diff options
-rw-r--r-- | extras/ipmi/manifest.yaml | 1 | ||||
-rw-r--r-- | extras/vnc/manifest.yaml | 1 | ||||
-rw-r--r-- | kvmd/apps/kvmd/__init__.py | 3 | ||||
-rw-r--r-- | kvmd/apps/kvmd/info.py | 23 | ||||
-rw-r--r-- | web/ipmi/index.html | 4 | ||||
-rw-r--r-- | web/share/js/ipmi/main.js | 73 | ||||
-rw-r--r-- | web/share/js/vnc/main.js | 50 | ||||
-rw-r--r-- | web/vnc/index.html | 11 |
8 files changed, 129 insertions, 37 deletions
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 @@ </a> <hr> <p class="text"> - 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 <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic + BMC operations like on/off/reset the server. </p> <p class="text"> <b>WARNING!</b> 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 = ` - <span class="code-comment"># Power on the server if it's off:<br> - $</span> ipmitool -I lanplus -U admin -P admin -H ${host} power on<br> - <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> - ${site}/api/atx/power?action=on<br> - <br> - <span class="code-comment"># Soft power off the server if it's on:<br> - $</span> ipmitool -I lanplus -U admin -P admin -H ${host} power soft<br> - <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> - ${site}/api/atx/power?action=off<br> - <br> - <span class="code-comment"># Hard power off the server if it's on:<br> - $</span> ipmitool -I lanplus -U admin -P admin -H ${host} power off<br> - <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> - ${site}/api/atx/power?action=off_hard<br> - <br> - <span class="code-comment"># Hard reset the server if it's on:<br> - $</span> ipmitool -I lanplus -U admin -P admin -H ${host} power reset<br> - <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> - ${site}/api/atx/power?action=reset_hard<br> - <br> - <span class="code-comment"># Check the power status:<br> - $</span> ipmitool -I lanplus -U admin -P admin -H ${host} power status<br> - <span class="code-comment">$</span> curl -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> - ${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 = ` + <span class="code-comment"># Power on the server if it's off:<br> + $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power on<br> + <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> + ${site}/api/atx/power?action=on<br> + <br> + <span class="code-comment"># Soft power off the server if it's on:<br> + $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power soft<br> + <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> + ${site}/api/atx/power?action=off<br> + <br> + <span class="code-comment"># Hard power off the server if it's on:<br> + $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power off<br> + <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> + ${site}/api/atx/power?action=off_hard<br> + <br> + <span class="code-comment"># Hard reset the server if it's on:<br> + $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power reset<br> + <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> + ${site}/api/atx/power?action=reset_hard<br> + <br> + <span class="code-comment"># Check the power status:<br> + $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power status<br> + <span class="code-comment">$</span> curl -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> + ${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 <[email protected]> # +# # +# 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 <https://www.gnu.org/licenses/>. # +# # +*****************************************************************************/ + + +"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 = ` + <span class="code-comment"># How to connect using the Linux terminal:<br> + $</span> 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 @@ <link rel="stylesheet" href="../share/css/vars.css"> <link rel="stylesheet" href="../share/css/main.css"> <link rel="stylesheet" href="../share/css/start.css"> + + <script type="module"> + import {main} from "/share/js/vnc/main.js"; + main(); + </script> </head> <body> @@ -47,8 +52,7 @@ </a> <hr> <p class="text"> - 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 <b>kvmd-vnc</b> daemon and provides VNC access to the server. </p> <p class="text"> <b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks. @@ -58,7 +62,10 @@ <p class="text"> Your VNC client must support Tight JPEG compression, password authentication and allow connection without encryption. <a href="https://tigervnc.org">TigerVNC</a> is a good choice. + On Linux, this client will most likely be available for installation from the repository. + It can also be called vncviewer. </p> + <div id="vnc-text" class="code" style="max-height:200px;"></div> </div> </div> </body> |