diff --git a/.vscode/settings.json b/.vscode/settings.json index 9ddf6b28..39eac8d1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,4 @@ { - "cmake.ignoreCMakeListsMissing": true + "cmake.ignoreCMakeListsMissing": true, + "makefile.configureOnOpen": false } \ No newline at end of file diff --git a/build/Dockerfile b/build/Dockerfile index 5ef333e2..467fd94d 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -38,7 +38,8 @@ RUN if [ ${TARGETARCH} = arm ]; then ARCH=armhf; elif [ ${TARGETARCH} = arm64 ]; COPY testenv/fakes/vcgencmd /usr/bin/ COPY extras/ /usr/share/kvmd/extras/ COPY web/ /usr/share/kvmd/web/ -COPY build/platform scripts/kvmd-gencert /usr/share/kvmd/ +COPY scripts/kvmd-gencert /usr/share/kvmd/ +COPY build/platform/docker /usr/share/kvmd/platform COPY contrib/keymaps /usr/share/kvmd/keymaps COPY kvmd/ build/init.sh /kvmd/ COPY configs/kvmd/ /etc/kvmd_backup/ diff --git a/build/build_img.sh b/build/build_img.sh new file mode 100644 index 00000000..05f4ce82 --- /dev/null +++ b/build/build_img.sh @@ -0,0 +1,126 @@ +#!/bin/bash + +#File List +#src +#└── image +# ├── cumebox2 +# │ └── Armbian_24.8.1_Khadas-vim1_bookworm_current_6.6.47_minimal.img +# └── onecloud +# ├── AmlImg_v0.3.1_linux_amd64 +# ├── Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal.burn.img +# └── rc.local + +#预处理镜像文件 +SRCPATH=../src +ROOTFS=/tmp/rootfs +$SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64 unpack $SRCPATH/image/onecloud/Armbian_by-SilentWind_24.5.0-trunk_Onecloud_bookworm_legacy_5.9.0-rc7_minimal.burn.img $SRCPATH/tmp +simg2img $SRCPATH/tmp/7.rootfs.PARTITION.sparse $SRCPATH/tmp/rootfs.img +dd if=/dev/zero of=/tmp/add.img bs=1M count=1024 && cat /tmp/add.img >> $SRCPATH/tmp/rootfs.img && rm /tmp/add.img +e2fsck -f $SRCPATH/tmp/rootfs.img && resize2fs $SRCPATH/tmp/rootfs.img + +#挂载镜像文件 +mkdir $ROOTFS +sudo mount $SRCPATH/tmp/rootfs.img $ROOTFS || exit -1 +sudo mount -t proc proc $ROOTFS/proc || exit -1 +sudo mount -t sysfs sys $ROOTFS/sys || exit -1 +sudo mount -o bind /dev $ROOTFS/dev || exit -1 + +#准备文件 +sudo mkdir -p $ROOTFS/etc/kvmd/override.d $ROOTFS/etc/kvmd/vnc $ROOTFS/var/lib/kvmd/msd $ROOTFS/opt/vc/bin $ROOTFS/usr/share/kvmd \ + $ROOTFS/usr/share/janus/javascript $ROOTFS/usr/lib/ustreamer/janus $ROOTFS/run/kvmd +sudo cp -r ../One-KVM $ROOTFS/ +sudo cp $SRCPATH/image/onecloud/rc.local $ROOTFS/etc/ +sudo cp -r $ROOTFS/One-KVM/configs/kvmd/* $ROOTFS/One-KVM/configs/nginx $ROOTFS/One-KVM/configs/janus \ + $ROOTFS/etc/kvmd +sudo cp -r $ROOTFS/One-KVM/web $ROOTFS/One-KVM/extras $ROOTFS/One-KVM/contrib/keymaps $ROOTFS/usr/share/kvmd +sudo cp $ROOTFS/One-KVM/build/platform/onecloud $ROOTFS/usr/share/kvmd/platform +sudo cp $ROOTFS/One-KVM/testenv/fakes/vcgencmd $ROOTFS/usr/bin/ +sudo cp -r $ROOTFS/One-KVM/testenv/js/* $ROOTFS/usr/share/janus/javascript/ + +#安装依赖 +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + apt update \ + && apt install -y python3-aiofiles python3-aiohttp python3-appdirs python3-asn1crypto python3-async-timeout \ + python3-bottle python3-cffi python3-chardet python3-click python3-colorama python3-cryptography python3-dateutil \ + python3-dbus python3-dev python3-hidapi python3-idna python3-libgpiod python3-mako python3-marshmallow python3-more-itertools \ + python3-multidict python3-netifaces python3-packaging python3-passlib python3-pillow python3-ply python3-psutil \ + python3-pycparser python3-pyelftools python3-pyghmi python3-pygments python3-pyparsing python3-requests \ + python3-semantic-version python3-setproctitle python3-setuptools python3-six python3-spidev python3-systemd \ + python3-tabulate python3-urllib3 python3-wrapt python3-xlib python3-yaml python3-yarl python3-pyotp python3-qrcode \ + python3-serial python3-zstandard python3-dbus-next \ + && apt install -y nginx python3-pip python3-dev python3-build net-tools tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim \ + git gpiod libxkbcommon0 build-essential janus-dev libssl-dev libffi-dev libevent-dev libjpeg-dev libbsd-dev libudev-dev \ + pkg-config libx264-dev libyuv-dev libasound2-dev libsndfile-dev libspeexdsp-dev cpufrequtils iptables\ + && apt clean " + +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple \ + && pip3 install --target=/usr/lib/python3/dist-packages --break-system-packages async-lru gpiod \ + && pip3 cache purge " + +sudo chroot --userspec "root:root" $ROOTFS sed --in-place --expression 's|^#include "refcount.h"$|#include "../refcount.h"|g' /usr/include/janus/plugins/plugin.h + +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + git clone --depth=1 https://github.com/mofeng-git/ustreamer /tmp/ustreamer \ + && make -j WITH_PYTHON=1 WITH_JANUS=1 WITH_LIBX264=1 -C /tmp/ustreamer \ + && mv /tmp/ustreamer/src/ustreamer.bin /usr/bin/ustreamer \ + && mv /tmp/ustreamer/src/ustreamer-dump.bin /usr/bin/ustreamer-dump \ + && chmod +x /usr/bin/ustreamer /usr/bin/ustreamer-dump \ + && mv /tmp/ustreamer/janus/libjanus_ustreamer.so /usr/lib/ustreamer/janus \ + && pip3 install --target=/usr/lib/python3/dist-packages --break-system-packages /tmp/ustreamer/python/dist/*.whl " + +#安装 kvmd 主程序 +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + cd /One-KVM \ + && python3 setup.py install \ + && bash scripts/kvmd-gencert --do-the-thing \ + && bash scripts/kvmd-gencert --do-the-thing --vnc \ + && kvmd-nginx-mkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf \ + && kvmd -m " + +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + curl https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.armhf -L -o /usr/bin/ttyd \ + && chmod +x /usr/bin/ttyd \ + && systemd-sysusers /One-KVM/configs/os/kvmd-webterm.conf \ + && mkdir -p /home/kvmd-webterm \ + && chown kvmd-webterm /home/kvmd-webterm " + + +#服务自启 +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + cat /One-KVM/configs/os/sudoers/v2-hdmiusb >> /etc/sudoers \ + && echo 'libcomposite' >> /etc/modules \ + && mv /usr/local/bin/kvmd* /usr/bin \ + && cp /One-KVM/configs/os/services/* /etc/systemd/system/ \ + && cp /One-KVM/configs/os/tmpfiles.conf /usr/lib/tmpfiles.d/ \ + && chmod +x /etc/update-motd.d/* \ + && echo 'kvmd ALL=\(ALL\) NOPASSWD: /etc/kvmd/custom_atx/gpio.sh' >> /etc/sudoers \ + && echo 'kvmd ALL=\(ALL\) NOPASSWD: /etc/kvmd/custom_atx/usbrelay_hid.sh' >> /etc/sudoers \ + && systemd-sysusers /One-KVM/configs/os/sysusers.conf \ + && ln -sf /usr/share/tesseract-ocr/*/tessdata /usr/share/tessdata \ + && sed -i 's/ch9329/otg/g' /etc/kvmd/override.yaml \ + && sed -i 's/device: \/dev\/ttyUSB0//g' /etc/kvmd/override.yaml \ + && sed -i 's/8080/80/g' /etc/kvmd/override.yaml \ + && sed -i 's/4430/443/g' /etc/kvmd/override.yaml \ + && sed -i 's/localhost.localdomain/onecloud/g' /etc/kvmd/meta.yaml \ + && systemctl enable kvmd kvmd-otg kvmd-nginx kvmd-vnc kvmd-ipmi kvmd-webterm kvmd-janus \ + && systemctl disable nginx janus \ + && rm -r /One-KVM " + + +sudo chroot --userspec "root:root" $ROOTFS bash -c " \ + sed -i '2c ATX=GPIO' /etc/kvmd/atx.sh \ + && sed -i 's/SHUTDOWNPIN/gpiochip1 7/g' /etc/kvmd/custom_atx/gpio.sh \ + && sed -i 's/REBOOTPIN/gpiochip0 11/g' /etc/kvmd/custom_atx/gpio.sh " + +#卸载镜像 +sudo umount $ROOTFS/sys +sudo umount $ROOTFS/dev +sudo umount $ROOTFS/proc +sudo umount $ROOTFS + +#打包镜像 +sudo rm $SRCPATH/tmp/7.rootfs.PARTITION.sparse +sudo img2simg $SRCPATH/tmp/rootfs.img $SRCPATH/tmp/7.rootfs.PARTITION.sparse +sudo $SRCPATH/image/onecloud/AmlImg_v0.3.1_linux_amd64 pack $SRCPATH/output/One-KVM_by-SilentWind_Onecloud_241004.burn.img $SRCPATH/tmp/ +sudo rm $SRCPATH/tmp/* \ No newline at end of file diff --git a/build/init.sh b/build/init.sh index edbf4b52..1df396ac 100755 --- a/build/init.sh +++ b/build/init.sh @@ -11,8 +11,9 @@ echo -e "${GREEN}One-KVM pre-starting...${NC}" if [ ! -f /etc/kvmd/.init_flag ]; then echo -e "${GREEN}One-KVM is initializing first...${NC}" \ && mkdir -p /etc/kvmd/ \ - && mv /etc/kvmd_backup/* /etc/kvmd/ \ + && mv /etc/kvmd_backup/* /etc/kvmd/ \ && touch /etc/kvmd/.docker_flag \ + && sed -i 's/localhost.localdomain/docker/g' /etc/kvmd/meta.yaml \ && /usr/share/kvmd/kvmd-gencert --do-the-thing \ && /usr/share/kvmd/kvmd-gencert --do-the-thing --vnc \ || echo -e "${RED}One-KVM config moving and self-signed SSL certificates init failed.${NC}" diff --git a/build/platform b/build/platform/docker similarity index 100% rename from build/platform rename to build/platform/docker diff --git a/build/platform/onecloud b/build/platform/onecloud new file mode 100644 index 00000000..02e1ab83 --- /dev/null +++ b/build/platform/onecloud @@ -0,0 +1,3 @@ +PIKVM_MODEL=v2_model +PIKVM_VIDEO=usb_video +PIKVM_BOARD=onecloud diff --git a/configs/kvmd/atx.sh b/configs/kvmd/atx.sh index d074634b..4e8694e0 100755 --- a/configs/kvmd/atx.sh +++ b/configs/kvmd/atx.sh @@ -3,15 +3,12 @@ echo $ATX case $ATX in GPIO) - CUSTOMATX=gpio + sudo /etc/kvmd/custom_atx/gpio.sh $1 ;; USBRELAY_HID) - CUSTOMATX=usbrelay_hid + sudo /etc/kvmd/custom_atx/usbrelay_hid.sh $1 ;; *) echo "No thing." exit -1 -esac - -#$1 option: short long reset -exec /etc/kvmd/custom_atx/$CUSTOMATX.sh $1 \ No newline at end of file +esac \ No newline at end of file diff --git a/configs/os/kvmd-webterm.conf b/configs/os/kvmd-webterm.conf new file mode 100644 index 00000000..3a015fb3 --- /dev/null +++ b/configs/os/kvmd-webterm.conf @@ -0,0 +1,6 @@ +g kvmd-webterm - - + +u kvmd-webterm - "Pi-KVM - Web terminal" /home/kvmd-webterm + +m kvmd-webterm kvmd +m kvmd-nginx kvmd-webterm diff --git a/configs/os/services/kvmd-ipmi.service b/configs/os/services/kvmd-ipmi.service index 790412a1..17bcc2b9 100644 --- a/configs/os/services/kvmd-ipmi.service +++ b/configs/os/services/kvmd-ipmi.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - IPMI to KVMD proxy +Description=One-KVM - IPMI to KVMD proxy After=kvmd.service [Service] diff --git a/configs/os/services/kvmd-janus.service b/configs/os/services/kvmd-janus.service index 21b2f7bb..ee36835b 100644 --- a/configs/os/services/kvmd-janus.service +++ b/configs/os/services/kvmd-janus.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - Janus WebRTC Gateway +Description=One-KVM - Janus WebRTC Gateway After=network.target network-online.target nss-lookup.target kvmd.service [Service] diff --git a/configs/os/services/kvmd-nginx.service b/configs/os/services/kvmd-nginx.service index c0eff485..0189fd5f 100644 --- a/configs/os/services/kvmd-nginx.service +++ b/configs/os/services/kvmd-nginx.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - HTTP entrypoint +Description=One-KVM - HTTP entrypoint After=network.target network-online.target nss-lookup.target kvmd.service [Service] diff --git a/configs/os/services/kvmd-otg.service b/configs/os/services/kvmd-otg.service index a2b87238..c4209779 100644 --- a/configs/os/services/kvmd-otg.service +++ b/configs/os/services/kvmd-otg.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - OTG setup +Description=One-KVM- OTG setup After=systemd-modules-load.service Before=kvmd.service diff --git a/configs/os/services/kvmd-vnc.service b/configs/os/services/kvmd-vnc.service index e1148f4f..f04b295b 100644 --- a/configs/os/services/kvmd-vnc.service +++ b/configs/os/services/kvmd-vnc.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - VNC to KVMD/Streamer proxy +Description=One-KVM - VNC to KVMD/Streamer proxy After=kvmd.service [Service] diff --git a/configs/os/services/kvmd-webterm.service b/configs/os/services/kvmd-webterm.service new file mode 100644 index 00000000..ca2089c5 --- /dev/null +++ b/configs/os/services/kvmd-webterm.service @@ -0,0 +1,24 @@ +[Unit] +Description=One-KVM - Web terminal (ttyd) +After=network.target + +[Service] +User=kvmd-webterm +Group=kvmd-webterm +WorkingDirectory=/home/kvmd-webterm +Restart=always +RestartSec=1 + +# Crutch for UNIX socket perms +UMask=0117 + +EnvironmentFile=-/etc/conf.d/kvmd-webterm +ExecStart=/usr/bin/ttyd \ + -W \ + --interface=/run/kvmd/ttyd.sock \ + --port=0 \ + $KVMD_WEBTERM_ARGS \ + /bin/bash -c 'echo -ne "\033]0;One-KVM Terminal: `hostname -f` (ttyd)\007"; bash /etc/kvmd/armbain-motd; export TERM=linux; umask 0022; bash' + +[Install] +WantedBy=multi-user.target diff --git a/configs/os/services/kvmd.service b/configs/os/services/kvmd.service index 1f4d6550..65b04bb7 100644 --- a/configs/os/services/kvmd.service +++ b/configs/os/services/kvmd.service @@ -1,5 +1,5 @@ [Unit] -Description=PiKVM - The main daemon +Description=One-KVM - The main daemon After=network.target network-online.target nss-lookup.target [Service] diff --git a/kvmd/apps/kvmd/info/hw.py b/kvmd/apps/kvmd/info/hw.py index 086980f5..1bade216 100644 --- a/kvmd/apps/kvmd/info/hw.py +++ b/kvmd/apps/kvmd/info/hw.py @@ -116,7 +116,7 @@ class HwInfoSubmanager(BaseInfoSubmanager): try: self.__dt_cache[name] = (await aiotools.read_file(path)).strip(" \t\r\n\0") except Exception as err: - get_logger(0).warn("Can't read DT %s from %s: %s", name, path, err) + #get_logger(0).warn("Can't read DT %s from %s: %s", name, path, err) return None return self.__dt_cache[name] diff --git a/kvmd/apps/kvmd/logreader.py b/kvmd/apps/kvmd/logreader.py index 64295b88..c1c6c3de 100644 --- a/kvmd/apps/kvmd/logreader.py +++ b/kvmd/apps/kvmd/logreader.py @@ -27,10 +27,11 @@ import time from typing import AsyncGenerator from xmlrpc.client import ServerProxy -from supervisor.xmlrpc import SupervisorTransport from ...logging import get_logger +us_systemd_journal = True + try: module_name = "systemd.journal" module = __import__(module_name) @@ -38,6 +39,12 @@ except ImportError: us_systemd_journal = False get_logger(0).error("Failed to import module: %s", module_name) +try: + module_name = "supervisor.xmlrpc" + module = __import__(module_name) +except ImportError: + us_systemd_journal = True + # ===== class LogReader: async def poll_log(self, seek: int, follow: bool) -> AsyncGenerator[dict, None]: @@ -68,7 +75,7 @@ class LogReader: else: await asyncio.sleep(1) else: - server = ServerProxy('http://127.0.0.1',transport=SupervisorTransport(None, None, serverurl='unix:///tmp/supervisor.sock')) + server = ServerProxy('http://127.0.0.1',transport=supervisor.xmlrpc.SupervisorTransport(None, None, serverurl='unix:///tmp/supervisor.sock')) log_entries = server.supervisor.readLog(0,0) yield log_entries diff --git a/setup.py b/setup.py index 61863d72..3b80baac 100755 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ import textwrap import setuptools.command.easy_install -from setuptools import setup +from setuptools import setup, find_packages # ===== @@ -108,6 +108,7 @@ def main() -> None: package_data={ "kvmd.apps.vnc": ["fonts/*.ttf"], + "kvmd": ["i18n/zh/LC_MESSAGES/*.mo"], }, entry_points={