<?php
ini_set('display_startup_errors', 1);
require 'config.php';
require 'ip2coordinates.php';
header('Content-Type: text/event-stream');
// recommended to prevent caching of event data.
header('Cache-Control: no-cache');
function xmlWalker($xml_array, $parent) {
$cmd="";
foreach($xml_array as $tag => $value) {
if ((int)$tag === $tag) {
}
$cmd = $cmd . "<" .$tag. ">";
$cmd = $cmd . xmlWalker($value, $tag);
} else {
$cmd = $cmd . $value;
}
$cmd = $cmd . "</" .$tag. ">";
}
return $cmd;
}
function parseDOMNode(DOMNode $domNode) {
$str="";
$cnt=0;
foreach ($domNode->childNodes as $node)
{
if ($cnt){
$str .= ",";
}
if($node->hasChildNodes()) {
if (!$node->childNodes->item(0)->hasChildNodes() ||
strpos($node->nodeName,"list")!==false ||
$node->nodeName === "histogram" ) {
$str .= parseDOMNode($node);
} else {
$str .= $node->nodeName.'(' ;
$str .= parseDOMNode($node);
$str .= ') ' ;
}
} else {
if (is_numeric($node->nodeValue) || $node->parentNode->nodeName === "pid") {
$str .= $node->nodeValue ;
} else {
if (strlen($node->nodeValue)) {
$str .= '"' . $node->nodeValue . '"' ;
} else {
$str .= "-1";
}
}
}
$cnt++;
}
return $str;
}
function stat2db($info){
global $code;
// Establish a MySQL connection and select our database using values contained in config.php.
if (PHP_SAPI === 'cli') {
$ip = "171.173.43.71";
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
$userinfo = IPtoCoordinates($ip);
$msql = 'INSERT INTO `visitor_map` (`ip`, `location`, `longitude`, `latitude`,`time`, `neve`, `realtime`, `cputime`,`code` ) VALUES ('
. '\'' . $userinfo['location'] . '\', '
. $userinfo['longitude'] . ', '
. $userinfo['latitude'] . ' , '
. $info
')';
send_message(0,$msql,100);
// Assign the user's IP to a variable and plot it into our function, whose return value is assigned to $userinfo
// Remember, the user's IP is not to be trusted 100%
// We select the location column from the database
$user = mysql_query('SELECT `location` FROM `visitor_map` WHERE `location` = \'' . $userinfo['location'] . '\'');
// If it does NOT return a value, and the user's IP could indeed be matched...
// (This makes sure that we have no duplicate rows (which would be a waste) and can determine the visitor's location, respectively)
// ...We insert the values returned by our function into the database, escaping any possible dangerous input
// or die(mysql_error());
}
function executeCmd($commandLine) {
$pipe = popen("$commandLine" , 'r');
if (!$pipe) {
print "pipe failed.";
return "";
}
$output = '';
$contents = fread($pipe, 12);
$unpacked = unpack("l*",$contents);
$id = $unpacked[1];
$len = $unpacked[2];
$progress = $unpacked[3];
if ($len>0){
$out= fread($pipe, $len);
if ($id == 3){
stat2db($out);
// $out = $_SERVER['REMOTE_ADDR'] . ";" .$out ;
// $retval = system("echo '$out' >> public/blab2stat.txt ");
// $out .= ";" . $retval;
$id = 0 ;
}
send_message($id,$out,$progress);
}
$output .=$out;
}
return $output;
}
function send_message($id, $message, $progress) {
$d = array('message' => $message , 'progress' => $progress); //prepare json
echo "id: $id" . PHP_EOL;
if (PHP_SAPI !== 'cli') {
echo PHP_EOL;
}
}
$code="";
if (PHP_SAPI === 'cli') {
$code = $argv[1];
} else {
if (isset($_GET["code"])){
$code = $_GET["code"];
}
}
$neve = $data['analysis']['neve'];
$source= $data['analysis']['datasource'];
$xml = '<?xml version="1.0" encoding="utf-8"?>' . xmlWalker($data,'start');
$dom = new DOMDocument;
$dom->loadXML($xml);
echo "<pre>";
echo $dom->saveXML();
echo "</pre>";
echo PHP_EOL;
$cnt=0;
$fstart = $dom->createElement("init");
$dom->appendChild($fstart);
$el = $dom->getElementsByTagName('neve')->item(0);
$fstart->appendChild($el);
$el = $dom->getElementsByTagName('datasource')->item(0);
$fstart->appendChild($el);
$histogramCount = $dom->getElementsByTagName('h1d')->length;
for($i= $histogramCount-1;$i>=0;--$i)
{
$idnode=$dom->createElement("id","$i");
$histo=$dom->getElementsByTagName('h1d')->item($i);
$histo->appendChild($idnode);
$newnode=$dom->createTextNode("$i");
$parent = $histo->parentNode;
//$histo->setAttribute('id',"$i");
$fstart->appendChild($histo);
$parent->appendChild($newnode);
}
$xpath = new DOMXpath($dom);
$nodelist = $xpath->query('//selector|//combiner');
$cnt=1;
foreach ($nodelist as $plist) {
$newnode=$dom->createElement("plist","$cnt");
$fstart->appendChild($newnode);
$newnode=$dom->createElement("id","$cnt");
$plist->appendChild($newnode);
$cnt++;
}
$nodelist = $xpath->query('//list|//list1|//list2');
$cnt=1;
foreach ($nodelist as $plist) {
if( $plist->childNodes->length === 0){
$newnode=$dom->createTextNode("-1");
$plist->appendChild($newnode);
}
}
//$isEmpty = $elem->childNodes->length === 0;
echo "<pre>";
echo $dom->saveXML();
echo "</pre>";
echo PHP_EOL;
$str="";
foreach ($dom->getElementsByTagName('analysis') as $node){
$str = PHP_EOL . "void Blab2::event(){" . PHP_EOL ;
$str .= parseDOMNode($node) . ";";
$str .= PHP_EOL . "}" . PHP_EOL ;
}
$nodelist = $fstart->getElementsByTagName('h1d');
$init = PHP_EOL . "void Blab2::Init(){" . PHP_EOL ;
$init .="fNeve=$neve;" . PHP_EOL ;
$init .="fData=$source;" . PHP_EOL ;
foreach ($nodelist as $node) {
$init .= $node->nodeName . "(";
$cnt=0;
foreach ($node->childNodes as $el) {
if ($cnt) {
$init .= ",";
}
$init .= $el->nodeValue ;
} else {
$init .= '"' . $el->nodeValue . '"' ;
}
$cnt++;
}
$init .= ");" . PHP_EOL;
}
foreach ($fstart->getElementsByTagName('plist') as $node) {
$init .= $node->nodeName . "(" .$node->nodeValue . ");" . PHP_EOL;
}
$init .= PHP_EOL . "}" . PHP_EOL ;
$cmd0 = ".L BParticle.cc+". PHP_EOL;
$cmd0 .= ".L BEvent.cc+". PHP_EOL;
$cmd0 .= ".L Blab2.cc". PHP_EOL;
$cmd0 .= $str. PHP_EOL;
$cmd0 .= $init. PHP_EOL;
$cmd0 .= "Blab2 *blab2 = new Blab2();". PHP_EOL;
//LONG RUNNING TASK
//executeCmd(5, 'ls');
//executeCmd(5, "/home/rok/public_html/blab/blockly/app/runscript.sh");
//executeCmd(5, 'for ((i=0;i<5;i++)) ; do echo $i; sleep 1; done;');
$profile ='/opt/root/bin/thisroot.sh';
} else {
$profile ='/home/rok/root/bin/thisroot.sh';
}
$cmd ="bash -c 'source $profile ;cd src; root -b -l <<EOL" . PHP_EOL;
$cmd .= $cmd0. PHP_EOL;
$cmd .= "EOL'". PHP_EOL;
send_message(0,$cmd0,0);
executeCmd($cmd);
send_message('CLOSE', $data,100);
?>