b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | #!/bin/sh /etc/rc.common |
| 2 | # Copyright (C) 2018 Dengfeng Liu |
| 3 | |
| 4 | . /lib/functions/network.sh |
| 5 | |
| 6 | START=99 |
| 7 | |
| 8 | USE_PROCD=1 |
| 9 | PROG=/usr/bin/wifidogx |
| 10 | CONFIGFILE=/tmp/wifidogx.conf |
| 11 | |
| 12 | extra_command "status" "Print the status of the service" |
| 13 | |
| 14 | PX5G_BIN="/usr/sbin/px5g" |
| 15 | OPENSSL_BIN="/usr/bin/openssl" |
| 16 | APFREE_CERT="/etc/apfree.crt" |
| 17 | APFREE_KEY="/etc/apfree.key" |
| 18 | |
| 19 | generate_keys() { |
| 20 | local days bits country state location commonname |
| 21 | local UNIQUEID GENKEY_CMD |
| 22 | |
| 23 | # Prefer px5g for certificate generation (existence evaluated last) |
| 24 | UNIQUEID=$(hexdump -n 4 -e '4/1 "%02x" "\n"' /dev/urandom) |
| 25 | [ -x "$OPENSSL_BIN" ] && GENKEY_CMD="$OPENSSL_BIN req -x509 -sha256 -outform pem -nodes" |
| 26 | [ -x "$PX5G_BIN" ] && GENKEY_CMD="$PX5G_BIN selfsigned -pem" |
| 27 | [ -n "$GENKEY_CMD" ] && { |
| 28 | $GENKEY_CMD \ |
| 29 | -days "${days:-720}" -newkey rsa:"${bits:-2048}" -keyout "${APFREE_KEY}.new" -out "${APFREE_CERT}.new" \ |
| 30 | -subj /C="${country:-CN}"/ST="${state:-Beijing}"/L="${location:-Unknown}"/O="${commonname:-ApFreeWiFidog}$UNIQUEID"/CN="${commonname:-ApFreeWiFidog}" |
| 31 | sync |
| 32 | mv "${APFREE_KEY}.new" "${APFREE_KEY}" |
| 33 | mv "${APFREE_CERT}.new" "${APFREE_CERT}" |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | service_trigger() { |
| 38 | procd_add_reload_trigger "wifidogx" |
| 39 | } |
| 40 | |
| 41 | echo_firewall_rule() { |
| 42 | echo " FirewallRule $1" |
| 43 | } |
| 44 | |
| 45 | prepare_mqtt_conf() { |
| 46 | local cfg=$1 |
| 47 | local serveraddr |
| 48 | local serverport |
| 49 | |
| 50 | config_get serveraddr "$cfg" "serveraddr" |
| 51 | config_get serverport "$cfg" "serverport" |
| 52 | [ -z "${serveraddr}" ] || [ -z "${serverport}" ] && return 1 |
| 53 | |
| 54 | cat <<-EOF >>${CONFIGFILE} |
| 55 | MQTT { |
| 56 | ServerAddr ${serveraddr} |
| 57 | ServerPort ${serverport} |
| 58 | } |
| 59 | EOF |
| 60 | } |
| 61 | |
| 62 | prepare_wifidog_conf() { |
| 63 | local cfg=$1 |
| 64 | local disabled |
| 65 | local gateway_id |
| 66 | local gateway_interface |
| 67 | local auth_server_hostname |
| 68 | local auth_server_path |
| 69 | local auth_server_path_login |
| 70 | local auth_server_path_portal |
| 71 | local auth_server_path_msg |
| 72 | local auth_server_path_ping |
| 73 | local auth_server_path_auth |
| 74 | local delta_traffic |
| 75 | local check_interval |
| 76 | local client_timeout |
| 77 | local trusted_domains |
| 78 | local js_filter |
| 79 | local trusted_maclist |
| 80 | local untrusted_maclist |
| 81 | local pool_mode |
| 82 | local thread_number |
| 83 | local queue_size |
| 84 | local wired_passed |
| 85 | local trusted_iplist |
| 86 | local trusted_pan_domains |
| 87 | local proxy_port |
| 88 | local no_auth |
| 89 | local apple_cna |
| 90 | local update_domain_interval |
| 91 | local dns_timeout |
| 92 | local default_gateway_id |
| 93 | local external_interface |
| 94 | local auth_server_port |
| 95 | |
| 96 | [ -f ${CONFIGFILE} ] && rm -f ${CONFIGFILE} |
| 97 | |
| 98 | config_get disabled "${cfg}" "disabled" 1 |
| 99 | if [ "${disabled}" = "1" ]; then |
| 100 | echo "wifidogx disabled in /etc/config/wifidogx file, please set disabled to 0 to enable it" >&2 |
| 101 | return |
| 102 | fi |
| 103 | |
| 104 | default_gateway_id=$(sed -e 's/://g' /sys/class/net/br-lan/address) |
| 105 | |
| 106 | network_get_device external_interface wan |
| 107 | |
| 108 | config_get gateway_id "${cfg}" "gateway_id" "${default_gateway_id}" |
| 109 | config_get gateway_interface "${cfg}" "gateway_interface" "br-lan" |
| 110 | config_get auth_server_hostname "${cfg}" "auth_server_hostname" |
| 111 | config_get auth_server_port "${cfg}" "auth_server_port" "80" |
| 112 | config_get auth_server_path "${cfg}" "auth_server_path" "/wifidog/" |
| 113 | config_get auth_server_path_login "${cfg}" "auth_server_path_login" |
| 114 | config_get auth_server_path_portal "${cfg}" "auth_server_path_portal" |
| 115 | config_get auth_server_path_msg "${cfg}" "auth_server_path_msg" |
| 116 | config_get auth_server_path_ping "${cfg}" "auth_server_path_ping" |
| 117 | config_get auth_server_path_auth "${cfg}" "auth_server_path_auth" |
| 118 | config_get delta_traffic "${cfg}" "delta_traffic" |
| 119 | config_get check_interval "${cfg}" "check_interval" "60" |
| 120 | config_get js_filter "${cfg}" "js_filter" 1 |
| 121 | config_get client_timeout "${cfg}" "client_timeout" "5" |
| 122 | config_get trusted_domains "${cfg}" "trusted_domains" |
| 123 | config_get trusted_maclist "${cfg}" "trusted_maclist" |
| 124 | config_get untrusted_maclist "${cfg}" "untrusted_maclist" |
| 125 | config_get pool_mode "${cfg}" "pool_mode" 0 |
| 126 | config_get thread_number "${cfg}" "thread_number" 20 |
| 127 | config_get queue_size "${cfg}" "queue_size" 200 |
| 128 | config_get wired_passed "${cfg}" "wired_passed" 1 |
| 129 | config_get trusted_iplist "${cfg}" "trusted_iplist" |
| 130 | config_get trusted_pan_domains "${cfg}" "trusted_pan_domains" |
| 131 | config_get proxy_port "${cfg}" "proxy_port" |
| 132 | config_get no_auth "${cfg}" "no_auth" |
| 133 | config_get apple_cna "${cfg}" "bypass_apple_cna" |
| 134 | config_get update_domain_interval "${cfg}" "update_domain_interval" |
| 135 | config_get dns_timeout "${cfg}" "dns_timeout" |
| 136 | |
| 137 | local set_auth_server_path_login |
| 138 | local set_auth_server_path_portal |
| 139 | local set_auth_server_path_msg |
| 140 | local set_auth_server_path_ping |
| 141 | local set_auth_server_path_auth |
| 142 | local set_delta_traffic |
| 143 | local set_trusted_maclist |
| 144 | local set_untrusted_maclist |
| 145 | local set_trusted_domains |
| 146 | local set_trusted_iplist |
| 147 | local set_trusted_pan_domains |
| 148 | local set_proxy_port |
| 149 | local set_no_auth |
| 150 | local set_firewall_rule_global |
| 151 | local set_firewall_rule_validating_users |
| 152 | local set_firewall_rule_known_users |
| 153 | local set_firewall_rule_auth_is_down |
| 154 | local set_firewall_rule_unknown_users |
| 155 | local set_firewall_rule_locked_users |
| 156 | local set_apple_cna |
| 157 | local set_update_domain_interval |
| 158 | local set_dns_timeout |
| 159 | |
| 160 | set_auth_server_path_login=$([ -n "$auth_server_path_login" ] && echo " LoginScriptPathFragment $auth_server_path_login") |
| 161 | set_auth_server_path_portal=$([ -n "$auth_server_path_portal" ] && echo " PortalScriptPathFragment $auth_server_path_portal") |
| 162 | set_auth_server_path_msg=$([ -n "$auth_server_path_msg" ] && echo " MsgScriptPathFragment $auth_server_path_msg") |
| 163 | set_auth_server_path_ping=$([ -n "$auth_server_path_ping" ] && echo " PingScriptPathFragment $auth_server_path_ping") |
| 164 | set_auth_server_path_auth=$([ -n "$auth_server_path_auth" ] && echo " AuthScriptPathFragment $auth_server_path_auth") |
| 165 | set_delta_traffic=$([ -n "$delta_traffic" ] && echo "DeltaTraffic $delta_traffic") |
| 166 | set_trusted_maclist=$([ -n "$trusted_maclist" ] && echo "TrustedMACList $trusted_maclist") |
| 167 | set_untrusted_maclist=$([ -n "$untrusted_maclist" ] && echo "UntrustedMACList $untrusted_maclist") |
| 168 | set_trusted_domains=$([ -n "$trusted_domains" ] && echo "TrustedDomains $trusted_domains") |
| 169 | set_trusted_iplist=$([ -n "$trusted_iplist" ] && echo "TrustedIpList $trusted_iplist") |
| 170 | set_trusted_pan_domains=$([ -n "$trusted_pan_domains" ] && echo "TrustedPanDomains $trusted_pan_domains") |
| 171 | set_proxy_port=$([ -n "$proxy_port" ] && echo "Proxyport $proxy_port") |
| 172 | set_no_auth=$([ -n "$no_auth" ] && echo "NoAuth $no_auth") |
| 173 | set_firewall_rule_global=$(config_list_foreach "$cfg" "firewall_rule_global" echo_firewall_rule) |
| 174 | set_firewall_rule_validating_users=$(config_list_foreach "$cfg" "firewall_rule_validating_users" echo_firewall_rule) |
| 175 | set_firewall_rule_known_users=$(config_list_foreach "$cfg" "firewall_rule_known_users" echo_firewall_rule) |
| 176 | set_firewall_rule_auth_is_down=$(config_list_foreach "$cfg" "firewall_rule_auth_is_down" echo_firewall_rule) |
| 177 | set_firewall_rule_unknown_users=$(config_list_foreach "$cfg" "firewall_rule_unknown_users" echo_firewall_rule) |
| 178 | set_firewall_rule_locked_users=$(config_list_foreach "$cfg" "firewall_rule_locked_users" echo_firewall_rule) |
| 179 | set_apple_cna=$([ -n "$apple_cna" ] && echo "BypassAppleCNA $apple_cna") |
| 180 | set_update_domain_interval=$([ -n "$update_domain_interval" ] && echo "UpdateDomainInterval $update_domain_interval") |
| 181 | set_dns_timeout=$([ -n "$dns_timeout" ] && echo "DNSTimeout $dns_timeout") |
| 182 | |
| 183 | cat <<-EOF >$CONFIGFILE |
| 184 | GatewayID $gateway_id |
| 185 | GatewayInterface $gateway_interface |
| 186 | Externalinterface $external_interface |
| 187 | |
| 188 | AuthServer { |
| 189 | Hostname $auth_server_hostname |
| 190 | HTTPPort $auth_server_port |
| 191 | Path $auth_server_path |
| 192 | $set_auth_server_path_login |
| 193 | $set_auth_server_path_portal |
| 194 | $set_auth_server_path_msg |
| 195 | $set_auth_server_path_ping |
| 196 | $set_auth_server_path_auth |
| 197 | } |
| 198 | |
| 199 | $set_delta_traffic |
| 200 | CheckInterval $check_interval |
| 201 | ClientTimeout $client_timeout |
| 202 | JsFilter $js_filter |
| 203 | WiredPassed $wired_passed |
| 204 | $set_trusted_domains |
| 205 | $set_untrusted_maclist |
| 206 | $set_trusted_maclist |
| 207 | $set_trusted_iplist |
| 208 | $set_trusted_pan_domains |
| 209 | $set_proxy_port |
| 210 | $set_no_auth |
| 211 | $set_apple_cna |
| 212 | $set_update_domain_interval |
| 213 | $set_dns_timeout |
| 214 | |
| 215 | FirewallRuleSet global { |
| 216 | $set_firewall_rule_global |
| 217 | } |
| 218 | |
| 219 | FirewallRuleSet validating-users { |
| 220 | $set_firewall_rule_validating_users |
| 221 | FirewallRule allow to 0.0.0.0/0 |
| 222 | } |
| 223 | |
| 224 | FirewallRuleSet known-users { |
| 225 | $set_firewall_rule_known_users |
| 226 | FirewallRule allow to 0.0.0.0/0 |
| 227 | } |
| 228 | |
| 229 | FirewallRuleSet auth-is-down { |
| 230 | $set_firewall_rule_auth_is_down |
| 231 | } |
| 232 | |
| 233 | FirewallRuleSet unknown-users { |
| 234 | $set_firewall_rule_unknown_users |
| 235 | FirewallRule allow udp port 53 |
| 236 | FirewallRule allow tcp port 53 |
| 237 | FirewallRule allow udp port 67 |
| 238 | FirewallRule allow tcp port 67 |
| 239 | } |
| 240 | |
| 241 | FirewallRuleSet locked-users { |
| 242 | $set_firewall_rule_locked_users |
| 243 | FirewallRule block to 0.0.0.0/0 |
| 244 | } |
| 245 | EOF |
| 246 | } |
| 247 | |
| 248 | init_config() { |
| 249 | config_load wifidogx |
| 250 | config_foreach prepare_wifidog_conf wifidog |
| 251 | |
| 252 | if [ ! -f ${CONFIGFILE} ]; then |
| 253 | echo "no wifidogx.conf, exit..." >&2 |
| 254 | exit |
| 255 | fi |
| 256 | |
| 257 | if [ ! -s "${APFREE_CERT}" ] || [ ! -s "${APFREE_KEY}" ]; then |
| 258 | generate_keys |
| 259 | fi |
| 260 | |
| 261 | if [ ! -s ${APFREE_KEY} ] || [ ! -s ${APFREE_CERT} ]; then |
| 262 | echo "no cert or key, exit..." >&2 |
| 263 | exit |
| 264 | fi |
| 265 | |
| 266 | config_foreach prepare_mqtt_conf mqtt |
| 267 | |
| 268 | sed -i -e '/^$/d' ${CONFIGFILE} |
| 269 | } |
| 270 | |
| 271 | start_service() { |
| 272 | init_config |
| 273 | |
| 274 | procd_open_instance |
| 275 | # -f: run in foreground |
| 276 | procd_set_param command $PROG -c $CONFIGFILE -f -d 0 |
| 277 | procd_set_param respawn # respawn automatically if something died |
| 278 | procd_set_param file $CONFIGFILE |
| 279 | procd_close_instance |
| 280 | } |
| 281 | |
| 282 | status_service() { |
| 283 | /usr/bin/wdctlx status |
| 284 | } |