1
0
moha/webserver.php

144 lines
5.2 KiB
PHP

<?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;
$socket = stream_socket_server("tcp://" . $listenHost . ":" . $listenPort, $error_code, $error_message) or logger(ERROR, _("Could not create socket") . EOL);
stream_set_blocking($socket, false);
$read = array( $socket );
function askWebServer($read)
{
$array = array();
$argList =array();
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__);
if (!empty($input))
{
$input = substr($input,5);
$input = explode(" ", $input); // suppress text
$argTmp = explode("&", $input[0]);
foreach($argTmp as $tmp)
{
//logger(DEBUG, $tmp, __FILE__ . ":" . __LINE__);
$argList[strchr($tmp, "=", true)] = substr(strchr($tmp, "="), 1);
//logger(DEBUG, $argList[0] . " ==========> " . $argList[1]);
//print_r($array);
//if (isset($array[1])) $argList[$array[0]] = $array[1];
}
logger(DEBUG, print_r($argList, true));
if(array_key_exists("cmd", $argList))
{
$command = strtolower($argList["cmd"]);
logger(DEBUG, _("command is ") . $command);
switch($command)
{
case "get":
logger(DEBUG, _("GET reached"), __FILE__ . ":" . __LINE__);
if(!array_key_exists("topic", $argList) or !array_key_exists("fn", $argList) or !array_key_exists("property", $argList))
{
$response = "<html><header></header><body>GET: " . _("no parameters passed, need topic, fn and property") . "</body></html>";
}else
{
$device = getDevice($argList["topic"], $argList["fn"]);
$property = $argList["property"];
$response = "<html><header></header><body>GET: " . bool2string($device->$property["value"]) . "</body></html>";
}
fwrite($spawn, $response);
break;
case "set":
logger(DEBUG, _("SET reached"), __FILE__ . ":" . __LINE__);
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 = "<html><header></header><body>SET: " . _("no parameters passed, need topic, fn, property and value") . "passed</body></html>";
fwrite($spawn, $response);
}else
{
$response = "<html><header></header><body>setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"] . "</body></html>";
fwrite($spawn, $response);
$payload = array($argList["property"] => $argList["value"]);
publish(Z2M . "/" . $argList["fn"], $payload);
}
break;
case "dump":
case "print":
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
$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 = "<html><header></header><body>" . $error["message"] . " file: " . $error["file"] . " line: " . $error["line"] . "</body></html>";
}
if ($command === "print")
{
$response = print_r($var, true);
}elseif($command === "dump")
{
$response = "Dump" . EOL;
$response .= var_export($var, true);
}
fwrite($spawn, $response);
break;
case "notify":
logger(DEBUG, $command . _(" reached"), __FILE__ . ":" . __LINE__);
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 = "<html><header></header><body>" . _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value") . "</body></html>";
fwrite($spawn, $response);
}else
{
$response = "<html><header></header><body>" . _("notify command have been set") . "</body></html>";
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
fwrite($spawn, $response);
}
logger(DEBUG, print_r($monitored, true));
break;
default:
logger(DEBUG, _("unknown command"), __FILE__ . ":" . __LINE__);
$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
fwrite($spawn, $response);
}
}
}
}
}
}
?>