diff --git a/build/Dockerfile b/build/Dockerfile index 467fd94d..76155cee 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -31,7 +31,7 @@ RUN if [ ${TARGETARCH} = arm ]; then ARCH=armhf; elif [ ${TARGETARCH} = arm64 ]; && chmod +x /usr/local/bin/ttyd \ && adduser kvmd --gecos "" --disabled-password \ && ln -sf /usr/share/tesseract-ocr/*/tessdata /usr/share/tessdata \ - && mkdir -p /etc/kvmd_backup/override.d /var/lib/kvmd/msd /var/lib/kvmd/pst/data /opt/vc/bin /run/kvmd /tmp/kvmd-nginx \ + && mkdir -p /etc/kvmd_backup/override.d /var/lib/kvmd/msd/images /var/lib/kvmd/msd/meta /var/lib/kvmd/pst/data /opt/vc/bin /run/kvmd /tmp/kvmd-nginx \ && touch /run/kvmd/ustreamer.sock diff --git a/build/build_img.sh b/build/build_img.sh index 3e1a48aa..1bd803c2 100644 --- a/build/build_img.sh +++ b/build/build_img.sh @@ -15,7 +15,7 @@ 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 +dd if=/dev/zero of=/tmp/add.img bs=1M count=800 && cat /tmp/add.img >> $SRCPATH/tmp/rootfs.img && rm /tmp/add.img e2fsck -f $SRCPATH/tmp/rootfs.img && resize2fs $SRCPATH/tmp/rootfs.img #挂载镜像文件 @@ -27,7 +27,7 @@ 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 + $ROOTFS/usr/share/janus/javascript $ROOTFS/usr/lib/ustreamer/janus $ROOTFS/run/kvmd $ROOTFS/var/lib/kvmd/msd/images $ROOTFS/var/lib/kvmd/msd/meta 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 \ @@ -103,6 +103,8 @@ sudo chroot --userspec "root:root" $ROOTFS bash -c " \ && 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/#type: otg/type: otg/g' /etc/kvmd/override.yaml \ + && chown kvmd -R /var/lib/kvmd/msd/ \ && 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 \ diff --git a/build/init.sh b/build/init.sh index 18cdbe8f..9509ee0a 100755 --- a/build/init.sh +++ b/build/init.sh @@ -19,7 +19,7 @@ if [ ! -f /etc/kvmd/.init_flag ]; then && /usr/share/kvmd/kvmd-gencert --do-the-thing --vnc \ || echo -e "${RED}One-KVM config moving and self-signed SSL certificates init failed.${NC}" - if [ "$NOSSL" = 1 ]; then + if [ "$NOSSL" == 1 ]; then echo -e "${GREEN}One-KVM self-signed SSL is disabled.${NC}" \ && python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf -o nginx/https/enabled=false \ || echo -e "${RED}One-KVM nginx config init failed.${NC}" @@ -27,8 +27,7 @@ if [ ! -f /etc/kvmd/.init_flag ]; then python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf \ || echo -e "${RED}One-KVM nginx config init failed.${NC}" fi - - + if [ "$NOAUTH" == "1" ]; then sed -i "s/enabled: true/enabled: false/g" /etc/kvmd/override.yaml \ && echo -e "${GREEN}One-KVM auth is disabled.${NC}" @@ -121,6 +120,12 @@ EOF echo -e "${YELLOW} USERNAME and PASSWORD environment variables is not set, using defalut(admin/admin).${NC}" fi + if [ "$NOMSD" == 1 ]; then + echo -e "${GREEN}One-KVM MSD is disabled.${NC}" + else + sed -i "s/#type: otg/type: otg/g" /etc/kvmd/override.yaml + fi + touch /etc/kvmd/.init_flag fi diff --git a/configs/kvmd/main.yaml b/configs/kvmd/main.yaml index cd1e9a72..6d60dcf2 100644 --- a/configs/kvmd/main.yaml +++ b/configs/kvmd/main.yaml @@ -16,7 +16,7 @@ kvmd: type: gpio msd: - type: otg + type: disabled streamer: quality: 0 diff --git a/configs/kvmd/override.yaml b/configs/kvmd/override.yaml index 9ec6ea73..e7d6e61b 100644 --- a/configs/kvmd/override.yaml +++ b/configs/kvmd/override.yaml @@ -21,7 +21,8 @@ kvmd: device: /dev/kvmd-hid-mouse-alt msd: - type: disabled + #type: otg + remount_cmd: /bin/true ocr: langs: diff --git a/kvmd/apps/otg/__init__.py b/kvmd/apps/otg/__init__.py index 504b6a34..a7b304ff 100644 --- a/kvmd/apps/otg/__init__.py +++ b/kvmd/apps/otg/__init__.py @@ -52,8 +52,12 @@ def _mkdir(path: str) -> None: os.mkdir(path) -def _chown(path: str, user: str) -> None: - get_logger().info("CHOWN --- %s - %s", user, path) +def _chown(path: str, user: str, optional: bool=False) -> None: + logger = get_logger() + if optional and not os.access(path, os.F_OK): + logger.info("CHOWN --- %s - [SKIPPED] %s", user, path) + return + logger.info("CHOWN --- %s - %s", user, path) shutil.chown(path, user) @@ -187,7 +191,7 @@ class _GadgetConfig: _chown(join(func_path, "lun.0/cdrom"), user) _chown(join(func_path, "lun.0/ro"), user) _chown(join(func_path, "lun.0/file"), user) - _chown(join(func_path, "lun.0/forced_eject"), user) + _chown(join(func_path, "lun.0/forced_eject"), user, optional=True) if start: _symlink(func_path, join(self.__profile_path, func)) name = ("Mass Storage Drive" if self.__msd_instance == 0 else f"Extra Drive #{self.__msd_instance}") diff --git a/kvmd/apps/otgmsd/__init__.py b/kvmd/apps/otgmsd/__init__.py index abe2400c..0fd0fbe6 100644 --- a/kvmd/apps/otgmsd/__init__.py +++ b/kvmd/apps/otgmsd/__init__.py @@ -34,6 +34,9 @@ from .. import init # ===== +def _has_param(gadget: str, instance: int, param: str) -> bool: + return os.access(_get_param_path(gadget, instance, param), os.F_OK) + def _get_param_path(gadget: str, instance: int, param: str) -> str: return usb.get_gadget_path(gadget, usb.G_FUNCTIONS, f"mass_storage.usb{instance}/lun.0", param) @@ -83,12 +86,15 @@ def main(argv: (list[str] | None)=None) -> None: if config.kvmd.msd.type != "otg": raise SystemExit(f"Error: KVMD MSD not using 'otg'" f" (now configured {config.kvmd.msd.type!r})") - + has_param = (lambda param: _has_param(config.otg.gadget, options.instance, param)) set_param = (lambda param, value: _set_param(config.otg.gadget, options.instance, param, value)) get_param = (lambda param: _get_param(config.otg.gadget, options.instance, param)) if options.eject: - set_param("forced_eject", "") + if has_param("forced_eject"): + set_param("forced_eject", "") + else: + set_param("file", "") if options.set_cdrom is not None: set_param("cdrom", str(int(options.set_cdrom))) diff --git a/kvmd/fstab.py b/kvmd/fstab.py index 4ab3163c..e7da2de3 100644 --- a/kvmd/fstab.py +++ b/kvmd/fstab.py @@ -48,7 +48,11 @@ def find_pst() -> Partition: def _find_single(part_type: str) -> Partition: parts = _find_partitions(part_type, True) if len(parts) == 0: - raise RuntimeError(f"Can't find {part_type!r} mountpoint") + if os.path.exists('/var/lib/kvmd/msd'): + #set default value + parts = [Partition(mount_path='/var/lib/kvmd/msd', root_path='/var/lib/kvmd/msd', user='kvmd')] + else: + raise RuntimeError(f"Can't find {part_type!r} mountpoint") return parts[0] diff --git a/kvmd/plugins/msd/otg/drive.py b/kvmd/plugins/msd/otg/drive.py index c9a393fc..998355e4 100644 --- a/kvmd/plugins/msd/otg/drive.py +++ b/kvmd/plugins/msd/otg/drive.py @@ -53,7 +53,7 @@ class Drive: # ===== def set_image_path(self, path: str) -> None: - if path: + if path or not self.__has_param("forced_eject"): self.__set_param("file", path) else: self.__set_param("forced_eject", "") @@ -75,7 +75,9 @@ class Drive: return (not int(self.__get_param("ro"))) # ===== - + def __has_param(self, param: str) -> bool: + return os.access(os.path.join(self.__lun_path, param), os.F_OK) + def __get_param(self, param: str) -> str: with open(os.path.join(self.__lun_path, param)) as file: return file.read().strip()