From 05d35d7eb0a30d71a88b7e443ff9755ad0a17bff Mon Sep 17 00:00:00 2001 From: Devaev Maxim Date: Tue, 21 Apr 2020 08:01:16 +0300 Subject: [PATCH] real ports for extras --- extras/ipmi/manifest.yaml | 1 + extras/vnc/manifest.yaml | 1 + kvmd/apps/kvmd/__init__.py | 3 +- kvmd/apps/kvmd/info.py | 23 ++++++++++-- web/ipmi/index.html | 4 +-- web/share/js/ipmi/main.js | 73 +++++++++++++++++++++++--------------- web/share/js/vnc/main.js | 50 ++++++++++++++++++++++++++ web/vnc/index.html | 11 ++++-- 8 files changed, 129 insertions(+), 37 deletions(-) create mode 100644 web/share/js/vnc/main.js diff --git a/extras/ipmi/manifest.yaml b/extras/ipmi/manifest.yaml index 6b966c3c..3c80b53a 100644 --- a/extras/ipmi/manifest.yaml +++ b/extras/ipmi/manifest.yaml @@ -4,4 +4,5 @@ icon: share/svg/ipmi.svg path: ipmi keyboard_cap: false daemon: kvmd-ipmi +port: ipmi/server/port place: 21 diff --git a/extras/vnc/manifest.yaml b/extras/vnc/manifest.yaml index 56735090..6824ad6e 100644 --- a/extras/vnc/manifest.yaml +++ b/extras/vnc/manifest.yaml @@ -4,4 +4,5 @@ icon: share/svg/vnc.svg path: vnc keyboard_cap: false daemon: kvmd-vnc +port: vnc/server/port place: 20 diff --git a/kvmd/apps/kvmd/__init__.py b/kvmd/apps/kvmd/__init__.py index d21de499..5aa3d687 100644 --- a/kvmd/apps/kvmd/__init__.py +++ b/kvmd/apps/kvmd/__init__.py @@ -60,6 +60,7 @@ def main(argv: Optional[List[str]]=None) -> None: if config.kvmd.msd.type == "otg": msd_kwargs["gadget"] = config.otg.gadget # XXX: Small crutch to pass gadget name to plugin + global_config = config config = config.kvmd KvmdServer( @@ -71,7 +72,7 @@ def main(argv: Optional[List[str]]=None) -> None: force_internal_users=config.auth.internal.force_users, enabled=config.auth.enabled, ), - info_manager=InfoManager(**config.info._unpack()), + info_manager=InfoManager(global_config, **config.info._unpack()), log_reader=LogReader(), wol=WakeOnLan(**config.wol._unpack()), diff --git a/kvmd/apps/kvmd/info.py b/kvmd/apps/kvmd/info.py index 088927e3..fe4a332c 100644 --- a/kvmd/apps/kvmd/info.py +++ b/kvmd/apps/kvmd/info.py @@ -30,6 +30,7 @@ import dbus.exceptions from ...logging import get_logger +from ...yamlconf import Section from ...yamlconf.loader import load_yaml_file from ... import aiotools @@ -39,10 +40,12 @@ from ... import aiotools class InfoManager: def __init__( self, + global_config: Section, meta_path: str, extras_path: str, ) -> None: + self.__global_config = global_config self.__meta_path = meta_path self.__extras_path = extras_path @@ -57,11 +60,25 @@ class InfoManager: for app in os.listdir(self.__extras_path): if app[0] != "." and os.path.isdir(os.path.join(self.__extras_path, app)): extras[app] = load_yaml_file(os.path.join(self.__extras_path, app, "manifest.yaml")) - daemon = extras[app].get("daemon", "") - if isinstance(daemon, str) and daemon.strip(): - extras[app]["enabled"] = self.__is_daemon_enabled(daemon) + self.__rewrite_app_daemon(extras[app]) + self.__rewrite_app_port(extras[app]) return extras + def __rewrite_app_daemon(self, extras: Dict) -> None: + daemon = extras.get("daemon", "") + if isinstance(daemon, str) and daemon.strip(): + extras["enabled"] = self.__is_daemon_enabled(daemon) + + def __rewrite_app_port(self, extras: Dict) -> None: + port_path = extras.get("port", "") + if isinstance(port_path, str) and port_path.strip(): + extras["port"] = 0 + config = self.__global_config + for item in filter(None, map(str.strip, port_path.split("/"))): + config = getattr(config, item, None) + if isinstance(config, int): + extras["port"] = config + def __is_daemon_enabled(self, name: str) -> bool: if not name.startswith(".service"): name += ".service" diff --git a/web/ipmi/index.html b/web/ipmi/index.html index bc146f1b..07fda012 100644 --- a/web/ipmi/index.html +++ b/web/ipmi/index.html @@ -52,8 +52,8 @@

