Skip to content

Instantly share code, notes, and snippets.

@lockcp
Last active June 6, 2025 14:32
Show Gist options
  • Save lockcp/ae231bb84b79fbe5ccf70929a966df0f to your computer and use it in GitHub Desktop.
Save lockcp/ae231bb84b79fbe5ccf70929a966df0f to your computer and use it in GitHub Desktop.
#!/bin/bash
set -e
INSTALL_DIR="/opt/mosdns"
BIN_PATH="$INSTALL_DIR/mosdns"
CONFIG_PATH="$INSTALL_DIR/config.yaml"
VERSION="v4.5.3"
SERVICE_NAME="mosdns"
SCRIPT_PATH="$(readlink -f "$0" 2>/dev/null || realpath "$0" 2>/dev/null || echo "$0")"
CONFIG_URL="https://ghfast.top/https://gist.github.com/lockcp/99b6c9b4d4bdce70e49652eb40e4427e/raw/10cb89532ebbce27c9c7afd2c437fdb18ec1c6d4/config.yaml"
# 检测初始化系统类型
function detect_init_system() {
if [ -f "/proc/1/comm" ] && grep -q "systemd" /proc/1/comm; then
echo "systemd"
elif [ -f "/etc/openwrt_release" ]; then
echo "openwrt"
elif [ -d "/etc/init.d" ]; then
echo "init"
else
echo "unknown"
fi
}
INIT_SYSTEM=$(detect_init_system)
# 自动识别架构
ARCH=$(uname -m)
case "$ARCH" in
x86_64) MOSDNS_ARCH="amd64" ;;
aarch64|arm64) MOSDNS_ARCH="arm64" ;;
armv7l|armv7) MOSDNS_ARCH="armv7" ;;
i386|i686) MOSDNS_ARCH="386" ;;
mips64el) MOSDNS_ARCH="mips64le" ;;
*) echo "不支持的架构: $ARCH"; exit 1 ;;
esac
DOWNLOAD_URL="https://ghfast.top/https://github.com/IrineSistiana/mosdns/releases/download/${VERSION}/mosdns-linux-${MOSDNS_ARCH}.zip"
# 判断是否需要sudo
SUDO=""
if command -v sudo &> /dev/null && [ "$(id -u)" -ne 0 ]; then
SUDO="sudo"
fi
# 服务文件路径
if [ "$INIT_SYSTEM" = "systemd" ]; then
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
elif [ "$INIT_SYSTEM" = "openwrt" ] || [ "$INIT_SYSTEM" = "init" ]; then
SERVICE_FILE="/etc/init.d/${SERVICE_NAME}"
else
SERVICE_FILE=""
fi
# 检查服务是否存在
function service_exists() {
[ -n "$SERVICE_FILE" ] && [ -f "$SERVICE_FILE" ]
}
# 安装/重建系统服务
function install_service() {
if [ -z "$SERVICE_FILE" ]; then
echo "不支持的初始化系统,无法创建服务。"
return 1
fi
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO tee "$SERVICE_FILE" >/dev/null <<EOF
[Unit]
Description=mosdns Service
After=network.target
[Service]
Type=simple
ExecStart=$BIN_PATH start --config $CONFIG_PATH
Restart=on-failure
User=root
[Install]
WantedBy=multi-user.target
EOF
$SUDO systemctl daemon-reload
$SUDO systemctl enable "$SERVICE_NAME"
elif [ "$INIT_SYSTEM" = "openwrt" ] || [ "$INIT_SYSTEM" = "init" ]; then
$SUDO tee "$SERVICE_FILE" >/dev/null <<EOF
#!/bin/sh /etc/rc.common
START=99
STOP=10
BIN="$BIN_PATH"
CONF="$CONFIG_PATH"
start() {
\$BIN start --config \$CONF &
}
stop() {
killall mosdns 2>/dev/null
}
status() {
if pidof mosdns >/dev/null; then
echo "mosdns is running."
return 0
else
echo "mosdns is not running."
return 1
fi
}
EOF
$SUDO chmod +x "$SERVICE_FILE"
$SUDO "$SERVICE_FILE" enable
else
echo "无法创建服务:未知的初始化系统"
return 1
fi
# 检查创建是否成功
if [ -f "$SERVICE_FILE" ]; then
echo "mosdns 系统服务创建成功!"
return 0
else
echo "mosdns 系统服务创建失败!"
return 1
fi
}
# 卸载系统服务
function uninstall_service() {
if ! service_exists; then
echo "服务文件不存在,无需卸载。"
return 0
fi
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO systemctl stop "$SERVICE_NAME" 2>/dev/null || true
$SUDO systemctl disable "$SERVICE_NAME" 2>/dev/null || true
$SUDO rm -f "$SERVICE_FILE"
$SUDO systemctl daemon-reload
elif [ "$INIT_SYSTEM" = "openwrt" ] || [ "$INIT_SYSTEM" = "init" ]; then
$SUDO "$SERVICE_FILE" stop 2>/dev/null || true
$SUDO "$SERVICE_FILE" disable 2>/dev/null || true
$SUDO rm -f "$SERVICE_FILE"
fi
echo "mosdns 系统服务已卸载。"
}
# 彻底清除
function full_cleanup() {
uninstall_service
$SUDO rm -rf "$INSTALL_DIR"
[ -f "$SCRIPT_PATH" ] && rm -f "$SCRIPT_PATH"
echo "mosdns 及相关文件已彻底清除。"
exit 0
}
# 首次安装检测(仅安装二进制,不自动装服务)
if [ ! -f "$BIN_PATH" ]; then
echo "首次运行,正在下载安装 mosdns v4.5.3 ..."
WORKDIR="/tmp/mosdns_install"
mkdir -p "$WORKDIR"
cd "$WORKDIR"
echo "下载: $DOWNLOAD_URL"
if ! curl -L -o mosdns.zip "$DOWNLOAD_URL"; then
echo "下载失败,请检查网络"
exit 1
fi
# OpenWrt需手动安装unzip
if ! command -v unzip >/dev/null 2>&1; then
if [ "$INIT_SYSTEM" = "openwrt" ]; then
opkg update && opkg install unzip
else
echo "请先安装 unzip"
exit 1
fi
fi
$SUDO mkdir -p "$INSTALL_DIR"
$SUDO unzip -o mosdns.zip -d "$INSTALL_DIR"
$SUDO chmod +x "$BIN_PATH"
# 覆盖 config.yaml 并赋予 755 权限(仅首次安装)
echo "正在下载并覆盖 config.yaml ..."
if curl -L -o "$WORKDIR/config.yaml" "$CONFIG_URL"; then
$SUDO cp "$WORKDIR/config.yaml" "$CONFIG_PATH"
$SUDO chmod 755 "$CONFIG_PATH"
echo "config.yaml 已覆盖并赋予 755 权限。"
else
echo "config.yaml 下载失败,请检查网络或手动配置。"
fi
echo "首次安装完成。config.yaml 已覆盖。"
fi
# 菜单
while true; do
clear
echo "========= mosdns v4.5.3 管理 ========="
echo "1. 启动服务"
echo "2. 重启服务"
echo "3. 停止服务"
echo "4. 查看状态"
echo "5. 安装/重建 mosdns 系统服务"
echo "6. 卸载 mosdns 系统服务"
echo "7. 彻底清除 mosdns(含服务、程序、脚本本身)"
echo "0. 退出"
echo "====================================="
if service_exists; then
echo "服务文件已存在: $SERVICE_FILE"
else
echo "服务文件不存在,可通过选项5安装/重建。"
fi
read -p "请输入选项 [0-7]: " choice
case "$choice" in
1)
if service_exists; then
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO systemctl start "$SERVICE_NAME"
else
$SUDO /etc/init.d/$SERVICE_NAME start
fi
else
echo "服务文件不存在,请先用选项5安装/重建服务。"
fi
;;
2)
if service_exists; then
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO systemctl restart "$SERVICE_NAME"
else
$SUDO /etc/init.d/$SERVICE_NAME restart
fi
else
echo "服务文件不存在,请先用选项5安装/重建服务。"
fi
;;
3)
if service_exists; then
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO systemctl stop "$SERVICE_NAME"
else
$SUDO /etc/init.d/$SERVICE_NAME stop
fi
else
echo "服务文件不存在,请先用选项5安装/重建服务。"
fi
;;
4)
if service_exists; then
if [ "$INIT_SYSTEM" = "systemd" ]; then
$SUDO systemctl status "$SERVICE_NAME"
else
$SUDO /etc/init.d/$SERVICE_NAME status
fi
else
echo "服务文件不存在,请先用选项5安装/重建服务。"
fi
;;
5)
echo "正在安装/重建 mosdns 系统服务..."
if install_service; then
echo "服务创建成功。"
else
echo "服务创建失败,请检查上方报错信息。"
fi
;;
6)
echo "正在卸载 mosdns 系统服务..."
uninstall_service
;;
7)
echo "正在彻底清除 mosdns 及相关文件..."
full_cleanup
;;
0)
echo "退出脚本。"
exit 0
;;
*)
echo "无效选项,请重新输入。"
;;
esac
echo
read -p "按回车键继续..."
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment