#!/bin/sh

echo “+++++++++++++++++++++++++++++++”
echo "本脚本用于OpenWrt路由器创建WiFi"
echo “+++++++++++++++++++++++++++++++”

sleep 2s
rollback() {
    echo "发生错误，正在回滚..."
    uci revert network
    uci revert wireless
    uci revert dhcp
    exit 1
}

read -p "请输入要创建的 WiFi 数量 (1-20): " COUNT
case "$COUNT" in
    ''|*[!0-9]*)
        echo "数量必须是数字"
        exit 1
        ;;
esac
[ "$COUNT" -lt 1 ] || [ "$COUNT" -gt 20 ] && { echo "数量必须在 1 到 20 之间"; exit 1; }

read -p "请输入无线设备名 (例如 radio1): " RADIO
[ -z "$RADIO" ] && { echo "无线设备名不能为空"; exit 1; }

read -p "请输入 SSID 前缀 (例如 ap): " PREFIX
[ -z "$PREFIX" ] && { echo "SSID 前缀不能为空"; exit 1; }

read -p "请输入 WiFi 密码: " PASS
[ -z "$PASS" ] && { echo "密码不能为空"; exit 1; }

read -p "请输入物理接口起始名 (例如 phy-ap0 或 phy0-ap0): " PHY

# 解析最后一段数字
PHY_NUM=$(echo "$PHY" | grep -o '[0-9]*$')
PHY_PREFIX=$(echo "$PHY" | sed 's/[0-9]*$//')

[ -z "$PHY_NUM" ] && {
    echo "物理接口必须以数字结尾，例如 phy-ap0 或 phy0-ap0"
    exit 1
}

read -p "请输入起始 IP (例如 192.168.11.1): " IPSTART
echo "$IPSTART" | grep -Eq '^([0-9]{1,3}\.){3}[0-9]{1,3}$' || {
    echo "IP 格式错误"
    exit 1
}

IP_A=$(echo $IPSTART | cut -d. -f1)
IP_B=$(echo $IPSTART | cut -d. -f2)
IP_C=$(echo $IPSTART | cut -d. -f3)
IP_D=$(echo $IPSTART | cut -d. -f4)

[ "$IP_D" != "1" ] && { echo "IP 最后一段必须为 1"; exit 1; }

echo
echo "========= 配置预览 ========="
echo "WiFi 数量: $COUNT"
echo "无线设备: $RADIO"
echo "SSID 前缀: $PREFIX"
echo "物理接口: ${PHY_PREFIX}${PHY_NUM} ~ ${PHY_PREFIX}$(($PHY_NUM+$COUNT-1))"
echo "IP 网段: ${IP_A}.${IP_B}.${IP_C}.1 ~ $(($IP_C+$COUNT-1)).1"
echo "密码: $PASS"
echo "DHCP: 已开启 (3h)"
echo "==========================="

read -p "是否确认执行? (yes/no): " CONFIRM
[ "$CONFIRM" != "yes" ] && { echo "已取消执行"; exit 0; }

echo "开始配置..."

i=1
while [ $i -le $COUNT ]; do
    IDX=$(printf "%02d" $i)
    NAME="${PREFIX}${IDX}"

    PHY_CUR=$(($PHY_NUM+$i-1))
    PHY_NAME="${PHY_PREFIX}${PHY_CUR}"

    IP_NET=$(($IP_C+$i-1))
    IP_ADDR="${IP_A}.${IP_B}.${IP_NET}.1"

    uci set network.$NAME=interface || rollback
    uci set network.$NAME.proto='static' || rollback
    uci set network.$NAME.device="$PHY_NAME" || rollback
    uci set network.$NAME.ipaddr="$IP_ADDR" || rollback
    uci set network.$NAME.netmask='255.255.255.0' || rollback

    uci set dhcp.$NAME=dhcp || rollback
    uci set dhcp.$NAME.interface="$NAME" || rollback
    uci set dhcp.$NAME.start='100' || rollback
    uci set dhcp.$NAME.limit='150' || rollback
    uci set dhcp.$NAME.leasetime='3h' || rollback

    uci set wireless.wifinet_$NAME=wifi-iface || rollback
    uci set wireless.wifinet_$NAME.device="$RADIO" || rollback
    uci set wireless.wifinet_$NAME.mode='ap' || rollback
    uci set wireless.wifinet_$NAME.ssid="$NAME" || rollback
    uci set wireless.wifinet_$NAME.encryption='psk2' || rollback
    uci set wireless.wifinet_$NAME.key="$PASS" || rollback
    uci set wireless.wifinet_$NAME.network="$NAME" || rollback

    i=$(($i+1))
done

uci commit network || rollback
uci commit wireless || rollback
uci commit dhcp || rollback

wifi reload
/etc/init.d/network restart
/etc/init.d/dnsmasq restart

echo
echo "全部配置完成 ✔"

