mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-11-09 17:44:43 -06:00
Serialize service operations and finish migration before starting services. Install the startup script atomically, remove recursive restarts, and keep the migration marker until required changes succeed. Claim video ownership before clearing orphan VENC/VPSS resources, always finish recovery SYS cleanup, and retain resource state on teardown failures. Rebuild the bundled libkvm_mmf.so with these fixes. Validated cross-builds, ABI and recovery failure paths, plus a 2.4.3 to 2.5.3 upgrade on hardware with 1080p browser WebRTC and MJPEG playback.
144 lines
4.2 KiB
Bash
Executable File
144 lines
4.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# nanokvm Rev3.1
|
|
|
|
exec 9>/run/nanokvm-service.lock || exit 1
|
|
flock -n 9 || { echo "NanoKVM service operation already in progress" >&2; exit 1; }
|
|
|
|
wait_for_exit() {
|
|
process="$1"
|
|
timeout="$2"
|
|
elapsed=0
|
|
|
|
while pidof "$process" >/dev/null 2>&1; do
|
|
if [ "$elapsed" -ge "$timeout" ]; then
|
|
return 1
|
|
fi
|
|
sleep 1
|
|
elapsed=$((elapsed + 1))
|
|
done
|
|
return 0
|
|
}
|
|
|
|
stop_process() {
|
|
process="$1"
|
|
|
|
if ! pidof "$process" >/dev/null 2>&1; then
|
|
return
|
|
fi
|
|
|
|
killall -INT "$process" 2>/dev/null || true
|
|
if wait_for_exit "$process" 20; then
|
|
return
|
|
fi
|
|
|
|
killall -TERM "$process" 2>/dev/null || true
|
|
if wait_for_exit "$process" 5; then
|
|
return
|
|
fi
|
|
|
|
killall -KILL "$process" 2>/dev/null || true
|
|
wait_for_exit "$process" 2 || {
|
|
echo "Failed to stop $process" >&2
|
|
return 1
|
|
}
|
|
}
|
|
|
|
stop_services() {
|
|
# The server owns VI/VPSS. Let it release MMF before stopping kvm_system.
|
|
stop_process NanoKVM-Server || return 1
|
|
stop_process kvm_system || return 1
|
|
}
|
|
|
|
start_services() {
|
|
if pidof NanoKVM-Server >/dev/null 2>&1 && pidof kvm_system >/dev/null 2>&1; then
|
|
return 0
|
|
fi
|
|
if pidof NanoKVM-Server >/dev/null 2>&1 || pidof kvm_system >/dev/null 2>&1; then
|
|
echo "NanoKVM is partially running; use restart" >&2
|
|
return 1
|
|
fi
|
|
|
|
rm -rf /tmp/kvm_system /tmp/server || return 1
|
|
cp -r /kvmapp/kvm_system /tmp/ || return 1
|
|
if [ -f /kvmapp/kvm_new_app ]; then
|
|
/tmp/kvm_system/kvm_system --migrate 9>&-
|
|
case "$?" in
|
|
0) ;;
|
|
2) sync; reboot; return "$?" ;;
|
|
*) echo "NanoKVM migration failed" >&2; return 1 ;;
|
|
esac
|
|
fi
|
|
|
|
cp -r /kvmapp/server /tmp/ || return 1
|
|
# Daemons must not inherit the service-operation lock.
|
|
/tmp/kvm_system/kvm_system 9>&- &
|
|
/tmp/server/NanoKVM-Server 9>&- &
|
|
}
|
|
|
|
case "$1" in
|
|
start)
|
|
echo -n kvm > /boot/hostname.prefix
|
|
[ -e /root/.profile ] || printf '%s\n' 'export PS1="\u@\h:\w# "' > /root/.profile
|
|
|
|
# Copy sensor config if the file exists
|
|
[ -f /mnt/data/sensor_cfg.ini.LT ] && cp /mnt/data/sensor_cfg.ini.LT /mnt/data/sensor_cfg.ini
|
|
|
|
# Generate unique device key
|
|
if [ -f /sys/class/cvi-base/base_uid ]; then
|
|
str_value=$(awk '{print $2}' /sys/class/cvi-base/base_uid)
|
|
first_uint=$(echo "$str_value" | cut -d'_' -f1)
|
|
second_uint=$(echo "$str_value" | cut -d'_' -f2)
|
|
echo "$first_uint$second_uint" > /device_key
|
|
fi
|
|
|
|
# Set iptables rules (skip if already present)
|
|
iptables -C INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT 2>/dev/null || \
|
|
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
|
|
iptables -C OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT 2>/dev/null || \
|
|
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
|
|
|
|
iptables -C INPUT -i eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT 2>/dev/null || \
|
|
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
|
|
iptables -C OUTPUT -o eth0 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT 2>/dev/null || \
|
|
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
|
|
|
|
iptables -C OUTPUT -o eth0 -p tcp --sport 8000 -m state --state ESTABLISHED -j DROP 2>/dev/null || \
|
|
iptables -A OUTPUT -o eth0 -p tcp --sport 8000 -m state --state ESTABLISHED -j DROP
|
|
|
|
# Logo selection
|
|
if [ -f /boot/logo.ico ]; then
|
|
if [ ! -f /kvmapp/server/web/original.ico ]; then
|
|
mv /kvmapp/server/web/sipeed.ico /kvmapp/server/web/original.ico
|
|
cp /boot/logo.ico /kvmapp/server/web/sipeed.ico
|
|
fi
|
|
else
|
|
if [ -f /kvmapp/server/web/original.ico ]; then
|
|
mv /kvmapp/server/web/original.ico /kvmapp/server/web/sipeed.ico
|
|
fi
|
|
fi
|
|
|
|
# Start services
|
|
start_services || exit 1
|
|
;;
|
|
|
|
stop)
|
|
stop_services || exit 1
|
|
echo "OK"
|
|
;;
|
|
|
|
restart)
|
|
stop_services || exit 1
|
|
start_services || exit 1
|
|
|
|
sync
|
|
echo "OK"
|
|
;;
|
|
|
|
*)
|
|
echo "Usage: $0 {start|stop|restart}"
|
|
exit 1
|
|
;;
|
|
esac
|