1
0
This commit is contained in:
2022-02-23 10:23:16 +01:00
parent 7d1dd25f2a
commit 34dca81ba5
21 changed files with 738 additions and 533 deletions

238
webserver/cmd_functions.php Normal file
View File

@ -0,0 +1,238 @@
<?php
function webDashboard($socket, $n = 0)
{
global $dashboards, $indexDevices;
logger(DEBUG, _("webDashboard function"));
$response = "";
if(array_key_exists($n, $dashboards))
{
foreach ($dashboards[$n] as $ieeeAddress => $property)
{
$value = $indexDevices[$ieeeAddress]->properties[$property]["value"];
if ($value === null)
{
$value ="null";
}
logger(DEBUG, _($indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($value)));
$response .= $indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($value) . "<br>";
}
}else
{
$response = _("dashboard not found");
}
htmlSend($socket, $response);
}
function webBrowse($socket, $argList)
{
global $topics, $devices;
logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
//$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
$response = "";
$flag = false;
$tab = "";
if (array_key_exists("topic", $argList))
{
if (array_key_exists($argList["topic"], $topics))
{
logger(DEBUG, _("Topic exists") , __FILE__ . ":" . __LINE__);
$topicRef = '<a href="/?browse&amp;topic=' . htmlentities($argList["topic"]);
if (array_key_exists("fn", $argList))
{
logger(DEBUG, _("FriendlyName exists: ") . $argList["fn"] , __FILE__ . ":" . __LINE__);
$fn = "";
$fnArray = explode("/", $argList["fn"]);
$device = $devices[$argList["topic"]];
//var_dump($fnArray);
foreach($fnArray as $value)
{
if ($flag) $fn .= "/";
$fn .= $value;
if (!array_key_exists($value, $device))
{
htmlSend($socket, sprintf(_('"%s" does not exists'), $value));
return false;
}
$device = $device[$value];
$flag = true;
}
//var_dump($device);
if (array_key_exists("device", $device)) // TODO
{
$device = $device["device"];
$fn .= "device/" . $fn;
}
if (is_a($device, "device"))
{
foreach($device->properties as $key => $value)
{
$response .= $key . "<br>";
$response .= $tab . "[<br>";
echo memory_get_usage();
//$response = value($key, $value, $response);
iterateProperty($key, $value, $response, $tab);
$response .= $tab . "]<br>";
}
/*foreach($device->properties as $key => $value)
{
$response = value($key, $value, $response);
}*/
}else
{
foreach($device as $key => $value)
{
$response .= $topicRef . htmlentities("&fn=" . $fn . "/" . $key) . '">' . $key . "</a><br>\n";
}
}
logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__);
//htmlSend($socket, $response);
}else
{
foreach($devices[$argList["topic"]] as $key => $value)
{
print "key = " . print_r($key, true) . " value = " . print_r($value, true) . EOLR;
logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__);
$response .= $topicRef . htmlentities("&fn=" . $key) . '">' . $key . "</a><br>";
logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__);
}
}
}else
{
$response = webListTopics();
}
}else
{
$response = webListTopics();
}
htmlSend($socket, $response);
}
function iterateProperty($property, $value, &$response, $tab="")
{
$tab .= "&nbsp;&nbsp;&nbsp;";
if (is_array($value) or is_object($value))
{
logger(DEBUG, _("is object or array"), __FILE__ . ":" . __LINE__ );
foreach($value as $key => $value2)
{
logger(DEBUG, $key, __FILE__ . ":" . __LINE__ );
iterateProperty($key, $value2, $response, $tab);
}
}else
{
$response .= $tab . $property . ' = ' . bool2string($value) . "<br>";//value($property, $value, "");
}
}
function webListTopics()
{
global $topics;
logger(DEBUG, _("webListTopics function"));
$response = "";
foreach ($topics as $name => $topic)
{
$response .= '<a href="/?browse&topic=' . $name . '">' . $name ."</a><br>";
}
return $response;
}
function webGet($argList)
{
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList))
{
$response = "GET: " . _("no parameters passed, need topic, fn and property");
}else
{
if (($device = getDevice($argList["topic"], $argList["fn"])) === false)
{
$response = sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"]);
}else
{
$property = $argList["property"];
$response = "GET: " . bool2string($device->$property["value"]);
}
}
return $response;
}
function webSet($argList)
{
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("value", $argList))
{
$response = "SET: " . _("no parameters passed, need topic, fn, property and value") . "passed";
}else
{
$response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"];
$payload = array($argList["property"] => $argList["value"]);
publish(Z2M . "/" . $argList["fn"], $payload);
}
return $response;
}
function webPrint($argList, $command)
{
global $GLOBALS, $topics;
if (array_key_exists($argList["object"], $GLOBALS))
{
$var = $GLOBALS[$argList["object"]];
if (isset($argList["topic"]))
{
$topic = $argList["topic"];
}
if (isset($argList["address"]))
{
$var = $var[$argList["address"]];
}elseif (isset($argList["fn"]))
{
if(!empty($topic))
{
$var = getDevice($topic, $argList["fn"]);
}else
{
$str = _("topic is not defining: add &topic=\nThese topics are availables: ");
foreach($topics as $key => $value)
{
$str .= $key . EOL;
}
logger(ERROR, $str, __FILE__ . ":" . __LINE__);
}
}
$error = error_get_last();
if($error !== null)
{
$response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"];
}
if ($command === "print")
{
$response = "<pre>" . nl2br(print_r($var, true)) . "<pre>";
}elseif($command === "dump")
{
$response = "Dump" . EOL;
$response .= "<pre>" . nl2br(var_export($var, true)) . "<pre>";
}
}else
{
$response = _("Object do not exists");
}
return $response;
}
function webNotify($argList)
{
if (!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList) or !array_key_exists("condition", $argList) or !array_key_exists("value", $argList))
{
$response = _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value");
}else
{
$response = _("notify command have been set");
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
}
}
?>

