mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2025-12-12 01:00:29 +08:00
real ports for extras
This commit is contained in:
parent
8c904cf4a8
commit
05d35d7eb0
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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()),
|
||||||
|
|
||||||
|
|||||||
@ -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"
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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) {
|
||||||
${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 = `
|
||||||
${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>
|
${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>
|
||||||
${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>
|
${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>
|
||||||
${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>
|
${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>
|
||||||
${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>
|
||||||
|
${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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
50
web/share/js/vnc/main.js
Normal file
50
web/share/js/vnc/main.js
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@ -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>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user