2016-07-27 22:43:40 +02:00
< ? php
2016-08-05 16:50:05 +02:00
2020-06-07 20:12:00 +02:00
require_once 'status_messages.php' ;
2020-02-15 18:57:46 +01:00
require_once 'app/lib/system.php' ;
2020-06-07 18:17:16 +02:00
require_once 'includes/wifi_functions.php' ;
2020-06-07 18:25:11 +02:00
require_once 'includes/config.php' ;
2016-08-05 16:50:05 +02:00
2020-06-07 18:17:16 +02:00
getWifiInterface ();
2020-06-07 15:23:40 +02:00
2022-06-08 19:29:23 +02:00
$system = new \RaspAP\System\Sysinfo ;
$os = $system -> operatingSystem ();
2016-07-27 22:43:40 +02:00
/**
2020-12-04 22:41:10 +01:00
* Initialize hostapd values , display interface
2020-02-15 18:57:46 +01:00
*
*/
2018-10-03 14:40:55 +02:00
function DisplayHostAPDConfig ()
{
2019-04-10 10:37:35 +02:00
$status = new StatusMessages ();
2021-08-31 16:43:44 +02:00
$system = new \RaspAP\System\Sysinfo ;
2022-06-22 12:50:00 +02:00
$operatingSystem = $system -> operatingSystem ();
2019-04-10 10:37:35 +02:00
$arrConfig = array ();
2019-08-01 23:01:31 +02:00
$arr80211Standard = [
'a' => '802.11a - 5 GHz' ,
'b' => '802.11b - 2.4 GHz' ,
'g' => '802.11g - 2.4 GHz' ,
2019-12-26 07:17:27 +01:00
'n' => '802.11n - 2.4 GHz' ,
2023-03-20 20:00:28 +01:00
'ac' => '802.11ac - 5 GHz'
2020-02-15 18:57:46 +01:00
];
2019-04-10 10:37:35 +02:00
$arrSecurity = array ( 1 => 'WPA' , 2 => 'WPA2' , 3 => 'WPA+WPA2' , 'none' => _ ( " None " ));
$arrEncType = array ( 'TKIP' => 'TKIP' , 'CCMP' => 'CCMP' , 'TKIP CCMP' => 'TKIP+CCMP' );
2021-04-20 16:19:00 +02:00
$arrTxPower = getDefaultNetOpts ( 'txpower' , 'dbm' );
2019-12-13 15:05:41 +01:00
$managedModeEnabled = false ;
2019-04-10 10:37:35 +02:00
exec ( " ip -o link show | awk -F': ' ' { print $ 2}' " , $interfaces );
2021-04-02 00:35:19 +02:00
sort ( $interfaces );
2020-07-10 19:28:28 +02:00
exec ( " iw reg get | awk '/country / { sub(/:/, \" \" , $ 2); print $ 2 }' " , $country_code );
2019-04-10 10:37:35 +02:00
2021-04-20 18:53:09 +02:00
$cmd = " iw dev " . $_SESSION [ 'ap_interface' ] . " info | awk ' $ 1== \" txpower \" { print $ 2}' " ;
exec ( $cmd , $txpower );
$txpower = intval ( $txpower [ 0 ]);
2020-02-14 03:38:46 +01:00
if ( ! RASPI_MONITOR_ENABLED ) {
if ( isset ( $_POST [ 'SaveHostAPDSettings' ])) {
SaveHostAPDConfig ( $arrSecurity , $arrEncType , $arr80211Standard , $interfaces , $status );
2020-03-23 13:41:06 +01:00
}
}
$arrHostapdConf = parse_ini_file ( '/etc/raspap/hostapd.ini' );
if ( ! RASPI_MONITOR_ENABLED ) {
if ( isset ( $_POST [ 'StartHotspot' ]) || isset ( $_POST [ 'RestartHotspot' ])) {
2020-02-14 03:38:46 +01:00
$status -> addMessage ( 'Attempting to start hotspot' , 'info' );
2020-03-12 22:02:26 +01:00
if ( $arrHostapdConf [ 'BridgedEnable' ] == 1 ) {
2020-03-10 09:42:08 +01:00
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --interface br0 --seconds 3' , $return );
2020-03-12 22:02:26 +01:00
} elseif ( $arrHostapdConf [ 'WifiAPEnable' ] == 1 ) {
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --interface uap0 --seconds 3' , $return );
2020-02-14 03:38:46 +01:00
} else {
2020-02-18 22:01:38 +01:00
exec ( 'sudo /etc/raspap/hostapd/servicestart.sh --seconds 3' , $return );
2020-02-14 03:38:46 +01:00
}
foreach ( $return as $line ) {
$status -> addMessage ( $line , 'info' );
}
} elseif ( isset ( $_POST [ 'StopHotspot' ])) {
$status -> addMessage ( 'Attempting to stop hotspot' , 'info' );
exec ( 'sudo /bin/systemctl stop hostapd.service' , $return );
foreach ( $return as $line ) {
$status -> addMessage ( $line , 'info' );
}
2019-04-10 10:37:35 +02:00
}
}
exec ( 'cat ' . RASPI_HOSTAPD_CONFIG , $hostapdconfig );
2021-05-01 18:46:53 +02:00
exec ( 'iwgetid ' . escapeshellarg ( $_POST [ 'interface' ]) . ' -r' , $wifiNetworkID );
2020-02-15 18:57:46 +01:00
if ( ! empty ( $wifiNetworkID [ 0 ])) {
2019-12-13 15:05:41 +01:00
$managedModeEnabled = true ;
}
2020-02-01 12:07:54 +01:00
$hostapdstatus = $system -> hostapdStatus ();
2019-11-01 10:10:24 +01:00
$serviceStatus = $hostapdstatus [ 0 ] == 0 ? " down " : " up " ;
2016-07-27 22:43:40 +02:00
2019-04-10 10:37:35 +02:00
foreach ( $hostapdconfig as $hostapdconfigline ) {
if ( strlen ( $hostapdconfigline ) === 0 ) {
continue ;
}
if ( $hostapdconfigline [ 0 ] != " # " ) {
2020-02-15 18:57:46 +01:00
$arrLine = explode ( " = " , $hostapdconfigline );
2019-04-10 10:37:35 +02:00
$arrConfig [ $arrLine [ 0 ]] = $arrLine [ 1 ];
}
};
2020-09-11 20:03:14 +02:00
// assign beacon_int boolean if value is set
if ( isset ( $arrConfig [ 'beacon_int' ])) {
$arrConfig [ 'beacon_interval_bool' ] = 1 ;
}
// assign disassoc_low_ack boolean if value is set
if ( isset ( $arrConfig [ 'disassoc_low_ack' ])) {
$arrConfig [ 'disassoc_low_ack_bool' ] = 1 ;
}
2020-07-10 19:28:28 +02:00
// assign country_code from iw reg if not set in config
2022-01-05 11:19:40 +01:00
if ( empty ( $arrConfig [ 'country_code' ]) && isset ( $country_code [ 0 ])) {
2020-07-10 19:28:28 +02:00
$arrConfig [ 'country_code' ] = $country_code [ 0 ];
}
2021-04-20 18:53:09 +02:00
// set txpower with iw if value is non-default ('auto')
2023-03-29 09:35:25 +02:00
if ( isset ( $_POST [ 'txpower' ]) && ( $_POST [ 'txpower' ] != 'auto' )) {
$txpower = intval ( $_POST [ 'txpower' ]);
$sdBm = $txpower * 100 ;
exec ( 'sudo /sbin/iw dev ' . escapeshellarg ( $_POST [ 'interface' ]) . ' set txpower fixed ' . $sdBm , $return );
$status -> addMessage ( 'Setting transmit power to ' . $_POST [ 'txpower' ] . ' dBm.' , 'success' );
$txpower = $_POST [ 'txpower' ];
} elseif ( $_POST [ 'txpower' ] == 'auto' ) {
exec ( 'sudo /sbin/iw dev ' . escapeshellarg ( $_POST [ 'interface' ]) . ' set txpower auto' , $return );
$status -> addMessage ( 'Setting transmit power to ' . $_POST [ 'txpower' ] . '.' , 'success' );
$txpower = $_POST [ 'txpower' ];
2021-04-20 18:53:09 +02:00
}
2020-07-10 19:28:28 +02:00
2023-03-20 20:14:01 +01:00
$countries_5Ghz_max48ch = RASPI_5GHZ_ISO_ALPHA2 ;
$selectedHwMode = $arrConfig [ 'hw_mode' ];
if ( isset ( $arrConfig [ 'ieee80211n' ])) {
if ( strval ( $arrConfig [ 'ieee80211n' ]) === '1' ) {
$selectedHwMode = 'n' ;
}
}
if ( isset ( $arrConfig [ 'ieee80211ac' ])) {
if ( strval ( $arrConfig [ 'ieee80211ac' ]) === '1' ) {
$selectedHwMode = 'ac' ;
}
}
if ( isset ( $arrConfig [ 'ieee80211w' ])) {
if ( strval ( $arrConfig [ 'ieee80211w' ]) === '2' ) {
$selectedHwMode = 'w' ;
}
}
if ( ! in_array ( $arrConfig [ 'country_code' ], $countries_5Ghz_max48ch )) {
$hwModeDisabled = 'ac' ;
if ( $selectedHwMode === $hwModeDisabled ) {
unset ( $selectedHwMode );
}
}
2020-02-15 18:57:46 +01:00
echo renderTemplate (
" hostapd " , compact (
" status " ,
" serviceStatus " ,
" hostapdstatus " ,
" managedModeEnabled " ,
" interfaces " ,
" arrConfig " ,
" arr80211Standard " ,
" selectedHwMode " ,
" arrSecurity " ,
" arrEncType " ,
2021-04-20 16:19:00 +02:00
" arrTxPower " ,
2021-04-20 18:53:09 +02:00
" txpower " ,
2022-06-22 12:50:00 +02:00
" arrHostapdConf " ,
2023-03-20 20:14:01 +01:00
" operatingSystem " ,
" selectedHwMode " ,
" hwModeDisabled "
2020-02-15 18:57:46 +01:00
)
);
2016-07-27 22:43:40 +02:00
}
2016-07-27 22:48:27 +02:00
2020-12-04 22:41:10 +01:00
/**
* Validate user input , save configs for hostapd , dnsmasq & dhcp
*
* @ param array $wpa_array
* @ param array $enc_types
* @ param array $modes
* @ param string $interface
* @ param object $status
* @ return boolean
*/
2019-04-10 10:37:35 +02:00
function SaveHostAPDConfig ( $wpa_array , $enc_types , $modes , $interfaces , $status )
{
// It should not be possible to send bad data for these fields so clearly
// someone is up to something if they fail. Fail silently.
2020-02-15 18:57:46 +01:00
if ( ! ( array_key_exists ( $_POST [ 'wpa' ], $wpa_array )
&& array_key_exists ( $_POST [ 'wpa_pairwise' ], $enc_types )
&& array_key_exists ( $_POST [ 'hw_mode' ], $modes ))
) {
2019-04-10 10:37:35 +02:00
error_log ( " Attempting to set hostapd config with wpa=' " . $_POST [ 'wpa' ] . " ', wpa_pairwise=' " . $_POST [ 'wpa_pairwise' ] . " ' and hw_mode=' " . $_POST [ 'hw_mode' ] . " ' " ); // FIXME: log injection
return false ;
}
2020-10-25 08:48:41 +01:00
// Validate input
$good_input = true ;
2018-08-04 01:58:34 +02:00
2019-04-10 10:37:35 +02:00
if ( ! filter_var ( $_POST [ 'channel' ], FILTER_VALIDATE_INT )) {
2020-10-25 08:48:41 +01:00
$status -> addMessage ( 'Attempting to set channel to invalid number.' , 'danger' );
$good_input = false ;
2019-04-10 10:37:35 +02:00
}
2020-10-25 08:48:41 +01:00
if ( intval ( $_POST [ 'channel' ]) < 1 || intval ( $_POST [ 'channel' ]) > RASPI_5GHZ_MAX_CHANNEL ) {
$status -> addMessage ( 'Attempting to set channel outside of permitted range' , 'danger' );
$good_input = false ;
2019-04-10 10:37:35 +02:00
}
2020-12-15 11:45:27 +01:00
$arrHostapdConf = parse_ini_file ( '/etc/raspap/hostapd.ini' );
2020-12-15 23:01:23 +01:00
2020-03-10 09:42:08 +01:00
// Check for Bridged AP mode checkbox
$bridgedEnable = 0 ;
if ( $arrHostapdConf [ 'BridgedEnable' ] == 0 ) {
if ( isset ( $_POST [ 'bridgedEnable' ])) {
$bridgedEnable = 1 ;
}
} else {
if ( isset ( $_POST [ 'bridgedEnable' ])) {
$bridgedEnable = 1 ;
}
}
2020-03-12 22:02:26 +01:00
// Check for WiFi client AP mode checkbox
$wifiAPEnable = 0 ;
if ( $bridgedEnable == 0 ) { // enable client mode actions when not bridged
if ( $arrHostapdConf [ 'WifiAPEnable' ] == 0 ) {
if ( isset ( $_POST [ 'wifiAPEnable' ])) {
$wifiAPEnable = 1 ;
}
} else {
if ( isset ( $_POST [ 'wifiAPEnable' ])) {
$wifiAPEnable = 1 ;
}
}
}
2019-04-10 10:37:35 +02:00
// Check for Logfile output checkbox
$logEnable = 0 ;
if ( $arrHostapdConf [ 'LogEnable' ] == 0 ) {
if ( isset ( $_POST [ 'logEnable' ])) {
$logEnable = 1 ;
2020-06-07 15:23:40 +02:00
exec ( 'sudo ' . RASPI_CONFIG . '/hostapd/enablelog.sh' );
2019-04-10 10:37:35 +02:00
} else {
2020-06-07 15:23:40 +02:00
exec ( 'sudo ' . RASPI_CONFIG . '/hostapd/disablelog.sh' );
2019-04-10 10:37:35 +02:00
}
2019-03-12 00:47:09 +01:00
} else {
2019-04-10 10:37:35 +02:00
if ( isset ( $_POST [ 'logEnable' ])) {
$logEnable = 1 ;
2020-06-07 15:23:40 +02:00
exec ( 'sudo ' . RASPI_CONFIG . '/hostapd/enablelog.sh' );
2019-04-10 10:37:35 +02:00
} else {
2020-06-07 15:23:40 +02:00
exec ( 'sudo ' . RASPI_CONFIG . '/hostapd/disablelog.sh' );
2019-04-10 10:37:35 +02:00
}
2019-03-12 00:47:09 +01:00
}
2020-12-05 10:14:07 +01:00
// set AP interface default, override for ap-sta & bridged options
2021-02-02 08:36:28 +01:00
$ap_iface = $_POST [ 'interface' ]; // the hostap AP interface
$cli_iface = $_POST [ 'interface' ]; // the wifi client interface
$session_iface = $_POST [ 'interface' ]; // the interface that the UI needs to monitor for data usage etc.
if ( $wifiAPEnable ) { // for AP-STA we monitor the uap0 interface, which is always the ap interface.
$ap_iface = 'uap0' ;
$session_iface = 'uap0' ;
}
if ( $bridgedEnable ) { // for bridged mode we monitor the bridge, but keep the selected interface as AP.
$session_iface = 'br0' ;
$cli_iface = 'br0' ;
}
2020-03-12 22:02:26 +01:00
2020-12-04 23:36:54 +01:00
// persist user options to /etc/raspap
2019-04-10 10:37:35 +02:00
$cfg = [];
2021-02-02 08:36:28 +01:00
$cfg [ 'WifiInterface' ] = $ap_iface ;
2019-04-10 10:37:35 +02:00
$cfg [ 'LogEnable' ] = $logEnable ;
2020-03-12 22:02:26 +01:00
// Save previous Client mode status when Bridged
2020-12-04 22:41:10 +01:00
$cfg [ 'WifiAPEnable' ] = ( $bridgedEnable == 1 ? $arrHostapdConf [ 'WifiAPEnable' ] : $wifiAPEnable );
2020-03-10 09:42:08 +01:00
$cfg [ 'BridgedEnable' ] = $bridgedEnable ;
2021-02-02 08:36:28 +01:00
$cfg [ 'WifiManaged' ] = $cli_iface ;
2020-06-07 15:23:40 +02:00
write_php_ini ( $cfg , RASPI_CONFIG . '/hostapd.ini' );
2021-02-02 08:36:28 +01:00
$_SESSION [ 'ap_interface' ] = $session_iface ;
2019-04-10 10:37:35 +02:00
// Verify input
if ( empty ( $_POST [ 'ssid' ]) || strlen ( $_POST [ 'ssid' ]) > 32 ) {
$status -> addMessage ( 'SSID must be between 1 and 32 characters' , 'danger' );
$good_input = false ;
2019-03-12 00:47:09 +01:00
}
2019-03-06 19:42:13 +01:00
2021-05-07 12:33:17 +02:00
# NB: A pass-phrase is a sequence of between 8 and 63 ASCII-encoded characters (IEEE Std. 802.11i-2004)
# Each character in the pass-phrase must have an encoding in the range of 32 to 126 (decimal). (IEEE Std. 802.11i-2004, Annex H.4.1)
if ( $_POST [ 'wpa' ] !== 'none' && ( strlen ( $_POST [ 'wpa_passphrase' ]) < 8 || strlen ( $_POST [ 'wpa_passphrase' ]) > 63 )) {
2019-04-10 10:37:35 +02:00
$status -> addMessage ( 'WPA passphrase must be between 8 and 63 characters' , 'danger' );
$good_input = false ;
2021-05-07 12:33:17 +02:00
} elseif ( ! ctype_print ( $_POST [ 'wpa_passphrase' ])) {
$status -> addMessage ( 'WPA passphrase must be comprised of printable ASCII characters' , 'danger' );
$good_input = false ;
2019-04-10 10:37:35 +02:00
}
2019-03-12 00:47:09 +01:00
2019-04-10 10:37:35 +02:00
if ( isset ( $_POST [ 'hiddenSSID' ])) {
if ( ! is_int (( int ) $_POST [ 'hiddenSSID' ])) {
$status -> addMessage ( 'Parameter hiddenSSID not a number.' , 'danger' );
$good_input = false ;
} elseif (( int ) $_POST [ 'hiddenSSID' ] < 0 || ( int ) $_POST [ 'hiddenSSID' ] >= 3 ) {
$status -> addMessage ( 'Parameter hiddenSSID contains invalid configuratie value.' , 'danger' );
$good_input = false ;
} else {
$ignore_broadcast_ssid = $_POST [ 'hiddenSSID' ];
}
2019-03-12 00:47:09 +01:00
} else {
2019-04-10 10:37:35 +02:00
$ignore_broadcast_ssid = '0' ;
2019-03-12 00:47:09 +01:00
}
2019-04-10 10:37:35 +02:00
if ( ! in_array ( $_POST [ 'interface' ], $interfaces )) {
$status -> addMessage ( 'Unknown interface ' . htmlspecialchars ( $_POST [ 'interface' ], ENT_QUOTES ), 'danger' );
$good_input = false ;
2019-03-12 00:47:09 +01:00
}
2019-04-10 10:37:35 +02:00
if ( strlen ( $_POST [ 'country_code' ]) !== 0 && strlen ( $_POST [ 'country_code' ]) != 2 ) {
$status -> addMessage ( 'Country code must be blank or two characters' , 'danger' );
$good_input = false ;
}
2020-09-11 20:03:14 +02:00
if ( isset ( $_POST [ 'beaconintervalEnable' ])) {
if ( ! is_numeric ( $_POST [ 'beacon_interval' ])) {
$status -> addMessage ( 'Beacon interval must be a numeric value' , 'danger' );
$good_input = false ;
} elseif ( $_POST [ 'beacon_interval' ] < 15 || $_POST [ 'beacon_interval' ] > 65535 ) {
$status -> addMessage ( 'Beacon interval must be between 15 and 65535' , 'danger' );
$good_input = false ;
}
}
2019-08-01 22:32:44 +02:00
$_POST [ 'max_num_sta' ] = ( int ) $_POST [ 'max_num_sta' ];
$_POST [ 'max_num_sta' ] = $_POST [ 'max_num_sta' ] > 2007 ? 2007 : $_POST [ 'max_num_sta' ];
$_POST [ 'max_num_sta' ] = $_POST [ 'max_num_sta' ] < 1 ? null : $_POST [ 'max_num_sta' ];
2019-04-10 10:37:35 +02:00
if ( $good_input ) {
2021-02-02 08:36:28 +01:00
$return = updateHostapdConfig ( $ignore_broadcast_ssid , $wifiAPEnable , $bridgedEnable );
2019-04-10 10:37:35 +02:00
2019-11-04 10:40:23 +01:00
// Fetch dhcp-range, lease time from system config
2020-12-01 23:52:15 +01:00
$syscfg = parse_ini_file ( RASPI_DNSMASQ_PREFIX . $ap_iface . '.conf' , false , INI_SCANNER_RAW );
2019-09-08 17:28:01 +02:00
2019-04-10 10:37:35 +02:00
if ( $wifiAPEnable == 1 ) {
2020-12-05 10:14:07 +01:00
// Enable uap0 configuration for ap-sta mode
// Set dhcp-range from system config, fallback to default if undefined
$dhcp_range = ( $syscfg [ 'dhcp-range' ] == '' ) ? getDefaultNetValue ( 'dnsmasq' , 'uap0' , 'dhcp-range' ) : $syscfg [ 'dhcp-range' ];
2020-12-01 23:52:15 +01:00
$config = [ '# RaspAP uap0 configuration' ];
$config [] = 'interface=lo,uap0 # Enable uap0 interface for wireless client AP mode' ;
$config [] = 'bind-dynamic # Hybrid between --bind-interfaces and default' ;
$config [] = 'server=8.8.8.8 # Forward DNS requests to Google DNS' ;
$config [] = 'domain-needed # Don\'t forward short names' ;
$config [] = 'bogus-priv # Never forward addresses in the non-routed address spaces' ;
$config [] = 'dhcp-range=' . $dhcp_range ;
if ( ! empty ( $syscfg [ 'dhcp-option' ])) {
$config [] = 'dhcp-option=' . $syscfg [ 'dhcp-option' ];
2019-11-04 10:40:23 +01:00
}
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL ;
scanConfigDir ( '/etc/dnsmasq.d/' , 'uap0' , $status );
$config = join ( PHP_EOL , $config );
file_put_contents ( " /tmp/dnsmasqdata " , $config );
system ( 'sudo cp /tmp/dnsmasqdata ' . RASPI_DNSMASQ_PREFIX . $ap_iface . '.conf' , $return );
} elseif ( $bridgedEnable !== 1 ) {
2020-12-05 10:14:07 +01:00
$dhcp_range = ( $syscfg [ 'dhcp-range' ] == '' ) ? getDefaultNetValue ( 'dnsmasq' , 'wlan0' , 'dhcp-range' ) : $syscfg [ 'dhcp-range' ];
2020-12-01 23:52:15 +01:00
$config = [ '# RaspAP ' . $_POST [ 'interface' ] . ' configuration' ];
$config [] = 'interface=' . $_POST [ 'interface' ];
$config [] = 'domain-needed' ;
$config [] = 'dhcp-range=' . $dhcp_range ;
if ( ! empty ( $syscfg [ 'dhcp-option' ])) {
$config [] = 'dhcp-option=' . $syscfg [ 'dhcp-option' ];
2019-11-04 10:40:23 +01:00
}
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL ;
$config = join ( PHP_EOL , $config );
file_put_contents ( " /tmp/dnsmasqdata " , $config );
system ( 'sudo cp /tmp/dnsmasqdata ' . RASPI_DNSMASQ_PREFIX . $ap_iface . '.conf' , $return );
2019-04-10 10:37:35 +02:00
}
2020-12-01 23:52:15 +01:00
// Set dhcp values from system config, fallback to default if undefined
2020-12-05 10:14:07 +01:00
$jsonData = json_decode ( getNetConfig ( $ap_iface ), true );
2020-12-06 18:31:03 +01:00
$ip_address = ( $jsonData [ 'StaticIP' ] == '' ) ? getDefaultNetValue ( 'dhcp' , $ap_iface , 'static ip_address' ) : $jsonData [ 'StaticIP' ];
2022-01-04 19:02:12 +01:00
$domain_name_server = ( $jsonData [ 'StaticDNS' ] == '' ) ? getDefaultNetValue ( 'dhcp' , 'wlan0' , 'static domain_name_server' ) : $jsonData [ 'StaticDNS' ];
2020-12-06 18:31:03 +01:00
$routers = ( $jsonData [ 'StaticRouters' ] == '' ) ? getDefaultNetValue ( 'dhcp' , $ap_iface , 'static routers' ) : $jsonData [ 'StaticRouters' ];
$netmask = ( $jsonData [ 'SubnetMask' ] == '' || $jsonData [ 'SubnetMask' ] == '0.0.0.0' ) ? getDefaultNetValue ( 'dhcp' , $ap_iface , 'subnetmask' ) : $jsonData [ 'SubnetMask' ];
$ip_address .= ( ! preg_match ( '/.*\/\d+/' , $ip_address )) ? '/' . mask2cidr ( $netmask ) : null ;
2020-03-10 09:42:08 +01:00
if ( $bridgedEnable == 1 ) {
2021-04-20 16:19:00 +02:00
$config = array_keys ( getDefaultNetOpts ( 'dhcp' , 'options' ));
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL . '# RaspAP br0 configuration' ;
2020-03-10 09:42:08 +01:00
$config [] = 'denyinterfaces eth0 wlan0' ;
2021-02-21 11:28:55 +01:00
$config [] = 'interface br0' ;
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL ;
2020-03-10 09:42:08 +01:00
} elseif ( $wifiAPEnable == 1 ) {
2021-04-20 16:19:00 +02:00
$config = array_keys ( getDefaultNetOpts ( 'dhcp' , 'options' ));
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL . '# RaspAP uap0 configuration' ;
$config [] = 'interface uap0' ;
2020-02-28 18:51:33 +01:00
$config [] = 'static ip_address=' . $ip_address ;
$config [] = 'nohook wpa_supplicant' ;
2020-12-04 15:40:54 +01:00
$config [] = PHP_EOL ;
2019-04-10 10:37:35 +02:00
} else {
2020-05-12 09:10:54 +02:00
$def_ip = array ();
2022-01-04 19:02:12 +01:00
$config = [ '# RaspAP ' . $ap_iface . ' configuration' ];
$config [] = 'interface ' . $ap_iface ;
2020-02-28 18:51:33 +01:00
$config [] = 'static ip_address=' . $ip_address ;
2020-12-01 23:52:15 +01:00
$config [] = 'static routers=' . $routers ;
2020-02-28 18:51:33 +01:00
$config [] = 'static domain_name_server=' . $domain_name_server ;
2020-12-04 15:40:54 +01:00
if ( ! is_null ( $jsonData [ 'Metric' ])) { $config [] = 'metric ' . $jsonData [ 'Metric' ]; }
2020-05-12 09:10:54 +02:00
}
2020-11-19 13:34:55 +01:00
$dhcp_cfg = file_get_contents ( RASPI_DHCPCD_CONFIG );
2020-12-04 15:40:54 +01:00
if ( $bridgedEnable == 1 || $wifiAPEnable == 1 ) {
$dhcp_cfg = join ( PHP_EOL , $config );
$status -> addMessage ( 'DHCP configuration for ' . $ap_iface . ' enabled.' , 'success' );
} elseif ( ! preg_match ( '/^interface\s' . $ap_iface . '$/m' , $dhcp_cfg )) {
2020-12-01 23:52:15 +01:00
$config [] = PHP_EOL ;
$config = join ( PHP_EOL , $config );
2020-12-04 15:40:54 +01:00
$dhcp_cfg = removeDHCPIface ( $dhcp_cfg , 'br0' );
$dhcp_cfg = removeDHCPIface ( $dhcp_cfg , 'uap0' );
2020-12-01 23:52:15 +01:00
$dhcp_cfg .= $config ;
$status -> addMessage ( 'DHCP configuration for ' . $ap_iface . ' added.' , 'success' );
} else {
$config = join ( PHP_EOL , $config );
2020-12-04 15:40:54 +01:00
$dhcp_cfg = removeDHCPIface ( $dhcp_cfg , 'br0' );
$dhcp_cfg = removeDHCPIface ( $dhcp_cfg , 'uap0' );
2020-12-01 23:52:15 +01:00
$dhcp_cfg = preg_replace ( '/^#\sRaspAP\s' . $ap_iface . '\s.*?(?=\s*^\s*$)/ms' , $config , $dhcp_cfg , 1 );
$status -> addMessage ( 'DHCP configuration for ' . $ap_iface . ' updated.' , 'success' );
}
file_put_contents ( " /tmp/dhcpddata " , $dhcp_cfg );
2019-04-10 10:37:35 +02:00
system ( 'sudo cp /tmp/dhcpddata ' . RASPI_DHCPCD_CONFIG , $return );
if ( $return == 0 ) {
$status -> addMessage ( 'Wifi Hotspot settings saved' , 'success' );
} else {
$status -> addMessage ( 'Unable to save wifi hotspot settings' , 'danger' );
}
2016-08-05 22:38:02 +02:00
} else {
2019-04-10 10:37:35 +02:00
$status -> addMessage ( 'Unable to save wifi hotspot settings' , 'danger' );
return false ;
2016-07-27 22:48:27 +02:00
}
2019-04-10 10:37:35 +02:00
return true ;
2016-07-27 22:48:27 +02:00
}
2020-12-04 23:36:54 +01:00
/**
* Updates a hostapd configuration
*
* @ return boolean $result
*/
2021-01-06 08:48:46 +01:00
function updateHostapdConfig ( $ignore_broadcast_ssid , $wifiAPEnable , $bridgedEnable )
2020-12-04 23:36:54 +01:00
{
// Fixed values
$country_code = $_POST [ 'country_code' ];
$config = 'driver=nl80211' . PHP_EOL ;
$config .= 'ctrl_interface=' . RASPI_HOSTAPD_CTRL_INTERFACE . PHP_EOL ;
$config .= 'ctrl_interface_group=0' . PHP_EOL ;
$config .= 'auth_algs=1' . PHP_EOL ;
$config .= 'wpa_key_mgmt=WPA-PSK' . PHP_EOL ;
if ( isset ( $_POST [ 'beaconintervalEnable' ])) {
$config .= 'beacon_int=' . $_POST [ 'beacon_interval' ] . PHP_EOL ;
}
if ( isset ( $_POST [ 'disassoc_low_ackEnable' ])) {
$config .= 'disassoc_low_ack=0' . PHP_EOL ;
}
$config .= 'ssid=' . $_POST [ 'ssid' ] . PHP_EOL ;
$config .= 'channel=' . $_POST [ 'channel' ] . PHP_EOL ;
if ( $_POST [ 'hw_mode' ] === 'n' ) {
$config .= 'hw_mode=g' . PHP_EOL ;
$config .= 'ieee80211n=1' . PHP_EOL ;
// Enable basic Quality of service
$config .= 'wmm_enabled=1' . PHP_EOL ;
} elseif ( $_POST [ 'hw_mode' ] === 'ac' ) {
$config .= 'hw_mode=a' . PHP_EOL . PHP_EOL ;
$config .= '# N' . PHP_EOL ;
$config .= 'ieee80211n=1' . PHP_EOL ;
$config .= 'require_ht=1' . PHP_EOL ;
$config .= 'ht_capab=[MAX-AMSDU-3839][HT40+][SHORT-GI-20][SHORT-GI-40][DSSS_CCK-40]' . PHP_EOL . PHP_EOL ;
$config .= '# AC' . PHP_EOL ;
$config .= 'ieee80211ac=1' . PHP_EOL ;
$config .= 'require_vht=1' . PHP_EOL ;
$config .= 'ieee80211d=0' . PHP_EOL ;
$config .= 'ieee80211h=0' . PHP_EOL ;
$config .= 'vht_capab=[MAX-AMSDU-3839][SHORT-GI-80]' . PHP_EOL ;
$config .= 'vht_oper_chwidth=1' . PHP_EOL ;
$config .= 'vht_oper_centr_freq_seg0_idx=42' . PHP_EOL . PHP_EOL ;
} elseif ( $_POST [ 'hw_mode' ] === 'w' ) {
$config .= 'ieee80211w=2' . PHP_EOL ;
$config .= 'wpa_key_mgmt=WPA-EAP-SHA256' . PHP_EOL ;
} else {
$config .= 'hw_mode=' . $_POST [ 'hw_mode' ] . PHP_EOL ;
$config .= 'ieee80211n=0' . PHP_EOL ;
}
if ( $_POST [ 'wpa' ] !== 'none' ) {
$config .= 'wpa_passphrase=' . $_POST [ 'wpa_passphrase' ] . PHP_EOL ;
}
if ( $wifiAPEnable == 1 ) {
$config .= 'interface=uap0' . PHP_EOL ;
} elseif ( $bridgedEnable == 1 ) {
$config .= 'interface=' . $_POST [ 'interface' ] . PHP_EOL ;
$config .= 'bridge=br0' . PHP_EOL ;
} else {
2020-12-20 17:46:57 +01:00
$config .= 'interface=' . $_SESSION [ 'ap_interface' ] . PHP_EOL ;
2020-12-04 23:36:54 +01:00
}
$config .= 'wpa=' . $_POST [ 'wpa' ] . PHP_EOL ;
$config .= 'wpa_pairwise=' . $_POST [ 'wpa_pairwise' ] . PHP_EOL ;
$config .= 'country_code=' . $_POST [ 'country_code' ] . PHP_EOL ;
$config .= 'ignore_broadcast_ssid=' . $ignore_broadcast_ssid . PHP_EOL ;
if ( isset ( $_POST [ 'max_num_sta' ])) {
$config .= 'max_num_sta=' . $_POST [ 'max_num_sta' ] . PHP_EOL ;
}
file_put_contents ( " /tmp/hostapddata " , $config );
system ( " sudo cp /tmp/hostapddata " . RASPI_HOSTAPD_CONFIG , $result );
return $result ;
}