#!/bin/sh /etc/rc.common # Copyright (C) 2018 Dengfeng Liu START=99 USE_PROCD=1 NAME=wifidogx PROG=/usr/bin/${NAME} CONFIGFILE=/tmp/wifidogx.conf handle_gateway() { local section=$1 local gateway_name gateway_channel gateway_id config_get gateway_name $section gateway_name config_get gateway_channel $section gateway_channel config_get gateway_id $section gateway_id if [ -z "$gateway_name" ] || [ -z "$gateway_channel" ]; then echo "gateway_name is required for $section" >&2 return fi # if gateway_id is not set, get it from the gateway_name if [ -z "$gateway_id" ]; then gateway_id=$(ifconfig $gateway_name | grep HWaddr | awk '{print $5}' | tr 'a-z' 'A-Z') [ -z "$gateway_id" ] && { echo "Failed to get gateway_id for $gateway_name" >&2 return } gateway_id=$(echo $gateway_id | tr -d ':') uci set wifidogx.$section.gateway_id=$gateway_id uci commit wifidogx fi echo "GatewaySetting { GatewayInterface $gateway_name GatewayChannel $gateway_channel GatewayID $gateway_id }" >> ${CONFIGFILE} } prepare_wifidog_conf() { [ -f ${CONFIGFILE} ] && rm -f ${CONFIGFILE} uci_validate_section ${NAME} ${NAME} common \ 'enabled:bool:0' \ 'log_level:integer:7' \ 'device_id:string' \ 'auth_server_hostname:string' \ 'auth_server_port:port:443' \ 'auth_server_path:string:/wifidog/' \ 'check_interval:integer:60' \ 'client_timeout:integer:5' \ 'wired_passed:bool:1' \ 'apple_cna:bool:0' \ 'trusted_domains:list(host)' \ 'trusted_wildcard_domains:list(string)' \ 'trusted_macs:list(string)' \ 'app_white_list:list(string)' \ 'mac_white_list:list(string)' \ 'wildcard_white_list:list(string)' \ 'enable_dns_forward:bool:1' \ 'enable_websocket:bool:1' \ 'js_filter:bool:1' if [ ! -z "$app_white_list" ]; then # iterate app_white_list and find the corresponding domain according to the item for group in $app_white_list; do group_domain_list=$(uci get wifidogx.$group.domain_name) # if the domain list is not empty, add it to trusted_domains if [ ! -z "$group_domain_list" ]; then trusted_domains="$trusted_domains $group_domain_list" fi done fi if [ ! -z "$mac_white_list" ]; then # iterate mac_white_list and find the corresponding mac according to the item for group in $mac_white_list; do group_mac_list=$(uci get wifidogx.$group.mac_address) # if the mac list is not empty, add it to trusted_macs if [ ! -z "$group_mac_list" ]; then trusted_macs="$trusted_macs $group_mac_list" fi done fi if [ ! -z "$wildcard_white_list" ]; then # iterate wildcard_white_list and find the corresponding domain according to the item for group in $wildcard_white_list; do group_wildcard_list=$(uci get wifidogx.$group.wildcard_domain) if [ ! -z "$group_wildcard_list" ]; then trusted_wildcard_domains="$trusted_wildcard_domains $group_wildcard_list" fi done fi # set above variables to config file echo "DeviceID $device_id" > ${CONFIGFILE} echo "AuthServer { Hostname $auth_server_hostname HTTPPort $auth_server_port Path $auth_server_path }" >> ${CONFIGFILE} echo "CheckInterval $check_interval" >> ${CONFIGFILE} echo "ClientTimeout $client_timeout" >> ${CONFIGFILE} echo "JsFilter $js_filter" >> ${CONFIGFILE} echo "WiredPassed $wired_passed" >> ${CONFIGFILE} echo "BypassAppleCNA $apple_cna" >> ${CONFIGFILE} echo "EnableDNSForward $enable_dns_forward" >> ${CONFIGFILE} echo "EnableWS $enable_websocket" >> ${CONFIGFILE} # if has trusted_domains, parse the list to a string with ',' as separator and add it to config file if [ ! -z "$trusted_domains" ]; then trusted_domains=$(echo $trusted_domains | tr ' ' ',') echo "TrustedDomains $trusted_domains" >> ${CONFIGFILE} fi # if has trusted_macs, add it to config file if [ ! -z "$trusted_macs" ]; then trusted_macs=$(echo $trusted_macs | tr ' ' ',') echo "TrustedMACList $trusted_macs" >> ${CONFIGFILE} fi # if has trusted_wildcard_domains, add it to config file if [ ! -z "$trusted_wildcard_domains" ]; then trusted_wildcard_domains=$(echo $trusted_wildcard_domains | tr ' ' ',') echo "TrustedPanDomains $trusted_wildcard_domains" >> ${CONFIGFILE} fi config_foreach handle_gateway gateway } start_service() { config_load $NAME prepare_wifidog_conf [ "$enabled" -eq 0 ] && { echo "wifidogx is disabled, exit..." >&2 return } procd_open_instance # -f: run in foreground procd_set_param command $PROG -c $CONFIGFILE -s -f -d $log_level procd_set_param respawn # respawn automatically if something died procd_set_param file /etc/config/wifidogx procd_close_instance } status_service() { /usr/bin/wdctlx status } reload_service() { stop start } service_triggers() { procd_add_reload_trigger "${NAME}" procd_add_interface_trigger "interface.*.up" "wan" /etc/init.d/wifidogx restart }