From 9da06d3f5870edce6ea80238c5b3bd925d78c85a Mon Sep 17 00:00:00 2001 From: mofeng-git Date: Sat, 1 Feb 2025 08:31:27 +0000 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20HTTP=20H.264=20=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=20=E5=85=B6=E4=BB=96=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 22 +--- build/Dockerfile | 65 ++++++--- build/Dockerfile-stage-0 | 116 +++++++++++----- build/init.sh | 154 +++++++++++++--------- configs/janus/janus.jcfg | 2 +- configs/janus/janus.plugin.ustreamer.jcfg | 2 +- configs/kvmd/override.yaml | 12 ++ configs/kvmd/supervisord.conf | 10 ++ scripts/kvmd-media | 3 + web/kvm/index.html | 14 +- web/kvm/navbar-text.pug | 7 +- web/login/index.html | 2 +- 12 files changed, 264 insertions(+), 145 deletions(-) create mode 100755 scripts/kvmd-media diff --git a/Makefile b/Makefile index e71bbd4d..f561d354 100644 --- a/Makefile +++ b/Makefile @@ -280,37 +280,21 @@ clean-all: testenv clean .PHONY: testenv run-stage-0: - $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0 \ - --allow security.insecure --progress plain \ - --platform linux/amd64,linux/arm64,linux/arm/v7 \ - -f build/Dockerfile-stage-0 . \ - --push - $(DOCKER) buildx build -t silentwind0/kvmd-stage-0 \ + $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0 -t silentwind0/kvmd-stage-0 \ --allow security.insecure --progress plain \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ -f build/Dockerfile-stage-0 . \ --push run-build-dev: - $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd:dev \ - --platform linux/amd64,linux/arm64,linux/arm/v7 \ - --build-arg CACHEBUST=$(date +%s) \ - -f build/Dockerfile . \ - --push - $(DOCKER) buildx build -t silentwind0/kvmd:dev \ + $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd:dev -t silentwind0/kvmd:dev \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ --build-arg CACHEBUST=$(date +%s) \ -f build/Dockerfile . \ --push run-build-release: - $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd \ - --progress plain \ - --platform linux/amd64,linux/arm64,linux/arm/v7 \ - --build-arg CACHEBUST=$(date +%s) \ - -f build/Dockerfile . \ - --push - $(DOCKER) buildx build -t silentwind0/kvmd \ + $(DOCKER) buildx build -t registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd -t silentwind0/kvmd:dev \ --progress plain \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ --build-arg CACHEBUST=$(date +%s) \ diff --git a/build/Dockerfile b/build/Dockerfile index 77b279a6..79386b8f 100644 --- a/build/Dockerfile +++ b/build/Dockerfile @@ -1,6 +1,6 @@ -FROM silentwind0/kvmd-stage-0 AS builder +FROM registry.cn-hangzhou.aliyuncs.com/silentwind/kvmd-stage-0 AS builder -FROM python:3.12.0rc2-slim-bookworm +FROM python:3.11.11-slim-bookworm LABEL maintainer="mofeng654321@hotmail.com" @@ -12,29 +12,58 @@ COPY --from=builder /usr/lib/janus/transports/* /usr/lib/janus/transports/ ARG TARGETARCH -ENV PYTHONDONTWRITEBYTECODE=1 -ENV PYTHONUNBUFFERED=1 -ENV TZ=Asia/Shanghai - -RUN cp /tmp/lib/* /lib/*-linux-*/ \ - && pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check /tmp/wheel/*.whl \ - && pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check pyfatfs \ - && rm -rf /tmp/lib /tmp/wheel +ENV PYTHONDONTWRITEBYTECODE=1 \ + PYTHONUNBUFFERED=1 \ + TZ=Asia/Shanghai RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list.d/debian.sources \ && apt-get update \ - && apt-get install -y --no-install-recommends libxkbcommon-x11-0 nginx tesseract-ocr tesseract-ocr-eng tesseract-ocr-chi-sim iptables sudo curl kmod \ - libmicrohttpd12 libjansson4 libssl3 libsofia-sip-ua0 libglib2.0-0 libopus0 libogg0 libcurl4 libconfig9 libusrsctp2 libwebsockets17 libnss3 libasound2 nano \ - && rm -rf /var/lib/apt/lists/* - -RUN if [ ${TARGETARCH} = arm ]; then ARCH=armhf; elif [ ${TARGETARCH} = arm64 ]; then ARCH=aarch64; elif [ ${TARGETARCH} = amd64 ]; then ARCH=x86_64; fi \ + && apt-get install -y --no-install-recommends \ + libxkbcommon-x11-0 \ + nginx \ + tesseract-ocr \ + tesseract-ocr-eng \ + tesseract-ocr-chi-sim \ + iptables \ + sudo \ + curl \ + kmod \ + libmicrohttpd12 \ + libjansson4 \ + libssl3 \ + libsofia-sip-ua0 \ + libglib2.0-0 \ + libopus0 \ + libogg0 \ + libcurl4 \ + libconfig9 \ + libusrsctp2 \ + libwebsockets17 \ + libnss3 \ + libasound2 \ + nano \ + && cp /tmp/lib/* /lib/*-linux-*/ \ + && pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check /tmp/wheel/*.whl \ + && pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check pyfatfs \ + && if [ ${TARGETARCH} = arm ]; then ARCH=armhf; \ + elif [ ${TARGETARCH} = arm64 ]; then ARCH=aarch64; \ + elif [ ${TARGETARCH} = amd64 ]; then ARCH=x86_64; \ + fi \ && curl https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.$ARCH -L -o /usr/local/bin/ttyd \ && 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/images /var/lib/kvmd/msd/meta /var/lib/kvmd/pst/data /var/lib/kvmd/msd/NormalFiles /opt/vc/bin /run/kvmd /tmp/kvmd-nginx \ - && touch /run/kvmd/ustreamer.sock - + && mkdir -p /etc/kvmd_backup/override.d \ + /var/lib/kvmd/msd/images \ + /var/lib/kvmd/msd/meta \ + /var/lib/kvmd/pst/data \ + /var/lib/kvmd/msd/NormalFiles \ + /opt/vc/bin \ + /run/kvmd \ + /tmp/kvmd-nginx \ + && touch /run/kvmd/ustreamer.sock \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /tmp/lib /tmp/wheel COPY testenv/fakes/vcgencmd scripts/kvmd* /usr/bin/ COPY extras/ /usr/share/kvmd/extras/ diff --git a/build/Dockerfile-stage-0 b/build/Dockerfile-stage-0 index df9f5505..414c0853 100644 --- a/build/Dockerfile-stage-0 +++ b/build/Dockerfile-stage-0 @@ -1,70 +1,118 @@ # syntax = docker/dockerfile:experimental -FROM python:3.12.0rc2-slim-bookworm AS builder +FROM debian:bookworm-slim AS builder ARG TARGETARCH +# 设置环境变量 +ENV DEBIAN_FRONTEND=noninteractive \ + PIP_NO_CACHE_DIR=1 \ + RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup" + +# 更新源并安装依赖 RUN sed -i 's/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/' /etc/apt/sources.list.d/debian.sources \ && apt-get update \ - && apt-get install -y --no-install-recommends build-essential libssl-dev libffi-dev python3-dev libevent-dev libjpeg-dev \ - libbsd-dev libudev-dev git pkg-config wget curl libmicrohttpd-dev libjansson-dev libssl-dev libsofia-sip-ua-dev libglib2.0-dev \ - libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev libconfig-dev libopus-dev libtool automake autoconf meson cmake \ - libx264-dev libyuv-dev libasound2-dev libspeex-dev libspeexdsp-dev libopus-dev \ + && apt-get install -y --no-install-recommends \ + python3-full \ + python3-pip \ + python3-dev \ + build-essential \ + libssl-dev \ + libffi-dev \ + python3-dev \ + libevent-dev \ + libjpeg-dev \ + libbsd-dev \ + libudev-dev \ + git \ + pkg-config \ + wget \ + curl \ + libmicrohttpd-dev \ + libjansson-dev \ + libsofia-sip-ua-dev \ + libglib2.0-dev \ + libopus-dev \ + libogg-dev \ + libcurl4-openssl-dev \ + liblua5.3-dev \ + libconfig-dev \ + libtool \ + automake \ + autoconf \ + meson \ + cmake \ + libx264-dev \ + libyuv-dev \ + libasound2-dev \ + libspeex-dev \ + libspeexdsp-dev \ + libusb-1.0-0-dev \ && rm -rf /var/lib/apt/lists/* COPY build/cargo_config /tmp/config +# 配置 pip 源并安装 Python 依赖 RUN --security=insecure pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple \ && if [ ${TARGETARCH} = arm ]; then \ mkdir -p /root/.cargo \ && chmod 777 /root/.cargo && mount -t tmpfs none /root/.cargo \ - && export RUSTUP_DIST_SERVER="https://mirrors.tuna.tsinghua.edu.cn/rustup" \ - #&& export RUSTUP_UPDATE_ROOT="https://mirrors.ustc.edu.cn/rust-static/rustup" \ - && wget https://sh.rustup.rs -O /root/rustup-init.sh \ + && wget https://sh.rustup.rs -O /root/rustup-init.sh \ && sh /root/rustup-init.sh -y \ && export PATH=$PATH:/root/.cargo/bin \ && cp /tmp/config /root/.cargo/config.toml; \ fi \ - && pip wheel --wheel-dir=/tmp/wheel/ cryptography - -RUN pip install --no-cache-dir --root-user-action=ignore --disable-pip-version-check build \ - && pip wheel --wheel-dir=/tmp/wheel/ aiofiles aiohttp appdirs asn1crypto async_lru async-timeout bottle cffi chardet click colorama \ - dbus_next gpiod hidapi idna mako marshmallow more-itertools multidict netifaces packaging passlib pillow ply psutil pycparser \ - pyelftools pyghmi pygments pyparsing pyotp qrcode requests semantic-version setproctitle setuptools six spidev \ - tabulate urllib3 wrapt xlib yarl pyserial pyyaml zstandard supervisor + && pip install --root-user-action=ignore --disable-pip-version-check --upgrade --break-system-packages build setuptools pip \ + && pip wheel --wheel-dir=/tmp/wheel/ cryptography \ + && pip wheel --wheel-dir=/tmp/wheel/ \ + aiofiles aiohttp appdirs asn1crypto async_lru async-timeout bottle cffi \ + chardet click colorama dbus_next gpiod hidapi idna mako marshmallow \ + more-itertools multidict netifaces packaging passlib pillow ply psutil \ + pycparser pyelftools pyghmi pygments pyparsing pyotp qrcode requests \ + semantic-version setproctitle six spidev tabulate urllib3 wrapt xlib \ + yarl pyserial pyyaml zstandard supervisor +# 编译安装 libnice、libsrtp、libwebsockets 和 janus-gateway RUN git clone --depth=1 https://gitlab.freedesktop.org/libnice/libnice /tmp/libnice \ && cd /tmp/libnice \ - && meson --prefix=/usr build && ninja -C build && ninja -C build install - -RUN curl https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz -L -o /tmp/libsrtp-2.2.0.tar.gz \ + && meson --prefix=/usr build && ninja -C build && ninja -C build install \ + && rm -rf /tmp/libnice \ + && curl https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz -L -o /tmp/libsrtp-2.2.0.tar.gz \ && cd /tmp \ - && tar xfv libsrtp-2.2.0.tar.gz \ + && tar xf libsrtp-2.2.0.tar.gz \ && cd libsrtp-2.2.0 \ && ./configure --prefix=/usr --enable-openssl \ - && make shared_library && make install - -RUN git clone --depth=1 https://libwebsockets.org/repo/libwebsockets /tmp/libwebsockets \ + && make shared_library && make install \ + && cd /tmp \ + && rm -rf /tmp/libsrtp* \ + && git clone --depth=1 https://libwebsockets.org/repo/libwebsockets /tmp/libwebsockets \ && cd /tmp/libwebsockets \ && mkdir build && cd build \ && cmake -DLWS_MAX_SMP=1 -DLWS_WITHOUT_EXTENSIONS=0 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" .. \ - && make && make install - -RUN git clone --depth=1 https://github.com/meetecho/janus-gateway.git /tmp/janus-gateway \ + && make && make install \ + && cd /tmp \ + && rm -rf /tmp/libwebsockets \ + && git clone --depth=1 https://github.com/meetecho/janus-gateway.git /tmp/janus-gateway \ && cd /tmp/janus-gateway \ && sh autogen.sh \ - && ./configure --enable-static --enable-websockets --enable-plugin-audiobridge \ - --disable-data-channels --disable-rabbitmq --disable-mqtt --disable-all-plugins --disable-all-loggers \ - --prefix=/usr \ - && make && make install + && ./configure --enable-static --enable-websockets --enable-plugin-audiobridge \ + --disable-data-channels --disable-rabbitmq --disable-mqtt --disable-all-plugins \ + --disable-all-loggers --prefix=/usr \ + && make && make install \ + && cd /tmp \ + && rm -rf /tmp/janus-gateway +# 编译 ustreamer RUN sed --in-place --expression 's|^#include "refcount.h"$|#include "../refcount.h"|g' /usr/include/janus/plugins/plugin.h \ && git clone --depth=1 https://github.com/mofeng-git/ustreamer /tmp/ustreamer \ + && sed -i '68s/-Wl,-Bstatic//' /tmp/ustreamer/src/Makefile \ && make -j WITH_PYTHON=1 WITH_JANUS=1 WITH_LIBX264=1 -C /tmp/ustreamer \ - && /tmp/ustreamer/ustreamer -v + && /tmp/ustreamer/ustreamer -v \ + && cp /tmp/ustreamer/python/dist/*.whl /tmp/wheel/ +# 复制必要的库文件 RUN mkdir /tmp/lib \ && cd /lib/*-linux-*/ \ - && cp libevent_core-*.so.7 libbsd.so.0 libevent_pthreads-*.so.7 libspeexdsp.so.1 libevent-*.so.7 libjpeg.so.62 libx264.so.164 libyuv.so.0 \ - libnice.so.10 /usr/lib/libsrtp2.so.1 /usr/lib/libwebsockets.so.19 \ - /tmp/lib/ \ - && cp /tmp/ustreamer/python/dist/*.whl /tmp/wheel/ \ No newline at end of file + && cp libevent_core-*.so.7 libbsd.so.0 libevent_pthreads-*.so.7 libspeexdsp.so.1 \ + libevent-*.so.7 libjpeg.so.62 libx264.so.164 libyuv.so.0 libnice.so.10 \ + /usr/lib/libsrtp2.so.1 /usr/lib/libwebsockets.so.19 \ + /tmp/lib/ \ No newline at end of file diff --git a/build/init.sh b/build/init.sh index 5431d1ce..c3fc20cf 100755 --- a/build/init.sh +++ b/build/init.sh @@ -1,41 +1,74 @@ #!/bin/bash +# 定义颜色代码 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' -echo -e "${GREEN}One-KVM pre-starting...${NC}" +# 输出日志的函数 +log_info() { + echo -e "${GREEN}[INFO] $1${NC}" +} +log_warn() { + echo -e "${YELLOW}[WARN] $1${NC}" +} + +log_error() { + echo -e "${RED}[ERROR] $1${NC}" +} + +# 初始化检查 +log_info "One-KVM 正在启动..." + +# 首次初始化配置 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/ \ - && touch /etc/kvmd/.docker_flag \ - && sed -i 's/localhost.localdomain/docker/g' /etc/kvmd/meta.yaml \ - && sed -i 's/localhost/localhost:4430/g' /etc/kvmd/kvm_input.sh \ - && /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}" - - 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}" + log_info "首次初始化配置..." + + # 创建必要目录并移动配置文件 + if mkdir -p /etc/kvmd/ && \ + mv /etc/kvmd_backup/* /etc/kvmd/ && \ + touch /etc/kvmd/.docker_flag && \ + sed -i 's/localhost.localdomain/docker/g' /etc/kvmd/meta.yaml && \ + sed -i 's/localhost/localhost:4430/g' /etc/kvmd/kvm_input.sh; then + log_info "基础配置完成" else - 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}" + log_error "基础配置失败" + exit 1 fi - + + # SSL证书配置 + if ! /usr/share/kvmd/kvmd-gencert --do-the-thing && \ + ! /usr/share/kvmd/kvmd-gencert --do-the-thing --vnc; then + log_error "SSL 证书生成失败" + exit 1 + fi + + # SSL开关配置 + if [ "$NOSSL" == 1 ]; then + log_info "已禁用SSL" + if ! python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf -o nginx/https/enabled=false; then + log_error "Nginx 配置失败" + exit 1 + fi + else + if ! python -m kvmd.apps.ngxmkconf /etc/kvmd/nginx/nginx.conf.mako /etc/kvmd/nginx/nginx.conf; then + log_error "Nginx 配置失败" + exit 1 + fi + 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}" + sed -i "s/enabled: true/enabled: false/g" /etc/kvmd/override.yaml + log_info "已禁用认证" fi #add supervisord conf if [ "$NOWEBTERM" == "1" ]; then - echo -e "${GREEN}One-KVM webterm is disabled.${NC}" + log_info "已禁用 WebTerm 功能" rm -r /usr/share/kvmd/extras/webterm else cat >> /etc/kvmd/supervisord.conf << EOF @@ -58,7 +91,7 @@ EOF fi if [ "$NOVNC" == "1" ]; then - echo -e "${GREEN}One-KVM VNC is disabled.${NC}" + log_info "已禁用 VNC 功能" rm -r /usr/share/kvmd/extras/vnc else cat >> /etc/kvmd/supervisord.conf << EOF @@ -77,7 +110,7 @@ EOF fi if [ "$NOIPMI" == "1" ]; then - echo -e "${GREEN}One-KVM IPMI is disabled.${NC}" + log_info "已禁用IPMI功能" rm -r /usr/share/kvmd/extras/ipmi else cat >> /etc/kvmd/supervisord.conf << EOF @@ -97,70 +130,71 @@ EOF #switch OTG config if [ "$OTG" == "1" ]; then - echo -e "${GREEN}One-KVM OTG is enabled.${NC}" + log_info "已启用 OTG 功能" sed -i "s/ch9329/otg/g" /etc/kvmd/override.yaml - sed -i "s/device: \/dev\/ttyUSB0//g" /etc/kvmd/override.yaml + sed -i "s/device: \/dev\/ttyUSB0//g" /etc/kvmd/override.yaml if [ "$NOMSD" == 1 ]; then - echo -e "${GREEN}One-KVM MSD is disabled.${NC}" + log_info "已禁用 MSD 功能" else sed -i "s/#type: otg/type: otg/g" /etc/kvmd/override.yaml fi fi - #if [ ! -z "$SHUTDOWNPIN" ! -z "$REBOOTPIN" ]; then - if [ ! -z "$VIDEONUM" ]; then - sed -i "s/\/dev\/video0/\/dev\/video$VIDEONUM/g" /etc/kvmd/override.yaml \ - && sed -i "s/\/dev\/video0/\/dev\/video$VIDEONUM/g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg \ - && echo -e "${GREEN}One-KVM video device is set to /dev/video$VIDEONUM.${NC}" + if sed -i "s/\/dev\/video0/\/dev\/video$VIDEONUM/g" /etc/kvmd/override.yaml && \ + sed -i "s/\/dev\/video0/\/dev\/video$VIDEONUM/g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg; then + log_info "视频设备已设置为 /dev/video$VIDEONUM" + fi fi if [ ! -z "$AUDIONUM" ]; then - sed -i "s/hw:0/hw:$AUDIONUM/g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg \ - && echo -e "${GREEN}One-KVM audio device is set to hw:$VIDEONUM.${NC}" + if sed -i "s/hw:0/hw:$AUDIONUM/g" /etc/kvmd/janus/janus.plugin.ustreamer.jcfg; then + log_info "音频设备已设置为 hw:$AUDIONUM" + fi fi if [ ! -z "$CH9329SPEED" ]; then - sed -i "s/speed: 9600/speed: $CH9329SPEED/g" /etc/kvmd/override.yaml \ - && echo -e "${GREEN}One-KVM CH9329 serial speed is set to $CH9329SPEED.${NC}" + if sed -i "s/speed: 9600/speed: $CH9329SPEED/g" /etc/kvmd/override.yaml; then + log_info "CH9329 串口速率已设置为 $CH9329SPEED" + fi fi if [ ! -z "$CH9329TIMEOUT" ]; then - sed -i "s/read_timeout: 0.3/read_timeout: $CH9329TIMEOUT/g" /etc/kvmd/override.yaml \ - && echo -e "${GREEN}One-KVM CH9329 timeout is set to $CH9329TIMEOUT s.${NC}" - fi - - #set htpasswd - if [ ! -z "$USERNAME" ] && [ ! -z "$PASSWORD" ]; then - python -m kvmd.apps.htpasswd del admin \ - && echo $PASSWORD | python -m kvmd.apps.htpasswd set -i "$USERNAME" \ - && echo "$PASSWORD -> $USERNAME:$PASSWORD" > /etc/kvmd/vncpasswd \ - && echo "$USERNAME:$PASSWORD -> $USERNAME:$PASSWORD" > /etc/kvmd/ipmipasswd \ - || echo -e "${RED}One-KVM htpasswd init failed.${NC}" - else - echo -e "${YELLOW} USERNAME and PASSWORD environment variables are not set, using defalut(admin/admin).${NC}" + if sed -i "s/read_timeout: 0.3/read_timeout: $CH9329TIMEOUT/g" /etc/kvmd/override.yaml; then + log_info "CH9329 超时已设置为 $CH9329TIMEOUT 秒" + fi fi if [ ! -z "$VIDEOFORMAT" ]; then - sed -i "s/format=mjpeg/format=$VIDFORMAT/g" /etc/kvmd/override.yaml \ - && echo -e "${GREEN}One-KVM input video format is set to $VIDFORMAT.${NC}" + if sed -i "s/format=mjpeg/format=$VIDFORMAT/g" /etc/kvmd/override.yaml; then + log_info "视频输入格式已设置为 $VIDFORMAT" + fi fi touch /etc/kvmd/.init_flag + log_info "初始化配置完成" fi - -#Trying usb_gadget +# OTG设备配置 if [ "$OTG" == "1" ]; then - echo "Trying OTG Port..." + log_info "正在配置 OTG 设备..." rm -r /run/kvmd/otg &> /dev/null - modprobe libcomposite || echo -e "${RED}Linux libcomposite module modprobe failed.${NC}" - python -m kvmd.apps.otg start \ - && ln -s /dev/hidg1 /dev/kvmd-hid-mouse \ - && ln -s /dev/hidg0 /dev/kvmd-hid-keyboard \ - || echo -e "${RED}OTG Port mount failed.${NC}" - ln -s /dev/hidg2 /dev/kvmd-hid-mouse-alt + + if ! modprobe libcomposite; then + log_error "加载 libcomposite 模块失败" + exit 1 + fi + + if python -m kvmd.apps.otg start; then + ln -s /dev/hidg1 /dev/kvmd-hid-mouse + ln -s /dev/hidg0 /dev/kvmd-hid-keyboard + ln -s /dev/hidg2 /dev/kvmd-hid-mouse-alt + log_info "OTG 设备配置完成" + else + log_error "OTG 设备挂载失败" + exit 1 + fi fi -echo -e "${GREEN}One-KVM starting...${NC}" +log_info "One-KVM 启动完成,正在启动服务..." exec supervisord -c /etc/kvmd/supervisord.conf \ No newline at end of file diff --git a/configs/janus/janus.jcfg b/configs/janus/janus.jcfg index 7f6985f8..a3e5555e 100644 --- a/configs/janus/janus.jcfg +++ b/configs/janus/janus.jcfg @@ -1,5 +1,5 @@ general: { - debug_level = 4 + debug_level = 0 } nat: { nice_debug = false diff --git a/configs/janus/janus.plugin.ustreamer.jcfg b/configs/janus/janus.plugin.ustreamer.jcfg index a3c1df02..70e35ac4 100644 --- a/configs/janus/janus.plugin.ustreamer.jcfg +++ b/configs/janus/janus.plugin.ustreamer.jcfg @@ -8,4 +8,4 @@ audio: { aplay: { device = "plughw:UAC2Gadget,0" check = "/run/kvmd/otg/uac2.usb0@meta.json" -} +} \ No newline at end of file diff --git a/configs/kvmd/override.yaml b/configs/kvmd/override.yaml index a21e9064..6adad387 100644 --- a/configs/kvmd/override.yaml +++ b/configs/kvmd/override.yaml @@ -149,6 +149,18 @@ vnc: h264: sink: "kvmd::ustreamer::h264" +media: + memsink: + h264: + sink: 'kvmd::ustreamer::h264' + + jpeg: + sink: 'kvmd::ustreamer::jpeg' +janus: + stun: + host: stun.cloudflare.com + port: 3478 + otgnet: commands: post_start_cmd: diff --git a/configs/kvmd/supervisord.conf b/configs/kvmd/supervisord.conf index 9867da32..1d420cc1 100644 --- a/configs/kvmd/supervisord.conf +++ b/configs/kvmd/supervisord.conf @@ -32,6 +32,16 @@ stdout_logfile=/dev/stdout stdout_logfile_maxbytes = 0 redirect_stderr=true +[program:kvmd-media] +command=python -m kvmd.apps.media --run +autostart=true +autorestart=true +priority=13 +stopasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes = 0 +redirect_stderr=true + [program:kvmd-nginx] command=nginx -c /etc/kvmd/nginx/nginx.conf -g 'daemon off;user root; error_log stderr;' autostart=true diff --git a/scripts/kvmd-media b/scripts/kvmd-media new file mode 100755 index 00000000..18e806a0 --- /dev/null +++ b/scripts/kvmd-media @@ -0,0 +1,3 @@ +#!/bin/bash + +cd / && python3 -m kvmd.apps.media "$@" diff --git a/web/kvm/index.html b/web/kvm/index.html index 19f00d14..3c45aeb3 100644 --- a/web/kvm/index.html +++ b/web/kvm/index.html @@ -142,7 +142,7 @@ -
  • System +
  • System