mirror of
https://github.com/billz/raspap-webgui.git
synced 2023-10-10 13:37:24 +02:00
Merge branch 'feature/dhcp-eth0' of https://github.com/billz/raspap-webgui into feature/dhcp-eth0
This commit is contained in:
commit
99918c30e0
@ -1,48 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require '../../includes/csrf.php';
|
|
||||||
|
|
||||||
require_once '../../includes/config.php';
|
|
||||||
require_once '../../includes/functions.php';
|
|
||||||
|
|
||||||
if (isset($_POST['generate'])) {
|
|
||||||
$cnfNetworking = array_diff(scandir(RASPI_CONFIG_NETWORKING, 1), array('..','.','dhcpcd.conf','defaults'));
|
|
||||||
$cnfNetworking = array_combine($cnfNetworking, $cnfNetworking);
|
|
||||||
$strConfFile = file_get_contents(RASPI_CONFIG_NETWORKING.'/defaults')."\n";
|
|
||||||
foreach ($cnfNetworking as $index => $file) {
|
|
||||||
if ($index != "defaults") {
|
|
||||||
$cnfFile = parse_ini_file(RASPI_CONFIG_NETWORKING.'/'.$file, false, INI_SCANNER_RAW);
|
|
||||||
if ($cnfFile['static'] === 'true') {
|
|
||||||
$strConfFile .= "#Static IP configured for ".$cnfFile['interface']."\n";
|
|
||||||
$strConfFile .= "interface ".$cnfFile['interface']."\n";
|
|
||||||
if (isset($cnfFile['metric'])) {
|
|
||||||
$strConfFile .= "metric ".$cnfFile['metric']."\n";
|
|
||||||
}
|
|
||||||
$strConfFile .= "static ip_address=".$cnfFile['ip_address']."\n";
|
|
||||||
$strConfFile .= "static routers=".$cnfFile['routers']."\n";
|
|
||||||
$strConfFile .= "static domain_name_servers=".$cnfFile['domain_name_server']."\n\n";
|
|
||||||
} elseif ($cnfFile['static'] === 'false' && $cnfFile['failover'] === 'true') {
|
|
||||||
$strConfFile .= "#Failover static IP configured for ".$cnfFile['interface']."\n";
|
|
||||||
$strConfFile .= "profile static_".$cnfFile['interface']."\n";
|
|
||||||
$strConfFile .= "static ip_address=".$cnfFile['ip_address']."\n";
|
|
||||||
$strConfFile .= "static routers=".$cnfFile['routers']."\n";
|
|
||||||
$strConfFile .= "static domain_name_servers=".$cnfFile['domain_name_server']."\n\n";
|
|
||||||
$strConfFile .= "interface ".$cnfFile['interface']."\n";
|
|
||||||
if (isset($cnfFile['metric'])) {
|
|
||||||
$strConfFile .= "metric ".$cnfFile['metric']."\n";
|
|
||||||
}
|
|
||||||
$strConfFile .= "fallback static_".$cnfFile['interface']."\n\n";
|
|
||||||
} else {
|
|
||||||
$strConfFile .= "#DHCP configured for ".pathinfo($file, PATHINFO_FILENAME)."\n\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_put_contents(RASPI_CONFIG_NETWORKING.'/dhcpcd.conf', $strConfFile)) {
|
|
||||||
exec('sudo /bin/cp '.RASPI_CONFIG_NETWORKING.'/dhcpcd.conf '.RASPI_DHCPCD_CONFIG);
|
|
||||||
$output = ['return'=>0,'output'=>'Settings successfully applied'];
|
|
||||||
} else {
|
|
||||||
$output = ['return'=>2,'output'=>'Unable to write to apply settings'];
|
|
||||||
}
|
|
||||||
echo json_encode($output);
|
|
||||||
}
|
|
@ -1,23 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require '../../includes/csrf.php';
|
|
||||||
|
|
||||||
require_once '../../includes/config.php';
|
|
||||||
require_once '../../includes/functions.php';
|
|
||||||
|
|
||||||
|
|
||||||
if (isset($_POST['interface'])) {
|
|
||||||
$int = preg_replace('/[^a-z0-9]/', '', $_POST['interface']);
|
|
||||||
if (!file_exists(RASPI_CONFIG_NETWORKING.'/'.$int.'.ini')) {
|
|
||||||
touch(RASPI_CONFIG_NETWORKING.'/'.$int.'.ini');
|
|
||||||
}
|
|
||||||
|
|
||||||
$intConfig = parse_ini_file(RASPI_CONFIG_NETWORKING.'/'.$int.'.ini', false, INI_SCANNER_RAW);
|
|
||||||
$jsonData = ['return'=>1,'output'=>['intConfig'=>$intConfig]];
|
|
||||||
echo json_encode($jsonData);
|
|
||||||
|
|
||||||
// Todo - get dhcp lease information from `dhcpcd -U eth0` ? maybe ?
|
|
||||||
} else {
|
|
||||||
$jsonData = ['return'=>2,'output'=>['Error getting data']];
|
|
||||||
echo json_encode($jsonData);
|
|
||||||
}
|
|
@ -6,10 +6,10 @@ require_once '../../includes/config.php';
|
|||||||
$interface = $_GET['iface'];
|
$interface = $_GET['iface'];
|
||||||
|
|
||||||
if (isset($interface)) {
|
if (isset($interface)) {
|
||||||
|
// fetch dnsmasq.conf settings for interface
|
||||||
exec('cat '. RASPI_DNSMASQ_PREFIX.$interface.'.conf', $return);
|
exec('cat '. RASPI_DNSMASQ_PREFIX.$interface.'.conf', $return);
|
||||||
$conf = ParseConfig($return);
|
$conf = ParseConfig($return);
|
||||||
|
|
||||||
// populate data
|
|
||||||
$dhcpdata['DHCPEnabled'] = empty($conf) ? false : true;
|
$dhcpdata['DHCPEnabled'] = empty($conf) ? false : true;
|
||||||
$arrRange = explode(",", $conf['dhcp-range']);
|
$arrRange = explode(",", $conf['dhcp-range']);
|
||||||
$dhcpdata['RangeStart'] = $arrRange[0];
|
$dhcpdata['RangeStart'] = $arrRange[0];
|
||||||
@ -20,12 +20,11 @@ if (isset($interface)) {
|
|||||||
$dhcpHost = empty($dhcpHost) ? [] : $dhcpHost;
|
$dhcpHost = empty($dhcpHost) ? [] : $dhcpHost;
|
||||||
$dhcpdata['dhcpHost'] = is_array($dhcpHost) ? $dhcpHost : [ $dhcpHost ];
|
$dhcpdata['dhcpHost'] = is_array($dhcpHost) ? $dhcpHost : [ $dhcpHost ];
|
||||||
$upstreamServers = is_array($conf['server']) ? $conf['server'] : [ $conf['server'] ];
|
$upstreamServers = is_array($conf['server']) ? $conf['server'] : [ $conf['server'] ];
|
||||||
$dhcpdata['upstreamServers'] = array_filter($upstreamServers);
|
|
||||||
$dhcpdata['upstreamServersEnabled'] = empty($conf['server']) ? false: true;
|
$dhcpdata['upstreamServersEnabled'] = empty($conf['server']) ? false: true;
|
||||||
|
$dhcpdata['upstreamServers'] = array_filter($upstreamServers);
|
||||||
preg_match('/([0-9]*)([a-z])/i', $dhcpdata['leaseTime'], $arrRangeLeaseTime);
|
preg_match('/([0-9]*)([a-z])/i', $dhcpdata['leaseTime'], $arrRangeLeaseTime);
|
||||||
$dhcpdata['leaseTime'] = $arrRangeLeaseTime[1];
|
$dhcpdata['leaseTime'] = $arrRangeLeaseTime[1];
|
||||||
$dhcpdata['leaseTimeInterval'] = $arrRangeLeaseTime[2];
|
$dhcpdata['leaseTimeInterval'] = $arrRangeLeaseTime[2];
|
||||||
|
|
||||||
if (isset($conf['dhcp-option'])) {
|
if (isset($conf['dhcp-option'])) {
|
||||||
$arrDns = explode(",", $conf['dhcp-option']);
|
$arrDns = explode(",", $conf['dhcp-option']);
|
||||||
if ($arrDns[0] == '6') {
|
if ($arrDns[0] == '6') {
|
||||||
@ -37,5 +36,21 @@ if (isset($interface)) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fetch dhcpcd.conf settings for interface
|
||||||
|
$conf = file_get_contents(RASPI_DHCPCD_CONFIG);
|
||||||
|
preg_match('/^#\sRaspAP\s'.$interface.'\s.*?(?=\s*+$)/ms', $conf, $matched);
|
||||||
|
preg_match('/metric\s(\d*)/', $matched[0], $metric);
|
||||||
|
preg_match('/static\sip_address=(.*)/', $matched[0], $static_ip);
|
||||||
|
preg_match('/static\srouters=(.*)/', $matched[0], $static_routers);
|
||||||
|
preg_match('/static\sdomain_name_servers=(.*)/', $matched[0], $static_dns);
|
||||||
|
preg_match('/fallback\sstatic_'.$interface.'/', $matched[0], $fallback);
|
||||||
|
$dhcpdata['Metric'] = $metric[1];
|
||||||
|
$dhcpdata['StaticIP'] = substr($static_ip[1], 0, strpos($static_ip[1],'/'));
|
||||||
|
$dhcpdata['SubnetMask'] = cidr2mask($static_ip[1]);
|
||||||
|
$dhcpdata['StaticRouters'] = $static_routers[1];
|
||||||
|
$dhcpdata['StaticDNS'] = $static_dns[1];
|
||||||
|
$dhcpdata['FallbackEnabled'] = empty($fallback) ? false: true;
|
||||||
|
|
||||||
echo json_encode($dhcpdata);
|
echo json_encode($dhcpdata);
|
||||||
}
|
}
|
||||||
|
@ -1,35 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
require '../../includes/csrf.php';
|
|
||||||
|
|
||||||
require_once '../../includes/config.php';
|
|
||||||
require_once '../../includes/functions.php';
|
|
||||||
|
|
||||||
if (isset($_POST['interface'])) {
|
|
||||||
$int = $_POST['interface'];
|
|
||||||
$cfg = [];
|
|
||||||
$file = $int.".ini";
|
|
||||||
$ip = $_POST[$int.'-ipaddress'];
|
|
||||||
$netmask = mask2cidr($_POST[$int.'-netmask']);
|
|
||||||
$dns1 = $_POST[$int.'-dnssvr'];
|
|
||||||
$dns2 = $_POST[$int.'-dnssvralt'];
|
|
||||||
|
|
||||||
|
|
||||||
$cfg['interface'] = $int;
|
|
||||||
$cfg['routers'] = $_POST[$int.'-gateway'];
|
|
||||||
$cfg['ip_address'] = $ip."/".$netmask;
|
|
||||||
$cfg['domain_name_server'] = $dns1." ".$dns2;
|
|
||||||
$cfg['static'] = $_POST[$int.'-static'];
|
|
||||||
$cfg['failover'] = $_POST[$int.'-failover'];
|
|
||||||
$cfg['metric'] = $_POST[$int.'-metric'];
|
|
||||||
|
|
||||||
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 to file']];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$jsonData = ['return'=>2,'output'=>'Unable to detect interface'];
|
|
||||||
}
|
|
||||||
|
|
||||||
echo json_encode($jsonData);
|
|
105
app/js/custom.js
105
app/js/custom.js
@ -49,74 +49,6 @@ function setupTabs() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadCurrentSettings(strInterface) {
|
|
||||||
$.post('ajax/networking/get_int_config.php',{interface:strInterface},function(data){
|
|
||||||
jsonData = JSON.parse(data);
|
|
||||||
$.each(jsonData['output'],function(i,v) {
|
|
||||||
var int = v['interface'];
|
|
||||||
$.each(v,function(i2,v2) {
|
|
||||||
switch(i2) {
|
|
||||||
case "static":
|
|
||||||
if(v2 == 'true') {
|
|
||||||
$('#'+int+'-static').click();
|
|
||||||
$('#'+int+'-nofailover').click();
|
|
||||||
} else {
|
|
||||||
$('#'+int+'-dhcp').click();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case "failover":
|
|
||||||
if(v2 === 'true') {
|
|
||||||
$('#'+int+'-failover').click();
|
|
||||||
} else {
|
|
||||||
$('#'+int+'-nofailover').click();
|
|
||||||
}
|
|
||||||
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 saveNetworkSettings(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;
|
|
||||||
$.post('ajax/networking/save_int_config.php',arrFormData,function(data){
|
|
||||||
var jsonData = JSON.parse(data);
|
|
||||||
$('#msgNetworking').html(msgShow(jsonData['return'],jsonData['output']));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function applyNetworkSettings() {
|
|
||||||
var int = $(this).data('int');
|
|
||||||
arrFormData = {};
|
|
||||||
arrFormData['generate'] = '';
|
|
||||||
$.post('ajax/networking/gen_int_config.php',arrFormData,function(data){
|
|
||||||
var jsonData = JSON.parse(data);
|
|
||||||
$('#msgNetworking').html(msgShow(jsonData['return'],jsonData['output']));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).on("click", ".js-add-dhcp-static-lease", function(e) {
|
$(document).on("click", ".js-add-dhcp-static-lease", function(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
var container = $(".js-new-dhcp-static-lease");
|
var container = $(".js-new-dhcp-static-lease");
|
||||||
@ -240,11 +172,19 @@ function loadWifiStations(refresh) {
|
|||||||
}
|
}
|
||||||
$(".js-reload-wifi-stations").on("click", loadWifiStations(true));
|
$(".js-reload-wifi-stations").on("click", loadWifiStations(true));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Populates the DHCP server form fields
|
||||||
|
Option toggles are set dynamically depending on the loaded configuration
|
||||||
|
*/
|
||||||
function loadInterfaceDHCPSelect() {
|
function loadInterfaceDHCPSelect() {
|
||||||
var iface = $('#cbxdhcpiface').val();
|
var iface = $('#cbxdhcpiface').val();
|
||||||
$.get('ajax/networking/get_netcfg.php?iface='+iface,function(data){
|
$.get('ajax/networking/get_netcfg.php?iface='+iface,function(data){
|
||||||
jsonData = JSON.parse(data);
|
jsonData = JSON.parse(data);
|
||||||
$('#dhcp-iface')[0].checked = jsonData.DHCPEnabled;
|
$('#dhcp-iface')[0].checked = jsonData.DHCPEnabled;
|
||||||
|
$('#txtipaddress').val(jsonData.StaticIP);
|
||||||
|
$('#txtsubnetmask').val(jsonData.SubnetMask);
|
||||||
|
$('#txtgateway').val(jsonData.StaticRouters);
|
||||||
|
$('#chkfallback')[0].checked = jsonData.FallbackEnabled;
|
||||||
$('#txtrangestart').val(jsonData.RangeStart);
|
$('#txtrangestart').val(jsonData.RangeStart);
|
||||||
$('#txtrangeend').val(jsonData.RangeEnd);
|
$('#txtrangeend').val(jsonData.RangeEnd);
|
||||||
$('#txtrangeleasetime').val(jsonData.leaseTime);
|
$('#txtrangeleasetime').val(jsonData.leaseTime);
|
||||||
@ -253,9 +193,38 @@ function loadInterfaceDHCPSelect() {
|
|||||||
$('#cbxrangeleasetimeunits').val(jsonData.leaseTimeInterval);
|
$('#cbxrangeleasetimeunits').val(jsonData.leaseTimeInterval);
|
||||||
$('#no-resolv')[0].checked = jsonData.upstreamServersEnabled;
|
$('#no-resolv')[0].checked = jsonData.upstreamServersEnabled;
|
||||||
$('#cbxdhcpupstreamserver').val(jsonData.upstreamServers[0]);
|
$('#cbxdhcpupstreamserver').val(jsonData.upstreamServers[0]);
|
||||||
|
$('#txtmetric').val(jsonData.Metric);
|
||||||
|
|
||||||
|
if (jsonData.StaticIP !== null && jsonData.StaticIP !== '' && !jsonData.FallbackEnabled) {
|
||||||
|
$('#chkstatic').closest('.btn').button('toggle');
|
||||||
|
$('#chkstatic').closest('.btn').button('toggle').blur();
|
||||||
|
$('#chkstatic').blur();
|
||||||
|
$('#chkfallback').prop('disabled', true);
|
||||||
|
} else {
|
||||||
|
$('#chkdhcp').closest('.btn').button('toggle');
|
||||||
|
$('#chkdhcp').closest('.btn').button('toggle').blur();
|
||||||
|
$('#chkdhcp').blur();
|
||||||
|
$('#chkfallback').prop('disabled', false);
|
||||||
|
}
|
||||||
|
if (jsonData.FallbackEnabled || $('#chkdhcp').is(':checked')) {
|
||||||
|
$('#dhcp-iface').prop('disabled', true);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setDHCPToggles(state) {
|
||||||
|
if ($('#chkfallback').is(':checked') && state) {
|
||||||
|
$('#chkfallback').prop('checked', state);
|
||||||
|
}
|
||||||
|
if ($('#dhcp-iface').is(':checked') && !state) {
|
||||||
|
$('#dhcp-iface').prop('checked', state);
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#chkfallback').prop('disabled', state);
|
||||||
|
$('#dhcp-iface').prop('disabled', !state);
|
||||||
|
//$('#dhcp-iface').prop('checked', state);
|
||||||
|
}
|
||||||
|
|
||||||
function loadChannel() {
|
function loadChannel() {
|
||||||
$.get('ajax/networking/get_channel.php',function(data){
|
$.get('ajax/networking/get_channel.php',function(data){
|
||||||
jsonData = JSON.parse(data);
|
jsonData = JSON.parse(data);
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# RaspAP wlan0 configuration
|
# RaspAP default configuration
|
||||||
hostname
|
hostname
|
||||||
clientid
|
clientid
|
||||||
persistent
|
persistent
|
||||||
@ -9,6 +9,8 @@ option ntp_servers
|
|||||||
require dhcp_server_identifier
|
require dhcp_server_identifier
|
||||||
slaac private
|
slaac private
|
||||||
nohook lookup-hostname
|
nohook lookup-hostname
|
||||||
|
|
||||||
|
# RaspAP wlan0 configuration
|
||||||
interface wlan0
|
interface wlan0
|
||||||
static ip_address=10.3.141.1/24
|
static ip_address=10.3.141.1/24
|
||||||
static routers=10.3.141.1
|
static routers=10.3.141.1
|
||||||
|
@ -68,10 +68,14 @@ function SaveDHCPConfig($status)
|
|||||||
$iface = $_POST['interface'];
|
$iface = $_POST['interface'];
|
||||||
$return = 1;
|
$return = 1;
|
||||||
|
|
||||||
if (($_POST['dhcp-iface'] == "1")) {
|
// handle disable dhcp option
|
||||||
$errors = ValidateDHCPInput();
|
if (!isset($_POST['dhcp-iface']) && file_exists(RASPI_DNSMASQ_PREFIX.$iface.'.conf')) {
|
||||||
if (empty($errors)) {
|
// remove dhcp conf for selected interface
|
||||||
$return = UpdateDnsmasqCfg($iface,$status);
|
$return = RemoveDHCPConfig($iface,$status);
|
||||||
|
} else {
|
||||||
|
$errors = ValidateDHCPInput();
|
||||||
|
if (empty($errors)) {
|
||||||
|
$return = UpdateDHCPConfig($iface,$status);
|
||||||
} else {
|
} else {
|
||||||
$status->addMessage($errors, 'danger');
|
$status->addMessage($errors, 'danger');
|
||||||
}
|
}
|
||||||
@ -79,21 +83,19 @@ function SaveDHCPConfig($status)
|
|||||||
$status->addMessage('Dnsmasq configuration failed to be updated.', 'danger');
|
$status->addMessage('Dnsmasq configuration failed to be updated.', 'danger');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$return = UpdateDHCPCfg($iface,$status);
|
|
||||||
|
|
||||||
// process disable dhcp option
|
if (($_POST['dhcp-iface'] == "1")) {
|
||||||
} elseif (($_POST['dhcp-iface'] == "0") && file_exists(RASPI_DNSMASQ_PREFIX.$iface.'.conf')) {
|
$return = UpdateDnsmasqConfig($iface,$status);
|
||||||
// remove dhcp conf for selected interface
|
}
|
||||||
$return = RemoveDHCPCfg($iface,$status);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($return == 0) {
|
if ($return == 0) {
|
||||||
$status->addMessage('Dnsmasq configuration updated successfully.', 'success');
|
$status->addMessage('Dnsmasq configuration updated successfully.', 'success');
|
||||||
} else {
|
} else {
|
||||||
$status->addMessage('Dnsmasq configuration failed to be updated.', 'danger');
|
$status->addMessage('Dnsmasq configuration failed to be updated.', 'danger');
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function ValidateDHCPInput()
|
function ValidateDHCPInput()
|
||||||
@ -105,26 +107,38 @@ function ValidateDHCPInput()
|
|||||||
) {
|
) {
|
||||||
$errors .= _('Invalid interface name.').'<br />'.PHP_EOL;
|
$errors .= _('Invalid interface name.').'<br />'.PHP_EOL;
|
||||||
}
|
}
|
||||||
if (!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $_POST['RangeStart'])
|
if (!filter_var($_POST['StaticIP'], FILTER_VALIDATE_IP) && !empty($_POST['StaticIP'])) {
|
||||||
&& !empty($_POST['RangeStart'])
|
$errors .= _('Invalid static IP address.').'<br />'.PHP_EOL;
|
||||||
) { // allow ''/null ?
|
|
||||||
$errors .= _('Invalid DHCP range start.').'<br />'.PHP_EOL;
|
|
||||||
}
|
}
|
||||||
if (!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\z/', $_POST['RangeEnd'])
|
if (!filter_var($_POST['SubnetMask'], FILTER_VALIDATE_IP) && !empty($_POST['SubnetMask'])) {
|
||||||
&& !empty($_POST['RangeEnd'])
|
$errors .= _('Invalid subnet mask.').'<br />'.PHP_EOL;
|
||||||
) { // allow ''/null ?
|
|
||||||
$errors .= _('Invalid DHCP range end.').'<br />'.PHP_EOL;
|
|
||||||
}
|
}
|
||||||
if (!ctype_digit($_POST['RangeLeaseTime']) && $_POST['RangeLeaseTimeUnits'] !== 'infinite') {
|
if (!filter_var($_POST['DefaultGateway'], FILTER_VALIDATE_IP) && !empty($_POST['DefaultGateway'])) {
|
||||||
$errors .= _('Invalid DHCP lease time, not a number.').'<br />'.PHP_EOL;
|
$errors .= _('Invalid default gateway.').'<br />'.PHP_EOL;
|
||||||
|
var_dump($_POST['DefaultGateway']);
|
||||||
|
die();
|
||||||
}
|
}
|
||||||
if (!in_array($_POST['RangeLeaseTimeUnits'], array('m', 'h', 'd', 'infinite'))) {
|
if (($_POST['dhcp-iface'] == "1")) {
|
||||||
$errors .= _('Unknown DHCP lease time unit.').'<br />'.PHP_EOL;
|
if (!filter_var($_POST['RangeStart'], FILTER_VALIDATE_IP) && !empty($_POST['RangeStart'])) {
|
||||||
|
$errors .= _('Invalid DHCP range start.').'<br />'.PHP_EOL;
|
||||||
|
}
|
||||||
|
if (!filter_var($_POST['RangeEnd'], FILTER_VALIDATE_IP) && !empty($_POST['RangeEnd'])) {
|
||||||
|
$errors .= _('Invalid DHCP range end.').'<br />'.PHP_EOL;
|
||||||
|
}
|
||||||
|
if (!ctype_digit($_POST['RangeLeaseTime']) && $_POST['RangeLeaseTimeUnits'] !== 'infinite') {
|
||||||
|
$errors .= _('Invalid DHCP lease time, not a number.').'<br />'.PHP_EOL;
|
||||||
|
}
|
||||||
|
if (!in_array($_POST['RangeLeaseTimeUnits'], array('m', 'h', 'd', 'infinite'))) {
|
||||||
|
$errors .= _('Unknown DHCP lease time unit.').'<br />'.PHP_EOL;
|
||||||
|
}
|
||||||
|
if ($_POST['Metric'] !== '' && !ctype_digit($_POST['Metric'])) {
|
||||||
|
$errors .= _('Invalid metric value, not a number.').'<br />'.PHP_EOL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return $errors;
|
return $errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
function UpdateDnsmasqCfg($iface,$status)
|
function UpdateDnsmasqConfig($iface,$status)
|
||||||
{
|
{
|
||||||
$config = 'interface='.$iface.PHP_EOL.
|
$config = 'interface='.$iface.PHP_EOL.
|
||||||
'dhcp-range='.$_POST['RangeStart'].','.$_POST['RangeEnd'].
|
'dhcp-range='.$_POST['RangeStart'].','.$_POST['RangeEnd'].
|
||||||
@ -173,45 +187,52 @@ function UpdateDnsmasqCfg($iface,$status)
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function UpdateDHCPCfg($iface,$status)
|
function UpdateDHCPConfig($iface,$status)
|
||||||
{
|
{
|
||||||
$net_cfg = RASPI_CONFIG_NETWORKING.'/'.$iface.'.ini';
|
$cfg[] = '# RaspAP '.$iface.' configuration';
|
||||||
if (!file_exists($net_cfg) || filesize($net_cfg) ==0 ) {
|
$cfg[] = 'interface '.$iface;
|
||||||
$status->addMessage('Static IP address for '.$iface.' not found.', 'danger');
|
if (isset($_POST['StaticIP'])) {
|
||||||
$status->addMessage('Configure this interface in Networking > '.$iface.'.', 'danger');
|
$cfg[] = 'static ip_address='.$_POST['StaticIP'].'/'.mask2cidr($_POST['SubnetMask']);
|
||||||
$return = 1;
|
|
||||||
} else {
|
|
||||||
$dhcp_cfg = file_get_contents(RASPI_DHCPCD_CONFIG);
|
|
||||||
if (!preg_match('/^interface\s'.$iface.'$/m', $dhcp_cfg)) {
|
|
||||||
// set dhcp values from ini
|
|
||||||
$iface_cfg = parse_ini_file($net_cfg, false, INI_SCANNER_RAW);
|
|
||||||
$ip_address = $iface_cfg['ip_address'];
|
|
||||||
$domain_name_server = ($iface_cfg['domain_name_server'] =='') ? '1.1.1.1 8.8.8.8' : $iface_cfg['domain_name_server'];
|
|
||||||
|
|
||||||
// append interface config to dhcpcd.conf
|
|
||||||
$cfg = $dhcp_conf;
|
|
||||||
$cfg[] = '# RaspAP '.$iface.' configuration';
|
|
||||||
$cfg[] = 'interface '.$iface;
|
|
||||||
$cfg[] = 'static ip_address='.$ip_address;
|
|
||||||
$cfg[] = 'static domain_name_server='.$domain_name_server;
|
|
||||||
$cfg[] = PHP_EOL;
|
|
||||||
$cfg = join(PHP_EOL, $cfg);
|
|
||||||
$dhcp_cfg .= $cfg;
|
|
||||||
file_put_contents("/tmp/dhcpddata", $dhcp_cfg);
|
|
||||||
system('sudo cp /tmp/dhcpddata '.RASPI_DHCPCD_CONFIG, $result);
|
|
||||||
$status->addMessage('DHCP configuration for '.$iface.' added.', 'success');
|
|
||||||
} else {
|
|
||||||
$status->addMessage('DHCP for '.$iface.' already enabled.', 'success');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (isset($_POST['DefaultGateway'])) {
|
||||||
|
$cfg[] = 'static routers='.$_POST['DefaultGateway'];
|
||||||
|
}
|
||||||
|
if ($_POST['DNS1'] !== '' || $_POST['DNS2'] !== '') {
|
||||||
|
$cfg[] = 'static domain_name_server='.$_POST['DNS1'].' '.$_POST['DNS2'];
|
||||||
|
}
|
||||||
|
if ($_POST['Metric'] !== '') {
|
||||||
|
$cfg[] = 'metric '.$_POST['Metric'];
|
||||||
|
}
|
||||||
|
if ($_POST['Fallback'] == 1) {
|
||||||
|
$cfg[] = 'profile static_'.$iface;
|
||||||
|
$cfg[] = 'fallback static_'.$iface;
|
||||||
|
}
|
||||||
|
$dhcp_cfg = file_get_contents(RASPI_DHCPCD_CONFIG);
|
||||||
|
if (!preg_match('/^$\s*\z/m', $dhcp_cfg) && !preg_match('/^interface\s'.$iface.'$/m', $dhcp_cfg)) {
|
||||||
|
echo '===== no ending newline found ====<br>';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!preg_match('/^interface\s'.$iface.'$/m', $dhcp_cfg)) {
|
||||||
|
$cfg[] = PHP_EOL;
|
||||||
|
$cfg = join(PHP_EOL, $cfg);
|
||||||
|
$dhcp_cfg .= $cfg;
|
||||||
|
$status->addMessage('DHCP configuration for '.$iface.' added.', 'success');
|
||||||
|
} else {
|
||||||
|
$cfg = join(PHP_EOL, $cfg);
|
||||||
|
$dhcp_cfg = preg_replace('/^#\sRaspAP\s'.$iface.'\s.*?(?=\s*^\s*$)/ms', $cfg, $dhcp_cfg, 1);
|
||||||
|
$status->addMessage('DHCP configuration for '.$iface.' updated.', 'success');
|
||||||
|
}
|
||||||
|
file_put_contents("/tmp/dhcpddata", $dhcp_cfg);
|
||||||
|
system('sudo cp /tmp/dhcpddata '.RASPI_DHCPCD_CONFIG, $result);
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
function RemoveDHCPCfg($iface,$status)
|
function RemoveDHCPConfig($iface,$status)
|
||||||
{
|
{
|
||||||
$dhcp_cfg = file_get_contents(RASPI_DHCPCD_CONFIG);
|
$dhcp_cfg = file_get_contents(RASPI_DHCPCD_CONFIG);
|
||||||
$dhcp_cfg = preg_replace('/^#\sRaspAP\s'.$iface.'.*\n(.*\n){3}/m', '', $dhcp_cfg);
|
$dhcp_cfg = preg_replace('/^#\sRaspAP\s'.$iface.'\s.*?(?=\s*^\s*$)([\s]+)/ms', '', $dhcp_cfg, 1);
|
||||||
file_put_contents("/tmp/dhcpddata", rtrim($dhcp_cfg).PHP_EOL);
|
file_put_contents("/tmp/dhcpddata", $dhcp_cfg);
|
||||||
system('sudo cp /tmp/dhcpddata '.RASPI_DHCPCD_CONFIG, $result);
|
system('sudo cp /tmp/dhcpddata '.RASPI_DHCPCD_CONFIG, $result);
|
||||||
if ($result == 0) {
|
if ($result == 0) {
|
||||||
$status->addMessage('DHCP configuration for '.$iface.' removed.', 'success');
|
$status->addMessage('DHCP configuration for '.$iface.' removed.', 'success');
|
||||||
@ -219,7 +240,7 @@ function RemoveDHCPCfg($iface,$status)
|
|||||||
$status->addMessage('Failed to remove DHCP configuration for '.$iface.'.', 'danger');
|
$status->addMessage('Failed to remove DHCP configuration for '.$iface.'.', 'danger');
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
// remove dnsmasq eth0 conf
|
// remove dnsmasq conf
|
||||||
system('sudo rm '.RASPI_DNSMASQ_PREFIX.$iface.'.conf', $result);
|
system('sudo rm '.RASPI_DNSMASQ_PREFIX.$iface.'.conf', $result);
|
||||||
if ($result == 0) {
|
if ($result == 0) {
|
||||||
$status->addMessage('Dnsmasq configuration for '.$iface.' removed.', 'success');
|
$status->addMessage('Dnsmasq configuration for '.$iface.' removed.', 'success');
|
||||||
@ -229,3 +250,4 @@ function RemoveDHCPCfg($iface,$status)
|
|||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Functions for Networking */
|
/* Functions for Networking */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a netmask to CIDR notation string
|
||||||
|
*
|
||||||
|
* @param string $mask
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
function mask2cidr($mask)
|
function mask2cidr($mask)
|
||||||
{
|
{
|
||||||
$long = ip2long($mask);
|
$long = ip2long($mask);
|
||||||
@ -8,6 +14,21 @@ function mask2cidr($mask)
|
|||||||
return 32-log(($long ^ $base)+1, 2);
|
return 32-log(($long ^ $base)+1, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a CIDR notation string to a netmask
|
||||||
|
*
|
||||||
|
* @param string $cidr
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function cidr2mask($cidr)
|
||||||
|
{
|
||||||
|
$ta = substr ($cidr, strpos ($cidr, '/') + 1) * 1;
|
||||||
|
$netmask = str_split (str_pad (str_pad ('', $ta, '1'), 32, '0'), 8);
|
||||||
|
foreach ($netmask as &$element)
|
||||||
|
$element = bindec ($element);
|
||||||
|
return join ('.', $netmask);
|
||||||
|
}
|
||||||
|
|
||||||
/* Functions to write ini files */
|
/* Functions to write ini files */
|
||||||
|
|
||||||
function write_php_ini($array, $file)
|
function write_php_ini($array, $file)
|
||||||
|
@ -7,39 +7,87 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<h5 class="mt-1"><?php echo _("Adapter IP Address Settings"); ?></h5>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<div class="input-group">
|
<div class="btn-group" data-toggle="buttons">
|
||||||
<input type="hidden" name="dhcp-iface" value="0">
|
<label class="btn btn-light active" checked onclick="setDHCPToggles(false)">
|
||||||
<div class="custom-control custom-switch">
|
<input type="radio" name="adapter-ip" id="chkdhcp" autocomplete="off"> DHCP
|
||||||
<input class="custom-control-input" id="dhcp-iface" type="checkbox" name="dhcp-iface" value="1" <?php echo $dhcp_iface_enable ? ' checked="checked"' : "" ?> aria-describedby="dhcp-iface-description">
|
</label>
|
||||||
<label class="custom-control-label" for="dhcp-iface"><?php echo _("Enable DHCP for this interface") ?></label>
|
<label class="btn btn-light" onclick="setDHCPToggles(true)">
|
||||||
</div>
|
<input type="radio" name="adapter-ip" id="chkstatic" autocomplete="off"> Static IP
|
||||||
<p class="mb-0" id="dhcp-iface-description">
|
</label>
|
||||||
<small><?php echo _("Enable this option if you want RaspAP to assign IP addresses on the selected interface.") ?></small>
|
|
||||||
</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<div class="custom-control custom-switch">
|
||||||
|
<input class="custom-control-input" id="chkfallback" type="checkbox" name="Fallback" value="1" aria-describedby="fallback-description">
|
||||||
|
<label class="custom-control-label" for="chkfallback"><?php echo _("Enable fallback to static option") ?></label>
|
||||||
|
</div>
|
||||||
|
<p class="mb-0" id="fallback-description">
|
||||||
|
<small><?php echo _("Enable this option to configure a static profile and fall back to it when DHCP lease fails.") ?></small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="mt-1">Static IP options</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label for="code"><?php echo _("IP Address"); ?></label>
|
||||||
|
<input type="text" class="form-control" id="txtipaddress" name="StaticIP" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label for="code"><?php echo _("Subnet Mask"); ?></label>
|
||||||
|
<input type="text" class="form-control" id="txtsubnetmask" name="SubnetMask" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label for="code"><?php echo _("Default gateway"); ?></label>
|
||||||
|
<input type="text" class="form-control" id="txtgateway" name="DefaultGateway" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h5 class="mt-1">DHCP options</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="custom-control custom-switch">
|
||||||
|
<input class="custom-control-input" id="dhcp-iface" type="checkbox" name="dhcp-iface" value="1" aria-describedby="dhcp-iface-description">
|
||||||
|
<label class="custom-control-label" for="dhcp-iface"><?php echo _("Enable DHCP for this interface") ?></label>
|
||||||
|
</div>
|
||||||
|
<p class="mb-0" id="dhcp-iface-description">
|
||||||
|
<small><?php echo _("Enable this option if you want RaspAP to assign IP addresses to clients on the selected interface. A static IP address is required for this option.") ?></small>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label for="code"><?php echo _("Starting IP Address"); ?></label>
|
<label for="code"><?php echo _("Starting IP Address"); ?></label>
|
||||||
<input type="text" class="form-control" id="txtrangestart" name="RangeStart" value="<?php echo htmlspecialchars($RangeStart, ENT_QUOTES); ?>" />
|
<input type="text" class="form-control" id="txtrangestart" name="RangeStart" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label for="code"><?php echo _("Ending IP Address"); ?></label>
|
<label for="code"><?php echo _("Ending IP Address"); ?></label>
|
||||||
<input type="text" class="form-control" id="txtrangeend" name="RangeEnd" value="<?php echo htmlspecialchars($RangeEnd, ENT_QUOTES); ?>" />
|
<input type="text" class="form-control" id="txtrangeend" name="RangeEnd" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-xs-3 col-sm-3">
|
<div class="form-group col-xs-3 col-sm-3">
|
||||||
<label for="code"><?php echo _("Lease Time"); ?></label>
|
<label for="code"><?php echo _("Lease Time"); ?></label>
|
||||||
<input type="text" class="form-control" id="txtrangeleasetime" name="RangeLeaseTime" value="<?php echo htmlspecialchars($arrRangeLeaseTime[1], ENT_QUOTES); ?>" />
|
<input type="text" class="form-control" id="txtrangeleasetime" name="RangeLeaseTime" />
|
||||||
</div>
|
</div>
|
||||||
<div class="col-xs-3 col-sm-3">
|
<div class="col-xs-3 col-sm-3">
|
||||||
<label for="code"><?php echo _("Interval"); ?></label>
|
<label for="code"><?php echo _("Interval"); ?></label>
|
||||||
@ -55,14 +103,21 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label for="code"><?php echo _("DNS Server"); ?> 1</label>
|
<label for="code"><?php echo _("DNS Server"); ?> 1</label>
|
||||||
<input type="text" class="form-control" id="txtdns1" name="DNS1" value="<?php echo htmlspecialchars($DNS1, ENT_QUOTES); ?>" />
|
<input type="text" class="form-control" id="txtdns1" name="DNS1" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label for="code"><?php echo _("DNS Server"); ?> 2</label>
|
<label for="code"><?php echo _("DNS Server"); ?> 2</label>
|
||||||
<input type="text" class="form-control" id="txtdns2" name="DNS2" value="<?php echo htmlspecialchars($DNS2, ENT_QUOTES); ?>" />
|
<input type="text" class="form-control" id="txtdns2" name="DNS2" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label for="<metric"><?php echo _("Metric") ?></label>
|
||||||
|
<input type="text" class="form-control" id="txtmetric" name="Metric">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -18,12 +18,6 @@
|
|||||||
// defaults to false
|
// defaults to false
|
||||||
$bridgedEnabled = $arrHostapdConf['BridgedEnable'];
|
$bridgedEnabled = $arrHostapdConf['BridgedEnable'];
|
||||||
?>
|
?>
|
||||||
<?php if (!$bridgedEnabled) : // no interface details when bridged ?>
|
|
||||||
<?php foreach ($interfaces as $if): ?>
|
|
||||||
<?php $if_quoted = htmlspecialchars($if, ENT_QUOTES) ?>
|
|
||||||
<li role="presentation" class="nav-item"><a class="nav-link" href="#<?php echo $if_quoted ?>" aria-controls="<?php echo $if_quoted ?>" role="tab" data-toggle="tab"><?php echo $if_quoted ?></a></li>
|
|
||||||
<?php endforeach ?>
|
|
||||||
<?php endif ?>
|
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div role="tabpanel" class="tab-pane active" id="summary">
|
<div role="tabpanel" class="tab-pane active" id="summary">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user