#!/usr/bin/env php
# file updated 20. may 2019, 22:00 from http://razor.arnes.si/~asija3/files/server-status-logger.php
<?php
if(empty($argv[1])) {
exit("server-status-logger.php v0.1 2019 Anton Šijanec astiril/server-status-logger\n
$argv[0] server-status-url [dbfile]\n");
}
if(empty($argv[2])) {
$dbfile = 'log.db';
} else {
$dbfile = $argv[2];
}
$url = $argv[1];
function tablefromhtml($urltoget) {
$dom = new DOMDocument();
//load the html
$html = $dom->loadHTMLFile($urltoget);
//discard white space
$dom->preserveWhiteSpace = false;
//the table by its tag name
$tables = $dom->getElementsByTagName('table');
//get all rows from the table
$rows = $tables->item(0)->getElementsByTagName('tr');
// get each column by tag name
$cols = $rows->item(0)->getElementsByTagName('th');
$row_headers = NULL;
foreach ($cols as $node) {
//print $node->nodeValue."\n";
$row_headers[] = $node->nodeValue;
}
$table = array();
//get all rows from the table
$rows = $tables->item(0)->getElementsByTagName('tr');
foreach ($rows as $row)
{
// get each column by tag name
$cols = $row->getElementsByTagName('td');
$row = array();
$i=0;
foreach ($cols as $node) {
# code...
//print $node->nodeValue."\n";
if($row_headers==NULL)
$row[] = $node->nodeValue;
else
$row[$row_headers[$i]] = $node->nodeValue;
$i++;
}
$table[] = $row;
return $table;
}
}
class MyDB extends SQLite3 {
function __construct() {
$this->open($dbfile);
}
}
$dbConnect = new MyDB();
if(!$dbConnect) {
exit($dbConnect->lastErrorMsg());
} else {
echo "Opened database successfully\n";
}
$tablename = "dnevnik";
$result = $dbConnect->query('CREATE TABLE IF NOT EXISTS '.$tablename.' (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"timestamp" INTEGER,
"worker" INTEGER,
"client" TEXT,
"vhost" TEXT,
"request" TEXT
)');
// var_dump($table); // debug
// exit(); // debug
$countTable = $dbConnect->querySingle("SELECT COUNT(*) as count FROM ".$tablename."");
$countTable = true;
while($countTable) { // while true basically
$table = tablefromhtml($url);
end($table);
$lastkey = key($table);
for($i=1;$i <= $lastkey;$i++) {
// echo $table[$i]["Client"] . " ";
$unique = false;
$smt = $dbConnect->prepare("SELECT `client`, `request` FROM ".$tablename." WHERE `worker` = :worker ORDER BY `timestamp` DESC LIMIT 1");
$smt->bindValue(':worker', explode('-', $table[$i]["Srv"]), SQLITE3_TEXT)[0];
@$query = $smt->execute(); // string>array notice ?!?!?!!?!?
$row = $query->fetchArray(SQLITE3_ASSOC);
// var_dump($row); // debug
if(!is_array($row) || empty(array_diff($row, array($table[$i]["Client"], $table[$i]["Request"])))) {
$unique = true;
}
if($table[$i]["Client"] != "::1" && $unique) { // ::1 because localhost is always querying for some reason via IPv6
$smt = $dbConnect->prepare("INSERT INTO ".$tablename." (timestamp, worker, client, vhost, request) VALUES ( :timestamp, :worker, :client, :vhost, :request )");
$smt->bindValue(':timestamp', date("U"), SQLITE3_TEXT);
$smt->bindValue(':worker', explode('-', $table[$i]["Srv"])[0], SQLITE3_TEXT);
$smt->bindValue(':client', $table[$i]["Client"], SQLITE3_TEXT);
$smt->bindValue(':vhost', $table[$i]["VHost"], SQLITE3_TEXT);
$smt->bindValue(':request', $table[$i]["Request"], SQLITE3_TEXT);
$query = $smt->execute();
if($query) {
echo ".";
} else {
echo "x";
}
} else {
echo "whoops?\n";
$dbConnect->lastErrorMsg();
}
}
}
// echo build_table($table); // debug
// header("Content-type: text/plain"); // debug
// var_dump($table); // debug
function build_table($array){ // not needed, maybe for debugging
// start table
$html = '<table>';
// header row
$html .= '<tr>';
foreach($array[0] as $key=>$value){
$html .= '<th>' . htmlspecialchars($key) . '</th>';
}
$html .= '</tr>';
// data rows
foreach( $array as $key=>$value){
$html .= '<tr>';
foreach($value as $key2=>$value2){
$html .= '<td>' . htmlspecialchars($value2) . '</td>';
}
$html .= '</tr>';
}
// finish table and return it
$html .= '</table>';
return $html;
}
?>