From 836444105e80e0adaf6d723bb572c707c1c69f5c Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 18:34:54 +0100 Subject: [PATCH 01/10] Remove hostapd logging scripts (deprecated) --- installers/disablelog.sh | 3 --- installers/enablelog.sh | 3 --- 2 files changed, 6 deletions(-) delete mode 100755 installers/disablelog.sh delete mode 100755 installers/enablelog.sh diff --git a/installers/disablelog.sh b/installers/disablelog.sh deleted file mode 100755 index 4272b88f..00000000 --- a/installers/disablelog.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -/bin/sed -i 's|DAEMON_OPTS=" -f /tmp/hostapd.log"|#DAEMON_OPTS=""|' /etc/default/hostapd - diff --git a/installers/enablelog.sh b/installers/enablelog.sh deleted file mode 100755 index 84a714b8..00000000 --- a/installers/enablelog.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -/bin/sed -i 's|#DAEMON_OPTS=""|DAEMON_OPTS=" -f /tmp/hostapd.log"|' /etc/default/hostapd -touch /tmp/hostapd.log From 2e2438b04544bd8fa0e5ef79f914dab781677d92 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 18:35:48 +0100 Subject: [PATCH 02/10] Remove copy logging shell scripts (deprecated) --- installers/common.sh | 3 --- 1 file changed, 3 deletions(-) diff --git a/installers/common.sh b/installers/common.sh index 12df56ff..c8e41ff6 100644 --- a/installers/common.sh +++ b/installers/common.sh @@ -325,9 +325,6 @@ function _create_hostapd_scripts() { _install_log "Creating hostapd logging & control scripts" sudo mkdir $raspap_dir/hostapd || _install_status 1 "Unable to create directory '$raspap_dir/hostapd'" - # Copy logging shell scripts - sudo cp "$webroot_dir/installers/"enablelog.sh "$raspap_dir/hostapd" || _install_status 1 "Unable to move logging scripts" - sudo cp "$webroot_dir/installers/"disablelog.sh "$raspap_dir/hostapd" || _install_status 1 "Unable to move logging scripts" # Copy service control shell scripts sudo cp "$webroot_dir/installers/"servicestart.sh "$raspap_dir/hostapd" || _install_status 1 "Unable to move service control scripts" # Change ownership and permissions of hostapd control scripts From de188cd8fc7ff544909a5697b904d17604bae398 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:31:02 +0100 Subject: [PATCH 03/10] Remove RASPI_HOSTAPD_LOG (deprecated) --- config/config.php | 1 - includes/defaults.php | 1 - 2 files changed, 2 deletions(-) diff --git a/config/config.php b/config/config.php index 546441e6..e9a41827 100755 --- a/config/config.php +++ b/config/config.php @@ -23,7 +23,6 @@ define('RASPI_ADBLOCK_CONFIG', RASPI_DNSMASQ_PREFIX.'adblock.conf'); define('RASPI_HOSTAPD_CONFIG', '/etc/hostapd/hostapd.conf'); define('RASPI_DHCPCD_CONFIG', '/etc/dhcpcd.conf'); define('RASPI_DHCPCD_LOG', '/var/log/dnsmasq.log'); -define('RASPI_HOSTAPD_LOG', '/tmp/hostapd.log'); define('RASPI_WPA_SUPPLICANT_CONFIG', '/etc/wpa_supplicant/wpa_supplicant.conf'); define('RASPI_HOSTAPD_CTRL_INTERFACE', '/var/run/hostapd'); define('RASPI_WPA_CTRL_INTERFACE', '/var/run/wpa_supplicant'); diff --git a/includes/defaults.php b/includes/defaults.php index 7a64fa72..fc276727 100755 --- a/includes/defaults.php +++ b/includes/defaults.php @@ -28,7 +28,6 @@ $defaults = [ 'RASPI_HOSTAPD_CONFIG' => '/etc/hostapd/hostapd.conf', 'RASPI_DHCPCD_CONFIG' => '/etc/dhcpcd.conf', 'RASPI_DHCPCD_LOG' => '/var/log/dnsmasq.log', - 'RASPI_HOSTAPD_LOG' => '/tmp/hostapd.log', 'RASPI_WPA_SUPPLICANT_CONFIG' => '/etc/wpa_supplicant/wpa_supplicant.conf', 'RASPI_HOSTAPD_CTRL_INTERFACE' => '/var/run/hostapd', 'RASPI_WPA_CTRL_INTERFACE' => '/var/run/wpa_supplicant', From e5c162ddcf2d38ba1ec04784a7ce716e58aa45fd Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:32:09 +0100 Subject: [PATCH 04/10] Revise fetch hostapd logs w/ hotspot->getHostapdLogs() --- includes/hostapd.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/includes/hostapd.php b/includes/hostapd.php index 29c33e35..a074709d 100755 --- a/includes/hostapd.php +++ b/includes/hostapd.php @@ -135,15 +135,22 @@ function DisplayHostAPDConfig() } } + // fetch hostapd logs if enabled + $logOutput = []; + if (!empty($arrHostapdConf['LogEnable']) && (int)$arrHostapdConf['LogEnable'] === 1) { + $logResult = $hotspot->getHostapdLogs(5000); + if ($logResult['success']) { + $joined = implode("\n", $logResult['logs']); + $limited = getLogLimited('', $joined); + $logOutput = explode("\n", $limited); + } + } + // assign disassoc_low_ack boolean if value is set $arrConfig['disassoc_low_ack_bool'] = isset($arrConfig['disassoc_low_ack']) ? 1 : 0; $hostapdstatus = $system->hostapdStatus(); $serviceStatus = $hostapdstatus[0] == 0 ? "down" : "up"; - // ensure log is writeable - exec('sudo /bin/chmod o+r '.RASPI_HOSTAPD_LOG); - $logdata = getLogLimited(RASPI_HOSTAPD_LOG); - echo renderTemplate( "hostapd", compact( "status", @@ -161,7 +168,7 @@ function DisplayHostAPDConfig() "arrHostapdConf", "operatingSystem", "countryCodes", - "logdata" + "logOutput" ) ); } From efc2dbc13612a0cbdd169c6af7b0d32572c1b807 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:32:34 +0100 Subject: [PATCH 05/10] Update w/ /usr/bin/journalctl -u hostapd.service * --- installers/raspap.sudoers | 1 + 1 file changed, 1 insertion(+) diff --git a/installers/raspap.sudoers b/installers/raspap.sudoers index b7a8a589..63b12506 100644 --- a/installers/raspap.sudoers +++ b/installers/raspap.sudoers @@ -90,3 +90,4 @@ www-data ALL=(ALL) NOPASSWD:/etc/raspap/plugins/plugin_helper.sh www-data ALL=(ALL) NOPASSWD:/bin/systemctl start raspap-network-activity@*.service www-data ALL=(ALL) NOPASSWD:/bin/systemctl stop raspap-network-activity@*.service www-data ALL=(ALL) NOPASSWD:/bin/cp /tmp/wpa_conf_* /etc/wpa_supplicant/wpa_supplicant.conf +www-data ALL=(ALL) NOPASSWD:/usr/bin/journalctl -u hostapd.service * From 352008b96644636de15f36ca41daa921694e72d8 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:33:08 +0100 Subject: [PATCH 06/10] Update template w/ $logOutput --- templates/hostapd/logging.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/hostapd/logging.php b/templates/hostapd/logging.php index 3948bc4d..facd8365 100644 --- a/templates/hostapd/logging.php +++ b/templates/hostapd/logging.php @@ -14,7 +14,7 @@
'.htmlspecialchars($logdata, ENT_QUOTES).''; + echo ''; } else { echo ''; } From b451971c46726acd2505e04a7614b6974e1ec2a5 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:34:25 +0100 Subject: [PATCH 07/10] Replace enable/disable log scripts (deprecated) w/ logger_syslog=-1 --- .../Networking/Hotspot/HostapdManager.php | 30 ++++--------------- 1 file changed, 6 insertions(+), 24 deletions(-) diff --git a/src/RaspAP/Networking/Hotspot/HostapdManager.php b/src/RaspAP/Networking/Hotspot/HostapdManager.php index c9d0a5ef..0caa1523 100644 --- a/src/RaspAP/Networking/Hotspot/HostapdManager.php +++ b/src/RaspAP/Networking/Hotspot/HostapdManager.php @@ -225,6 +225,12 @@ class HostapdManager $config[] = 'max_num_sta=' . (int)$params['max_num_sta']; } + // add logging configuration if enabled + if (!empty($params['log_enable'])) { + $config[] = 'logger_syslog=-1'; + $config[] = 'logger_syslog_level=0'; + } + // optional additional user config $config[] = $this->parseUserHostapdCfg(); @@ -325,17 +331,6 @@ class HostapdManager return [$apIface, $cliIface, $sessionIface]; } - /** - * Enables or disables hostapd logging - * - * @param int $logEnable - */ - private function handleLogState(int $logEnable): void - { - $script = $logEnable === 1 ? 'enablelog.sh' : 'disablelog.sh'; - exec('sudo ' . RASPI_CONFIG . '/hostapd/' . $script); - } - /** * Parses optional /etc/hostapd/hostapd.conf.users file * @@ -415,8 +410,6 @@ class HostapdManager */ public function persistHostapdIni(array $states, string $apIface, string $cliIface, array $previousIni = []): bool { - $this->applyLogState($states['LogEnable']); - // compose new ini payload $cfg = [ 'WifiInterface' => $apIface, @@ -435,17 +428,6 @@ class HostapdManager return write_php_ini($cfg, RASPI_CONFIG . '/hostapd.ini'); } - /** - * Enables or disables hostapd logging - * - * @param int $logEnable 1 = enable, 0 = disable - */ - private function applyLogState(int $logEnable): void - { - $script = $logEnable === 1 ? 'enablelog.sh' : 'disablelog.sh'; - exec('sudo ' . RASPI_CONFIG . '/hostapd/' . $script); - } - /** * Returns a count of hostapd-.conf files * From 95229fd1b7dd1e9ce8c94d2d8c6577707e5ed9a0 Mon Sep 17 00:00:00 2001 From: billz Date: Sun, 16 Nov 2025 21:34:48 +0100 Subject: [PATCH 08/10] Add public method getHostapdLogs() --- .../Networking/Hotspot/HotspotService.php | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/RaspAP/Networking/Hotspot/HotspotService.php b/src/RaspAP/Networking/Hotspot/HotspotService.php index 2f6a3c60..1fff4bde 100644 --- a/src/RaspAP/Networking/Hotspot/HotspotService.php +++ b/src/RaspAP/Networking/Hotspot/HotspotService.php @@ -351,6 +351,36 @@ class HotspotService return array_values($interfaces); } + /** + * Retrieves hostapd service logs from systemd journal + * + * @param int $lines number of log lines to retrieve (default: 100, max: 1000) + * @param bool $follow return command for real-time following (tbd) + * @return array ['success' => bool, 'logs' => array, 'command' => string] + */ + public function getHostapdLogs(int $lines = 100, bool $follow = false): array + { + // sanitize and limit line count + $lines = max(1, min(1000, $lines)); + + if ($follow) { + return [ + 'success' => true, + 'logs' => [], + 'command' => 'journalctl -u hostapd.service -f --no-pager' + ]; + } + + $cmd = sprintf('sudo journalctl -u hostapd.service -n %d --no-pager 2>&1', $lines); + exec($cmd, $output, $status); + + return [ + 'success' => $status === 0, + 'logs' => $output, + 'line_count' => count($output) + ]; + } + /** * Starts services for given interface * From 49ee0751d062fc27c8e81c1b02df50fa2e231be6 Mon Sep 17 00:00:00 2001 From: billz Date: Mon, 17 Nov 2025 09:55:54 +0100 Subject: [PATCH 09/10] Reload .ini after save, fix LogEnable condition --- includes/hostapd.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/includes/hostapd.php b/includes/hostapd.php index a074709d..58b2d9fc 100755 --- a/includes/hostapd.php +++ b/includes/hostapd.php @@ -45,8 +45,10 @@ function DisplayHostAPDConfig() } else { $interface = $_SESSION['ap_interface']; } + $txpower = $hotspot->getTxPower($interface); $arrHostapdConf = $hotspot->getHostapdIni(); + $logOutput = []; if (!RASPI_MONITOR_ENABLED) { if (isset($_POST['StartHotspot']) || isset($_POST['RestartHotspot'])) { @@ -77,6 +79,10 @@ function DisplayHostAPDConfig() $reg_domain, $status ); + + // reload hostapi.ini + $arrHostapdConf = $hotspot->getHostapdIni(); + } elseif (isset($_POST['StopHotspot'])) { $status->addMessage('Attempting to stop hotspot', 'info'); exec('sudo /bin/systemctl stop hostapd.service', $return); @@ -136,8 +142,7 @@ function DisplayHostAPDConfig() } // fetch hostapd logs if enabled - $logOutput = []; - if (!empty($arrHostapdConf['LogEnable']) && (int)$arrHostapdConf['LogEnable'] === 1) { + if ((string)$arrHostapdConf['LogEnable'] === "1") { $logResult = $hotspot->getHostapdLogs(5000); if ($logResult['success']) { $joined = implode("\n", $logResult['logs']); From ee776f2a2e7c7a570edefd4c4cc4842ea145cbd3 Mon Sep 17 00:00:00 2001 From: billz Date: Mon, 17 Nov 2025 14:09:53 +0100 Subject: [PATCH 10/10] Update en_US locale messages --- locale/en_US/LC_MESSAGES/messages.mo | Bin 84323 -> 84793 bytes locale/en_US/LC_MESSAGES/messages.po | 21 +++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/locale/en_US/LC_MESSAGES/messages.mo b/locale/en_US/LC_MESSAGES/messages.mo index 552a4644174bd212dea7c53217e6157113f752be..58e9c5be38de2df7c3b50b5debcd3691be3637d7 100644 GIT binary patch delta 19794 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 M$9e?+e=*Yk2jpv3zW@LL delta 19350 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