0) $configs[$key] = $value; } } //Load the DStarRepeater config file $configdstar = array(); if ($configdstarfile = fopen('/etc/dstarrepeater','r')) { while ($line1 = fgets($configdstarfile)) { if (strpos($line1, '=') !== false) { list($key1,$value1) = preg_split('/=/',$line1); $value1 = trim(str_replace('"','',$value1)); if (strlen($value1) > 0) $configdstar[$key1] = $value1; } } } //Load the dmrgateway config file $dmrGatewayConfigFile = '/etc/dmrgateway'; if (fopen($dmrGatewayConfigFile,'r')) { $configdmrgateway = parse_ini_file($dmrGatewayConfigFile, true); } //Load the dapnetgateway config file $dapnetGatewayConfigFile = '/etc/dapnetgateway'; if (fopen($dapnetGatewayConfigFile,'r')) { $configdapnetgateway = parse_ini_file($dapnetGatewayConfigFile, true); } // Load the ysf2dmr config file if (file_exists('/etc/ysf2dmr')) { $ysf2dmrConfigFile = '/etc/ysf2dmr'; if (fopen($ysf2dmrConfigFile,'r')) { $configysf2dmr = parse_ini_file($ysf2dmrConfigFile, true); } } // Load the ysf2nxdn config file if (file_exists('/etc/ysf2nxdn')) { $ysf2nxdnConfigFile = '/etc/ysf2nxdn'; if (fopen($ysf2nxdnConfigFile,'r')) { $configysf2nxdn = parse_ini_file($ysf2nxdnConfigFile, true); } } // Load the ysf2p25 config file if (file_exists('/etc/ysf2p25')) { $ysf2p25ConfigFile = '/etc/ysf2p25'; if (fopen($ysf2p25ConfigFile,'r')) { $configysf2p25 = parse_ini_file($ysf2p25ConfigFile, true); } } // Load the dmr2ysf config file if (file_exists('/etc/dmr2ysf')) { $dmr2ysfConfigFile = '/etc/dmr2ysf'; if (fopen($dmr2ysfConfigFile,'r')) { $configdmr2ysf = parse_ini_file($dmr2ysfConfigFile, true); } } // Load the dmr2nxdn config file if (file_exists('/etc/dmr2nxdn')) { $dmr2nxdnConfigFile = '/etc/dmr2nxdn'; if (fopen($dmr2nxdnConfigFile,'r')) { $configdmr2nxdn = parse_ini_file($dmr2nxdnConfigFile, true); } } ?>


