- added dashboard\n- some debugging
This commit is contained in:
parent
18d5b74a96
commit
314305bcb1
@ -17,6 +17,7 @@ class topic {
|
||||
public $extensions;
|
||||
public $config;
|
||||
public $callback;
|
||||
public $getOnStart = false;
|
||||
}
|
||||
|
||||
class device
|
||||
@ -47,7 +48,7 @@ class device
|
||||
|
||||
public function get()
|
||||
{
|
||||
publish($this->topic . "/" . $this->friendlyNames, $this->payload, "get"); //, $event);
|
||||
publish($this->topic . "/" . $this->friendlyName, $this->payload, "get"); //, $event);
|
||||
}
|
||||
}
|
||||
|
||||
|
10
config/dashboard_conf.php
Normal file
10
config/dashboard_conf.php
Normal file
@ -0,0 +1,10 @@
|
||||
<?php
|
||||
$dashboards[] = array(
|
||||
RDC_SALON_ECLAIRAGE_PANNEAU => "state",
|
||||
RDC_SDB_WC_ECLAIRAGE => "state_l1",
|
||||
RDC_SDB_WC_ECLAIRAGE => "state_l2",
|
||||
RDC_CHAMBRE_AMBIANCE => "state",
|
||||
RDC_CHAMBRE_ECLAIRAGE => "state_l1"
|
||||
);
|
||||
|
||||
?>
|
@ -2,6 +2,7 @@
|
||||
|
||||
//Constants
|
||||
define("EOL", "\n");
|
||||
define("EOLR", "\n\r");
|
||||
define("Z2M", "zigbee2mqtt");
|
||||
define("ON", 1);
|
||||
define("OFF", 0);
|
||||
|
@ -6,12 +6,16 @@ logger(DEBUG,_("Including db_functions.php"), __FILE__ . ":" . __LINE__);
|
||||
function storeDB($db, $filepath)
|
||||
{
|
||||
$data = serialize($db);
|
||||
file_put_contents($filepath, $data);
|
||||
return file_put_contents($filepath, $data);
|
||||
}
|
||||
|
||||
function loadDB(& $db, $filepath)
|
||||
{
|
||||
$data = file_get_contents($filepath);
|
||||
if ($data === false)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
$db = unserialize($data);
|
||||
}
|
||||
|
||||
@ -230,9 +234,36 @@ function iterateDevice($topic, $fn, $parentDevice, &$device, $payloadArray, $pro
|
||||
}
|
||||
}
|
||||
|
||||
function getDevicesValues()
|
||||
function getDevicesValues($topic)
|
||||
{
|
||||
//TODO
|
||||
global $indexDevices, $topics;
|
||||
logger(DEBUG, _("getDevicesValues function" ));
|
||||
foreach($indexDevices as $device)
|
||||
{
|
||||
if ($device->topic == $topic)
|
||||
{
|
||||
logger(DEBUG, "device: " . $device->friendlyName);
|
||||
$payload = "{";
|
||||
$flag = false;
|
||||
$properties = array_slice($device, 12);
|
||||
logger(DEBUG, print_r($properties, true));
|
||||
foreach($properties as $property)
|
||||
{
|
||||
if (flag)
|
||||
{
|
||||
$payload = ",";
|
||||
}else {
|
||||
$flag = true;
|
||||
}
|
||||
$payload .= $property . ':""';
|
||||
}
|
||||
$device->payload = $payload . "}";
|
||||
logger(DEBUG, $device->payload);
|
||||
$device->get();
|
||||
}
|
||||
}
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
||||
?>
|
||||
|
@ -13,7 +13,7 @@ class rdc_salon_eclairage extends hook
|
||||
|
||||
public $delay = 3; // amount of time in $timeunit
|
||||
public $timeUnit = "minute"; // unit of time for delay, second, minute, hour, day, week, month, year
|
||||
public $luminance_min = 70;
|
||||
public $luminance_min = 60;
|
||||
public $luminance_max = 3000;
|
||||
|
||||
|
||||
|
68
moha.php
68
moha.php
@ -34,6 +34,8 @@ $curlErr = 0; // Number of errors returned by curl
|
||||
$configDir = "./config"; // default config dir (production value is /etc/moha/)
|
||||
$hooksInitialized = 0; // are all hooks initialized ? false/true
|
||||
$flagHooks = false;
|
||||
|
||||
|
||||
if ($testMode)
|
||||
{
|
||||
$mqttServerIp = "192.168.1.253"; // IP address of mqttserver in test mode
|
||||
@ -45,7 +47,7 @@ if ($testMode)
|
||||
$mqttServerIp = "127.0.0.1"; // IP address of mqttserver in production mode
|
||||
$dataPath = "/usr/share/moha/";
|
||||
$logFile = "/var/log/moha.log"; // Path of log file
|
||||
$configDir = "/etc/config"; // default config dir (production value is /etc/moha/)
|
||||
$configDir = "/etc/moha"; // default config dir (production value is /etc/moha/)
|
||||
|
||||
}
|
||||
|
||||
@ -88,11 +90,7 @@ function logger($level, $log, $pos = false, $notif = true)
|
||||
{
|
||||
logger(INFO, _("Notification not sent"), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
}else
|
||||
{
|
||||
logger(INFO, _("Notification not sent because of testMode"), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function init()
|
||||
@ -134,7 +132,10 @@ function endMoha()
|
||||
$x = 0;
|
||||
|
||||
logger(WARNING, _("moha is ending"), __FILE__ . ":" . __LINE__);
|
||||
storeDB($devices, $dataPath . "moha.db");
|
||||
if (storeDB($devices, $dataPath . "moha.db") === false)
|
||||
{
|
||||
logger(ERROR, _("Can not store db" ), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
if($testMode) file_put_contents($dataPath . "moha.devices", var_export($devices, true));
|
||||
if ($connected)
|
||||
{
|
||||
@ -160,6 +161,25 @@ function connect2mqttServer()
|
||||
$client->onConnect('connectResponse');
|
||||
}
|
||||
logger(WARNING, _("starting moha"), __FILE__ . ":" . __LINE__);
|
||||
|
||||
|
||||
logger(DEBUG, _("requiring config files -> devices_constants.php"), __FILE__ . ":" . __LINE__);
|
||||
//include predefined file witch define constants for devices
|
||||
if (is_readable($configDir . "/devices_constants.php"))
|
||||
{
|
||||
include $configDir . "/devices_constants.php";
|
||||
//echo "hooklist"; print_r($hooksList); echo EOL;
|
||||
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}elseif(is_readable("config/devices_constants.php"))
|
||||
{
|
||||
include "config/devices_constants.php";
|
||||
//echo "hooklist"; print_r($hooksList); echo EOL;
|
||||
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}else
|
||||
{
|
||||
logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
|
||||
logger(DEBUG, _("requiring php modules"), __FILE__ . ":" . __LINE__);
|
||||
require "class/main.php";
|
||||
require "class/db.php";
|
||||
@ -171,11 +191,11 @@ require "events.php";
|
||||
require "db_functions.php";
|
||||
require "webserver.php";
|
||||
|
||||
//logger(DEBUG, _('assigning variable $client to mosquitto class "client"'), false);
|
||||
//$client = new Mosquitto\Client();
|
||||
|
||||
logger(DEBUG, _("Loading stored devices datas"), __FILE__ . ":" . __LINE__);
|
||||
loadDB($devices, "moha.db");
|
||||
if (loadDB($devices, $dataPath . "moha.db") === false)
|
||||
{
|
||||
logger(ERROR, _("Can not load device db"), __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
|
||||
|
||||
// topics definition
|
||||
@ -189,22 +209,6 @@ if (!empty($hooksList))
|
||||
}
|
||||
}
|
||||
|
||||
logger(DEBUG, _("requiring config files -> devices_constants.php"), __FILE__ . ":" . __LINE__);
|
||||
//include predefined file witch define constants for devices
|
||||
if (is_readable($configDir . "/" . "devices_constants.php"))
|
||||
{
|
||||
include $configDir . "/" . "devices_constants.php";
|
||||
//echo "hooklist"; print_r($hooksList); echo EOL;
|
||||
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}elseif(is_readable("config/devices_constants.php"))
|
||||
{
|
||||
include "config/devices_constants.php";
|
||||
//echo "hooklist"; print_r($hooksList); echo EOL;
|
||||
logger(INFO, sprintf(_("%s/devices_constants.define found, so it has been included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}else
|
||||
{
|
||||
logger(WARNING, sprintf(_("%s/devices_constants.define not found, so not included :-)"), $configDir), __FILE__ . ":" . __LINE__, false);
|
||||
}
|
||||
|
||||
// making the list of hooks to include
|
||||
listHooks("./hooks", $hooksList);
|
||||
@ -252,13 +256,13 @@ while (true)
|
||||
if (! $included) // hooks not already included
|
||||
{
|
||||
logger(DEBUG, _("Making hooks list"), __FILE__ . ":" . __LINE__, false);
|
||||
getDevicesValues(); // TODO get the values of devices
|
||||
|
||||
if (!empty($hooksList)) // some hooks to include if hooklist is not empty
|
||||
{
|
||||
foreach ($hooksList as $hook) // loop to include hooks in hookslist
|
||||
foreach ($hooksList as $hookFile) // loop to include hooks in hookslist
|
||||
{
|
||||
logger(INFO, _("Including ") . $hook, __FILE__ . ":" . __LINE__, false);
|
||||
include $hook;
|
||||
logger(INFO, _("Including ") . $hookFile, __FILE__ . ":" . __LINE__, false);
|
||||
include $hookFile;
|
||||
}
|
||||
file_put_contents($dataPath . "moha.devices", var_export($devices, true)); // debugging : save device list
|
||||
$included = true;
|
||||
@ -270,11 +274,12 @@ while (true)
|
||||
if ($oneshot === false) // execute once initialization finished :WARNING hooks can to be not initialized
|
||||
{
|
||||
logger(DEBUG, _("Oneshot part of loop"), __FILE__ . ":" . __LINE__, false);
|
||||
|
||||
$oneshot = true;
|
||||
}
|
||||
if($hooksInitialized == 0) // all hooks are not initialized
|
||||
{
|
||||
$i = 1;
|
||||
//$i = 1;
|
||||
foreach($hooks as $hookName => $hook)
|
||||
{
|
||||
if ($hook->initialized === false)
|
||||
@ -288,6 +293,7 @@ while (true)
|
||||
{
|
||||
logger(DEBUG, _("All hooks initialized"), __FILE__ . ":" . __LINE__);
|
||||
$flagHooks = true;
|
||||
getDevicesValues();exit (0);
|
||||
}
|
||||
checkEvents();
|
||||
askWebServer($read);
|
||||
|
@ -15,6 +15,7 @@ $callback = function($topic, $message)
|
||||
$topics[$topic[0]]->devices = json_decode($message->payload);
|
||||
fwrite($logFh, var_export($topics[$topic[0]]->devices, true));
|
||||
mkDevicesDB($topic[0], $topics[$topic[0]]->devices);
|
||||
getDevicesValues($topic[0]);
|
||||
break;
|
||||
case "groups":
|
||||
logger(DEBUG,_("Inserting zigbee groups in DB"), __FILE__ . ":" . __LINE__);
|
||||
|
202
webserver.php
202
webserver.php
@ -4,17 +4,147 @@
|
||||
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";
|
||||
|
||||
// opening listening server
|
||||
$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 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 webListTopics()
|
||||
{
|
||||
global $topics;
|
||||
logger(DEBUG, _("webListTopics function"));
|
||||
$response = "";
|
||||
foreach ($topics as $name => $topic)
|
||||
{
|
||||
$response .= '<a href="/topic=' . $name . '">' . $name ."</a><br>";
|
||||
}
|
||||
return $response;
|
||||
}
|
||||
|
||||
function webBrowse($socket, $argList)
|
||||
{
|
||||
global $topics, $devices;
|
||||
$response = "";
|
||||
logger(DEBUG, _("Generic response to choose device and property"), __FILE__ . ":" . __LINE__);
|
||||
//$response = "<html><header></header><body>" . _("unknown command") . "</body></html>";
|
||||
$response = "";
|
||||
$flag = false;
|
||||
if (array_key_exists("topic", $argList))
|
||||
{
|
||||
if (array_key_exists($argList["topic"], $topics))
|
||||
{
|
||||
logger(DEBUG, _("Topic exists") , __FILE__ . ":" . __LINE__);
|
||||
$topicRef = '<a href="topic=' . $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"]];
|
||||
foreach($fnArray as $value)
|
||||
{
|
||||
if ($flag) $fn .= "/";
|
||||
$fn .= $value;
|
||||
if (!array_key_exists($value, $device))
|
||||
{
|
||||
htmlSend($socket, sprintf(_('"%s" does not exists')));
|
||||
return false;
|
||||
}
|
||||
$device = $device[$value];
|
||||
$flag = true;
|
||||
}
|
||||
if (array_key_exists("device", $device))
|
||||
{
|
||||
$device = $device["device"];
|
||||
$fn .= "device/" . $fn;
|
||||
}
|
||||
if (is_object($device))
|
||||
{
|
||||
foreach($device as $key => $value)
|
||||
{
|
||||
if ($key != "device" and is_array($value))
|
||||
{
|
||||
print_r($value);
|
||||
if (array_key_exists("value", $value))
|
||||
{
|
||||
$response .= $key . ' = ' . bool2string($value["value"]) . "<br>";
|
||||
}
|
||||
}
|
||||
}
|
||||
}else
|
||||
{
|
||||
foreach($device as $key => $value)
|
||||
{
|
||||
$response .= $topicRef . "&fn=" . $fn . "/" . $key . '">' . $key . "</a><br>";
|
||||
}
|
||||
}
|
||||
logger(DEBUG, _("response: ") . EOL . $response , __FILE__ . ":" . __LINE__);
|
||||
|
||||
//htmlSend($socket, $response);
|
||||
}else
|
||||
{
|
||||
foreach($devices[$argList["topic"]] as $key => $value)
|
||||
{
|
||||
logger(DEBUG, _("devices de topic: ") . $key , __FILE__ . ":" . __LINE__);
|
||||
$response .= $topicRef . "&fn=" . $key . '">' . $key . "</a><br>";
|
||||
logger(DEBUG, _("response: ") . $response , __FILE__ . ":" . __LINE__);
|
||||
}
|
||||
}
|
||||
}else
|
||||
{
|
||||
$response = webListTopics();
|
||||
}
|
||||
}else
|
||||
{
|
||||
$response = webListTopics();
|
||||
}
|
||||
htmlSend($socket, $response);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
logger(DEBUG, _($indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"])));
|
||||
$response .= $indexDevices[$ieeeAddress]->friendlyName . " => " . bool2string($indexDevices[$ieeeAddress]->$property["value"]) . "<br>";
|
||||
}
|
||||
}else
|
||||
{
|
||||
$response = _("dashboard not found");
|
||||
}
|
||||
|
||||
htmlSend($socket, $response);
|
||||
}
|
||||
|
||||
function askWebServer($read)
|
||||
{
|
||||
global $topics, $indexDevices, $devices;
|
||||
$array = array();
|
||||
$argList =array();
|
||||
|
||||
@ -31,16 +161,32 @@ function askWebServer($read)
|
||||
{
|
||||
$input = substr($input,5);
|
||||
$input = explode(" ", $input); // suppress text
|
||||
$argTmp = explode("&", $input[0]);
|
||||
|
||||
$argTmp = explode("&", urldecode($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, $tmp, __FILE__ . ":" . __LINE__);
|
||||
if(strpos($tmp, "=") === false)
|
||||
{
|
||||
logger(DEBUG, _("no ="));
|
||||
$argList[trim($tmp)] = "";
|
||||
}else
|
||||
{
|
||||
$argList[trim(strchr($tmp, "=", true))] = trim(substr(strchr($tmp, "="), 1));
|
||||
}
|
||||
}
|
||||
logger(DEBUG, print_r($argList, true));
|
||||
|
||||
if (array_key_exists("browse", $argList))
|
||||
{
|
||||
logger(DEBUG, _("Browsing"));
|
||||
webBrowse($spawn, $argList);
|
||||
return true;
|
||||
}elseif(array_key_exists("dashboard", $argList))
|
||||
{
|
||||
webDashboard($spawn, $argList["dashboard"]);
|
||||
return true;
|
||||
}
|
||||
if(array_key_exists("cmd", $argList))
|
||||
{
|
||||
$command = strtolower($argList["cmd"]);
|
||||
@ -51,25 +197,29 @@ function askWebServer($read)
|
||||
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>";
|
||||
$response = "GET: " . _("no parameters passed, need topic, fn and property");
|
||||
}else
|
||||
{
|
||||
$device = getDevice($argList["topic"], $argList["fn"]);
|
||||
$property = $argList["property"];
|
||||
$response = "<html><header></header><body>GET: " . bool2string($device->$property["value"]) . "</body></html>";
|
||||
if (($device = getDevice($argList["topic"], $argList["fn"])) === false)
|
||||
{
|
||||
htmlSend($spawn, sprintf(_('"%s" or "%s" does not exists'), $argList["topic"], $argList["fn"]));
|
||||
return false;
|
||||
}
|
||||
fwrite($spawn, $response);
|
||||
$property = $argList["property"];
|
||||
$response = "GET: " . bool2string($device->$property["value"]);
|
||||
}
|
||||
htmlSend($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);
|
||||
$response = "SET: " . _("no parameters passed, need topic, fn, property and value") . "passed";
|
||||
htmlSend($spawn, $response);
|
||||
}else
|
||||
{
|
||||
$response = "<html><header></header><body>setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"] . "</body></html>";
|
||||
fwrite($spawn, $response);
|
||||
$response = "setting property " . $argList["property"] . " of " . $argList["fn"] . " to value: " . $argList["value"];
|
||||
htmlSend($spawn, $response);
|
||||
$payload = array($argList["property"] => $argList["value"]);
|
||||
publish(Z2M . "/" . $argList["fn"], $payload);
|
||||
}
|
||||
@ -104,7 +254,7 @@ function askWebServer($read)
|
||||
$error = error_get_last();
|
||||
if($error !== null)
|
||||
{
|
||||
$response = "<html><header></header><body>" . $error["message"] . " file: " . $error["file"] . " line: " . $error["line"] . "</body></html>";
|
||||
$response = $error["message"] . " file: " . $error["file"] . " line: " . $error["line"];
|
||||
}
|
||||
if ($command === "print")
|
||||
{
|
||||
@ -114,28 +264,32 @@ function askWebServer($read)
|
||||
$response = "Dump" . EOL;
|
||||
$response .= var_export($var, true);
|
||||
}
|
||||
fwrite($spawn, $response);
|
||||
htmlSend($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);
|
||||
$response = _("Error: With 'notify' command, you need 4 parameters: topic, fn, property, condition, value");
|
||||
htmlSend($spawn, $response);
|
||||
}else
|
||||
{
|
||||
$response = "<html><header></header><body>" . _("notify command have been set") . "</body></html>";
|
||||
$response = _("notify command have been set");
|
||||
$monitored[] = new watch($argList["topic"], $argList["fn"], $argList["property"], $argList["condition"], $argList["value"]);
|
||||
fwrite($spawn, $response);
|
||||
htmlSend($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);
|
||||
webBrowse($spawn, $argList);
|
||||
}
|
||||
}else
|
||||
{
|
||||
webBrowse($spawn,$argList);
|
||||
}
|
||||
}else
|
||||
{
|
||||
webDashboard($spawn);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user