commit
1c094833ba
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2021 Dominic Reich, OE7DRT <oe7drt@gmail.com>
|
||||
|
||||
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.
|
@ -0,0 +1,4 @@
|
||||
# My personal hotspot dashboard
|
||||
|
||||
Using this for YSF and DMR+.
|
||||
|
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* conf.php
|
||||
* Dashboard for my personal hotspot dashboard
|
||||
* Configuration file
|
||||
* Dominic Reich, OE7DRT, oe7drt@oevsv.at
|
||||
*/
|
||||
|
||||
/* General Settings */
|
||||
define('CALLSIGN', 'OE7DRT');
|
||||
define('DMRID_DAT', '/home/pi/dmrid.dat');
|
||||
define('MAXENTRIES', 15);
|
||||
|
||||
/* Brandmeister specific settings */
|
||||
/* Well, I used this in my first version */
|
||||
// define("BM_INI", "/etc/MMDVM-BM.ini");
|
||||
// define("BM_PREFIX", "DMRHost-BM");
|
||||
// define("BM_LOGPATH", "/var/log/mmdvm");
|
||||
|
||||
/* IPSC2 specific settings */
|
||||
define("IPSC_INI", "/etc/MMDVM-IPSC.ini");
|
||||
define("IPSC_PREFIX", "DMRHost-IPSC");
|
||||
define("IPSC_LOGPATH", "/var/log/mmdvm");
|
||||
|
||||
/* YSF specific settings */
|
||||
define("MMDVMHOST_INI", "/etc/MMDVM-YSF.ini");
|
||||
define("MMDVMHOST_PREFIX", "MMDVM");
|
||||
define("MMDVMHOST_LOGPATH", "/var/log/mmdvm");
|
||||
|
||||
define("YSFGW_INI", "/etc/YSFGateway.ini");
|
||||
define("YSFGW_PREFIX", "YSFGateway");
|
||||
define("YSFGW_LOGPATH", "/var/log/mmdvm");
|
||||
|
||||
?>
|
@ -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;
|
||||
}
|
@ -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}
|
@ -0,0 +1,549 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* func.php
|
||||
* Dashboard for my personal hotspot dashboard
|
||||
* Functions file
|
||||
* Dominic Reich, OE7DRT, oe7drt@oevsv.at
|
||||
*/
|
||||
|
||||
function getBMInfo() {
|
||||
$iniFile = BM_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];
|
||||
|
||||
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 "<td>$dns</td>\n <td>" . trim( $portLine[1] ) . "</td>\n";
|
||||
} else {
|
||||
//echo "Master: " . trim( $addressLine[1] ) . ":" . trim( $portLine[1] );
|
||||
echo "<td>" . trim( $addressLine[1] ) . "</td>\n <td>" . trim( $portLine[1] ) . "</td>\n";
|
||||
}
|
||||
|
||||
echo "<td><a href=\"https://brandmeister.network/?page=repeater&id=$rpt_id\" target=\"_blank\">$rpt_id</a></td>\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 "<td>$rpt_id</td>\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 "<td>$dns</td>\n <td>" . trim( $portLine[1] ) . "</td>\n";
|
||||
// } else {
|
||||
//echo "Master: " . trim( $addressLine[1] ) . ":" . trim( $portLine[1] );
|
||||
echo "<td>" . trim( $addressLine[1] ) . "</td>\n";
|
||||
// echo " <td>" . trim( $portLine[1] ) . "</td>\n";
|
||||
// }
|
||||
|
||||
$logline = `egrep -h "^Options=\"" $iniFile | tail -n 1`;
|
||||
|
||||
if( !empty( $logline )) {
|
||||
$optionsLine = explode( "\"", $logline );
|
||||
$options = explode( ";", $optionsLine[1] );
|
||||
|
||||
echo "<td style=\"word-break:break-word;\">";
|
||||
|
||||
foreach( $options as $option ) {
|
||||
echo "$option ";
|
||||
}
|
||||
} else {
|
||||
echo "<td>N/A</td>";
|
||||
}
|
||||
|
||||
echo "</td>\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 "<td>" . trim( $idLine[1] ) . "</td>\n";
|
||||
|
||||
echo "<td>" . trim( $startupLine[1] ) . "</td>\n<td>";
|
||||
|
||||
foreach( $DGIDs as $DGID ) {
|
||||
echo "$DGID ";
|
||||
}
|
||||
|
||||
echo "</td>\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 = "<a href=\"https://www.radioid.net/database/view?id=$call\"" . " target=\"_blank\">$call</a>";
|
||||
|
||||
global $mem;
|
||||
|
||||
if( !empty( $mem )) {
|
||||
|
||||
foreach( $mem as $key => $val ) {
|
||||
if( $val[0] === $id ) {
|
||||
$call = $mem[$key];
|
||||
$callsign = $call[1];
|
||||
|
||||
$call_code = "<a href=\"https://qrz.com/db/$callsign\"" . " target=\"_blank\">$callsign</a>";
|
||||
|
||||
return $call_code;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$call_code = "<a href=\"https://www.radioid.net/database/view?id=$id\"" . " target=\"_blank\">$id</a>";
|
||||
|
||||
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 = "<a href=\"https://qrz.com/db/$call\" target=\"_blank\">$call" . "</a>$suffix";
|
||||
} elseif( strlen( $call ) == 7 ) {
|
||||
// old version linked to ham-digital which now is fusioned into radioid.net
|
||||
//$call = "<a href=\"https://ham-digital.org/dmr-userreg.php?usrid=$call\"" . " target=\"_blank\">$call</a>";
|
||||
$call = CallsignLookupDB( $call );
|
||||
} elseif( strlen( $call ) == 6 ) {
|
||||
$call = "<a href=\"https://www.radioid.net/map?locator=$call\"" . " target=\"_blank\">$call</a>";
|
||||
} 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 = "<a href=\"https://brandmeister.network/?page=lh&DestinationID=$tg_id\" target=\"_blank\">$tg</a>";
|
||||
|
||||
return $tg_new;
|
||||
}
|
||||
|
||||
return $tg;
|
||||
}
|
||||
|
||||
function rssiCalcImg( $val ) {
|
||||
if( $val > -53 ) $rssi = "<img title=\"S9 +40dB\" alt=\"S9 +40dB\" src=\"img/4.png\">";
|
||||
else if( $val > -63 ) $rssi = "<img title=\"S9 +30dB\" alt=\"S9 +30dB\" src=\"img/4.png\">";
|
||||
else if( $val > -73 ) $rssi = "<img title=\"S9 +20dB\" alt=\"S9 +20dB\" src=\"img/4.png\">";
|
||||
else if( $val > -83 ) $rssi = "<img title=\"S9 +10dB\" alt=\"S9 +10dB\" src=\"img/4.png\">";
|
||||
else if( $val > -93 ) $rssi = "<img title=\"S9\" alt=\"S9\" src=\"img/4.png\">";
|
||||
else if( $val > -99 ) $rssi = "<img title=\"S8\" alt=\"S8\" src=\"img/3.png\">";
|
||||
else if( $val > -105 ) $rssi = "<img title=\"S7\" alt=\"S7\" src=\"img/3.png\">";
|
||||
else if( $val > -111 ) $rssi = "<img title=\"S6\" alt=\"S6\" src=\"img/2.png\">";
|
||||
else if( $val > -117 ) $rssi = "<img title=\"S5\" alt=\"S5\" src=\"img/2.png\">";
|
||||
else if( $val > -123 ) $rssi = "<img title=\"S4\" alt=\"S4\" src=\"img/1.png\">";
|
||||
else if( $val > -129 ) $rssi = "<img title=\"S3\" alt=\"S3\" src=\"img/1.png\">";
|
||||
else if( $val > -135 ) $rssi = "<img title=\"S2\" alt=\"S2\" src=\"img/0.png\">";
|
||||
else if( $val > -141 ) $rssi = "<img title=\"S1\" alt=\"S1\" src=\"img/0.png\">";
|
||||
|
||||
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 " <tr>\n" .
|
||||
"<td align=\"right\">$id</td>\n" .
|
||||
"<td>$time</td>\n" .
|
||||
"<td>" . linkCallsign( $callsign ) ."</td>\n" .
|
||||
"<td>$slot</td>\n" .
|
||||
"<td>" . linkTG( $tg, $linktg ) . "</td>\n" .
|
||||
"<td>$duration</td>\n" .
|
||||
"<td>$loss</td>\n" .
|
||||
"<td>$ber</td>\n" .
|
||||
"</tr>\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 "<pre><code>\$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 )."</code></pre>\n";
|
||||
|
||||
// echo "<pre><code>OLD LINE: $oldline\nLINE: $line\n</code></pre>\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 = "<a href=\"https://qrz.com/db/$rpt\" target=\"_blank\">$rpt</a>";
|
||||
} */
|
||||
if( preg_match( '/[A-Z]{1,2}\d[A-Z]{1,3}/', $rpt )) {
|
||||
$rpt = "<a href=\"https://qrz.com/db/$rpt\" target=\"_blank\">$rpt</a>";
|
||||
}
|
||||
|
||||
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 " <tr>\n" .
|
||||
"<td>$id</td>\n" .
|
||||
"<td>$time</td>\n" .
|
||||
"<td>" . linkCallsign( $callsign ) ."</td>\n" .
|
||||
"<td>$dgid</td>\n" .
|
||||
"<td>$repeater</td>\n" .
|
||||
"<td>$duration</td>\n" .
|
||||
"<td>$loss</td>\n" .
|
||||
"<td>$ber</td>\n" .
|
||||
"</tr>\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<!-- start logfile output -->\n<h2>DEBUG LOGFILES OUTPUT</h2>\n";
|
||||
echo "<div style=\"text-align:left;font-size:0.8em;\"><code><pre>\n";
|
||||
|
||||
foreach( $logLines as $line ) {
|
||||
if ( substr( $line, 0, 4) == "==> " ) {
|
||||
echo "<strong style=\"font-size:1.3em;\">$line</strong>\n";
|
||||
} else {
|
||||
echo "$line\n";
|
||||
}
|
||||
}
|
||||
|
||||
echo "\n</pre></code></div>\n<!-- end logfile output -->\n\n";
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/*
|
||||
* index.php
|
||||
* Dashboard for my personal hotspot dashboard
|
||||
* Dominic Reich, OE7DRT, oe7drt@oevsv.at
|
||||
*/
|
||||
|
||||
$time_start = microtime(true);
|
||||
include("conf.php");
|
||||
include("func.php");
|
||||
$mem = ImportDB();
|
||||
?><!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title><?php echo CALLSIGN ?> Dashboard</title>
|
||||
<meta name=viewport content="width=device-width,initial-scale=1">
|
||||
<meta name=generator content="Sublime Text 3 / Vim">
|
||||
<meta name="author" content="Dominic Reich">
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="dash.min.css" />
|
||||
<meta http-equiv="refresh" content="60">
|
||||
</head>
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="header">
|
||||
<a href="<?php echo $_SERVER['REQUEST_URI'] ?>"><h1><?php echo CALLSIGN ?> Hotspot Dashboard</h1></a>
|
||||
</div>
|
||||
<div id="content">
|
||||
<table id="toptable" align="center" width="100%" cellpadding="2px" border="0">
|
||||
<tr>
|
||||
<th>Hostname</th>
|
||||
<th>Model</th>
|
||||
<th>CPU Freq.</th>
|
||||
<th>Load</th>
|
||||
<th>Uptime</th>
|
||||
<th>Temp.</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><?php echo trim(`hostname`); ?> (<?php echo trim(`hostname -I | cut -d' ' -f1`); ?>)</td>
|
||||
<td><?php echo trim( `cat /sys/firmware/devicetree/base/model | sed 's/Raspberry\ Pi/RPi/'` ); ?> (<?php echo trim( `uname -sr` ); ?>)</td>
|
||||
<td><?php echo round((int)`cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq` / 1000) . " MHz"; ?></td>
|
||||
<td><?php echo str_replace(","," /",implode(", ", explode(" ", `cat /proc/loadavg`, -2))); ?></td>
|
||||
<td><?php echo getUptime(); ?></td>
|
||||
<td><?php echo round((int)`cat /sys/class/thermal/thermal_zone0/temp` / 1000) . "°C"; ?></td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<div id="bmtable">
|
||||
<h2>YSF</h2>
|
||||
|
||||
<table width="100%" cellpadding="2px" border="0">
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Time (<?php echo date("T"); ?>)</th>
|
||||
<th>Call</th>
|
||||
<th>DG-ID</th>
|
||||
<th>Source</th>
|
||||
<th>Dur</th>
|
||||
<th>Loss</th>
|
||||
<th>BER</th>
|
||||
</tr>
|
||||
<?php getLastHeardYSF(MMDVMHOST_LOGPATH, MMDVMHOST_PREFIX) ?>
|
||||
</table>
|
||||
|
||||
<div class="box">
|
||||
<table width="100%" cellpadding="2px" border="0">
|
||||
<tr>
|
||||
<th>Hotspot ID</th>
|
||||
<th>Startup Reflector</th>
|
||||
<th><?php echo countDGIDs() ?> DG-IDs booked</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<?php getYSFInfo(); ?>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
<div id="ipsctable">
|
||||
<h2>IPSC</h2>
|
||||
|
||||
<table width="100%" cellpadding="2px" border="0">
|
||||
<tr>
|
||||
<th>#</th>
|
||||
<th>Time (<?php echo date("T"); ?>)</th>
|
||||
<th>Call</th>
|
||||
<th>Slot</th>
|
||||
<th>TG</th>
|
||||
<th>Dur</th>
|
||||
<th>Loss</th>
|
||||
<th>BER</th>
|
||||
</tr>
|
||||
<?php getLastHeard(IPSC_LOGPATH, IPSC_PREFIX) ?>
|
||||
</table>
|
||||
|
||||
<div class="box">
|
||||
<table width="100%" cellpadding="2px" border="0">
|
||||
<tr>
|
||||
<th>Hotspot ID</th>
|
||||
<th>Server</th>
|
||||
<!-- <th>Port</th> -->
|
||||
<th>DMR Options</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<?php getIPSCInfo(); ?>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
<div id="footer">
|
||||
I worked <?php $time_end = microtime(true); echo (round($time_end - $time_start, 3)*1000)."ms"; ?> on this page request — I hope this makes you happy.
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<!-- <?php //$time_end = microtime(true); echo (round($time_end - $time_start, 3)*1000)."ms"; ?>-.- -->
|
@ -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
|
||||
|
Loading…
Reference in new issue