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:
- 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.
- $ 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
+ $ 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 @@