Browse Source
Implemented start of web interface to update Static IP addresses or use DHCP.
Implemented start of web interface to update Static IP addresses or use DHCP.
Currently saves to files in /etc/raspap/networking, still need to build something to generate a working config for dhcpcdpull/131/head
9 changed files with 265 additions and 22 deletions
-
4ajax/networking/get_all_interfaces.php
-
27ajax/networking/get_int_config.php
-
15ajax/networking/get_ip_summary.php
-
75ajax/networking/save_int_config.php
-
2includes/functions.php
-
31includes/networking.php
-
14index.php
-
8installers/common.sh
-
111js/custom.js
@ -0,0 +1,4 @@ |
|||
<?php |
|||
exec("ls /sys/class/net | grep -v lo", $interfaces); |
|||
echo json_encode($interfaces); |
|||
?>
|
@ -0,0 +1,27 @@ |
|||
<?php |
|||
session_start(); |
|||
include_once('../../includes/config.php'); |
|||
include_once('../../includes/functions.php'); |
|||
|
|||
|
|||
if(isset($_POST['interface']) && isset($_POST['csrf_token']) && CSRFValidate()) { |
|||
$int = $_POST['interface']; |
|||
if(!file_exists(RASPI_CONFIG_NETWORKING.'/DHCP-'.$int)) { |
|||
touch(RASPI_CONFIG_NETWORKING.'/DHCP-'.$int.'.ini'); |
|||
} |
|||
|
|||
if(!file_exists(RASPI_CONFIG_NETWORKING.'/STATIC-'.$int)) { |
|||
touch(RASPI_CONFIG_NETWORKING.'/STATIC-'.$int.'.ini'); |
|||
} |
|||
|
|||
$intDHCPConfig = parse_ini_file(RASPI_CONFIG_NETWORKING.'/DHCP-'.$int.'.ini'); |
|||
$intStaticConfig = parse_ini_file(RASPI_CONFIG_NETWORKING.'/STATIC-'.$int.'.ini'); |
|||
$jsonData = ['return'=>1,'output'=>['DHCPConfig'=>$intDHCPConfig,'StaticConfig'=>$intStaticConfig]]; |
|||
echo json_encode($jsonData); |
|||
|
|||
} else { |
|||
$jsonData = ['return'=>2,'output'=>['Error getting data']]; |
|||
echo json_encode($jsonData); |
|||
} |
|||
|
|||
?>
|
@ -0,0 +1,15 @@ |
|||
<?php |
|||
session_start(); |
|||
include_once('../../includes/functions.php'); |
|||
|
|||
if(isset($_POST['interface']) && isset($_POST['csrf_token']) && CSRFValidate()) { |
|||
$int = preg_replace('/[^a-z0-9]/','',$_POST['interface']); |
|||
exec('ip a s '.$int,$intOutput,$intResult); |
|||
$jsonData = ['return'=>$intResult,'output'=>$intOutput]; |
|||
echo json_encode($jsonData); |
|||
} else { |
|||
$jsonData = ['return'=>2,'output'=>['Error getting data']]; |
|||
echo json_encode($jsonData); |
|||
} |
|||
|
|||
?>
|
@ -0,0 +1,75 @@ |
|||
<?php |
|||
function mask2cidr($mask){ |
|||
$long = ip2long($mask); |
|||
$base = ip2long('255.255.255.255'); |
|||
return 32-log(($long ^ $base)+1,2); |
|||
} |
|||
|
|||
function write_php_ini($array, $file) { |
|||
$res = array(); |
|||
foreach($array as $key => $val) { |
|||
if(is_array($val)) { |
|||
$res[] = "[$key]"; |
|||
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"'); |
|||
} |
|||
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"'); |
|||
} |
|||
if(safefilerewrite($file, implode("\r\n", $res))) { |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
function safefilerewrite($fileName, $dataToSave) { |
|||
if ($fp = fopen($fileName, 'w')) { |
|||
$startTime = microtime(TRUE); |
|||
do { |
|||
$canWrite = flock($fp, LOCK_EX); |
|||
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
|
|||
if(!$canWrite) usleep(round(rand(0, 100)*1000)); |
|||
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5)); |
|||
|
|||
//file was locked so now we can store information
|
|||
if ($canWrite) { |
|||
fwrite($fp, $dataToSave); |
|||
flock($fp, LOCK_UN); |
|||
} |
|||
fclose($fp); |
|||
return true; |
|||
} else { |
|||
return false; |
|||
} |
|||
} |
|||
|
|||
session_start(); |
|||
include_once('../../includes/config.php'); |
|||
include_once('../../includes/functions.php'); |
|||
var_dump($_POST); |
|||
if(isset($_POST['interface']) && isset($_POST['csrf_token']) && CSRFValidate()) { |
|||
$int = $_POST['interface']; |
|||
$cfg = []; |
|||
if($_POST[$int.'-static'] == 'true') { |
|||
$file = "STATIC-".$int.".ini"; |
|||
$ip = $_POST[$int.'-ipaddress']; |
|||
$netmask = mask2cidr($_POST[$int.'-netmask']); |
|||
$dns1 = $_POST[$int.'-dnssvr']; |
|||
$dns2 = $_POST[$int.'-dnssvralt']; |
|||
|
|||
$cfg['static'] = $_POST[$int.'-static']; |
|||
$cfg['interface'] = $int; |
|||
$cfg['routers'] = $_POST[$int.'-gateway']; |
|||
$cfg['ip_address'] = $ip."/".$netmask; |
|||
$cfg['domain_name_server'] = $dns1." ".$dns2; |
|||
|
|||
if(write_php_ini($cfg,RASPI_CONFIG_NETWORKING.'/'.$file)) { |
|||
$jsonData = ['return'=>0,'output'=>['Successfully Updated Network Configuration']]; |
|||
} else { |
|||
$jsonData = ['return'=>1,'output'=>['Error saving network configuration']]; |
|||
} |
|||
} |
|||
} else { |
|||
$jsonData = ['return'=>2,'output'=>['Error saving network configuration']]; |
|||
} |
|||
echo json_encode($jsonData); |
|||
?>
|
@ -0,0 +1,111 @@ |
|||
function createNetmaskAddr(bitCount) { |
|||
var mask=[]; |
|||
for(i=0;i<4;i++) { |
|||
var n = Math.min(bitCount, 8); |
|||
mask.push(256 - Math.pow(2, 8-n)); |
|||
bitCount -= n; |
|||
} |
|||
return mask.join('.'); |
|||
} |
|||
|
|||
function loadSummary(strInterface) { |
|||
$.post('/ajax/networking/get_ip_summary.php',{interface:strInterface,csrf_token:csrf},function(data){ |
|||
jsonData = JSON.parse(data); |
|||
console.log(jsonData); |
|||
if(jsonData['return'] == 0) { |
|||
$('#'+strInterface+'-summary').html(jsonData['output'].join('<br />')); |
|||
} else if(jsonData['return'] == 2) { |
|||
$('#'+strInterface+'-summary').append('<div class="alert alert-danger alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>'+jsonData['output'].join('<br />')+'</div>'); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
function getAllInterfaces() { |
|||
$.get('/ajax/networking/get_all_interfaces.php',function(data){ |
|||
jsonData = JSON.parse(data); |
|||
$.each(jsonData,function(ind,value){loadSummary(value)}); |
|||
}); |
|||
} |
|||
|
|||
function setupTabs() { |
|||
$('a[data-toggle="tab"]').on('shown.bs.tab',function(e){ |
|||
var target = $(e.target).attr('href'); |
|||
if(!target.match('summary')) { |
|||
var int = target.replace("#",""); |
|||
loadCurrentSettings(int); |
|||
} |
|||
}); |
|||
} |
|||
|
|||
function loadCurrentSettings(strInterface) { |
|||
$.post('/ajax/networking/get_int_config.php',{interface:strInterface,csrf_token:csrf},function(data){ |
|||
jsonData = JSON.parse(data); |
|||
//console.log(data);
|
|||
$.each(jsonData['output'],function(i,v) { |
|||
//console.log(i);
|
|||
var int = v['interface']; |
|||
//console.log('interface : '+int);
|
|||
$.each(v,function(i2,v2) { |
|||
//console.log(i2+":"+v2);
|
|||
switch(i2) { |
|||
case "static": |
|||
if(v2 == 1) { |
|||
$('#'+int+'-static').click(); |
|||
} |
|||
break; |
|||
case "interface": |
|||
break; |
|||
case "ip_address": |
|||
var arrIPNetmask = v2.split('/'); |
|||
$('#'+int+'-ipaddress').val(arrIPNetmask[0]); |
|||
$('#'+int+'-netmask').val(createNetmaskAddr(arrIPNetmask[1])); |
|||
break; |
|||
case "routers": |
|||
$('#'+int+'-gateway').val(v2); |
|||
break; |
|||
case "domain_name_server": |
|||
svrsDNS = v2.split(" "); |
|||
$('#'+int+'-dnssvr').val(svrsDNS[0]); |
|||
$('#'+int+'-dnssvralt').val(svrsDNS[1]); |
|||
break; |
|||
} |
|||
}); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
function setupBtns() { |
|||
$('#btnSummaryRefresh').click(function(){getAllInterfaces();}); |
|||
$('.intsave').click(function(){ |
|||
var int = $(this).data('int'); |
|||
var frmInt = $('#frm-'+int).find(':input'); |
|||
var arrFormData = {}; |
|||
$.each(frmInt,function(i3,v3){ |
|||
if($(v3).attr('type') == 'radio') { |
|||
arrFormData[$(v3).attr('id')] = $(v3).prop('checked'); |
|||
} else { |
|||
arrFormData[$(v3).attr('id')] = $(v3).val(); |
|||
} |
|||
}); |
|||
arrFormData['interface'] = int; |
|||
arrFormData['csrf_token'] = csrf; |
|||
$.post('/ajax/networking/save_int_config.php',arrFormData,function(data){ |
|||
console.log(data); |
|||
}); |
|||
}); |
|||
} |
|||
|
|||
$().ready(function(){ |
|||
csrf = $('#csrf_token').val(); |
|||
pageCurrent = window.location.href.split("?")[1].split("=")[1]; |
|||
pageCurrent = pageCurrent.replace("#",""); |
|||
switch(pageCurrent) { |
|||
case "network_conf": |
|||
getAllInterfaces(); |
|||
setupTabs(); |
|||
setupBtns(); |
|||
break; |
|||
} |
|||
}); |
|||
|
|||
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue