&1", $output); if (!startsWith(substr($output[0],18,8),"20")) { showLapTime("getMMDVMHostVersion"); return getMMDVMHostFileVersion(); } else { showLapTime("getMMDVMHostVersion"); if (strlen($output[0]) > 26) { return substr($output[0],18,8)." ("._("compiled")." ".getMMDVMHostFileVersion(). ", GitID #" . substr($output[0],32,7) . ")"; } else { return substr($output[0],18,8)." ("._("compiled")." ".getMMDVMHostFileVersion(). ")"; } } } function getMMDVMHostFileVersion() { // returns creation-time of MMDVMHost as version-number $filename = MMDVMHOSTPATH."/MMDVMHost"; if (file_exists($filename)) { showLapTime("getMMDVMHostFileVersion"); return date("d M Y", filectime($filename)); } } function getDMRGatewayVersion() { // returns creation-time or version of DMRGateway as version-number $filename = DMRGATEWAYPATH."/DMRGateway"; exec($filename." -v 2>&1", $output); if (!startsWith(substr($output[0],19,8),"20")) { showLapTime("getDMRGatewayVersion"); return getDMRGatewayFileVersion(); } else { showLapTime("getDMRGatewayVersion"); if (strlen($output[0]) > 26) { return substr($output[0],19,8)." ("._("compiled")." ".getDMRGatewayFileVersion(). ", GitID #" . substr($output[0],33,7) . ")"; } else { return substr($output[0],19,8)." ("._("compiled")." ".getDMRGatewayFileVersion(). ")"; } } } function getDMRGatewayFileVersion() { // returns creation-time of DMRGateway as version-number $filename = DMRGATEWAYPATH."/DMRGateway"; if (file_exists($filename)) { showLapTime("getDMRGatewayFileVersion"); return date("d M Y", filectime($filename)); } } function getFirmwareVersion() { $logPath = MMDVMLOGPATH."/".MMDVMLOGPREFIX."-".date("Y-m-d").".log"; $logLines = explode("\n", `egrep "MMDVM protocol version" $logPath`); $firmware = "n/a"; if (count($logLines) >= 2) { $firmware = substr($logLines[count($logLines)-2], strpos($logLines[count($logLines)-2], "description")+13, strlen($logLines[count($logLines)-2])-strpos($logLines[count($logLines)-2], "description")+13); if (0 === strpos($firmware, 'MMDVM_HS_Dual_Hat')) { $firmware = preg_replace('/GitID #([0-9A-Fa-f]{7})/', 'GitID #$1', $firmware); } else if (0 === strpos($firmware, 'MMDVM')) { $firmware = preg_replace('/GitID #([0-9A-Fa-f]{7})/', 'GitID #$1', $firmware); } else if (0 === strpos($firmware, 'ZUMspot')) { $firmware = preg_replace('/GitID #([0-9A-Fa-f]{7})/', 'GitID #$1', $firmware); } } if ($firmware != "n/a") { $fp = fopen('/tmp/MMDVMFirmware.txt', 'w'); fwrite($fp, $firmware); fclose($fp); } else { $fp = fopen('/tmp/MMDVMFirmware.txt', 'r'); $contents = fread($fp, filesize("/tmp/MMDVMFirmware.txt")); $firmware = $contents; } echo $firmware; } function setDMRNetwork($network) { $fp = fopen('../config/DMRNetwork.txt', 'w'); fwrite($fp, $network); fclose($fp); } function getDMRNetwork() { $filename = 'config/DMRNetwork.txt'; $network = ''; if (file_exists($filename)) { $fp = fopen($filename, 'r'); $network = fread($fp, filesize($filename)); fclose($fp); } return $network; } function getDMRNetwork2() { $filename = '../config/DMRNetwork.txt'; $network = ''; if (file_exists($filename)) { $fp = fopen($filename, 'r'); $network = fread($fp, filesize($filename)); fclose($fp); } return $network; } function getDMRMasterState() { $logPath = MMDVMLOGPATH."/".MMDVMLOGPREFIX."-".date("Y-m-d").".log"; $logLines = explode("\n", `egrep -h "(DMR, Logged into the master successfully)|(DMR, Closing DMR Network)" $logPath`); $state = -1; foreach($logLines as $logLine) { if (strpos($logLine, "successfully") > 0) { $state = 1; } if (strpos($logLine, "Closing") > 0) { $state = 0; } } if ($state >= 0) { $fp = fopen('/tmp/DMRMasterState.txt', 'w'); fwrite($fp, $state); fclose($fp); } else { $fp = fopen('/tmp/DMRMasterState.txt', 'r'); $contents = fread($fp, filesize("/tmp/DMRMasterState.txt")); $state = $contents; } return $state; } function getMMDVMConfig() { // loads MMDVM.ini into array for further use $conf = array(); if ($configs = fopen(MMDVMINIPATH."/".MMDVMINIFILENAME, 'r')) { while ($config = fgets($configs)) { array_push($conf, trim ( $config, " \t\n\r\0\x0B")); } fclose($configs); } return $conf; } function getYSFGatewayConfig() { // loads YSFGateway.ini into array for further use $conf = array(); if ($configs = fopen(YSFGATEWAYINIPATH."/".YSFGATEWAYINIFILENAME, 'r')) { while ($config = fgets($configs)) { array_push($conf, trim ( $config, " \t\n\r\0\x0B")); } fclose($configs); } showLapTime("getYSFGatewayConfig"); return $conf; } function getCallsign($mmdvmconfigs) { // returns Callsign from MMDVM-config return getConfigItem("General", "Callsign", $mmdvmconfigs); } function getDMRId ($mmdvmconfigs) { // returns DMRId from MMDVM-Config return getConfigItem("General", "Id", $mmdvmconfigs); } function getConfigItem($section, $key, $configs) { // retrieves the corresponding config-entry within a [section] $sectionpos = array_search("[" . $section . "]", $configs); if ($sectionpos !== FALSE) { $sectionpos++; $len = count($configs); while(($sectionpos < $len) && (startsWith($configs[$sectionpos],$key."=") === false) ) { if (startsWith($configs[$sectionpos],"[")) { return null; } $sectionpos++; } if ($sectionpos < $len) { return substr($configs[$sectionpos], strlen($key) + 1); } } return null; } function getEnabled ($mode, $mmdvmconfigs) { // returns enabled/disabled-State of mode return getConfigItem($mode, "Enable", $mmdvmconfigs); } function showMode($mode, $mmdvmconfigs) { // shows if mode is enabled or not. ?> "> "-53") $rssi = "
S9 +40dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-63") $rssi = "
S9 +30dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-73") $rssi = "
S9 +20dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-83") $rssi = "
S9 +10dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-93") $rssi = "
S9 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-99") $rssi = "
S8 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-105") $rssi = "
S7 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-111") $rssi = "
S6 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-117") $rssi = "
S5 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-123") $rssi = "
S4 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-129") $rssi = "
S3 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-135") $rssi = "
S2 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-141") $rssi = "
S1 ($rssiVal dBm)(min/max/avg)
$rssiString
"; } else { $rssi = $rssiVal; } } $ber = substr($loss, 5); $loss = ""; } else if (startsWith($loss,"RSSI:")) { //for short RF packets and "X" button requests, BER sometimes in not showed. RSSI is in BER position $loss=""; $ber = ""; $rssiString = substr($lineTokens[3], 6); if (constant("RSSI") == "min") $rssiVal = preg_replace('/(-\d+)\/-\d+\/-\d+ dBm/', "\\1", $rssiString); else if (constant("RSSI") == "max") $rssiVal = preg_replace('/-\d+\/(-\d+)\/-\d+ dBm/', "\\1", $rssiString); else if (constant("RSSI") == "avg") $rssiVal = preg_replace('/-\d+\/-\d+\/(-\d+) dBm/', "\\1", $rssiString); else if (constant("RSSI") == "all") $rssiVal = $rssiString; else $rssiVal = preg_replace('/-\d+\/-\d+\/(-\d+) dBm/', "\\1", $rssiString); if (constant("RSSI") != "all") { if ($rssiVal > "-53") $rssi = "
S9 +40dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-63") $rssi = "
S9 +30dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-73") $rssi = "
S9 +20dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-83") $rssi = "
S9 +10dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-93") $rssi = "
S9 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-99") $rssi = "
S8 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-105") $rssi = "
S7 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-111") $rssi = "
S6 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-117") $rssi = "
S5 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-123") $rssi = "
S4 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-129") $rssi = "
S3 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-135") $rssi = "
S2 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-141") $rssi = "
S1 ($rssiVal dBm)(min/max/avg)
$rssiString
"; } else { $rssi = $rssiVal; } } else { $loss = strtok($loss, " "); if (array_key_exists(4,$lineTokens)) { $ber = substr($lineTokens[4], 5); } if (array_key_exists(5,$lineTokens) && substr($lineTokens[5], 6) != "-0/-0/-0 dBm") { $rssiString = substr($lineTokens[5], 6); if (constant("RSSI") == "min") $rssiVal = preg_replace('/(-\d+)\/-\d+\/-\d+ dBm/', "\\1", $rssiString); else if (constant("RSSI") == "max") $rssiVal = preg_replace('/-\d+\/(-\d+)\/-\d+ dBm/', "\\1", $rssiString); else if (constant("RSSI") == "avg") $rssiVal = preg_replace('/-\d+\/-\d+\/(-\d+) dBm/', "\\1", $rssiString); else if (constant("RSSI") == "all") $rssiVal = $rssiString; else $rssiVal = preg_replace('/-\d+\/-\d+\/(-\d+) dBm/', "\\1", $rssiString); if (constant("RSSI") != "all") { if ($rssiVal > "-53") $rssi = "
S9 +40dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-63") $rssi = "
S9 +30dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-73") $rssi = "
S9 +20dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-83") $rssi = "
S9 +10dB ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-93") $rssi = "
S9 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-99") $rssi = "
S8 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-105") $rssi = "
S7 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-111") $rssi = "
S6 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-117") $rssi = "
S5 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-123") $rssi = "
S4 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-129") $rssi = "
S3 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-135") $rssi = "
S2 ($rssiVal dBm)(min/max/avg)
$rssiString
"; else if ($rssiVal > "-141") $rssi = "
S1 ($rssiVal dBm)(min/max/avg)
$rssiString
"; } else { $rssi = $rssiVal; } } } if (strpos($logLine,"ended RF data") || strpos($logLine,"ended network")) { switch (substr($logLine, 27, strpos($logLine,",") - 27)) { case "DMR Slot 1": $ts1duration = "SMS"; break; case "DMR Slot 2": $ts2duration = "SMS"; break; } } else { switch (substr($logLine, 27, strpos($logLine,",") - 27)) { case "D-Star": $dstarduration = $duration; $dstarloss = $loss; $dstarber = $ber; $dstarrssi = $rssi; break; case "DMR Slot 1": $ts1duration = $duration; $ts1loss = $loss; $ts1ber = $ber; $ts1rssi = $rssi; break; case "DMR Slot 2": $ts2duration = $duration; $ts2loss = $loss; $ts2ber = $ber; $ts2rssi = $rssi; break; case "YSF": $ysfduration = $duration; $ysfloss = $loss; $ysfber = $ber; $ysfrssi = $rssi; break; case "P25": $p25duration = $duration; $p25loss = $loss; $p25ber = $ber; $p25rssi = $rssi; break; case "NXDN": $nxdnduration = $duration; $nxdnloss = $loss; $nxdnber = $ber; $nxdnrssi = $rssi; break; } } } else { if (!$onlyLast) continue; } $timestamp = substr($logLine, 3, 23); $mode = substr($logLine, 27, strpos($logLine,",") - 27); if ($topos = strpos($logLine, "to follow)")) { $topos = strpos($logLine, "to", $topos+1); } else { $topos = strpos($logLine, "to"); } $callsign2 = substr($logLine, strpos($logLine,"from") + 5, $topos - strpos($logLine,"from") - 6); $callsign = $callsign2; if (strpos($callsign2,"/") > 0) { $callsign = substr($callsign2, 0, strpos($callsign2,"/")); } $callsign = trim($callsign); if (defined("USESQLITE")) { if (is_numeric($callsign)) { $callsign = getCallsignFromDB($callsign); } } $id =""; if ($mode == "D-Star") { $id = substr($callsign2, strpos($callsign2,"/") + 1); if(!$id) $id=""; } $target = substr($logLine, $topos + 3); if (strpos($target,",") > 0) $target = substr($target, 0, strpos($target,",")); $target = preg_replace('/\s/', ' ', $target); if (defined("RESOLVETGS")) { $target = $target." ".getTGName($target); } $source = "RF"; if (strpos($logLine,"network") > 0 ) { $source = "Net"; } switch ($mode) { case "D-Star": $duration = $dstarduration; $loss = $dstarloss; $ber = $dstarber; $rssi = $dstarrssi; break; case "DMR Slot 1": $duration = $ts1duration; $loss = $ts1loss; $ber = $ts1ber; $rssi = $ts1rssi; break; case "DMR Slot 2": $duration = $ts2duration; $loss = $ts2loss; $ber = $ts2ber; $rssi = $ts2rssi; break; case "YSF": $duration = $ysfduration; $loss = $ysfloss; $ber = $ysfber; $rssi = $ysfrssi; break; case "P25": $duration = $p25duration; $loss = $p25loss; $ber = $p25ber; $rssi = $p25rssi; break; case "NXDN": $duration = $nxdnduration; $loss = $nxdnloss; $ber = $nxdnber; $rssi = $nxdnrssi; break; case "POCSAG": $callsign = "POCSAG"; $name = ""; $id = ""; $target = ""; $source = ""; $duration = ""; $loss = ""; $ber = ""; $rssi = ""; $alias = ""; break; } // Callsign or ID should be less than 11 chars long, otherwise it could be errorneous if ( strlen($callsign) < 11 ) { $name = ""; if (defined("ENABLEXTDLOOKUP")) { if (getEnabled("D-Star", getMMDVMConfig()) == 1) { array_push($heardList, array(convertTimezone($timestamp), $mode, $callsign, $name, $id, $target, $source, $duration, $loss, $ber, $rssi, $alias)); } else { array_push($heardList, array(convertTimezone($timestamp), $mode, $callsign, $name, $target, $source, $duration, $loss, $ber, $rssi, $alias)); } $alias = ""; } else { if (getEnabled("D-Star", getMMDVMConfig()) == 1) { array_push($heardList, array(convertTimezone($timestamp), $mode, $callsign, $id, $target, $source, $duration, $loss, $ber, $rssi, $alias)); } else { array_push($heardList, array(convertTimezone($timestamp), $mode, $callsign, $target, $source, $duration, $loss, $ber, $rssi, $alias)); } $alias = ""; } $duration = ""; $loss = ""; $ber = ""; $rssi = ""; $ts1alias = "---"; $ts2alias = "---"; if ($onlyLast && count($heardList )> 20) { return $heardList; } } $duration = ""; $loss = ""; $ber = ""; $rssi = ""; $ts1alias = "---"; $ts2alias = "---"; } return $heardList; } // 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 // D: 2020-09-21 18:16:12.814 Messages in Queue 0002 // M: 2020-09-21 18:16:12.824 Sending message in slot 13 to 0000216, type 6, func Alphanumeric: "YYYYMMDDHHMMSS200921181600" // D: 2020-09-21 18:16:12.825 Messages in Queue 0001 // D: 2020-09-21 18:17:00.036 Queueing message to 0000208, type 6, func Alphanumeric: "XTIME=2017210920XTIME=2017210920" function getDAPNETTxList($logLines) { $DAPNETTxList = array(); foreach ($logLines as $logLine) { if (strpos($logLine,"Sending")) { $timestamp = substr($logLine, 3, 23); $slot = substr($logLine,51, 2); if ($slot[1] == " ") { $target = substr($logLine,56, 7); } else { $target = substr($logLine,57, 7); } $message = substr($logLine,strpos($logLine, "\"")); $message = substr($message,1 , -1); if ($target == "0004520") $message = rot1($message); array_push($DAPNETTxList, array(convertTimezone($timestamp), $slot, $target, $message)); } } return $DAPNETTxList; } function getLastHeard($logLines, $onlyLast) { //returns last heard list from log $lastHeard = array(); $heardCalls = array(); $heardList = getHeardList($logLines, $onlyLast); $counter = 0; foreach ($heardList as $listElem) { if ( ($listElem[1] == "D-Star") || ($listElem[1] == "YSF") || ($listElem[1] == "P25") || ($listElem[1] == "NXDN") || ($listElem[1] == "POCSAG") || (startsWith($listElem[1], "DMR")) ) { if(!(array_search($listElem[2]."#".$listElem[1].$listElem[4], $heardCalls) > -1)) { // Generate a canonicalized call for QRZ and name lookups $call_canon = preg_replace('/\s+\w$/', '', $listElem[2]); //remove suffix used sometimes in YSF (es: -FT2 , -991) if (strpos($call_canon,"-")!=false) { $call_canon = substr($call_canon, 0, strpos($call_canon, "-")); } array_push($heardCalls, $listElem[2]."#".$listElem[1].$listElem[4]); if (defined("ENABLEXTDLOOKUP")) { if ($listElem[2] !== "??????????") { $listElem[3] = getName($call_canon); //Should speed up this function - time-issue! } else { $listElem[3] = "---"; } } if ($listElem[2] !== "??????????") { if (!is_numeric($listElem[2])) { if (defined("SHOWQRZ")) { $listElem[2] = "".str_replace("0","Ø",$listElem[2]).""; } else { $listElem[2] = "".$listElem[2].""; } } else { $listElem[2] = "".$listElem[2].""; } } array_push($lastHeard, $listElem); $counter++; } } } return $lastHeard; } function getActualMode($metaLastHeard, $mmdvmconfigs) { if (count($metaLastHeard) == 0) return _("idle"); // returns mode of repeater actual working in $listElem = $metaLastHeard[0]; $timestamp = new DateTime($listElem[0],new DateTimeZone(TIMEZONE)); $timestamp2 = $timestamp; $timestamp2->add(new DateInterval('PT3S')); $mode = $listElem[1]; if (startsWith($mode, "DMR")) { $mode = "DMR"; } $now = new DateTime('NOW',new DateTimeZone(TIMEZONE)); if (defined("ENABLEXTDLOOKUP") && $listElem[7] == null && $mode != "POCSAG" || !defined("ENABLEXTDLOOKUP") && $listElem[6] == null && $mode != "POCSAG" || $mode == "POCSAG" && $now->format('U') <= $timestamp2->format('U') ) { return "".$mode.""; } else { $hangtime = getConfigItem("General", "ModeHang", $mmdvmconfigs); if ($hangtime != "") { $timestamp->add(new DateInterval('PT' . $hangtime . 'S')); } else { $source = $listElem[6]; if ($source === "Net") { $hangtime = getConfigItem("General", "NetModeHang", $mmdvmconfigs); } else { $hangtime = getConfigItem("General", "RFModeHang", $mmdvmconfigs); } $timestamp->add(new DateInterval('PT' . $hangtime . 'S')); } if ($now->format('U') > $timestamp->format('U')) { return _("idle"); } else { return "".$mode.""; } } } function getDSTARLinks() { // returns link-states of all D-Star-modules if (filesize(LINKLOGPATH."/Links.log") == 0) { return "not linked"; } $out = ""; if ($linkLog = fopen(LINKLOGPATH."/Links.log",'r')) { while ($linkLine = fgets($linkLog)) { $linkDate = " "; $protocol = " "; $linkType = " "; $linkSource = " "; $linkDest = " "; $linkDir = " "; // Reflector-Link, sample: // 2011-09-22 02:15:06: DExtra link - Type: Repeater Rptr: DB0LJ B Refl: XRF023 A Dir: Outgoing // 2012-04-03 08:40:07: DPlus link - Type: Dongle Rptr: DB0ERK B Refl: REF006 D Dir: Outgoing // 2012-04-03 08:40:07: DCS link - Type: Repeater Rptr: DB0ERK C Refl: DCS001 C Dir: Outgoing if(preg_match_all('/^(.{19}).*(D[A-Za-z]*).*Type: ([A-Za-z]*).*Rptr: (.{8}).*Refl: (.{8}).*Dir: (.{8})/',$linkLine,$linx) > 0){ $linkDate = $linx[1][0]; $protocol = $linx[2][0]; $linkType = $linx[3][0]; $linkSource = $linx[4][0]; $linkDest = $linx[5][0]; $linkDir = $linx[6][0]; } // CCS-Link, sample: // 2013-03-30 23:21:53: CCS link - Rptr: PE1AGO C Remote: PE1KZU Dir: Incoming if(preg_match_all('/^(.{19}).*(CC[A-Za-z]*).*Rptr: (.{8}).*Remote: (.{8}).*Dir: (.{8})/',$linkLine,$linx) > 0){ $linkDate = $linx[1][0]; $protocol = $linx[2][0]; $linkType = $linx[2][0]; $linkSource = $linx[3][0]; $linkDest = $linx[4][0]; $linkDir = $linx[5][0]; } // Dongle-Link, sample: // 2011-09-24 07:26:59: DPlus link - Type: Dongle User: DC1PIA Dir: Incoming // 2012-03-14 21:32:18: DPlus link - Type: Dongle User: DC1PIA Dir: Incoming if(preg_match_all('/^(.{19}).*(D[A-Za-z]*).*Type: ([A-Za-z]*).*User: (.{6,8}).*Dir: (.*)$/',$linkLine,$linx) > 0){ $linkDate = $linx[1][0]; $protocol = $linx[2][0]; $linkType = $linx[3][0]; $linkSource = " "; $linkDest = $linx[4][0]; $linkDir = $linx[5][0]; } $out .= "" . $linkSource . " " . $protocol . "-link to " . $linkDest . " " . $linkDir . ""; } } $out .= "
"; fclose($linkLog); return $out; } function getActualLink($logLines, $mode) { // returns actual link state of specific mode //M: 2016-05-02 07:04:10.504 D-Star link status set to "Verlinkt zu DCS002 S" //M: 2016-04-03 16:16:18.638 DMR Slot 2, received network voice header from 4000 to 2625094 //M: 2016-04-03 19:30:03.099 DMR Slot 2, received network voice header from 4020 to 2625094 switch ($mode) { case "D-Star": if (isProcessRunning(IRCDDBGATEWAY)) { return getDSTARLinks(); } else { return _("ircddbgateway not running!"); } break; case "DMR Slot 1": foreach ($logLines as $logLine) { if(strpos($logLine,"unable to decode the network CSBK")) { continue; } else if(substr($logLine, 27, strpos($logLine,",") - 27) == "DMR Slot 1") { $to = ""; if (strpos($logLine,"to")) { $to = trim(substr($logLine, strpos($logLine,"to") + 3)); $to = substr($to, 0, strpos($to,",")); } if ($to !== "") { $fp = fopen('/tmp/DMR1State.txt', 'w'); fwrite($fp, $to); fclose($fp); return $to; } } } if (file_exists('/tmp/DMR1State.txt')) { $fp = fopen('/tmp/DMR1State.txt', 'r'); $contents = fread($fp, filesize("/tmp/DMR1State.txt")); fclose($fp); if (count($contents)>0){ return $contents; } else { return _("not linked"); } } else { return _("not linked"); } break; case "DMR Slot 2": foreach ($logLines as $logLine) { if(strpos($logLine,"unable to decode the network CSBK")) { continue; } else if(substr($logLine, 27, strpos($logLine,",") - 27) == "DMR Slot 2") { $to = ""; if (strpos($logLine,"to")) { $to = trim(substr($logLine, strpos($logLine,"to") + 3)); $to = trim(substr($logLine, strpos($logLine,"to") + 3)); $to = substr($to, 0, strpos($to,",")); } if ($to !== "") { $fp = fopen('/tmp/DMR2State.txt', 'w'); fwrite($fp, $to); fclose($fp); return $to; } } } if (file_exists('/tmp/DMR2State.txt')) { $fp = fopen('/tmp/DMR2State.txt', 'r'); $contents = fread($fp, filesize("/tmp/DMR2State.txt")); fclose($fp); if (count($contents)>0){ return $contents; } else { return _("not linked"); } } else { return _("not linked"); } break; case "YSF": // 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 //I: 2018-06-04 11:04:22.190 The ID of this repeater is 50735 //M: 2018-06-04 11:04:22.202 No connection startup //M: 2018-06-04 11:04:24.005 Linked to IT C4FM Piemonte if (isProcessRunning("YSFGateway")) { foreach($logLines as $logLine) { $to = ""; if (strpos($logLine,"Disconnect") || strpos($logLine, "Unknown reflector") || strpos($logLine, "Disconnecting due to inactivity") || strpos($logLine, "No connection startup")) { return _("not linked"); } if (strpos($logLine,"Linked to")) { $to = substr($logLine, 37, 16); if ($to == "MMDVM" ) continue; } if ($to !== "") { $fp = fopen('/tmp/YSFState.txt', 'w'); fwrite($fp, $to); fclose($fp); return $to; } } if ( ($to == "") && file_exists('/tmp/YSFState.txt')) { // reflector is in yesterday's log $logPath2 = YSFGATEWAYLOGPATH."/".YSFGATEWAYLOGPREFIX."-".date('Y-m-d',strtotime(date('Y-m-d').' -1 day')).".log"; //open yesterday's log $logLines2 = explode("\n", `egrep -h "Linked to" $logPath2`); $to = ""; foreach($logLines2 as $logLine) { if ($logLine!=='') { $to = substr($logLine, 37, 16); if ($to == "MMDVM" ) continue; } } if ($to !== "") { $fp = fopen('/tmp/YSFState.txt', 'w'); fwrite($fp, $to); fclose($fp); return $to; } } } else { return _("YSFGateway not running"); } if (file_exists('/tmp/YSFState.txt')) { $fp = fopen('/tmp/YSFState.txt', 'r'); $contents = fread($fp, filesize("/tmp/YSFState.txt")); fclose($fp); if (count($contents)>0){ return $contents; } else { return _("not linked"); } } else { return _("not linked"); } break; } return _("something went wrong!"); } function getActualReflector($logLines, $mode) { $to = getActualReflector2($logLines, $mode); if ($to >= -1 ) { $fp = fopen('/tmp/DMR2RefState.txt', 'w'); fwrite($fp, $to); fclose($fp); if ($to == -1) { return _("Reflector not linked"); } else { return $to; } } if (file_exists('/tmp/DMR2RefState.txt')) { $fp = fopen('/tmp/DMR2RefState.txt', 'r'); $contents = fread($fp, filesize("/tmp/DMR2RefState.txt")); fclose($fp); if (count($contents)>0){ return $contents; } else { return _("not linked"); } } } function getActualReflector2($logLines, $mode) { // returns actual link state of specific mode //M: 2016-05-02 07:04:10.504 D-Star link status set to "Verlinkt zu DCS002 S" //M: 2016-04-03 16:16:18.638 DMR Slot 2, received network voice header from 4000 to 2625094 //M: 2016-04-03 19:30:03.099 DMR Slot 2, received network voice header from 4020 to 2625094 foreach ($logLines as $logLine) { if(substr($logLine, 27, strpos($logLine,",") - 27) == "DMR Slot 2") { $from = substr($logLine, strpos($logLine,"from") + 5, strpos($logLine,"to") - strpos($logLine,"from") - 6); if (strlen($from) == 4 && startsWith($from,"4")) { if ($from == "4000") { return -1; } else { return _("Reflector")." ".$from; } } $source = "RF"; if (strpos($logLine,"network") > 0 ) { $source = "Net"; } if ( $source == "RF") { $to = substr($logLine, strpos($logLine, "to") + 3); if (strlen($to) < 6 && startsWith($to, "4")) { return _("Reflector")." ".$to." ("._("not cfmd").")"; } } } } return -1; } function getActiveYSFReflectors() { $reflectorlist = Array(); $file = fopen(YSFHOSTSPATH."/".YSFHOSTSFILENAME, 'r'); if ($file) { while (($line = fgetcsv($file, 1000, ";")) !== FALSE) { array_push($reflectorlist, array($line[1], $line[6],$line[2], $line[0], $line[5])); } } fclose($file); return $reflectorlist; } function getName($callsign) { if (defined("USESQLITE")) { return resolveNameFromDB($callsign); } else { if (is_numeric($callsign)) { return "---"; } return resolveNameFromFile($callsign); } } function resolveNameFromDB($callsign) { $db = new SQLite3('database/callsigns.db'); if (is_numeric($callsign)) $results = $db->query("SELECT distinct name FROM callsign where id = '$callsign'"); else $results = $db->query("SELECT distinct name FROM callsign where callsign = '$callsign'"); while ($row = $results->fetchArray()) { return $row['name']; } return "---"; } function resolveNameFromFile($callsign) { $TMP_CALL_NAME = "/tmp/Callsign_Name.txt"; if (file_exists($TMP_CALL_NAME)) { $callsign = trim($callsign); if (strpos($callsign,"-")) { $callsign = substr($callsign,0,strpos($callsign,"-")); } $delimiter =" "; exec("egrep -m1 '".$callsign.$delimiter."' ".$TMP_CALL_NAME, $output); if (count($output) !== 0) { $name = substr($output[0], strpos($output[0],$delimiter)); $name = substr($name, strpos($name,$delimiter)); return $name; } } if (file_exists(DMRIDDATPATH)) { $callsign = trim($callsign); if (strpos($callsign,"-")) { $callsign = substr($callsign,0,strpos($callsign,"-")); } $delimiter =" "; exec("sed -e 's/[[:space:]]\+/ /g' ".DMRIDDATPATH ." | grep -m1 '".$callsign.$delimiter."'" , $output); if (count($output) !== 0) { $name = preg_replace('/[\x00-\x1F\x7F-\xA0\xAD]/u', '', substr($output[0], strpos($output[0],$delimiter)+1)); $name = substr($name, strpos($name,$delimiter)+1); $fp = fopen($TMP_CALL_NAME .'.TMP', 'a'); $TMP_STRING = $callsign .' ' .$name; fwrite($fp, $TMP_STRING.PHP_EOL); fclose($fp); exec('sort ' .$TMP_CALL_NAME.'.TMP' .' ' .$TMP_CALL_NAME .' | uniq > ' .$TMP_CALL_NAME); return $name; } else return "---"; } else { return _("DMRIDs.dat not correct!"); } } function getCallsignFromDB($id) { $db = new SQLite3('database/callsigns.db'); $results = $db->query("SELECT distinct callsign FROM callsign where id = '$id'"); while ($row = $results->fetchArray()) { return $row['callsign']; } return $id; } // 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 // M: 2017-02-13 15:53:30.991 0000: 04 00 5E 49 57 38 44 59 94 *..^IW8DY.* // M: 2017-02-13 15:53:31.253 0000: 05 00 20 47 69 6F 76 61 DC *.. Giova.* function decodeAlias($logLine) { if (substr($logLine, 34, 2) !=="04") $tok1 = encode(substr($logLine, 40, 2)); else $tok1 = ""; $tok2 = encode(substr($logLine, 43, 2)); $tok3 = encode(substr($logLine, 46, 2)); $tok4 = encode(substr($logLine, 49, 2)); $tok5 = encode(substr($logLine, 52, 2)); $tok6 = encode(substr($logLine, 55, 2)); $tok7 = encode(substr($logLine, 58, 2)); return $tok1.$tok2.$tok3.$tok4.$tok5.$tok6.$tok7; } function getGitVersion(){ if (file_exists(".git")) { exec("git rev-parse --short HEAD", $output); return 'GitID #'.$output[0].''; } else { return 'GitID unknown'; } } function getDMRReflectors() { $data = file_get_contents("http://ham-dmr.de/reflector.db"); $rows = explode("\n",$data); $refls = array(); foreach($rows as $row) { $refls[] = str_getcsv($row,"@",''); } return $refls; } function getDMRplusDMRMasterList() { $data = file_get_contents("http://ham-dmr.de/dmr/dmrmaster2.php"); $rows = explode("\n",$data); $s = array(); foreach($rows as $row) { $s[] = str_getcsv($row,"@",''); } return $s; } function getTGList() { $list = array_map('str_getcsv', file(getcwd().'/database/tgs.csv')); return $list; } function getTGName($id) { global $tgList; $name =""; if (startsWith($id, "TG")) { $name = $tgList[recursive_array_search(substr($id, 8), $tgList)][2]; // $name = substr($id, 8); return "(".$name.")"; } else { return $name; } } ?>