You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

553 lines
18 KiB

3 years ago
<?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" )) {
if( strpos( $oldline, "network watchdog" )) {
break;
}
3 years ago
$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;
}