From 1c094833ba33c6d33fb5581e337a7f9ef9197037 Mon Sep 17 00:00:00 2001 From: Dominic Reich Date: Sun, 30 May 2021 22:21:12 +0200 Subject: [PATCH] initial commit --- LICENSE | 21 ++ README.md | 4 + conf.php | 35 ++++ dash.css | 189 ++++++++++++++++++ dash.min.css | 1 + func.php | 549 +++++++++++++++++++++++++++++++++++++++++++++++++++ img/0.png | Bin 0 -> 394 bytes img/1.png | Bin 0 -> 452 bytes img/2.png | Bin 0 -> 493 bytes img/3.png | Bin 0 -> 531 bytes img/4.png | Bin 0 -> 571 bytes index.php | 118 +++++++++++ update-db.sh | 57 ++++++ 13 files changed, 974 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100644 conf.php create mode 100644 dash.css create mode 100644 dash.min.css create mode 100644 func.php create mode 100644 img/0.png create mode 100644 img/1.png create mode 100644 img/2.png create mode 100644 img/3.png create mode 100644 img/4.png create mode 100644 index.php create mode 100755 update-db.sh diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..00ab283 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Dominic Reich, OE7DRT + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..a59ec78 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# My personal hotspot dashboard + +Using this for YSF and DMR+. + diff --git a/conf.php b/conf.php new file mode 100644 index 0000000..d9e4f46 --- /dev/null +++ b/conf.php @@ -0,0 +1,35 @@ + diff --git a/dash.css b/dash.css new file mode 100644 index 0000000..fcbbef8 --- /dev/null +++ b/dash.css @@ -0,0 +1,189 @@ +#container { + /*max-width: 1200px;*/ + text-align: left; + margin: auto; + background : #ffffff; + border-radius: 5px 5px 5px 5px; + -moz-border-radius: 5px 5px 5px 5px; + -webkit-border-radius: 5px 5px 5px 5px; + -khtml-border-radius: 5px 5px 5px 5px; + -ms-border-radius: 5px 5px 5px 5px; + box-shadow: 3px 3px 3px #707070; +} + +#header { + background : #2d2d2d; + text-decoration : none; + color : #ffffff; + /*font-family : verdana, arial, sans-serif;*/ + font-family : monospace; + font-size: 1.1em; + text-align : left; + padding : 5px 5px 5px 5px; + border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0px 0px; + -webkit-border-radius: 5px 5px 0px 0px; + -khtml-border-radius: 5px 5px 0px 0px; + -ms-border-radius: 5px 5px 0px 0px; + overflow-wrap: break-word; + } + +#header h1 { + font-family: verdana, arial, sans-serif; + color: whitesmoke; +} + +#content { + padding : 5px 5px 5px 5px; + color : #000000; + background : #ffffff; + text-align: center; + font-size: 1.4em; + /*overflow: hidden;*/ + max-width: 100%; +} + +#toptable { + /*margin-bottom: 0.5em;*/ + width: 100%; +} + +#bmtable { + float: left; + width: 49%; + margin-left: 1px; + margin-right: 1px; +} + +#ipsctable { + float: right; + width: 49%; + margin-left: 1px; + margin-right: 1px; +} + +#footer { + background : #2d2d2d; + text-decoration : none; + color : #ffffff; + font-family : verdana, arial, sans-serif; + font-size : 9px; + text-align : center; + padding : 10px 5px 10px 5px; + border-radius: 0 0 5px 5px; + -moz-border-radius: 0px 0px 5px 5px; + -webkit-border-radius: 0px 0px 5px 5px; + -khtml-border-radius: 0px 0px 5px 5px; + -ms-border-radius: 0px 0px 5px 5px; + clear : both; + overflow-wrap: break-word; +} + +body, font { + background: #edf0f5; + font: 12px verdana,arial,sans-serif; + /*color: #ffffff;*/ + color: #000000; +} + +table { + /*vertical-align: middle;*/ + text-align: center; + empty-cells: show; + padding-left: 0px; + padding-right: 0px; + padding-top: 0px; + padding-bottom: 0px; + border-collapse:collapse; + border-color: #000000; + border-style: solid; + /*border-spacing: 4px; + border-width: 2px;*/ + text-decoration: none; + color: #ffffff; + background: #000000; + font-family: verdana,arial,sans-serif; + /*width: 100%;*/ +/* white-space: nowrap; + overflow-x: scroll; */ +} + +table th { + font-family: "Lucidia Console",Monaco,monospace; + text-shadow: 1px 1px #3d3d3d; + text-decoration: none; + background: #2d2d2d; + /*border: 1px solid #c0c0c0;*/ + border: 1px solid #000000; +} + +table tr:nth-child(even) { + background: #f7f7f7; +} + +table tr:nth-child(odd) { + background: #d0d0d0; +} + +table td { + vertical-align: text-top; + color: #000000; + font-family: "Lucidia Console",Monaco,monospace; + text-decoration: none; + border: 1px solid #000000; +} + +a { + text-decoration:none; + +} + +a:link, a:visited { + text-decoration: none; + color: #0000e0; + font-weight: normal; +} + +ul { + padding: 5px; + margin: 10px 0; + list-style: none; + float: left; +} + +ul li { + float: left; + display: inline; /*For ignore double margin in IE6*/ + margin: 0 10px; +} + +ul li a { + text-decoration: none; + float:left; + color: #999; + cursor: pointer; + font: 900 14px/22px "Arial", Helvetica, sans-serif; +} + +ul li a span { + margin: 0 10px 0 -10px; + padding: 1px 8px 5px 18px; + position: relative; /*To fix IE6 problem (not displaying)*/ + float:left; +} + +h1 { + text-shadow: 2px 2px #000000; + text-align: center; +} + +.box { + margin-top: 1em; + margin-bottom: 0.5em; + margin-left: 1px; + margin-right: 1px; +} + +.clear { + clear: both; +} \ No newline at end of file diff --git a/dash.min.css b/dash.min.css new file mode 100644 index 0000000..5439203 --- /dev/null +++ b/dash.min.css @@ -0,0 +1 @@ +#container{text-align:left;margin:auto;background:#fff;border-radius:5px 5px 5px 5px;-moz-border-radius:5px 5px 5px 5px;-webkit-border-radius:5px 5px 5px 5px;-khtml-border-radius:5px 5px 5px 5px;-ms-border-radius:5px 5px 5px 5px;box-shadow:3px 3px 3px #707070}#header{background:#2d2d2d;text-decoration:none;color:#fff;font-family:monospace;font-size:1.1em;text-align:left;padding:5px 5px 5px 5px;border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px 5px 0 0;-khtml-border-radius:5px 5px 0 0;-ms-border-radius:5px 5px 0 0;overflow-wrap:break-word}#header h1{font-family:verdana,arial,sans-serif;color:whitesmoke}#content{padding:5px 5px 5px 5px;color:#000;background:#fff;text-align:center;font-size:1.4em;max-width:100%}#toptable{width:100%}#bmtable{float:left;width:49%;margin-left:1px;margin-right:1px}#ipsctable{float:right;width:49%;margin-left:1px;margin-right:1px}#footer{background:#2d2d2d;text-decoration:none;color:#fff;font-family:verdana,arial,sans-serif;font-size:9px;text-align:center;padding:10px 5px 10px 5px;border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0 0 5px 5px;-khtml-border-radius:0 0 5px 5px;-ms-border-radius:0 0 5px 5px;clear:both;overflow-wrap:break-word}body,font{background:#edf0f5;font:12px verdana,arial,sans-serif;color:#000}table{text-align:center;empty-cells:show;padding-left:0;padding-right:0;padding-top:0;padding-bottom:0;border-collapse:collapse;border-color:#000;border-style:solid;text-decoration:none;color:#fff;background:#000;font-family:verdana,arial,sans-serif}table th{font-family:"Lucidia Console",Monaco,monospace;text-shadow:1px 1px #3d3d3d;text-decoration:none;background:#2d2d2d;border:1px solid #000}table tr:nth-child(even){background:#f7f7f7}table tr:nth-child(odd){background:#d0d0d0}table td{vertical-align:text-top;color:#000;font-family:"Lucidia Console",Monaco,monospace;text-decoration:none;border:1px solid #000}a{text-decoration:none}a:link,a:visited{text-decoration:none;color:#0000e0;font-weight:normal}ul{padding:5px;margin:10px 0;list-style:none;float:left}ul li{float:left;display:inline;margin:0 10px}ul li a{text-decoration:none;float:left;color:#999;cursor:pointer;font:900 14px/22px "Arial",Helvetica,sans-serif}ul li a span{margin:0 10px 0 -10px;padding:1px 8px 5px 18px;position:relative;float:left}h1{text-shadow:2px 2px #000;text-align:center}.box{margin-top:1em;margin-bottom:.5em;margin-left:1px;margin-right:1px}.clear{clear:both} \ No newline at end of file diff --git a/func.php b/func.php new file mode 100644 index 0000000..0e4d42d --- /dev/null +++ b/func.php @@ -0,0 +1,549 @@ +$dns\n " . trim( $portLine[1] ) . "\n"; + } else { + //echo "Master: " . trim( $addressLine[1] ) . ":" . trim( $portLine[1] ); + echo "" . trim( $addressLine[1] ) . "\n " . trim( $portLine[1] ) . "\n"; + } + + echo "$rpt_id\n"; +} + +function getIPSCInfo() { + + $iniFile = IPSC_INI; + + $logline = `grep "DMR Network" $iniFile -A 10 | egrep "^Address"`; + $addressLine = explode( "=", $logline ); + + // $logline = `grep "DMR Network" $iniFile -A 10 | egrep "^Port"`; + // $portLine = explode( "=", $logline ); + + $logline = `egrep "^\[DMR]$" $iniFile -A 30 | egrep "^Id="`; + $idLine = explode( "=", $logline ); + $rpt_id = $idLine[1]; + + echo "$rpt_id\n"; + + // if( `command -v nslookup` ) { + // $address = strstr( `nslookup $addressLine[1]`, "=" ); + // $dns = substr( $address, 2, strrpos( $address, "." ) - 2); + + // //echo "Master: $dns on Port: " . trim( $portLine[1] ); + // echo "$dns\n " . trim( $portLine[1] ) . "\n"; + // } else { + //echo "Master: " . trim( $addressLine[1] ) . ":" . trim( $portLine[1] ); + echo "" . trim( $addressLine[1] ) . "\n"; + // echo " " . trim( $portLine[1] ) . "\n"; + // } + + $logline = `egrep -h "^Options=\"" $iniFile | tail -n 1`; + + if( !empty( $logline )) { + $optionsLine = explode( "\"", $logline ); + $options = explode( ";", $optionsLine[1] ); + + echo ""; + + foreach( $options as $option ) { + echo "$option "; + } + } else { + echo "N/A"; + } + + echo "\n"; +} + +function countDGIDs( $iniFile = YSFGW_INI ) { + $logline = `grep "[Network]" $iniFile -A 10 | egrep "^Options"`; + $optionsLine = explode( "=", $logline ); + $DGIDs = explode( ",", $optionsLine[1] ); + + return count( $DGIDs ); +} + +function getYSFInfo() { + $iniFile = YSFGW_INI; + + $logline = `grep "[General]" $iniFile -A 10 | egrep "^Id"`; + $idLine = explode( "=", $logline ); + + $logline = `grep "[Network]" $iniFile -A 10 | egrep "^Startup"`; + $startupLine = explode( "=", $logline ); + + $logline = `grep "[Network]" $iniFile -A 10 | egrep "^Options"`; + $optionsLine = explode( "=", $logline ); + $DGIDs = explode( ",", $optionsLine[1] ); + + echo "" . trim( $idLine[1] ) . "\n"; + + echo "" . trim( $startupLine[1] ) . "\n"; + + foreach( $DGIDs as $DGID ) { + echo "$DGID "; + } + + echo "\n"; +} + +function getUptime() { + $uptime = intval( `cat /proc/uptime | awk '{ print $1 }'` ); + if( $uptime >= 60 ) { + // in minutes + $minutes = intval( $uptime / 60 ); + $seconds = $uptime % 60; + if( $minutes >= 60 ) { + $hours = intval( $minutes / 60 ); + $minutes = $minutes % 60; + if( $hours >= 24 ) { + $days = intval( $hours / 24 ); + $hours = $hours % 24; + $out = "${days}d ${hours}h ${minutes}m and ${seconds}s"; + } else { + // no days, only hours minutes and seconds + $out = "${hours}h ${minutes}m and ${seconds}s"; + } + } else { + // mintes < 60 only minuts, hours + $out = "${minutes}m and ${seconds}s"; + } + } else { + // only seconds + $out = "${uptime}s"; + } + + return $out; +} + +function ImportDB() { + + $contents = array(); + + if( $file = fopen( DMRID_DAT, 'r' )) { + if( !defined("NONAMES")) { + while( !feof( $file )) { + $line = fgetss( $file, 64 ); + $elem = explode( ";", $line ); + array_push( $contents, $elem ); + } + } + fclose( $file ); + } + + return $contents; +} + +function CallsignLookupDB( $id ) { + // $call = "$call"; + + global $mem; + + if( !empty( $mem )) { + + foreach( $mem as $key => $val ) { + if( $val[0] === $id ) { + $call = $mem[$key]; + $callsign = $call[1]; + + $call_code = "$callsign"; + + return $call_code; + } + } + } + + $call_code = "$id"; + + return $call_code; +} + +function linkCallsign( $callsign ) { + $tmp = explode( "-", $callsign ); + $call = trim( $tmp[0] ); + $suffix = ( !empty( $tmp[1] )) + ? "-$tmp[1]" + : ""; + + if( !empty( $suffix )) { + $suffix="-$suffix"; + } + + if( !is_numeric( $call )) { + $call = "$call" . "$suffix"; + } elseif( strlen( $call ) == 7 ) { + // old version linked to ham-digital which now is fusioned into radioid.net + //$call = "$call"; + $call = CallsignLookupDB( $call ); + } elseif( strlen( $call ) == 6 ) { + $call = "$call"; + } elseif( strlen( $call ) == 4 ) { + //$call = "Reflector $call"; + } + + return $call; +} + +function linkTG( $tg, $linktg ) { + if( !is_numeric( $tg ) && $linktg == "bm") { + $tmp = explode( " ", $tg ); + $tg_id = trim( $tmp[1] ); + $tg_new = "$tg"; + + return $tg_new; + } + + return $tg; +} + +function rssiCalcImg( $val ) { + if( $val > -53 ) $rssi = "\"S9"; + else if( $val > -63 ) $rssi = "\"S9"; + else if( $val > -73 ) $rssi = "\"S9"; + else if( $val > -83 ) $rssi = "\"S9"; + else if( $val > -93 ) $rssi = "\"S9\""; + else if( $val > -99 ) $rssi = "\"S8\""; + else if( $val > -105 ) $rssi = "\"S7\""; + else if( $val > -111 ) $rssi = "\"S6\""; + else if( $val > -117 ) $rssi = "\"S5\""; + else if( $val > -123 ) $rssi = "\"S4\""; + else if( $val > -129 ) $rssi = "\"S3\""; + else if( $val > -135 ) $rssi = "\"S2\""; + else if( $val > -141 ) $rssi = "\"S1\""; + + return "$rssi"; +} + +function rssiCalc( $val ) { + if( $val > -53 ) $rssi = "S9+40dB"; + else if( $val > -63 ) $rssi = "S9+30dB"; + else if( $val > -73 ) $rssi = "S9+20dB"; + else if( $val > -83 ) $rssi = "S9+10dB"; + else if( $val > -93 ) $rssi = "S9"; + else if( $val > -99 ) $rssi = "S8"; + else if( $val > -105 ) $rssi = "S7"; + else if( $val > -111 ) $rssi = "S6"; + else if( $val > -117 ) $rssi = "S5"; + else if( $val > -123 ) $rssi = "S4"; + else if( $val > -129 ) $rssi = "S3"; + else if( $val > -135 ) $rssi = "S2"; + else if( $val > -141 ) $rssi = "S1"; + + return "$rssi ($val dBm)"; +} + +function printTable( $id=0, $linktg, $time, $callsign, $slot, $tg, $duration, $loss = "---", $ber = "---" ) { + if( $duration >= 60 ) { + $min = str_pad( intval( $duration / 60 ), 2, "0", STR_PAD_LEFT ); + $sec = str_pad( $duration % 60, 2, "0", STR_PAD_LEFT ); + $duration = "$min:$sec"; + } else { + $duration = "00:" . str_pad( $duration, 2, "0", STR_PAD_LEFT ); + } + echo " \n" . + "$id\n" . + "$time\n" . + "" . linkCallsign( $callsign ) ."\n" . + "$slot\n" . + "" . linkTG( $tg, $linktg ) . "\n" . + "$duration\n" . + "$loss\n" . + "$ber\n" . + "\n"; +} + +// $linktg should be "bm" or false +function getLastHeard($logpath = BM_LOGPATH, $prefix = BM_PREFIX, $linktg = false, $limit = MAXENTRIES) { + $logPath = "$logpath/$prefix-*.log"; + $logLines = explode( "\n", `egrep -h "DMR Slot" $logPath` ); + + $oldline = ""; + + $time = ""; + $loss = ""; + $ber = ""; + $rssi = ""; + $call = ""; + $duration = ""; + $repeater = ""; + + $printLines = []; + + foreach( $logLines as $line ) { + if( empty( $oldline ) && strpos( $line, "network watchdog has expired" )) { + // $oldine=$line; + continue; + } + + if( strpos( $line, "RF end of voice transmission" )) { + $time = date( "Y-m-d H:i:s", strtotime( substr( $line, 3, 24 )." UTC" )); + $callsign = substr( $line, 82, strpos( $line, "to" ) - 82 ); + $slot = substr( $line, 36, strpos( $line, ",") -36); + $tg = substr( $line, 93, strpos( $line, ",", 93 ) - 93 ); + $duration = round( trim( substr( $line, 103, strpos( $line, "seconds,", 103 ) - 103 ), " ," )); + $rssi_values = explode( "/", substr( $line, 133, strpos( $line, "dBm", 133 ) - 133 )); + $loss = rssiCalcImg( round( array_sum( $rssi_values ) / count( $rssi_values ))); + $ber = substr( $line, 120, strpos( $line, ",", 120 ) - 120 ); + if( empty( $ber )) $ber = "---"; + } elseif( strpos( $line, "received network voice header" )) { + if( strpos( $oldline, "received network voice header" )) { + $oldline = $line; + continue; + } else { + $time = date( "Y-m-d H:i:s", strtotime( substr( $line, 3, 24 )." UTC" )); + $old_time = strtotime( $time ); + $oldline=$line; + continue; + } + } elseif( strpos( $line, "received network end of voice" )) { + $time = date( "Y-m-d H:i:s", strtotime( substr( $line, 3, 24 )." UTC" )); + $callsign = substr( $line, 87, strpos( $line, "to ") - 87 ); + $slot = substr( $line, 36, strpos( $line, ",") - 36); + $tg = substr( + $line, + strpos( $line, "to " ) + 3, + strpos( $line, ",", strpos( $line, "to " ) + 3 ) - strpos( $line, "to " ) - 3 + ); + + $duration = substr( + $line, + strpos( $line, "to " ) + strlen( $tg ) + 5, + strpos( $line, " seconds," ) - strpos( $line, "to " ) - strlen( $tg ) - 5 + ); + $loss = substr( + $line, + strpos( $line, "seconds, " ) + 9, + strpos( $line, " packet loss" ) - strpos( $line, "seconds, " ) - 9 + ); + /*if( $loss == "0%" ) { + $loss = "-x-"; + }*/ + $ber = substr( + $line, + strpos( $line, "BER: " ) + 5, + strpos( $line, "%", strpos( $line, "BER: ")) - strpos( $line, "BER: " ) + ); + //if( $ber == "0.0%" ) $ber = "-x-"; + $rssi = ""; + } else { + continue; + } + // echo "
\$callsign: $callsign at \$dgid: $dgid\n\$old_time: ".date("Y-m-d H:i:s", $old_time ).
+      //   "\n\$new_time: ".date("Y-m-d H:i:s", $new_time )."
\n"; + + // echo "
OLD LINE: $oldline\nLINE: $line\n
\n"; + + $tmp = []; + $tmp['linktg'] = $linktg; + $tmp['time'] = $time; + $tmp['callsign'] = $callsign; + $tmp['slot'] = $slot; + $tmp['tg'] = $tg; + $tmp['duration'] = round( $duration, 0, PHP_ROUND_HALF_UP ); + $tmp['loss'] = $loss; + $tmp['ber'] = $ber; + array_unshift( $printLines, $tmp ); + unset( $tmp ); + + // Lastly we set $oldline as the actual line + $oldline = $line; + } + + $c = 0; + + foreach( $printLines as $key=>$line ) { + printTable( + $c + 1, + $line['linktg'], + $line['time'], + $line['callsign'], + $line['slot'], + $line['tg'], + $line['duration'], + $line['loss'], + $line['ber'] + ); + if( ++$c >= MAXENTRIES ) break; + } // end foreach $printLines +} // end function + +function qrzRepeater( $rpt ) { + /* $pos = strpos( $rpt, "OE" ); + if( $pos !== false) { + $rpt = "$rpt"; + } */ + if( preg_match( '/[A-Z]{1,2}\d[A-Z]{1,3}/', $rpt )) { + $rpt = "$rpt"; + } + + return $rpt; +} + +function printTableYSF( $id=0, $time, $callsign, $dgid, $duration, $repeater, $loss = "---", $ber = "---" ) { + if( $duration >= 60 ) { + $min = str_pad( intval( $duration / 60 ), 2, "0", STR_PAD_LEFT ); + $sec = str_pad( $duration % 60, 2, "0", STR_PAD_LEFT ); + $duration = "$min:$sec"; + } else { + $duration = "00:" . str_pad( $duration, 2, "0", STR_PAD_LEFT ); + } + echo " \n" . + "$id\n" . + "$time\n" . + "" . linkCallsign( $callsign ) ."\n" . + "$dgid\n" . + "$repeater\n" . + "$duration\n" . + "$loss\n" . + "$ber\n" . + "\n"; +} + + +// function getLastHeard($logpath = BM_LOGPATH, $prefix = BM_PREFIX, $linktg = false, $limit = MAXENTRIES) { +// $logPath = "$logpath/$prefix-*.log"; +// $logLines = explode( "\n", `egrep -h "DMR Slot" $logPath` ); + +function getLastHeardYSF($logpath = MMDVMHOST_LOGPATH, $prefix = MMDVMHOST_PREFIX, $limit = MAXENTRIES) { + $logPath = "$logpath/$prefix-*.log"; + $logLines = explode( "\n", `egrep -h "YSF," $logPath` ); + + $oldline = ""; + + $time = ""; + $loss = ""; + $ber = ""; + $rssi = ""; + $call = ""; + $duration = ""; + $repeater = ""; + + $printLines = []; + + foreach( $logLines as $line ) { + if( empty( $oldline ) && strpos( $line, "network watchdog" )) { + // $oldine=$line; + continue; + } + + if( strpos( $line, "RF end of transmission" )) { + $time = date( "Y-m-d H:i:s", strtotime( substr( $line, 3, 23 )." UTC" )); + $callsign = substr( $line, 69, strpos( $line, "to" ) - 69 ); + //$dgid = substr( $line, 83, strpos( $line, ",", 83 ) - 83 ); + $dgid = substr( $line, strpos( $line, "to " ) + 3, strpos( $line, " ", strpos( $line, "to " ) + 3) - strpos( $line, "to " ) + 3 ); + //$repeater = substr( $oldline, strpos( $oldline, "at " ) + 3, strpos( $oldline, " ", strpos( $oldline, "at " ) + 3) - strpos( $oldline, "at " ) + 3 ); + $duration = round( trim( substr( $line, 92, strpos( $line, "seconds,", 92 ) - 92 ), " ," )); + $rssi_values = explode( "/", substr( $line, 113, strpos( $line, "dBm", 113 ) - 113 )); + $rssi = rssiCalc( round( array_sum( $rssi_values ) / count( $rssi_values ))); + $loss = "---"; + $ber = substr( $line, 111, strpos( $line, ",", 111 ) - 111 ); + if( empty( $ber )) $ber = "---"; + $repeater = $rssi; // use this testwise, debug + } elseif( strpos( $line, "network data" )) { + if( strpos( $oldline, "network data" )) { + $oldline = $line; + continue; + } else { + $time = date( "Y-m-d H:i:s", strtotime( substr( $line, 3, 23 )." UTC" )); + $old_time = strtotime( $time ); + $oldline=$line; + continue; + } + } elseif( strpos( $line, "network watchdog" )) { + $time = date( "Y-m-d H:i:s", strtotime( substr( $oldline, 3, 23 )." UTC" )); + $callsign = trim( substr( $oldline, 59, strpos( $oldline, "to" ) - 59 )); + if( strpos( $oldline, "DG-ID" )) { + $dgid = substr( $oldline, 79, strpos( $oldline, "at " ) - 79 ); + } else { + $dgid = substr( $oldline, 73, strpos( $oldline, "at " ) - 73 ); + } + //$dgid = substr( $oldline, strpos( $oldline, "to " ) + 3, strpos( $oldline, " ", strpos( $oldline, "to " ) + 3) - strpos( $oldline, "to " ) + 3 ); + $new_time = strtotime( date( "Y-m-d H:i:s", strtotime( substr( $oldline, 3, 23 )." UTC" ))); + $duration = intval(( $new_time - $old_time )); + $rpt = substr( $oldline, strpos( $oldline, "at " ) + 3, strpos( $oldline, " ", strpos( $oldline, "at " ) + 3) - strpos( $oldline, "at " ) + 3 ); + $repeater = qrzRepeater( trim( $rpt )); + $loss = substr( $line, 75, strpos( $line, "%", 75 ) - 74 ); + if( $loss == "0%" ) { + $loss = "-x-"; + } + $ber = substr( $line, 96, strpos( $line, "%", 96 ) - 95 ); + if( $ber == "0.0%" ) $ber = "-x-"; + } else { + continue; + } + + $tmp = []; + $tmp['time'] = $time; + $tmp['callsign'] = $callsign; + $tmp['dgid'] = $dgid; + $tmp['duration'] = $duration; + $tmp['repeater'] = $repeater; + $tmp['loss'] = $loss; + $tmp['ber'] = $ber; + array_unshift( $printLines, $tmp ); + unset( $tmp ); + + // Lastly we set $oldline as the actual line + $oldline = $line; + } + + $c = 0; + + foreach( $printLines as $key=>$line ) { + printTableYSF( + $c + 1, + $line['time'], + $line['callsign'], + $line['dgid'], + $line['duration'], + $line['repeater'], + $line['loss'], + $line['ber'] + ); + if( ++$c >= MAXENTRIES ) break; + } // end foreach $printLines +} // end function + +function printLogs($logpath, $limit = MAXLOGENTRIES) { + $logPath = "$logpath/*-".gmdate("Y-m-d").".log"; + $logLines = explode("\n", `tail -n $limit $logPath`); + + echo "\n\n

DEBUG LOGFILES OUTPUT

\n"; + echo "
\n";
+
+  foreach( $logLines as $line ) {
+    if ( substr( $line, 0, 4) == "==> " ) {
+      echo "$line\n";
+    } else {
+      echo "$line\n";
+    }
+  }
+
+  echo "\n
\n\n\n"; + return 0; +} diff --git a/img/0.png b/img/0.png new file mode 100644 index 0000000000000000000000000000000000000000..ba238270b0e6f3b686df3f949b7ec094189b1763 GIT binary patch literal 394 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rm-==h@v2>8 zUjt#r3Hg(Uq9HdwB{QuOw}u+SS(AYpBtbR==ckpF oCl;kLl$V$5W#(lUCnpx9>g5-u&wghk1ysb~>FVdQ&MBb@0H}0}!T2>8 zUjt#r3Hg(j5Bb6gGB z_*$o@?U>F+@0@=ji_az~zr4WM?2#eA_Lt}N#pM81s z#fIzhdu_DNOnDbrH9>l{%4N4#%in%JHoyJ7{f}IZeGGZc=KUrs#gl>lQY~?fC`m~y zNwrEYN(E93Mh1okx&{`yh6W*qW>zMaK%{M8WMyDr*PP>lq9HdwB{QuOw+8=vSH1u> wNP=t#&QB{TPb^AhC@(M9%goCzPEIUH)ypqRpZ(583aE&|)78&qol`;+06pfcYXATM literal 0 HcmV?d00001 diff --git a/img/2.png b/img/2.png new file mode 100644 index 0000000000000000000000000000000000000000..cfcd1d53ac862c78c4c3d665aa8bb1c68138dc14 GIT binary patch literal 493 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rm-==h@v2>8 zUjt#r3Hg527^|M?INKH(ubH^rb&@_UjMgvl`~^d2HEUyr231-UkhN z9xpbf3Cr>DY!KP;fnS?x8;3#ww+4eyA={D_(+}<4+hKC;>&s_nnbP7pG`Nb&jjMLm z%;9q_Pi1IXz#*0J>EEK{>W>pwm@%_#7Y~1Yam{j_lTo5U>3ogfK7T!};;p{kLR0Ep z-@z$2zwM2<#kIUO(EhytC&stdo2|}SFI{tMU1;UAUuQo3OP(`ldGk+a^M7_TS2Oha z>sWGV98swWG2>8 zUjt#r3Hg(o<*RbeHeUQXadnZ!ioU#>`fC+Cbq{@fk=S@xNQ6UVg@NJ{zY`r+ z24~zq=SCjVtBd}_)+~{6b&gO=Dlp7cOI#yLQW8s2t&)pUffR$0fuVt}frYN2L5QK5 zm8pT1ftj{}k(Gf#q13ZL6b-rgDVb@NxHT}i$Grt=kObKfoS#-wo>-L1P+nfHmzkGc coSayYs+V7sKKq@G6i^X^r>mdKI;Vst04jCMIRF3v literal 0 HcmV?d00001 diff --git a/img/4.png b/img/4.png new file mode 100644 index 0000000000000000000000000000000000000000..b9d8a492bb18e5e49e2d65a638c59700528f9b2e GIT binary patch literal 571 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6n3BBRT^Rm-==h@v2>8 zUjt#r3HgJve$<^A$9X}68P0-mB?Rly>TxRzCoxlGszwGub z_Ft65)VjiqtCK!=E{;w7a^Z$~{L%!wlg}02UUGGBuNF0Uv_Z?+r#gJC?)==6>tX&& zI;RA6YHpPk5K)s_QNHUC|Aqy|I#JtM()Jd`&aB{AsCPD~jdikjPuR`&1N$TPL}lI4 ziAn18b>mS}c6)hER4em|`MP&cBMPmKH=QfgnA^xCu|epoX|s!xK9|t>DzgH|C5z5I zQ9hJwcV>$E`}VBp#QUeOye;FHdVB4 + + + <?php echo CALLSIGN ?> Dashboard + + + + + + + +
+ +
+ + + + + + + + + + + + + + + + + +
HostnameModelCPU Freq.LoadUptimeTemp.
() ()
+ +
+

YSF

+ + + + + + + + + + + + + +
#Time ()CallDG-IDSourceDurLossBER
+ +
+ + + + + + + + + +
Hotspot IDStartup Reflector DG-IDs booked
+
+
+
+

IPSC

+ + + + + + + + + + + + + +
#Time ()CallSlotTGDurLossBER
+ +
+ + + + + + + + + + +
Hotspot IDServerDMR Options
+
+
+ + +
+ +
+ + + + diff --git a/update-db.sh b/update-db.sh new file mode 100755 index 0000000..b175737 --- /dev/null +++ b/update-db.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Get an actual dmrid.dat file from radioid.net + +# This file got some more logic to also handle backups, +# the code for that was taken from YSFHostsupdate.sh from +# YSFClients: +# https://github.com/g4klx/YSFClients/blob/master/DGIdGateway/YSFHostsupdate.sh +# +############################################################################### + +############################################################################### +# +# YSFHostsupdate.sh +# +# Copyright (C) 2016 by Tony Corbett G0WFV +# Adapted to YSFHosts by Paul Nannery KC2VRJ on 6/28/2016 with all crdeit +# to G0WFV for the orignal script. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# +############################################################################### + +DMRIDFILE=/home/pi/dmrid.dat +BACKUPS=1 + +if [ ${BACKUPS} -ne 0 ] +then + cp ${DMRIDFILE} ${DMRIDFILE}.$(date +%Y%m%d) +fi + +COUNT=$(ls ${DMRIDFILE}.* | wc -l) +TODELETE=$(expr ${COUNT} - ${BACKUPS}) + +if [ ${COUNT} -gt ${BACKUPS} ] +then + for f in $(ls -tr ${DMRIDFILE}.* | head -${TODELETE}) + do + rm -f $f + done +fi + +curl https://www.radioid.net/static/dmrid.dat > ${DMRIDFILE} + +exit 0 +