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 path: ipmi
keyboard_cap: false keyboard_cap: false
daemon: kvmd-ipmi daemon: kvmd-ipmi
port: ipmi/server/port
place: 21 place: 21

View File

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

View File

@ -60,6 +60,7 @@ def main(argv: Optional[List[str]]=None) -> None:
if config.kvmd.msd.type == "otg": if config.kvmd.msd.type == "otg":
msd_kwargs["gadget"] = config.otg.gadget # XXX: Small crutch to pass gadget name to plugin msd_kwargs["gadget"] = config.otg.gadget # XXX: Small crutch to pass gadget name to plugin
global_config = config
config = config.kvmd config = config.kvmd
KvmdServer( KvmdServer(
@ -71,7 +72,7 @@ def main(argv: Optional[List[str]]=None) -> None:
force_internal_users=config.auth.internal.force_users, force_internal_users=config.auth.internal.force_users,
enabled=config.auth.enabled, enabled=config.auth.enabled,
), ),
info_manager=InfoManager(**config.info._unpack()), info_manager=InfoManager(global_config, **config.info._unpack()),
log_reader=LogReader(), log_reader=LogReader(),
wol=WakeOnLan(**config.wol._unpack()), wol=WakeOnLan(**config.wol._unpack()),

View File

@ -30,6 +30,7 @@ import dbus.exceptions
from ...logging import get_logger from ...logging import get_logger
from ...yamlconf import Section
from ...yamlconf.loader import load_yaml_file from ...yamlconf.loader import load_yaml_file
from ... import aiotools from ... import aiotools
@ -39,10 +40,12 @@ from ... import aiotools
class InfoManager: class InfoManager:
def __init__( def __init__(
self, self,
global_config: Section,
meta_path: str, meta_path: str,
extras_path: str, extras_path: str,
) -> None: ) -> None:
self.__global_config = global_config
self.__meta_path = meta_path self.__meta_path = meta_path
self.__extras_path = extras_path self.__extras_path = extras_path
@ -57,11 +60,25 @@ class InfoManager:
for app in os.listdir(self.__extras_path): for app in os.listdir(self.__extras_path):
if app[0] != "." and os.path.isdir(os.path.join(self.__extras_path, app)): 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")) extras[app] = load_yaml_file(os.path.join(self.__extras_path, app, "manifest.yaml"))
daemon = extras[app].get("daemon", "") self.__rewrite_app_daemon(extras[app])
if isinstance(daemon, str) and daemon.strip(): self.__rewrite_app_port(extras[app])
extras[app]["enabled"] = self.__is_daemon_enabled(daemon)
return extras 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: def __is_daemon_enabled(self, name: str) -> bool:
if not name.startswith(".service"): if not name.startswith(".service"):
name += ".service" name += ".service"

View File

@ -52,8 +52,8 @@
</a> </a>
<hr> <hr>
<p class="text"> <p class="text">
This Pi-KVM device has running kvmd-ipmi daemon and provides IPMI 2.0 port (default 623) This Pi-KVM device has running <b>kvmd-ipmi</b> daemon and provides IPMI 2.0 interface for some basic
for some basic BMC operations like on/off/reset for the server. BMC operations like on/off/reset the server.
</p> </p>
<p class="text"> <p class="text">
<b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because <b>WARNING!</b> We strongly don't recommend you to use IPMI in untrusted networks because

View File

@ -23,36 +23,51 @@
"use strict"; "use strict";
import {$} from "../tools.js"; import {$, tools} from "../tools.js";
export function main() { export function main() {
let host = window.location.hostname; __loadKvmdInfo();
let site = `${window.location.protocol}//${window.location.host}`; }
$("ipmi-text").innerHTML = `
<span class="code-comment"># Power on the server if it's off:<br> function __loadKvmdInfo() {
$</span> ipmitool -I lanplus -U admin -P admin -H ${host} power on<br> let http = tools.makeRequest("GET", "/api/info", function() {
<span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> if (http.readyState === 4) {
&nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=on<br> if (http.status === 200) {
<br> let port = JSON.parse(http.responseText).result.extras.ipmi.port;
<span class="code-comment"># Soft power off the server if it's on:<br> let host = window.location.hostname;
$</span> ipmitool -I lanplus -U admin -P admin -H ${host} power soft<br> let site = `${window.location.protocol}//${window.location.host}`;
<span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> $("ipmi-text").innerHTML = `
&nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=off<br> <span class="code-comment"># Power on the server if it's off:<br>
<br> $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power on<br>
<span class="code-comment"># Hard power off the server if it's on:<br> <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br>
$</span> ipmitool -I lanplus -U admin -P admin -H ${host} power off<br> &nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=on<br>
<span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> <br>
&nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=off_hard<br> <span class="code-comment"># Soft power off the server if it's on:<br>
<br> $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power soft<br>
<span class="code-comment"># Hard reset the server if it's on:<br> <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br>
$</span> ipmitool -I lanplus -U admin -P admin -H ${host} power reset<br> &nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=off<br>
<span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> <br>
&nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=reset_hard<br> <span class="code-comment"># Hard power off the server if it's on:<br>
<br> $</span> ipmitool -I lanplus -U admin -P admin -H ${host} -p ${port} power off<br>
<span class="code-comment"># Check the power status:<br> <span class="code-comment">$</span> curl -XPOST -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br>
$</span> ipmitool -I lanplus -U admin -P admin -H ${host} power status<br> &nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx/power?action=off_hard<br>
<span class="code-comment">$</span> curl -HX-KVMD-User:admin -HX-KVMD-Passwd:admin -k \\<br> <br>
&nbsp;&nbsp;&nbsp;&nbsp;${site}/api/atx <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/vars.css">
<link rel="stylesheet" href="../share/css/main.css"> <link rel="stylesheet" href="../share/css/main.css">
<link rel="stylesheet" href="../share/css/start.css"> <link rel="stylesheet" href="../share/css/start.css">
<script type="module">
import {main} from "/share/js/vnc/main.js";
main();
</script>
</head> </head>
<body> <body>
@ -47,8 +52,7 @@
</a> </a>
<hr> <hr>
<p class="text"> <p class="text">
This Pi-KVM device has running kvmd-vnc daemon and provides VNC port (default 5900) This Pi-KVM device has running <b>kvmd-vnc</b> daemon and provides VNC access to the server.
for alternative access to the server other than the web interface.
</p> </p>
<p class="text"> <p class="text">
<b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks. <b>WARNING!</b> We strongly don't recommend you to use VNC in untrusted networks.
@ -58,7 +62,10 @@
<p class="text"> <p class="text">
Your VNC client must support Tight JPEG compression, password authentication and allow 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. 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> </p>
<div id="vnc-text" class="code" style="max-height:200px;"></div>
</div> </div>
</div> </div>
</body> </body>