loadMe(); $this->me = $me; $this->layout()->set("me", $me); } protected function apiAction() { $do = $this->request->do; if ($do !== "getConfig" && !$this->me->is("employee")) { $this->redirect("dashboard"); } switch ($do) { case "getDisplays": $return = $this->getDisplaysApi(); break; case "change": $return = $this->change(); break; case "reboot": $return = $this->restartRaspberryPi($this->request->displayID); break; case "rebootAll": $return = $this->restartAllRaspberryPis(); break; case "getConfig": $return = $this->getConfig(); break; case "displayPower": $return = $this->displayPower(); break; default: $return = false; break; } $data = []; if ($return === true) { $data = ["status" => "success"]; $this->returnJson($data); } if (!is_array($return) || !count($return)) { $data = ["status" => "error"]; $this->returnJson($data); } $data['status'] = "OK"; $data['result'] = $return; $this->returnJson($data); } protected function getDisplaysApi(): array { $displays = RaspberryDisplayModel::getAll(); $result = []; foreach ($displays as $display) { $result[] = ["display_label" => $display->display_label, "hostname" => $display->hostname, "ip" => $display->ip_address, "display_url" => $display->display_url, "auto_refresh_enabled" => $display->auto_refresh_enabled === "1", "margin_hot_fix_enabled" => $display->margin_hot_fix_enabled === "1", "custom_style" => $display->custom_style, "id" => $display->id,]; } return $result; } protected function change() { $displayID = $this->request->displayID; $field = $this->request->field; $value = $this->request->value; $value = $value === "true" ? 1 : ($value === "false" ? 0 : $value); $display = RaspberryDisplayModel::get($displayID); if ($display === null) { return false; } $display->$field = $value; $display->save(); return true; } protected function restartRaspberryPi($id) { $display = RaspberryDisplayModel::get($id); $ssh = new SSH2($display->ip_address, $this->port); $ssh->login($this->username, $this->password); $ssh->exec('sudo reboot now'); return true; } protected function restartAllRaspberryPis() { $displays = RaspberryDisplayModel::getAll(); $ipAddresses = []; foreach ($displays as $display) { if (in_array($display->ip_address, $ipAddresses)) { continue; } $ipAddresses[] = $display->ip_address; $ssh = new SSH2($display->ip_address, $this->port); $ssh->login($this->username, $this->password); $ssh->exec('sudo reboot now'); } return true; } protected function getConfig() { $hostname = $this->request->hostname; $displays = RaspberryDisplayModel::getByHostname($hostname); if ($displays === null) { die("No display found for this hostname and ip:" . $hostname . " X "); } return array_map(function ($display) { return ["display_url" => $display->data->display_url, "auto_refresh_enabled" => $display->data->auto_refresh_enabled === "1", "margin_hot_fix_enabled" => $display->data->margin_hot_fix_enabled === "1", "id" => $display->id,]; }, $displays); } protected function indexAction(): void { $JSGlobals = ["BASE_URL" => self::getUrl("RaspberryDisplay"), "DASHBOARD_URL" => self::getUrl("Dashboard"), "MFAPPNAME" => MFAPPNAME_SLUG, "PAGE_TITLE" => "Raspberry Displays", "PATH" => [ ["text" => MFAPPNAME_SLUG, "href" => self::getUrl("Dashboard")], ["text" => "Raspberry Displays", "href" => self::getUrl("RaspberryDisplay")] ] ]; $this->layout()->set("vueViewName", "RaspberryDisplay"); $this->layout()->set("JSGlobals", $JSGlobals); $this->layout()->set("additionalCSS", ["css/views/RaspberryDisplay.css"]); $this->layout()->setTemplate("VueViews/Vue"); } private function displayPower(): bool { $state = $this->request->state; $displays = RaspberryDisplayModel::getAll(); $ipAddresses = []; foreach ($displays as $display) { if (in_array($display->ip_address, $ipAddresses)) { continue; } $ipAddresses[] = $display->ip_address; $ssh = new SSH2($display->ip_address, $this->port); $ssh->login($this->username, $this->password); if ($state === "on") { $ssh->exec('sudo bash /root/on.sh'); } else { $ssh->exec('sudo bash /root/off.sh'); } } return true; } }