Subversion Repositories f9daq

Rev

Rev 266 | Rev 320 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. <?php
  2.  
  3. ini_set('display_errors', 1);
  4. ini_set('display_startup_errors', 1);
  5. error_reporting(E_ALL);
  6.  
  7. require 'config.php';
  8. require 'ip2coordinates.php';
  9.  
  10. header('Content-Type: text/event-stream');
  11. // recommended to prevent caching of event data.
  12. header('Cache-Control: no-cache');
  13.  
  14.  
  15. function xmlWalker($xml_array, $parent) {
  16.          $cmd="";
  17.          foreach($xml_array as $tag => $value) {
  18.             if ((int)$tag === $tag) {
  19.                 $tag = mb_substr($parent, 0, -1);
  20.             }
  21.             $cmd = $cmd . "<" .$tag. ">";
  22.             if (is_array($value)) {
  23.                  $cmd = $cmd . xmlWalker($value, $tag);
  24.             } else {
  25.                  $cmd = $cmd . $value;
  26.             }
  27.             $cmd = $cmd . "</" .$tag. ">";
  28.         }
  29.         return $cmd;
  30.     }
  31.  
  32.  
  33.  
  34.  
  35. function parseDOMNode(DOMNode $domNode) {
  36.     $str="";
  37.     $cnt=0;
  38.     foreach ($domNode->childNodes as $node)
  39.     {  
  40.         if ($cnt){
  41.           $str .= ",";
  42.         }
  43.         if($node->hasChildNodes()) {
  44.            if (!$node->childNodes->item(0)->hasChildNodes() ||
  45.                strpos($node->nodeName,"list")!==false       ||
  46.                $node->nodeName === "histogram"              )  {
  47.              $str .= parseDOMNode($node);
  48.            } else {
  49.              $str .=  $node->nodeName.'(' ;
  50.              $str .= parseDOMNode($node);
  51.              $str .=   ') '     ;
  52.            }
  53.  
  54.         } else {
  55.  
  56.           if (is_numeric($node->nodeValue) || $node->parentNode->nodeName === "pid") {
  57.             $str .=   $node->nodeValue ;
  58.           } else {
  59.             if (strlen($node->nodeValue)) {
  60.               $str .=  '"' . $node->nodeValue . '"' ;
  61.             } else {
  62.               $str .=  "-1";
  63.             }
  64.           }
  65.         }
  66.         $cnt++;
  67.     }    
  68.     return $str;
  69. }
  70.  
  71.  
  72.  
  73.  
  74.  
  75.  
  76. function stat2db($info){
  77. global $code;
  78. // Establish a MySQL connection and select our database using values contained in config.php.
  79.  
  80. if (PHP_SAPI === 'cli') {
  81.     $ip = "171.173.43.71";
  82. } else {
  83.   $ip = $_SERVER['REMOTE_ADDR'];
  84. }
  85.  
  86. $userinfo = IPtoCoordinates($ip);
  87.  
  88.  
  89. mysql_connect(DB_HOST, DB_USER, DB_PASS);
  90. mysql_select_db(DB_NAME);
  91.  
  92.  
  93. $msql = 'INSERT INTO `visitor_map` (`ip`, `location`, `longitude`, `latitude`,`time`, `neve`, `realtime`, `cputime`,`code` ) VALUES ('
  94. . '\'' . mysql_real_escape_string($ip) . '\','
  95. . '\'' . $userinfo['location'] . '\', '
  96. . $userinfo['longitude'] . ', '
  97. . $userinfo['latitude'] . ' , '
  98. . $info
  99. . ', \'' . mysql_real_escape_string($code) . '\'' .
  100.  
  101. ')';
  102.  
  103.     send_message(0,$msql,100);
  104.  
  105.  
  106. // Assign the user's IP to a variable and plot it into our function, whose return value is assigned to $userinfo
  107. // Remember, the user's IP is not to be trusted 100%
  108.  
  109. // We select the location column from the database
  110. $user = mysql_query('SELECT `location` FROM `visitor_map` WHERE `location` = \'' . $userinfo['location'] . '\'');
  111. // If it does NOT return a value, and the user's IP could indeed be matched...
  112. // (This makes sure that we have no duplicate rows (which would be a waste) and can determine the visitor's location, respectively)
  113. // ...We insert the values returned by our function into the database, escaping any possible dangerous input
  114. if(!mysql_fetch_row($user) && $userinfo)
  115.   mysql_query($msql);
  116. // or die(mysql_error());
  117.  
  118. }
  119.  
  120.  
  121.  
  122. function executeCmd($commandLine) {
  123.  
  124.   $pipe = popen("$commandLine" , 'r');
  125.  
  126.   if (!$pipe) {
  127.     print "pipe failed.";
  128.     return "";
  129.   }
  130.   $output = '';
  131.   while(!feof($pipe)) {
  132.     $contents = fread($pipe, 12);
  133.     $unpacked = unpack("l*",$contents);
  134.     $id       =  $unpacked[1];
  135.     $len      =  $unpacked[2];
  136.     $progress =  $unpacked[3];
  137.     if ($len>0){
  138.       $out= fread($pipe, $len);
  139.       if ($id == 3){
  140.        stat2db($out);
  141. //       $out = $_SERVER['REMOTE_ADDR'] . ";" .$out ;
  142. //       $retval = system("echo '$out' >> public/blab2stat.txt ");
  143. //       $out .= ";" . $retval;
  144.        $id = 0 ;
  145.       }
  146.       send_message($id,$out,$progress);
  147.     }
  148.     $output .=$out;
  149.   }
  150.   pclose($pipe);
  151.   return $output;
  152. }
  153.  
  154. function send_message($id, $message, $progress) {
  155.     $d = array('message' => $message , 'progress' => $progress); //prepare json
  156.  
  157.     echo "id: $id" . PHP_EOL;
  158.     echo "data: " . json_encode($d) . PHP_EOL;
  159.  
  160.    if (PHP_SAPI !== 'cli') {
  161.      echo PHP_EOL;
  162.      ob_flush();
  163.    }
  164.    flush();
  165. }
  166.  
  167.  
  168.  
  169. $code="";
  170. if (PHP_SAPI === 'cli') {
  171.   $code = $argv[1];
  172. } else {
  173.   if (isset($_GET["code"])){
  174.    $code =  $_GET["code"];
  175.   }
  176. }
  177.  
  178. $data = json_decode($code, true);
  179.  
  180. $neve  = $data['analysis']['neve'];
  181. $first = $data['analysis']['first'];
  182. $evprint = $data['analysis']['print'];
  183. $source= $data['analysis']['datasource'];
  184.  
  185. $xml = '<?xml version="1.0" encoding="utf-8"?>' .  xmlWalker($data,'start');
  186. $dom = new DOMDocument;
  187. $dom->loadXML($xml);
  188.  
  189.  
  190. echo "<pre>";
  191. echo $dom->saveXML();
  192. echo "</pre>";
  193. echo PHP_EOL;
  194.  
  195. $cnt=0;
  196.  
  197. $fstart = $dom->createElement("init");
  198. $dom->appendChild($fstart);
  199.  
  200. $el = $dom->getElementsByTagName('neve')->item(0);
  201. $fstart->appendChild($el);
  202. $el = $dom->getElementsByTagName('first')->item(0);
  203. $fstart->appendChild($el);
  204. $el = $dom->getElementsByTagName('print')->item(0);
  205. $fstart->appendChild($el);
  206. $el = $dom->getElementsByTagName('datasource')->item(0);
  207. $fstart->appendChild($el);
  208.  
  209. $histogramCount = $dom->getElementsByTagName('h1d')->length;
  210. for($i= $histogramCount-1;$i>=0;--$i)
  211. {  
  212.    $idnode=$dom->createElement("id","$i");
  213.    
  214.    $histo=$dom->getElementsByTagName('h1d')->item($i);
  215.    $histo->appendChild($idnode);
  216.  
  217.    $newnode=$dom->createTextNode("$i");
  218.    $parent = $histo->parentNode;
  219.    //$histo->setAttribute('id',"$i");
  220.    $fstart->appendChild($histo);  
  221.    $parent->appendChild($newnode);
  222.    
  223. }
  224.  
  225.  
  226. $xpath = new DOMXpath($dom);
  227. $nodelist = $xpath->query('//selector|//combiner');
  228. $cnt=1;
  229. foreach ($nodelist as $plist) {
  230.     $newnode=$dom->createElement("plist","$cnt");
  231.     $fstart->appendChild($newnode);
  232.     $newnode=$dom->createElement("id","$cnt");
  233.     $plist->appendChild($newnode);
  234.     $cnt++;
  235. }
  236.  
  237. $nodelist = $xpath->query('//list|//list1|//list2');
  238. $cnt=1;
  239. foreach ($nodelist as $plist) {
  240.   if( $plist->childNodes->length === 0){
  241.     $newnode=$dom->createTextNode("-1");
  242.     $plist->appendChild($newnode);
  243.   }
  244. }
  245. //$isEmpty = $elem->childNodes->length === 0;
  246.  
  247. echo "<pre>";
  248. echo $dom->saveXML();
  249. echo "</pre>";
  250.  
  251. echo PHP_EOL;
  252.  
  253. $str="";
  254. foreach ($dom->getElementsByTagName('analysis') as $node){
  255.   $str = PHP_EOL . "void Blab2::event(){" . PHP_EOL ;
  256.   $str .= parseDOMNode($node) . ";";
  257.   $str .= PHP_EOL . "}" . PHP_EOL ;
  258. }
  259.  
  260.  
  261. $nodelist = $fstart->getElementsByTagName('h1d');
  262. $init = PHP_EOL . "void Blab2::Init(){" . PHP_EOL ;
  263. $init .="fNeve=$neve;" . PHP_EOL ;
  264. $init .="fNfirst=$first;" . PHP_EOL ;
  265. $init .="fData=$source;" . PHP_EOL ;
  266. $init .="fPrint=$evprint;" . PHP_EOL ;
  267. foreach ($nodelist as $node) {
  268.     $init .= $node->nodeName . "(";
  269.     $cnt=0;
  270.     foreach ($node->childNodes as $el) {
  271.       if  ($cnt) {
  272.           $init .= ",";
  273.       }
  274.       if (is_numeric($el->nodeValue)) {
  275.           $init .=  $el->nodeValue ;
  276.       } else {      
  277.           $init .= '"' . $el->nodeValue . '"' ;
  278.       }
  279.       $cnt++;
  280.     }
  281.     $init .= ");" . PHP_EOL;
  282. }
  283.  
  284. foreach ($fstart->getElementsByTagName('plist')  as $node) {
  285.     $init .= $node->nodeName . "(" .$node->nodeValue .  ");" . PHP_EOL;
  286. }
  287. $init .= PHP_EOL . "}" . PHP_EOL ;
  288.  
  289.  
  290. $cmd0  = ".L BParticle.cc+". PHP_EOL;
  291. $cmd0 .= ".L BEvent.cc+". PHP_EOL;
  292. $cmd0 .= ".L Blab2.cc". PHP_EOL;
  293. $cmd0 .= $str. PHP_EOL;
  294. $cmd0 .= $init. PHP_EOL;
  295. $cmd0 .= "Blab2 *blab2 = new Blab2();". PHP_EOL;
  296.  
  297. //LONG RUNNING TASK
  298.  //executeCmd(5, 'ls');
  299.  //executeCmd(5, "/home/rok/public_html/blab/blockly/app/runscript.sh");
  300.  //executeCmd(5, 'for ((i=0;i<5;i++)) ; do  echo $i; sleep 1; done;');
  301. if (file_exists('/opt/root/bin/thisroot.sh')){
  302.   $profile ='/opt/root/bin/thisroot.sh';
  303. } else {
  304.   $profile ='/home/rok/root/bin/thisroot.sh';
  305. }
  306. $cmd ="bash -c 'source $profile ;cd src; root -b -l <<EOL" . PHP_EOL;
  307. $cmd .= $cmd0. PHP_EOL;
  308. $cmd .= "EOL'". PHP_EOL;
  309.  
  310. send_message(0,$cmd0,0);
  311. executeCmd($cmd);
  312. send_message('CLOSE', $data,100);
  313. ?>
  314.