&1", $output); if (!startsWith(substr($output[0],18,8),"20")) { return getMMDVMHostFileVersion(); } 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)) { return date("d M Y", filectime($filename)); } } 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); } return $conf; } function getCallsign($mmdvmconfigs) { // returns Callsign from MMDVM-config return getConfigItem("General", "Callsign", $mmdvmconfigs); } function getConfigItem($section, $key, $configs) { // retrieves the corresponding config-entry within a [section] $sectionpos = array_search("[" . $section . "]", $configs) + 1; $len = count($configs); while(startsWith($configs[$sectionpos],$key."=") === false && $sectionpos <= ($len) ) { if (startsWith($configs[$sectionpos],"[")) { return null; } $sectionpos++; } return substr($configs[$sectionpos], strlen($key) + 1); } 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. ?> "> 0) { $callsign = substr($callsign2, 0, strpos($callsign2,"/")); } $callsign = trim($callsign); $id =""; if ($mode == "D-Star") { $id = substr($callsign2, strpos($callsign2,"/") + 1); } $target = substr($logLine, strpos($logLine, "to") + 3); $source = "RF"; if (strpos($logLine,"network") > 0 ) { $source = "Net"; } switch ($mode) { case "D-Star": $duration = $dstarduration; $loss = $dstarloss; $ber = $dstarber; break; case "DMR Slot 1": $duration = $ts1duration; $loss = $ts1loss; $ber = $ts1ber; break; case "DMR Slot 2": $duration = $ts2duration; $loss = $ts2loss; $ber = $ts2ber; break; case "YSF": $duration = $ysfduration; $loss = $ysfloss; $ber = $ysfber; break; case "P25": $duration = $p25duration; $loss = $p25loss; $ber = $p25ber; break; } // Callsign or ID should be less than 11 chars long, otherwise it could be errorneous if ( strlen($callsign) < 11 ) { $name = "";//getName($callsign); array_push($heardList, array($timestamp, $mode, $callsign, $name, $id, $target, $source, $duration, $loss, $ber)); $duration = ""; $loss =""; $ber = ""; if ($onlyLast && count($heardList )> 4) { return $heardList; } } } return $heardList; } 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") || (startsWith($listElem[1], "DMR")) ) { if(!(array_search($listElem[2]."#".$listElem[1].$listElem[4], $heardCalls) > -1)) { array_push($heardCalls, $listElem[2]."#".$listElem[1].$listElem[4]); if ($listElem[2] !== "??????????") { $listElem[3] = getName($listElem[2]); } else { $listElem[3] = "---"; } if (constant("SHOWQRZ") && $listElem[2] !== "??????????" && !is_numeric($listElem[2])) { $listElem[2] = "".str_replace("0","Ø",$listElem[2]).""; } else { $listElem[2] = "".$listElem[2].""; } array_push($lastHeard, $listElem); $counter++; } } } return $lastHeard; } function getActualMode($metaLastHeard, $mmdvmconfigs) { // returns mode of repeater actual working in $listElem = $metaLastHeard[0]; $timestamp = new DateTime($listElem[0]); $mode = $listElem[1]; if (startsWith($mode, "DMR")) { $mode = "DMR"; } if ($listElem[6] ==="") { return $mode; } else { $now = new DateTime(); $hangtime = getConfigItem("General", "ModeHang", $mmdvmconfigs); if ($hangtime != "") { $timestamp->add(new DateInterval('PT' . $hangtime . 'S')); } else { $source = $listElem[6]; if ($source === "Network") { $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 .= ""; } } $out .= "
" . $linkSource . " " . $protocol . "-link to " . $linkDest . " " . $linkDir . "
"; 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)); } if ($to !== "") { return $to; } } } 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)); } if ($to !== "") { return $to; } } } return "not linked"; break; case "YSF": // 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 // M: 2016-09-25 16:08:05.811 Connect to 62829 has been requested by DG9VH // M: 2016-10-01 17:52:36.586 Automatic connection to 62829 foreach($logLines as $logLine) { $to = ""; if (strpos($logLine,"Starting YSFGateway")) { $to = -1; } if (strpos($logLine,"DISCONNECT Reply")) { $to = -1; } if (strpos($logLine,"Connect to")) { $to = substr($logLine, 38, 5); } if (strpos($logLine,"Automatic connection to")) { $to = substr($logLine, 51, 5); } if ($to !== "") { return $to; } } return -1; break; } return "something went wrong!"; } function getActualReflector($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 "Reflector not linked"; } 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 "Reflector not linked"; } function getActiveYSFReflectors() { $reflectorlist = Array(); $file = fopen(YSFHOSTSPATH."/".YSFHOSTSFILENAME, 'r'); if ($file) { while (($line = fgetcsv($file, 1000, ";")) !== FALSE) { //$line is an array of the csv elements // print_r($line); array_push($reflectorlist, array($line[1], $line[2], $line[0], $line[5])); } } fclose($file); return $reflectorlist; } /* function getActiveYSFReflectors($logLines) { // 00000000001111111111222222222233333333334444444444555555555566666666667777777777888888888899999999990000000000111111111122 // 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901 // D: 2016-06-11 19:09:31.371 Have reflector status reply from 89164/FUSIONBE2 /FusionBelgium /002 $reflectors = Array(); $reflectorlist = Array(); foreach ($logLines as $logLine) { if (strpos($logLine, "Have reflector status reply from")) { $timestamp = substr($logLine, 3, 19); $timestamp2 = new DateTime($timestamp); $now = new DateTime(); $timestamp2->add(new DateInterval('PT2H')); if ($now->format('U') <= $timestamp2->format('U')) { $str = substr($logLine, 60); $id = strtok($str, "/"); $name = strtok("/"); $description = strtok("/"); $concount = strtok("/"); if(!(array_search($name, $reflectors) > -1)) { array_push($reflectors,$name); array_push($reflectorlist, array($name, $description, $id, $concount, $timestamp)); } } } } array_multisort($reflectorlist); return $reflectorlist; } */ function getYSFReflectorById($id, $reflectors) { if ($id ==-1) { return "not linked"; } else { foreach($reflectors as $reflector) { if ($reflector[2] === $id) { return $reflector[0]; } } } } function getName($callsign) { if (is_numeric($callsign)) { return "---"; } if (file_exists(DMRIDDATPATH)) { $callsign = trim($callsign); if (strpos($callsign,"-")) { $callsign = substr($callsign,0,strpos($callsign,"-")); } $delimiter =" "; exec("grep -P '".$callsign.$delimiter."' ".DMRIDDATPATH, $output); if (count($output) == 0) { $delimiter = "\t"; exec("grep -P '".$callsign.$delimiter."' ".DMRIDDATPATH, $output); } $name = substr($output[0], strpos($output[0],$delimiter)+1); $name = substr($name, strpos($name,$delimiter)+1); return $name; } else { return "DMRIDs.dat not correct!"; } } ?>