TX " . htmlspecialchars((string)$listElem[1], ENT_QUOTES, 'UTF-8') . ""; } else { if (getActualMode($lastHeard, $mmdvmconfigs) === 'idle') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === NULL) { if (isProcessRunning("MMDVMHost")) { echo ""; } else { echo ""; } } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'D-Star') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'D-Star') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'DMR') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'DMR') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'YSF') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'YSF') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'P25') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'P25') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'NXDN') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'NXDN') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'M17') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'M17') { echo ""; } elseif ($listElem[2] && $listElem[6] == null && getActualMode($lastHeard, $mmdvmconfigs) === 'FM') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'FM') { echo ""; } elseif (getActualMode($lastHeard, $mmdvmconfigs) === 'POCSAG') { echo ""; } else { // getActualMode() returns log-derived strings; // escape before HTML interpolation. echo ""; } } } else { echo ""; } ?>'."\n"; } ?> '."\n"; } ?>
TrxListeningListeningOFFLINERX D-StarListening D-StarRX DMRListening DMRRX YSFListening YSFRX P25Listening P25RX NXDNListening NXDNRX M17Listening M17RX FMListening FMPOCSAG" . htmlspecialchars((string)getActualMode($lastHeard, $mmdvmconfigs), ENT_QUOTES, 'UTF-8') . "
Tx
Rx
FW'.htmlspecialchars((string)$fwVersion, ENT_QUOTES, 'UTF-8').'
TCXO'.htmlspecialchars((string)$tcxoFreq, ENT_QUOTES, 'UTF-8').'
\n"; echo "\n"; echo "\n"; // Config values from /etc/dstarrepeater and /etc/ircddbgateway // — operator-controlled, but defensive escape before HTML // interpolation. The legacy ` ` substitution stays but // runs AFTER the htmlspecialchars so the entity isn't double- // encoded. echo "\n"; echo "\n"; echo "\n"; if ($configs['aprsEnabled']) { echo "\n"; } if ($configs['ircddbEnabled']) { echo "\n"; } // getActualLink() returns log-parsed strings (DMR talkgroups, // D-Star reflector names, NXDN/M17 link state etc.) which can // carry RF-controllable bytes; escape before display. echo "\n"; echo "
".$lang['dstar_repeater']."
RPT1".str_replace(' ', ' ', htmlspecialchars((string)$configdstar['callsign'], ENT_QUOTES, 'UTF-8'))."
RPT2".str_replace(' ', ' ', htmlspecialchars((string)$configdstar['gateway'], ENT_QUOTES, 'UTF-8'))."
".$lang['dstar_net']."
APRS".htmlspecialchars(substr((string)$configs['aprsHostname'], 0, 16), ENT_QUOTES, 'UTF-8')."
IRC".htmlspecialchars(substr((string)$configs['ircddbHostname'], 0, 16), ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)getActualLink($reverseLogLinesMMDVM, "D-Star"), ENT_QUOTES, 'UTF-8')."
\n"; } $testMMDVModeDMR = getConfigItem("DMR", "Enable", $mmdvmconfigs); if ( $testMMDVModeDMR == 1 ) { //Hide the DMR information when DMR mode not enabled. // DMR_Hosts.txt: read once via getDMRHostsLines() (functions.php) and // cached for the request, so this scan and the YSF2DMR scan further // down both iterate the same in-memory line array instead of two // separate fopen/fgets passes over a 3-6K-line SD-card file. $dmrMasterHost = getConfigItem("DMR Network", "Address", $mmdvmconfigs); $dmrMasterPort = getConfigItem("DMR Network", "Port", $mmdvmconfigs); if ($dmrMasterHost == '127.0.0.1') { if (isset($configdmrgateway['XLX Network 1']['Address'])) { $xlxMasterHost1 = $configdmrgateway['XLX Network 1']['Address']; } else { $xlxMasterHost1 = ""; } $dmrMasterHost1 = $configdmrgateway['DMR Network 1']['Address']; $dmrMasterHost2 = $configdmrgateway['DMR Network 2']['Address']; $dmrMasterHost3 = str_replace('_', ' ', $configdmrgateway['DMR Network 3']['Name']); if (isset($configdmrgateway['DMR Network 4']['Name'])) {$dmrMasterHost4 = str_replace('_', ' ', $configdmrgateway['DMR Network 4']['Name']);} if (isset($configdmrgateway['DMR Network 5']['Name'])) {$dmrMasterHost5 = str_replace('_', ' ', $configdmrgateway['DMR Network 5']['Name']);} if (isset($configdmrgateway['DMR Network 6']['Name'])) {$dmrMasterHost6 = str_replace('_', ' ', $configdmrgateway['DMR Network 6']['Name']);} foreach (getDMRHostsLines() as $dmrMasterLine) { $dmrMasterHostF = preg_split('/\s+/', $dmrMasterLine); if ((count($dmrMasterHostF) >= 2) && (strpos($dmrMasterHostF[0], '#') === FALSE) && ($dmrMasterHostF[0] != '')) { if ((strpos($dmrMasterHostF[0], 'XLX_') === 0) && ($xlxMasterHost1 == $dmrMasterHostF[2])) { $xlxMasterHost1 = str_replace('_', ' ', $dmrMasterHostF[0]); } if ((strpos($dmrMasterHostF[0], 'BM_') === 0) && ($dmrMasterHost1 == $dmrMasterHostF[2])) { $dmrMasterHost1 = str_replace('_', ' ', $dmrMasterHostF[0]); } if ((strpos($dmrMasterHostF[0], 'DMR+_') === 0) && ($dmrMasterHost2 == $dmrMasterHostF[2])) { $dmrMasterHost2 = str_replace('_', ' ', $dmrMasterHostF[0]); } } } if (strlen($xlxMasterHost1) > 19) { $xlxMasterHost1 = substr($xlxMasterHost1, 0, 17) . '..'; } if (strlen($dmrMasterHost1) > 19) { $dmrMasterHost1 = substr($dmrMasterHost1, 0, 17) . '..'; } if (strlen($dmrMasterHost2) > 19) { $dmrMasterHost2 = substr($dmrMasterHost2, 0, 17) . '..'; } if (strlen($dmrMasterHost3) > 19) { $dmrMasterHost3 = substr($dmrMasterHost3, 0, 17) . '..'; } if (isset($dmrMasterHost4)) { if (strlen($dmrMasterHost4) > 19) { $dmrMasterHost4 = substr($dmrMasterHost4, 0, 17) . '..'; } } if (isset($dmrMasterHost5)) { if (strlen($dmrMasterHost5) > 19) { $dmrMasterHost5 = substr($dmrMasterHost5, 0, 17) . '..'; } } if (isset($dmrMasterHost6)) { if (strlen($dmrMasterHost6) > 19) { $dmrMasterHost6 = substr($dmrMasterHost6, 0, 17) . '..'; } } } else { foreach (getDMRHostsLines() as $dmrMasterLine) { $dmrMasterHostF = preg_split('/\s+/', $dmrMasterLine); if ((count($dmrMasterHostF) >= 4) && (strpos($dmrMasterHostF[0], '#') === FALSE) && ($dmrMasterHostF[0] != '')) { if (($dmrMasterHost == $dmrMasterHostF[2]) && ($dmrMasterPort == $dmrMasterHostF[4])) { $dmrMasterHost = str_replace('_', ' ', $dmrMasterHostF[0]); } } } if (strlen($dmrMasterHost) > 19) { $dmrMasterHost = substr($dmrMasterHost, 0, 17) . '..'; } } echo "
\n"; echo "\n"; echo "\n"; // All getConfigItem returns and $dmrMasterHost* values below // originate from /etc/mmdvmhost or /etc/dmrgateway (parse_ini) // or from log-parsed `exec(grep | awk)` pipelines. Escape every // echoed value so an editor-injected payload (closes the read // path of the M-3 stored XSS class) or a hostile log line can't // break out of the table cell. echo "\n"; echo "\n"; echo ""; if (getConfigItem("DMR Network", "Slot1", $mmdvmconfigs) == 1) { echo "\n"; } else { echo "\n"; } echo ""; if (getConfigItem("DMR Network", "Slot2", $mmdvmconfigs) == 1) { echo "\n"; } else { echo "\n"; } echo "\n"; if (getEnabled("DMR Network", $mmdvmconfigs) == 1) { if ($dmrMasterHost == '127.0.0.1') { if ((isset($configdmrgateway['XLX Network 1']['Enabled'])) && ($configdmrgateway['XLX Network 1']['Enabled'] == 1)) { echo "\n"; } if ( !isset($configdmrgateway['XLX Network 1']['Enabled']) && isset($configdmrgateway['XLX Network']['Enabled']) && $configdmrgateway['XLX Network']['Enabled'] == 1) { if (file_exists("/var/log/pi-star/DMRGateway-".gmdate("Y-m-d").".log")) { $xlxMasterHost1 = exec('grep \'XLX, Linking\|XLX, Unlinking\|XLX, Logged\' /var/log/pi-star/DMRGateway-'.gmdate("Y-m-d").'.log | tail -1 | awk \'{print $5 " " $8 " " $9}\''); } else { $xlxMasterHost1 = exec('grep \'XLX, Linking\|XLX, Unlinking\|XLX, Logged\' /var/log/pi-star/DMRGateway-'.gmdate("Y-m-d", time() - 86340).'.log | tail -1 | awk \'{print $5 " " $8 " " $9}\''); } if ( strpos($xlxMasterHost1, 'Linking') !== false ) { $xlxMasterHost1 = str_replace('Linking ', '', $xlxMasterHost1); } else if ( strpos($xlxMasterHost1, 'Unlinking') !== false ) { $xlxMasterHost1 = "XLX Not Linked"; } else if ( strpos($xlxMasterHost1, 'Logged') !== false ) { $xlxMasterHost1 = "XLX Not Linked"; } echo "\n"; } if ($configdmrgateway['DMR Network 1']['Enabled'] == 1) { echo "\n"; } if ($configdmrgateway['DMR Network 2']['Enabled'] == 1) { echo "\n"; } if ($configdmrgateway['DMR Network 3']['Enabled'] == 1) { echo "\n"; } if (isset($configdmrgateway['DMR Network 4']['Enabled'])) { if ($configdmrgateway['DMR Network 4']['Enabled'] == 1) { echo "\n"; } } if (isset($configdmrgateway['DMR Network 5']['Enabled'])) { if ($configdmrgateway['DMR Network 5']['Enabled'] == 1) { echo "\n"; } } if (isset($configdmrgateway['DMR Network 6']['Enabled'])) { if ($configdmrgateway['DMR Network 6']['Enabled'] == 1) { echo "\n"; } } } else { echo "\n"; } } else { echo "\n"; } echo "
".$lang['dmr_repeater']."
DMR ID".htmlspecialchars((string)getConfigItem("General", "Id", $mmdvmconfigs), ENT_QUOTES, 'UTF-8')."
DMR CC".htmlspecialchars((string)getConfigItem("DMR", "ColorCode", $mmdvmconfigs), ENT_QUOTES, 'UTF-8')."
TS1enabled
disabled
TS2enabled
disabled
".$lang['dmr_master']."
".htmlspecialchars((string)$xlxMasterHost1, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$xlxMasterHost1, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost1, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost2, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost3, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost4, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost5, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost6, ENT_QUOTES, 'UTF-8')."
".htmlspecialchars((string)$dmrMasterHost, ENT_QUOTES, 'UTF-8')."
No DMR Network
\n"; } $testMMDVModeYSF = getConfigItem("System Fusion Network", "Enable", $mmdvmconfigs); if ( isset($configdmr2ysf['Enabled']['Enabled']) ) { $testDMR2YSF = $configdmr2ysf['Enabled']['Enabled']; } if ( $testMMDVModeYSF == 1 || $testDMR2YSF ) { //Hide the YSF information when System Fusion Network mode not enabled. $ysfLinkedTo = getActualLink($reverseLogLinesYSFGateway, "YSF"); if ($ysfLinkedTo == 'Not Linked' || $ysfLinkedTo == 'Service Not Started') { $ysfLinkedToTxt = $ysfLinkedTo; } else { $ysfHostFile = fopen("/usr/local/etc/YSFHosts.txt", "r"); $ysfLinkedToTxt = "null"; while (!feof($ysfHostFile)) { $ysfHostFileLine = fgets($ysfHostFile); $ysfRoomTxtLine = preg_split('/;/', $ysfHostFileLine); if (empty($ysfRoomTxtLine[0]) || empty($ysfRoomTxtLine[1])) continue; if (($ysfRoomTxtLine[0] == $ysfLinkedTo) || ($ysfRoomTxtLine[1] == $ysfLinkedTo)) { $ysfLinkedToTxt = $ysfRoomTxtLine[1]; break; } } if ($ysfLinkedToTxt != "null") { $ysfLinkedToTxt = $ysfLinkedToTxt; } else { $ysfLinkedToTxt = $ysfLinkedTo; } $ysfLinkedToTxt = str_replace('_', ' ', $ysfLinkedToTxt); } if (strlen($ysfLinkedToTxt) > 19) { $ysfLinkedToTxt = substr($ysfLinkedToTxt, 0, 17) . '..'; } echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "
".$lang['ysf_net']."
".htmlspecialchars((string)$ysfLinkedToTxt, ENT_QUOTES, 'UTF-8')."
\n"; } if ( isset($configysf2dmr['Enabled']['Enabled']) ) { $testYSF2DMR = $configysf2dmr['Enabled']['Enabled']; } if ( $testYSF2DMR ) { //Hide the YSF2DMR information when YSF2DMR Network mode not enabled. // Reuses the in-memory DMR_Hosts.txt line array cached by // getDMRHostsLines() — same data the DMR block above just // walked, no second SD-card read. $dmrMasterHost = $configysf2dmr['DMR Network']['Address']; foreach (getDMRHostsLines() as $dmrMasterLine) { $dmrMasterHostF = preg_split('/\s+/', $dmrMasterLine); if ((count($dmrMasterHostF) >= 2) && (strpos($dmrMasterHostF[0], '#') === FALSE) && ($dmrMasterHostF[0] != '')) { if ($dmrMasterHost == $dmrMasterHostF[2]) { $dmrMasterHost = str_replace('_', ' ', $dmrMasterHostF[0]); } } } if (strlen($dmrMasterHost) > 19) { $dmrMasterHost = substr($dmrMasterHost, 0, 17) . '..'; } echo "
\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "\n"; echo "
YSF2DMR
DMR ID".htmlspecialchars((string)$configysf2dmr['DMR Network']['Id'], ENT_QUOTES, 'UTF-8')."
YSF2".$lang['dmr_master']."
".htmlspecialchars((string)$dmrMasterHost, ENT_QUOTES, 'UTF-8')."
\n"; } $testMMDVModeP25 = getConfigItem("P25 Network", "Enable", $mmdvmconfigs); if ( isset($configysf2p25['Enabled']['Enabled']) ) { $testYSF2P25 = $configysf2p25['Enabled']['Enabled']; } if ( $testMMDVModeP25 == 1 || $testYSF2P25 ) { //Hide the P25 information when P25 Network mode not enabled. echo "
\n"; echo "\n"; if (getConfigItem("P25", "NAC", $mmdvmconfigs)) { echo "\n"; echo "\n"; } else { echo "\n"; echo "\n"; } echo "\n"; echo "\n"; echo "
".$lang['p25_radio']."
NAC".htmlspecialchars((string)getConfigItem("P25", "NAC", $mmdvmconfigs), ENT_QUOTES, 'UTF-8')."
".$lang['p25_radio']."
NAC0
".$lang['p25_net']."
".htmlspecialchars((string)getActualLink($logLinesP25Gateway, "P25"), ENT_QUOTES, 'UTF-8')."
\n"; } $testMMDVModeNXDN = getConfigItem("NXDN Network", "Enable", $mmdvmconfigs); if ( isset($configysf2nxdn['Enabled']['Enabled']) ) { if ($configysf2nxdn['Enabled']['Enabled'] == 1) { $testYSF2NXDN = 1; } } if ( isset($configdmr2nxdn['Enabled']['Enabled']) ) { if ($configdmr2nxdn['Enabled']['Enabled'] == 1) { $testDMR2NXDN = 1; } } if ( $testMMDVModeNXDN == 1 || isset($testYSF2NXDN) || isset($testDMR2NXDN) ) { //Hide the NXDN information when NXDN Network mode not enabled. echo "
\n"; echo "\n"; if (getConfigItem("NXDN", "RAN", $mmdvmconfigs)) { echo "\n"; echo "\n"; } else { echo "\n"; echo "\n"; } echo "\n"; if (file_exists('/etc/nxdngateway')) { echo "\n"; } else { echo "\n"; } echo "
".$lang['nxdn_radio']."
RAN".htmlspecialchars((string)getConfigItem("NXDN", "RAN", $mmdvmconfigs), ENT_QUOTES, 'UTF-8')."
".$lang['nxdn_radio']."
RAN0
".$lang['nxdn_net']."
".htmlspecialchars((string)getActualLink($logLinesNXDNGateway, "NXDN"), ENT_QUOTES, 'UTF-8')."
TG 65000
\n"; } $testMMDVModeM17 = getConfigItem("M17 Network", "Enable", $mmdvmconfigs); if ( $testMMDVModeM17 == 1 ) { //Hide the M17 information when P25 Network mode not enabled. echo "
\n"; echo "\n"; if (getConfigItem("M17", "CAN", $mmdvmconfigs)) { echo "\n"; echo "\n"; } else { echo "\n"; echo "\n"; } echo "\n"; echo "\n"; echo "
".$lang['m17_radio']."
CAN".htmlspecialchars((string)getConfigItem("M17", "CAN", $mmdvmconfigs), ENT_QUOTES, 'UTF-8')."
".$lang['m17_radio']."
CAN0
".$lang['m17_net']."
".htmlspecialchars((string)getActualLink($logLinesM17Gateway, "M17"), ENT_QUOTES, 'UTF-8')."
\n"; } $testMMDVModePOCSAG = getConfigItem("POCSAG Network", "Enable", $mmdvmconfigs); if ( $testMMDVModePOCSAG == 1 ) { //Hide the POCSAG information when POCSAG Network mode not enabled. echo "
\n"; echo "\n"; echo "\n"; echo "\n"; if (isset($configdapnetgateway['DAPNET']['Address'])) { $dapnetGatewayRemoteAddr = $configdapnetgateway['DAPNET']['Address']; if (strlen($dapnetGatewayRemoteAddr) > 19) { $dapnetGatewayRemoteAddr = substr($dapnetGatewayRemoteAddr, 0, 17) . '..'; } echo "\n"; echo "\n"; } echo "
POCSAG
Tx".htmlspecialchars((string)getMHZ(getConfigItem("POCSAG", "Frequency", $mmdvmconfigs)), ENT_QUOTES, 'UTF-8')."
POCSAG Master
".htmlspecialchars((string)$dapnetGatewayRemoteAddr, ENT_QUOTES, 'UTF-8')."
\n"; }