172 lines
4.1 KiB
Bash
Executable File
172 lines
4.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
set -e
|
||
|
||
# --------------------------------------------
|
||
# 参数解析:必须指定 config.json 路径
|
||
# --------------------------------------------
|
||
CONFIG_PATH=""
|
||
|
||
while [[ $# -gt 0 ]]; do
|
||
case "$1" in
|
||
-c|--config)
|
||
CONFIG_PATH="$2"
|
||
shift 2
|
||
;;
|
||
*)
|
||
echo "❌ 未知参数: $1"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
if [[ -z "$CONFIG_PATH" ]]; then
|
||
echo "❌ 必须使用 -c <config.json 路径>"
|
||
echo "示例: sudo ./install_mdns.sh -c /home/aiec/demo/config.json"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ ! -f "$CONFIG_PATH" ]]; then
|
||
echo "❌ 找不到配置文件:"
|
||
echo " $CONFIG_PATH"
|
||
exit 1
|
||
fi
|
||
|
||
echo "📌 使用配置文件: $CONFIG_PATH"
|
||
|
||
|
||
# --------------------------------------------
|
||
# 1. 安装 avahi 组件
|
||
# --------------------------------------------
|
||
echo "=== 安装 Avahi 相关 deb 包 ==="
|
||
sudo dpkg -i avahi-daemon_*.deb avahi-utils_*.deb avahi-autoipd_*.deb libnss-mdns_*.deb || true
|
||
sudo apt --fix-broken install -y
|
||
|
||
|
||
echo "=== 启动 & 启用 avahi-daemon ==="
|
||
sudo systemctl enable avahi-daemon || true
|
||
sudo systemctl restart avahi-daemon
|
||
|
||
|
||
# --------------------------------------------
|
||
# 2. 安装 update_mdns.sh(核心逻辑)
|
||
# --------------------------------------------
|
||
echo "=== 写入 /usr/local/bin/update_mdns.sh ==="
|
||
|
||
sudo mkdir -p /usr/local/bin
|
||
|
||
sudo tee /usr/local/bin/update_mdns.sh >/dev/null <<'EOF'
|
||
#!/bin/bash
|
||
|
||
CONFIG="@CONFIG_PATH@"
|
||
TRIGGER="/run/update_mdns_request"
|
||
|
||
# --------------- 读取 device_no ---------------
|
||
DEVICE_NO=$(grep -oP '"device_no"\s*:\s*"\K[^"]+' "$CONFIG")
|
||
|
||
# 若触发文件存在,则优先使用触发文件内容
|
||
if [[ -f "$TRIGGER" ]]; then
|
||
FILE_VALUE=$(tr -d '\n' < "$TRIGGER")
|
||
if [[ -n "$FILE_VALUE" ]]; then
|
||
DEVICE_NO="$FILE_VALUE"
|
||
fi
|
||
fi
|
||
|
||
if [[ -z "$DEVICE_NO" ]]; then
|
||
echo "[update_mdns] 未找到有效 device_no"
|
||
exit 1
|
||
fi
|
||
|
||
echo "[update_mdns] 更新 hostname = $DEVICE_NO"
|
||
|
||
# --------------- 设置 hostname ---------------
|
||
hostnamectl set-hostname "$DEVICE_NO"
|
||
|
||
# 修复 /etc/hosts
|
||
if grep -q "^127.0.1.1" /etc/hosts; then
|
||
sed -i "s/^127.0.1.1.*/127.0.1.1 $DEVICE_NO/" /etc/hosts
|
||
else
|
||
echo "127.0.1.1 $DEVICE_NO" >> /etc/hosts
|
||
fi
|
||
|
||
# --------------- 更新 Avahi 服务 ---------------
|
||
mkdir -p /etc/avahi/services
|
||
tee /etc/avahi/services/webconfig.service >/dev/null <<EOF2
|
||
<?xml version="1.0" standalone='no'?>
|
||
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
|
||
|
||
<service-group>
|
||
<name replace-wildcards="yes">%h Config Page</name>
|
||
|
||
<service>
|
||
<type>_http._tcp</type>
|
||
<port>18080</port>
|
||
</service>
|
||
</service-group>
|
||
EOF2
|
||
|
||
systemctl restart avahi-daemon
|
||
|
||
# 删除触发文件,避免重复触发
|
||
rm -f "$TRIGGER"
|
||
|
||
EOF
|
||
|
||
sudo chmod +x /usr/local/bin/update_mdns.sh
|
||
|
||
# 用真实 CONFIG_PATH 替换脚本中的占位符
|
||
sudo sed -i "s|@CONFIG_PATH@|$CONFIG_PATH|g" /usr/local/bin/update_mdns.sh
|
||
|
||
|
||
|
||
# --------------------------------------------
|
||
# 3. 安装 systemd service
|
||
# --------------------------------------------
|
||
echo "=== 创建 update-mdns.service ==="
|
||
|
||
sudo tee /etc/systemd/system/update-mdns.service >/dev/null <<EOF
|
||
[Unit]
|
||
Description=Update hostname & mDNS when device_no changed
|
||
|
||
[Service]
|
||
Type=oneshot
|
||
ExecStart=/usr/local/bin/update_mdns.sh
|
||
EOF
|
||
|
||
|
||
|
||
# --------------------------------------------
|
||
# 4. 安装 systemd path watcher
|
||
# --------------------------------------------
|
||
echo "=== 创建 update-mdns.path ==="
|
||
|
||
sudo tee /etc/systemd/system/update-mdns.path >/dev/null <<EOF
|
||
[Unit]
|
||
Description=Watch for mDNS update request
|
||
|
||
[Path]
|
||
PathExists=/run/update_mdns_request
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
EOF
|
||
|
||
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable update-mdns.path
|
||
sudo systemctl start update-mdns.path
|
||
|
||
|
||
echo ""
|
||
echo "============================================="
|
||
echo "mDNS 自动更新机制安装完成!🎉"
|
||
echo "配置文件路径:$CONFIG_PATH"
|
||
echo ""
|
||
echo "当 C++ 程序写入: /run/update_mdns_request"
|
||
echo "内容 = 新设备号,例如: KL777"
|
||
echo "系统会立即更新:"
|
||
echo " • hostname"
|
||
echo " • /etc/hosts"
|
||
echo " • avahi 广播名字(xxx.local)"
|
||
echo "============================================="
|