Files
3m-ui/scripts/3m-ui
T
dzx941 5b4cb63a73 fix: align listener generation with mihomo official spec
- Port now supports mihomo ports format (single/range/list)
- Add explicit RoutingMark field support
- Auto-propagate UDP flag for vmess/vless/trojan/anytls/trusttunnel
- Update validator to accept port ranges
- Sync visual config and client converter port types
- Rename module from dzx941 to kazeyukiro
- Fix missing ExpiresAt in JWTClaims
- Fix nodeDTO Port type to string
- Fix frontend tsconfig and add missing dependencies
2026-08-16 09:21:42 +08:00

136 lines
4.0 KiB
Bash

#!/bin/sh
# 3m-ui unified management entrypoint.
# Installed as /usr/local/bin/3m-ui.
# The actual Go application binary is /usr/local/lib/3m-ui/3m-ui-bin.
set -eu
BASE="/usr/local/lib/3m-ui"
MANAGER="$BASE/3m-ui.sh"
INSTALLER="$BASE/install.sh"
UPDATER="$BASE/update.sh"
UNINSTALLER="$BASE/uninstall.sh"
APP_BIN="$BASE/3m-ui-bin"
run_script() {
script="$1"
shift
[ -x "$script" ] || {
printf '%s\n' "3m-ui management script is missing: $script" >&2
exit 1
}
exec "$script" "$@"
}
menu() {
while :; do
printf '\n'
printf '%s\n' '╭────────────────────────────────────╮'
printf '%s\n' '│ 3m-ui 管理控制台 │'
printf '%s\n' '│ Mihomo Core Management UI │'
printf '%s\n' '╰────────────────────────────────────╯'
printf '\n'
printf '%s\n' ' 1. 安装 / 修复 3m-ui'
printf '%s\n' ' 2. 更新 3m-ui'
printf '%s\n' ' 3. 查看运行状态'
printf '%s\n' ' 4. 启动 3m-ui'
printf '%s\n' ' 5. 重启 3m-ui'
printf '%s\n' ' 6. 停止 3m-ui'
printf '%s\n' ' 7. 查看日志'
printf '%s\n' ' 8. 查看版本'
printf '%s\n' ' 9. 卸载 3m-ui'
printf '%s\n' ' 0. 退出'
printf '\n请选择 [0-9]: '
IFS= read -r choice || exit 0
case "$choice" in
1) run_script "$INSTALLER" ;;
2) run_script "$UPDATER" ;;
3) run_script "$MANAGER" status ;;
4) run_script "$MANAGER" start ;;
5) run_script "$MANAGER" restart ;;
6) run_script "$MANAGER" stop ;;
7) run_script "$MANAGER" logs ;;
8) run_script "$MANAGER" version ;;
9) run_script "$UNINSTALLER" ;;
0) exit 0 ;;
*) printf '%s\n' '无效选择,请重新输入。' ;;
esac
done
}
init_system() {
if [ -d /run/systemd/system ] && command -v systemctl >/dev/null 2>&1; then
printf '%s' systemd
elif command -v rc-service >/dev/null 2>&1; then
printf '%s' openrc
else
printf '%s' unsupported
fi
}
service_action() {
action="$1"
case "$(init_system)" in
systemd) systemctl "$action" 3m-ui ;;
openrc) rc-service 3m-ui "$action" ;;
*) printf '%s\n' '未检测到 systemd 或 OpenRC。' >&2; exit 1 ;;
esac
}
status() {
case "$(init_system)" in
systemd) systemctl --no-pager --full status 3m-ui || true ;;
openrc) rc-service 3m-ui status || true ;;
*) printf '%s\n' 'init: unsupported' ;;
esac
printf '\n'
if [ -x "$APP_BIN" ]; then
printf '%s\n' "应用程序: $APP_BIN"
"$APP_BIN" --version 2>/dev/null || true
else
printf '%s\n' '应用程序二进制不存在。'
fi
}
logs() {
case "$(init_system)" in
systemd) journalctl -u 3m-ui -n 100 --no-pager ;;
openrc) tail -n 100 /var/log/3m-ui/3m-ui.log 2>/dev/null || printf '%s\n' '未找到日志文件。' ;;
*) printf '%s\n' '未找到可用的日志系统。' ;;
esac
}
version() {
if [ -x "$APP_BIN" ]; then
"$APP_BIN" --version
else
printf '%s\n' '3m-ui 未安装。' >&2
exit 1
fi
}
need_root() {
[ "$(id -u)" -eq 0 ] || { printf '%s\n' '请使用 root 运行 3m-ui 管理命令。' >&2; exit 1; }
}
main() {
need_root
cmd=${1:-}
case "$cmd" in
status) status ;;
start) service_action start ;;
restart) service_action restart ;;
stop) service_action stop ;;
logs) logs ;;
version) version ;;
help|-h|--help)
printf '%s\n' '用法: 3m-ui [status|start|restart|stop|logs|version|help]'
printf '%s\n' '不带参数直接运行 3m-ui 将进入交互式管理菜单。'
;;
'') menu ;;
*) printf '%s\n' "未知命令: $cmd" >&2; exit 2 ;;
esac
}
main "$@"