113
webserver/webserver.php Normal file
View File

@ -0,0 +1,113 @@
<?php
// server init: No Timeout
set_time_limit(0);
ob_implicit_flush();
$error_message = null;
$error_code = null;
$listenHost = "0.0.0.0";
$listenPort = 1025;
$Dashboards = array();
require_once $configDir . "/dashboard_conf.php";
require_once "class/main.php";
require "webserver/cmd_functions.php";
// opening listening server
$socket = stream_socket_server("tcp://" . $listenHost . ":" . $listenPort, $error_code, $error_message) or logger(ERROR, _("Could not create socket"), __FILE__ . ":" . __LINE__);
stream_set_blocking($socket, false);
$read = array( $socket );
function htmlSend($socket, $text)
{
$httpHeader = "HTTP/1.1 200 OK" . EOLR .
"Date: " . date("r") . EOLR .
"Connection: close" . EOLR .
"Content-Type: text/html; charset=UTF-8" . EOLR . EOLR;
$response = $httpHeader . '<!doctype html>' . EOL . '<html lang="fr">' . EOL . '<head>' . EOL . '<meta charset="utf-8">' . EOL . '<title>Moha</title>' . EOL . '</head><body>' . $text . "</body></html>";
stream_socket_sendto($socket, $response);
}
function askWebServer($read)
{
global $topics, $indexDevices, $devices;
$array = array();
$argList =array();
//logger(DEBUG, _("askWebserver function starting"), __FILE__ . ":" . __LINE__);
if ( stream_select( $read, $array, $array, 0 ))
{
logger(DEBUG, _("socket ready to read"), __FILE__ . ":" . __LINE__);
$spawn = stream_socket_accept($read[0]);
if ($spawn !== false)
{
logger(DEBUG, _("socket accepted"), __FILE__ . ":" . __LINE__);
$input = fgets($spawn, 4096);
logger(DEBUG, $input, __FILE__ . ":" . __LINE__);
$input = substr($input,5);
$input = explode(" ", $input); // suppress text
if (!empty($input[0]))
{
$argTmp = explode("&", urldecode($input[0]));
foreach($argTmp as $tmp)
{
logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
if(strpos($tmp, "=") === false)
{
logger(DEBUG, _("no ="), __FILE__ . ":" . __LINE__);
$argList["cmd"] = trim($tmp);
}else
{
$argList[trim(strchr($tmp, "=", true))] = trim(substr(strchr($tmp, "="), 1));
}
}
logger(DEBUG, print_r($argList, true), __FILE__ . ":" . __LINE__);
if(array_key_exists("cmd", $argList))
{
$command = strtolower($argList["cmd"]);
logger(DEBUG, _("command is ") . $command, __FILE__ . ":" . __LINE__);
switch($command)
{
case "dashboard":
webDashboard($spawn, $argList["dashboard"]);
break;
case "browse":
logger(DEBUG, _("Browsing"), __FILE__ . ":" . __LINE__);
webBrowse($spawn, $argList);
//return true;
break;
case "get":
logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
htmlSend($spawn, webGet($argList));
break;
case "set":
logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
htmlSend($spawn, webSet($argList));
break;
case "dump":
case "print":
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
htmlSend($spawn, webPrint($argList, $command));
break;
case "notify":
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
htmlSend($spawn, webNotify($argList));
logger(DEBUG, print_r($monitored, true), __FILE__ . ":" . __LINE__);
break;
default:
webBrowse($spawn, $argList);
}
}else
{
webDashboard($spawn);
}
}else
{
webDashboard($spawn);
}
}
}
}
?>