summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevaev Maxim <[email protected]>2020-04-21 08:01:16 +0300
committerDevaev Maxim <[email protected]>2020-04-21 08:01:16 +0300
commit05d35d7eb0a30d71a88b7e443ff9755ad0a17bff (patch)
tree0a0b261715a0fb3f3c4d1ccbb2332675eb080701
parent8c904cf4a8e78fc4a688131a9b360085b7bfbf75 (diff)
real ports for extras
-rw-r--r--extras/ipmi/manifest.yaml1
-rw-r--r--extras/vnc/manifest.yaml1
-rw-r--r--kvmd/apps/kvmd/__init__.py3
-rw-r--r--kvmd/apps/kvmd/info.py23
-rw-r--r--web/ipmi/index.html4
-rw-r--r--web/share/js/ipmi/main.js73
-rw-r--r--web/share/js/vnc/main.js50
-rw-r--r--web/vnc/index.html11
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>
- &nbsp;&nbsp;&nbsp;&nbsp;${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>
- &nbsp;&nbsp;&nbsp;&nbsp;${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>
- &nbsp;&nbsp;&nbsp;&nbsp;${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>
- &nbsp;&nbsp;&nbsp;&nbsp;${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>
- &nbsp;&nbsp;&nbsp;&nbsp;${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>
+ &nbsp;&nbsp;&nbsp;&nbsp;${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>
+ &nbsp;&nbsp;&nbsp;&nbsp;${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>
+ &nbsp;&nbsp;&nbsp;&nbsp;${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>
+ &nbsp;&nbsp;&nbsp;&nbsp;${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>
+ &nbsp;&nbsp;&nbsp;&nbsp;${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>