File: //usr/local/sbin/hp-monitord
#!/usr/bin/env php
<?php
require_once("/usr/local/share/hostingplatform/esrpc.php");
$client = new ESRPCConnection();
$client->connect("hp-esrpc");
$target = $client->get();
$packages = $target->listHostingPackages();
$counters = array();
$file = "/tmp/hp-monitord.sock";
$server = socket_create(AF_UNIX, SOCK_STREAM, 0) or die ("Cannot create socket!");
if (file_exists($file)) unlink($file);
socket_bind($server, $file) or die ("Cannot bind socket!");
socket_listen($server, 10) or die ("Cannot listen on socket!");
socket_set_nonblock($server) or die ("Cannot set socket nonblocking!");
proc_nice(10);
foreach ($packages as $packagename => $package) {
foreach ($package['domains'] as $domain) {
$counters[$domain] = new LogCounter(
"/var/log/apache2/hostingpackages/$packagename/$domain-access.log"
);
}
}
$json = false;
while (true) {
foreach ($counters as $domain => $counter) {
if ($counter->update())
$json = false;
}
while (($client = @socket_accept($server)) !== false) {
if (!$json) {
$data = array();
foreach($counters as $domain => $counter)
$data[$domain] = $counter->out;
$json = json_encode($data);
}
socket_write($client, $json);
socket_close($client);
}
sleep(1);
}
class LogCounter {
var $out = 0;
var $__file;
var $__ifp;
var $__pos = 0;
var $__maxLines = 10000;
var $__pattern = "/(?xU)
\S+ # address
\s+
\S+\s+\S+\s+ # - -
# date
\[ # date opening bracket
(?P<day>\d+) # day
\/
(?P<month>\w+) # month
\/
(?P<year>\d+) # year
:.* # time
\] # date closing bracket
\s+
# URL
\".*\"
\s+
\d+ # Status code
\s+
(?P<size>\d+) # Size
\s+
# Reminder...
.*
/";
function __construct($file) {
$this->__file = $file;
}
function __open() {
$this->__ifp = fopen($this->__file, "r");
}
function update() {
if (!$this->__ifp) $this->__open();
$linecount = 0;
fseek($this->__ifp, $this->__pos);
while($line = fgets($this->__ifp)) {
$r = preg_match($this->__pattern, $line, $matches);
$this->out += round($matches["size"]);
if (++$linecount > $this->__maxLines) break;
}
$this->__pos = ftell($this->__ifp);
return $linecount != 0;
}
}