Browse Source

Update KDB relations via new JSON API

Jan Behrens 1 year ago
parent
commit
ef8d8915f2
3 changed files with 317 additions and 17 deletions
  1. 11 0
      patchpanel/index.php
  2. 18 17
      poll_database.php
  3. 288 0
      update_database.php

+ 11 - 0
patchpanel/index.php

@@ -33,6 +33,8 @@
 	{
 		// write TXT patch-panel configuration
 
+        $config = $_POST["configurationname"] != "" ? $_POST["configurationname"] : $_POST["configurationload"];
+
 		$time = strtotime($_POST["validfrom"]);
 		if ($time === FALSE) $filename = time() . ".txt"; else $filename = $time . ".txt";
 
@@ -53,6 +55,15 @@
 
 		copy("data/" . $filename, "data/activeIEconfig.txt");
 
+        // update KDB database
+
+        sleep(1);
+        //require '../update_database.php';
+        if ($time === FALSE)
+            shell_exec('php ../update_database.php "' . $config . '"');
+        else
+            shell_exec('php ../update_database.php "' . $config . '" "' . date('Y-m-d H:i:s', $time) . '"');
+
 		// write CONF patch-panel configuration
 
 		if ($_POST["configurationname"] != "")

+ 18 - 17
poll_database.php

@@ -53,7 +53,6 @@
     //include "SDS_status_channels.php";
     $username = getenv("PHP_ADEI_USERNAME");
     $password = getenv("PHP_ADEI_PASSWORD");
-    $context = stream_context_create(["http" => ["header" => "Authorization: Basic " . base64_encode("$username:$password") , "Connection: close\r\n", ], ]);
 
     // ** Katrin numbers referring to IE electrode segments ** //
     $relationKatrinNumbers = array(
@@ -189,6 +188,17 @@
     // set time zone to local German time
     date_default_timezone_set("Europe/Berlin");
 
+    // build HTTP context
+    $context = stream_context_create([
+        'http' => [
+            'header' => "Authorization: Basic " . base64_encode("$username:$password") . "\r\n" .
+                        "Connection: close" . "\r\n",
+        ],
+    ]);
+
+    $KDB_API_URL = "https://kdb.kaas.kit.edu/kdb-api.fcgi/json";
+    //$KDB_API_URL = "http://localhost:9999/json";
+
     $counter = 0;
     $calltime = time();
     do {
@@ -197,16 +207,9 @@
 
         $starttime = time();
 
-        /// TODO (1) get current relations for HV rings (KATRIN number mapping)
-        /// TODO (2) write channel mapping to file used by monitor ("patchpanel/data/activeIEconfig.txt")
-        ///     => (a) the file contains one line per IE channel (44 total: 11 rings x inner/outer x west/east)
-        ///     => (b) each line contains the power supply index (values 0 .. 21; 22 = through IE)
-        /// TODO (3) resolve ADEI channels for each relation (?)
-        /// TODO (4) update ADEIchannels array (?)
-
         //echo "Polling database." . PHP_EOL;
         // new kdb.kaas.kit.edu added and optimized readout parameters
-        $fileip = file_get_contents("https://kdb.kaas.kit.edu/kdb-api.fcgi/json?relations&kn=" . join(",", flatten($relationKatrinNumbers)) . "&only_recent=1", false, $context);
+        $fileip = file_get_contents($KDB_API_URL . "?relations&kn=" . join(",", flatten($relationKatrinNumbers)) . "&only_recent=1", false, $context);
 
         //show_status($id+1,sizeof($adeiChannel));
         if (substr($fileip, 0, 5) == "ERROR") {
@@ -214,10 +217,6 @@
             $errormessage = $errormessage . "Error querying database<br>";
         }
 
-        if ($errorcount > 0) {
-            echo $errormessage;
-        }
-
         $json = json_decode($fileip, true);
         //echo "Database result (JSON):" . PHP_EOL;
         //var_dump($json);
@@ -256,13 +255,11 @@
                 $target = "(default)";
                 if (array_key_exists($kn, $patchpanelMap)) {
                     $target = $patchpanelMap[$kn];
-                    if ($target == "436-EHV-0-1003-0002") {
+                    if ($target == end($relationTargetNumbers[$eastwest])) {  // last entry = IE common
                         $index = 'IE';
                     }
                     else {
-                        $index = array_search($target, $relationTargetNumbers[$eastwest]);
-                        if ($index > 22)
-                            $index = 22;
+                        $index = array_search($target, $relationTargetNumbers[$eastwest]) + 2;
                     }
                 }
                 echo "\t" . $kn . " => " . $target . " [" . $index . "]" . PHP_EOL;
@@ -292,6 +289,10 @@
         fwrite($file_log, $log_message);
         fclose($file_log);
 
+        if ($errorcount > 0) {
+            echo $errormessage;
+        }
+
         //echo "Loop ".$counter." done.".PHP_EOL;
         if ($wait_till <= $stoptime) {
             sleep(3);

+ 288 - 0
update_database.php

@@ -0,0 +1,288 @@
+<?php
+
+    function show_status($done, $total, $size = 30) {
+        static $start_time;
+
+        // if we go over our bound, just ignore it
+        if ($done > $total) {
+            return;
+        }
+
+        if (empty($start_time)) {
+            $start_time = time();
+        }
+        $now = time();
+
+        $perc = (float)($done / $total);
+
+        $bar = floor($perc * $size);
+
+        $status_bar = "\r[";
+        $status_bar .= str_repeat("=", $bar);
+        if ($bar < $size) {
+            $status_bar .= ">";
+            $status_bar .= str_repeat(" ", $size - $bar);
+        }
+        else {
+            $status_bar .= "=";
+        }
+
+        $disp = number_format($perc * 100, 0);
+
+        $status_bar .= "] $disp%  $done/$total";
+
+        $rate = ($now - $start_time) / $done;
+        $left = $total - $done;
+        $eta = round($rate * $left, 2);
+
+        $elapsed = $now - $start_time;
+
+        $status_bar .= " remaining: " . number_format($eta) . " sec.  elapsed: " . number_format($elapsed) . " sec.";
+
+        echo "$status_bar  ";
+
+        flush();
+
+        // when done, send a newline
+        if ($done == $total) {
+            echo "\n";
+        }
+    }
+
+    // get config name (optionally pass to script, 1st arg)
+    $config = !empty($argv[1]) ? $argv[1] : "";
+
+    // get validity time (optionally pass to script, 2nd arg)
+    $ts = !empty($argv[2]) ? $argv[2] : date('Y-m-d H:i:s', $time);
+
+    // include channel list
+    //include "SDS_status_channels.php";
+    $username = getenv("PHP_ADEI_USERNAME");
+    $password = getenv("PHP_ADEI_PASSWORD");
+
+    // the user needs write access to KDB!
+    $kdb_username = getenv("PHP_KDB_USERNAME");
+    $kdb_password = getenv("PHP_KDB_PASSWORD");
+
+    // ** Katrin numbers referring to IE electrode segments ** //
+    $relationKatrinNumbers = array(
+        array( // 22 rows: 2x11 electrode rings (inner+outer)
+            "434-EEL-3-0210-0002", // WestRing 02 outer
+            "434-EEL-3-0211-0002", // WestRing 02 inner
+            "434-EEL-3-0310-0002", // WestRing 03 outer
+            "434-EEL-3-0311-0002", // WestRing 03 inner
+            "434-EEL-3-0410-0002", // WestRing 04 outer
+            "434-EEL-3-0411-0002", // WestRing 04 inner
+            "434-EEL-3-0510-0002", // WestRing 05 outer
+            "434-EEL-3-0511-0002", // WestRing 05 inner
+            "434-EEL-3-0610-0002", // WestRing 06 outer
+            "434-EEL-3-0611-0002", // WestRing 06 inner
+            "434-EEL-3-0710-0002", // WestRing 07-11 outer
+            "434-EEL-3-0711-0002", // WestRing 07-11 inner
+            "434-EEL-3-1210-0002", // WestRing 12 outer
+            "434-EEL-3-1211-0002", // WestRing 12 inner
+            "434-EEL-3-1310-0002", // WestRing 13 outer
+            "434-EEL-3-1311-0002", // WestRing 13 inner
+            "434-EEL-3-1410-0002", // WestRing 14 outer
+            "434-EEL-3-1411-0002", // WestRing 14 inner
+            "434-EEL-3-1510-0002", // WestRing 15 outer
+            "434-EEL-3-1511-0002", // WestRing 15 inner
+            "434-EEL-3-1610-0002", // WestRing 16 outer
+            "434-EEL-3-1611-0002", // WestRing 16 inner
+            //         ^^............ means ring index (02..16)
+            //           ^........... means west (=1) or east (=2) dipole
+            //            ^.......... means outer (=0) or inner (=1) layer
+        ) ,
+        array( // 22 rows: 2x11 electrode rings (inner+outer)
+            "434-EEL-3-0220-0002", // EastRing 02 outer
+            "434-EEL-3-0221-0002", // EastRing 02 inner
+            "434-EEL-3-0320-0002", // EastRing 03 outer
+            "434-EEL-3-0321-0002", // EastRing 03 inner
+            "434-EEL-3-0420-0002", // EastRing 04 outer
+            "434-EEL-3-0421-0002", // EastRing 04 inner
+            "434-EEL-3-0520-0002", // EastRing 05 outer
+            "434-EEL-3-0521-0002", // EastRing 05 inner
+            "434-EEL-3-0620-0002", // EastRing 06 outer
+            "434-EEL-3-0621-0002", // EastRing 06 inner
+            "434-EEL-3-0720-0002", // EastRing 07-11 outer
+            "434-EEL-3-0721-0002", // EastRing 07-11 inner
+            "434-EEL-3-1220-0002", // EastRing 12 outer
+            "434-EEL-3-1221-0002", // EastRing 12 inner
+            "434-EEL-3-1320-0002", // EastRing 13 outer
+            "434-EEL-3-1321-0002", // EastRing 13 inner
+            "434-EEL-3-1420-0002", // EastRing 14 outer
+            "434-EEL-3-1421-0002", // EastRing 14 inner
+            "434-EEL-3-1520-0002", // EastRing 15 outer
+            "434-EEL-3-1521-0002", // EastRing 15 inner
+            "434-EEL-3-1620-0002", // EastRing 16 outer
+            "434-EEL-3-1621-0002", // EastRing 16 inner
+            //         ^^............ means ring index (02..16)
+            //           ^........... means west (=1) or east (=2) dipole
+            //            ^.......... means outer (=0) or inner (=1) layer
+        ) ,
+    );
+
+    // ** Katrin numbers referring to IE power supply channels ** //
+    $relationTargetNumbers = array(
+        array( // IE offset channels West side
+            // 22 rows: 3x7 offset channels + IE common
+            "436-EHV-0-0003-0102", // WestCh 00 / not used
+            "436-EHV-0-0003-0202", // WestCh 01 / not used
+            "436-EHV-0-0003-0302", // WestCh 02 / Patch 00
+            "436-EHV-0-0003-0402", // WestCh 03 / Patch 01
+            "436-EHV-0-0003-0502", // WestCh 04 / Patch 02
+            "436-EHV-0-0003-0602", // WestCh 05 / Patch 03
+            "436-EHV-0-0003-0702", // WestCh 06 / Patch 04
+            "436-EHV-0-0003-0802", // WestCh 07 / Patch 05
+            "436-EHV-0-0005-0102", // WestCh 08 / Patch 06
+            "436-EHV-0-0005-0202", // WestCh 09 / Patch 07
+            "436-EHV-0-0005-0302", // WestCh 10 / Patch 08
+            "436-EHV-0-0005-0402", // WestCh 11 / Patch 09
+            "436-EHV-0-0005-0502", // WestCh 12 / Patch 10
+            "436-EHV-0-0005-0602", // WestCh 13 / Patch 11
+            "436-EHV-0-0005-0702", // WestCh 14 / Patch 12
+            "436-EHV-0-0005-0802", // WestCh 15 / Patch 13
+            "436-EHV-0-0007-0102", // WestCh 16 / Patch 14
+            "436-EHV-0-0007-0202", // WestCh 16 / Patch 15
+            "436-EHV-0-0007-0302", // WestCh 17 / Patch 16
+            "436-EHV-0-0007-0402", // WestCh 18 / Patch 17
+            "436-EHV-0-0007-0502", // WestCh 19 / Patch 18
+            "436-EHV-0-0007-0602", // WestCh 20 / Patch 19
+            "436-EHV-0-0007-0702", // WestCh 21 / Patch 20
+            "436-EHV-0-0007-0802", // WestCh 22 / Patch 21
+
+            "436-EHV-0-0002-0101", // IE dipole west
+            "436-EHV-0-1003-0002", // IE common
+        ) ,
+        array( // IE offset channels East side
+            // 22 rows: 3x7 offset channels + IE common
+            "436-EHV-0-0004-0102", // EastCh 00 / not used
+            "436-EHV-0-0004-0202", // EastCh 01 / not used
+            "436-EHV-0-0004-0302", // EastCh 02 / Patch 00
+            "436-EHV-0-0004-0402", // EastCh 03 / Patch 01
+            "436-EHV-0-0004-0502", // EastCh 04 / Patch 02
+            "436-EHV-0-0004-0602", // EastCh 05 / Patch 03
+            "436-EHV-0-0004-0702", // EastCh 06 / Patch 04
+            "436-EHV-0-0004-0802", // EastCh 07 / Patch 05
+            "436-EHV-0-0006-0102", // EastCh 08 / Patch 06
+            "436-EHV-0-0006-0202", // EastCh 09 / Patch 07
+            "436-EHV-0-0006-0302", // EastCh 10 / Patch 08
+            "436-EHV-0-0006-0402", // EastCh 11 / Patch 09
+            "436-EHV-0-0006-0502", // EastCh 12 / Patch 10
+            "436-EHV-0-0006-0602", // EastCh 13 / Patch 11
+            "436-EHV-0-0006-0702", // EastCh 14 / Patch 12
+            "436-EHV-0-0006-0802", // EastCh 15 / Patch 13
+            "436-EHV-0-0008-0102", // EastCh 16 / Patch 14
+            "436-EHV-0-0008-0202", // EastCh 16 / Patch 15
+            "436-EHV-0-0008-0302", // EastCh 17 / Patch 16
+            "436-EHV-0-0008-0402", // EastCh 18 / Patch 17
+            "436-EHV-0-0008-0502", // EastCh 19 / Patch 18
+            "436-EHV-0-0008-0602", // EastCh 20 / Patch 19
+            "436-EHV-0-0008-0702", // EastCh 21 / Patch 20
+            "436-EHV-0-0008-0802", // EastCh 22 / Patch 21
+
+            "436-EHV-0-0002-0102", // IE dipole east
+            "436-EHV-0-1003-0002", // IE common
+        ) ,
+
+    );
+
+    function flatten(array $array) {
+        $return = array();
+        array_walk_recursive($array, function ($a) use (&$return) {
+            $return[] = $a;
+        });
+        return $return;
+    }
+
+    // set time zone to local German time
+    date_default_timezone_set("Europe/Berlin");
+
+    $errorcount = 0;
+    $errormessage = "<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>";
+
+    // read ADEI data from file
+    if (! file_exists("patchpanel/data/activeIEconfig.txt")) {
+        $errorcount++;
+        $errormessage = $errormessage . "File 'activeIEconfig.txt' does not exist.<br>";
+    }
+
+    $check = array( 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+                    22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22 );
+
+    $handle = fopen("patchpanel/data/activeIEconfig.txt", "r");
+    if ($handle) {
+        $id = 0;
+        while (($buffer = fgets($handle, 4096)) !== false)
+        {
+            $buffer = trim($buffer);
+            if ($buffer == 'IE')
+                $check[$id++] = 22;
+            else
+                $check[$id++] = intval($buffer) - 2;
+        }
+        fclose($handle);
+    }
+
+    $json = array('relation' => array());
+
+    assert( sizeof($relationKatrinNumbers) == 2 );
+    assert( sizeof($relationTargetNumbers) == 2 );
+    $ch = 0;
+    for ($eastwest = 0; $eastwest < 2; $eastwest++) {
+        // loop over each half of the array
+        assert( sizeof($relationKatrinNumbers[$eastwest]) == 22 );
+        assert( sizeof($relationTargetNumbers[$eastwest]) >= 22 );
+        foreach ($relationKatrinNumbers[$eastwest] as $kn) {
+            $json['relation'][$kn] = array();
+            $json['relation'][$kn]['ValidityStart'] = $ts;
+            $json['relation'][$kn]['Comment'] = "Patchpanel configuration: " . $config;
+
+            $index = $check[$ch++];
+            if ($index >= 22)
+                $json['relation'][$kn]['AssociateNumber'] = end($relationTargetNumbers[$eastwest]);  // last entry = IE common
+            else
+                $json['relation'][$kn]['AssociateNumber'] = $relationTargetNumbers[$eastwest][$index];
+        }
+    }
+
+    echo "Request payload (JSON):" . PHP_EOL;
+    var_dump($json);
+
+    // build HTTP context
+    $context = stream_context_create([
+        'http' => [
+            'method' => 'POST',
+            'header' => "Authorization: Basic " . base64_encode("$kdb_username:$kdb_password") . "\r\n" .
+                        "Content-type: application/json" . "\r\n" .
+                        "Connection: close" . "\r\n",
+            'content' => json_encode($json),
+        ],
+    ]);
+
+    $KDB_API_URL = "https://kdb-test.kaas.kit.edu/kdb-api.fcgi/json/write";
+    //$KDB_API_URL = "http://localhost:9999/json/write";
+
+    echo "Updating database." . PHP_EOL;
+    // new kdb.kaas.kit.edu added and optimized readout parameters
+    $fileip = file_get_contents($KDB_API_URL, false, $context);
+
+    echo($fileip);
+
+    //show_status($id+1,sizeof($adeiChannel));
+    if (substr($fileip, 0, 5) == "ERROR") {
+        $errorcount++;
+        $errormessage = $errormessage . "Error querying database<br>";
+    }
+
+    $json = json_decode($fileip, true);
+    echo "Database result (JSON):" . PHP_EOL;
+    var_dump($json);
+
+    if ($errorcount > 0) {
+        echo $errormessage;
+    }
+
+    //echo "All loops done.".PHP_EOL;
+
+    ?>