- This Pi-KVM device has running kvmd-ipmi daemon and provides IPMI 2.0 port (default 623) - for some basic BMC operations like on/off/reset for the server. + This Pi-KVM device has running kvmd-ipmi daemon and provides IPMI 2.0 interface for some basic + BMC operations like on/off/reset the server.

WARNING! We strongly don't recommend you to use IPMI in untrusted networks because diff --git a/web/share/js/ipmi/main.js b/web/share/js/ipmi/main.js index ff3032f5..2c48e7d3 100644 --- a/web/share/js/ipmi/main.js +++ b/web/share/js/ipmi/main.js @@ -23,36 +23,51 @@ "use strict"; -import {$} from "../tools.js"; +import {$, tools} from "../tools.js"; export function main() { - let host = window.location.hostname; - let site = `${window.location.protocol}//${window.location.host}`; - $("ipmi-text").innerHTML = ` - # Power on the server if it's off:
- $
ipmitool -I lanplus -U admin -P admin -H ${host} power on
- $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
-     ${site}/api/atx/power?action=on
-
- # Soft power off the server if it's on:
- $
ipmitool -I lanplus -U admin -P admin -H ${host} power soft
- $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
-     ${site}/api/atx/power?action=off
-
- # Hard power off the server if it's on:
- $
ipmitool -I lanplus -U admin -P admin -H ${host} power off
- $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
-     ${site}/api/atx/power?action=off_hard
-
- # Hard reset the server if it's on:
- $
ipmitool -I lanplus -U admin -P admin -H ${host} power reset
- $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
-     ${site}/api/atx/power?action=reset_hard
-
- # Check the power status:
- $
ipmitool -I lanplus -U admin -P admin -H ${host} power status
- $ curl -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
-     ${site}/api/atx - `; + __loadKvmdInfo(); +} + +function __loadKvmdInfo() { + let http = tools.makeRequest("GET", "/api/info", function() { + if (http.readyState === 4) { + if (http.status === 200) { + let port = JSON.parse(http.responseText).result.extras.ipmi.port; + let host = window.location.hostname; + let site = `${window.location.protocol}//${window.location.host}`; + $("ipmi-text").innerHTML = ` + # Power on the server if it's off:
+ $
ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power on
+ $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
+     ${site}/api/atx/power?action=on
+
+ # Soft power off the server if it's on:
+ $
ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power soft
+ $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
+     ${site}/api/atx/power?action=off
+
+ # Hard power off the server if it's on:
+ $
ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power off
+ $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
+     ${site}/api/atx/power?action=off_hard
+
+ # Hard reset the server if it's on:
+ $
ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power reset
+ $ curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
+     ${site}/api/atx/power?action=reset_hard
+
+ # Check the power status:
+ $
ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power status
+ $ curl -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\
+     ${site}/api/atx + `; + } else if (http.status === 401 || http.status === 403) { + document.location.href = "/login"; + } else { + setTimeout(__loadKvmdInfo, 1000); + } + } + }); } diff --git a/web/share/js/vnc/main.js b/web/share/js/vnc/main.js new file mode 100644 index 00000000..41f310b7 --- /dev/null +++ b/web/share/js/vnc/main.js @@ -0,0 +1,50 @@ +/***************************************************************************** +# # +# KVMD - The main Pi-KVM daemon. # +# # +# Copyright (C) 2018 Maxim Devaev # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see . # +# # +*****************************************************************************/ + + +"use strict"; + + +import {$, tools} from "../tools.js"; + + +export function main() { + __loadKvmdInfo(); +} + +function __loadKvmdInfo() { + let http = tools.makeRequest("GET", "/api/info", function() { + if (http.readyState === 4) { + if (http.status === 200) { + let port = JSON.parse(http.responseText).result.extras.vnc.port; + let host = window.location.hostname; + $("vnc-text").innerHTML = ` + # How to connect using the Linux terminal:
+ $
vncviewer ${host}::${port} + `; + } else if (http.status === 401 || http.status === 403) { + document.location.href = "/login"; + } else { + setTimeout(__loadKvmdInfo, 1000); + } + } + }); +} diff --git a/web/vnc/index.html b/web/vnc/index.html index 9cf2b251..966f5b22 100644 --- a/web/vnc/index.html +++ b/web/vnc/index.html @@ -37,6 +37,11 @@ + + @@ -47,8 +52,7 @@


- This Pi-KVM device has running kvmd-vnc daemon and provides VNC port (default 5900) - for alternative access to the server other than the web interface. + This Pi-KVM device has running kvmd-vnc daemon and provides VNC access to the server.

WARNING! We strongly don't recommend you to use VNC in untrusted networks. @@ -58,7 +62,10 @@

Your VNC client must support Tight JPEG compression, password authentication and allow connection without encryption. TigerVNC is a good choice. + On Linux, this client will most likely be available for installation from the repository. + It can also be called vncviewer.

+