real ports for extras

This commit is contained in:
Devaev Maxim 2020-04-21 08:01:16 +03:00
parent 8c904cf4a8
commit 05d35d7eb0
8 changed files with 129 additions and 37 deletions

View File

@ -4,4 +4,5 @@ icon: share/svg/ipmi.svg
path: ipmi
keyboard_cap: false
daemon: kvmd-ipmi
port: ipmi/server/port
place: 21

View File

@ -4,4 +4,5 @@ icon: share/svg/vnc.svg
path: vnc
keyboard_cap: false
daemon: kvmd-vnc
port: vnc/server/port
place: 20

View File

@ -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()),

View File

@ -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"

View File

@ -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

View File

@ -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);
}
}
});
}

50
web/share/js/vnc/main.js Normal file
View File

@ -0,0 +1,50 @@
/*****************************************************************************
# #
# KVMD - The main Pi-KVM daemon. #
# #
# Copyright (C) 2018 Maxim Devaev <mdevaev@gmail.com> #
# #
# 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);
}
}
});
}

View File

@ -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>