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 @@
-
+