@@ -468,6 +468,7 @@ mwan4_get_iface_list() {
468468 local iface_list=" "
469469 mwan4_is_installed || return 1
470470
471+ # shellcheck disable=SC2329
471472 _mwan4_collect_iface () {
472473 local en
473474 config_get_bool en " $1 " ' enabled' ' 0'
@@ -485,6 +486,7 @@ mwan4_get_strategy_list() {
485486 local strategy_list=" "
486487 mwan4_is_installed || return 1
487488
489+ # shellcheck disable=SC2329
488490 _mwan4_collect_strategy () { strategy_list=" ${strategy_list}${1} " ; }
489491 config_load ' mwan4'
490492 config_foreach _mwan4_collect_strategy ' strategy'
@@ -704,6 +706,7 @@ process_url() {
704706}
705707
706708load_package_config () {
709+ [ -n " $loadPackageConfigFlag " ] && return 0
707710 local param=" $1 "
708711 config_load " $packageName "
709712 config_get config_compat ' config' ' config_compat'
@@ -850,7 +853,7 @@ load_environment() {
850853 case " $param " in
851854 on_boot|on_start)
852855 output 1 " Loading environment ($param ) "
853- [ -n " $loadPackageConfigFlag " ] || load_package_config " $param "
856+ load_package_config " $param "
854857 if [ -z " $enabled " ]; then
855858 output 1 " $_FAIL_ \n"
856859 json add error ' errorServiceDisabled'
@@ -872,11 +875,11 @@ load_environment() {
872875 output 1 " $_OK_ \n"
873876 ;;
874877 on_triggers)
875- [ -n " $loadPackageConfigFlag " ] || load_package_config " $param "
878+ load_package_config " $param "
876879 ;;
877880 on_interface_reload|on_reload|on_stop|* )
878881 output 1 " Loading environment ($param ) "
879- [ -n " $loadPackageConfigFlag " ] || load_package_config " $param "
882+ load_package_config " $param "
880883 load_network " $param "
881884 resolver ' check_support'
882885 output 1 " $_OK_ \n"
@@ -1481,6 +1484,7 @@ resolver() {
14811484
14821485netifd () {
14831486 # Usage: netifd install [iface] | netifd remove [iface] | netifd uninstall
1487+ # shellcheck disable=SC2329
14841488 _netifd_process_interface () {
14851489 local iface=" $1 " action=" ${2:- install} "
14861490 # Normalize table name for split uplink scenarios
@@ -1578,6 +1582,7 @@ netifd() {
15781582 nft add rule inet " $nftTable " " ${nftPrefix} _mark_${_mark} ${nftRuleParams} meta mark set (meta mark & ${fw_maskXor} ) | ${_mark} "
15791583 nft add rule inet " $nftTable " " ${nftPrefix} _mark_${_mark} return"
15801584 fi
1585+ # shellcheck disable=SC2155
15811586 local dscp=" $( uci_get " $packageName " ' config' " ${iface} _dscp" ) "
15821587 if [ " ${dscp:- 0} " -ge ' 1' ] && [ " ${dscp:- 0} " -le ' 63' ]; then
15831588 if ! is_split_uplink || ! is_uplink6 " $iface " ; then
@@ -1614,16 +1619,20 @@ netifd() {
16141619 fi
16151620 }
16161621
1617- load_package_config
1618- json ' init'
1619-
1622+ local _uplinkMark _uplinkPriority _uplinkTableID
16201623 local action=" ${1:- install} "
16211624 local target_iface=" $2 "
1625+
1626+ load_package_config " on_netifd_${action} "
1627+ json ' init'
1628+
1629+ # shellcheck disable=SC2155
16221630 local lan_priority=" $(( uplink_ip_rules_priority + 1000 )) "
1631+ # shellcheck disable=SC2155
16231632 local mark=" $( printf ' 0x%06x' " $uplink_mark " ) "
16241633 local priority=" $uplink_ip_rules_priority "
1634+ # shellcheck disable=SC2155
16251635 local tid=" $( get_rt_tables_non_pbr_next_id) "
1626- local _uplinkMark _uplinkPriority _uplinkTableID
16271636
16281637 case " $action " in
16291638 check)
@@ -1694,8 +1703,12 @@ netifd() {
16941703 uci_commit " $packageName "
16951704 uci_commit ' network'
16961705 sync
1697- output " Restarting network ${action: +(on_${action} ) } "
1698- { /etc/init.d/network ' reload' ; /etc/init.d/firewall ' reload' ; } > /dev/null 2>&1 && output_okbn || output_failn
1706+ output " Reloading network and firewall ${action: +(on_${action} ) } "
1707+ if { /etc/init.d/network ' reload' && /etc/init.d/firewall ' reload' ; } > /dev/null 2>&1 ; then
1708+ output_okbn
1709+ else
1710+ output_failn
1711+ fi
16991712}
17001713
17011714# original idea by @egc112: https://github.com/egc112/OpenWRT-egc-add-on/tree/main/stop-dns-leak
@@ -1708,6 +1721,12 @@ dns_policy_routing() {
17081721 local dest_dns_ipv4=" $6 " dest_dns_ipv6=" $7 "
17091722 local chain=' dstnat' iface=' dns'
17101723
1724+ if [ -z " $src_addr " ]; then
1725+ processDnsPolicyError=' true'
1726+ json add error ' errorPolicyNoSrcDest' " $name "
1727+ return 1
1728+ fi
1729+
17111730 if [ -z " ${dest_dns_ipv4}${dest_dns_ipv6} " ]; then
17121731 processDnsPolicyError=' true'
17131732 json add error ' errorPolicyProcessNoInterfaceDns' " '$dest_dns '"
@@ -1816,6 +1835,12 @@ policy_routing() {
18161835 chain=" ${chain:- prerouting} "
18171836 mark=$( eval echo " \$ mark_${iface// -/ _} " )
18181837
1838+ if [ -z " ${src_addr}${dest_addr}${src_port}${dest_port}${proto} " ]; then
1839+ processPolicyError=' true'
1840+ json add error ' errorPolicyNoSrcDest' " $name "
1841+ return 1
1842+ fi
1843+
18191844 if [ -z " $ipv6_enabled " ] && \
18201845 { is_ipv6 " $( str_first_word " $src_addr " ) " || is_ipv6 " $( str_first_word " $dest_addr " ) " ; }; then
18211846 processPolicyError=' true'
@@ -1991,8 +2016,14 @@ policy_routing() {
19912016 for dest_i in dest_udp_53 dest_tcp_80 dest_udp_80 dest_tcp_443 dest_udp_443; do
19922017 eval " dest4=\$ $dest_i "
19932018 eval " dest6=\$ $dest_i "
1994- nft4 " $param4 " " $dest4 " || ipv4_error=' 1'
1995- nft6 " $param6 " " $dest6 " || ipv6_error=' 1'
2019+ if [ " $filter_group_src_addr " != ' ipv6' ] && [ " $filter_group_src_addr " != ' ipv6_negative' ] && \
2020+ [ " $filter_group_dest_addr " != ' ipv6' ] && [ " $filter_group_dest_addr " != ' ipv6_negative' ]; then
2021+ nft4 " $param4 " " $dest4 " || ipv4_error=' 1'
2022+ fi
2023+ if [ " $filter_group_src_addr " != ' ipv4' ] && [ " $filter_group_src_addr " != ' ipv4_negative' ] && \
2024+ [ " $filter_group_dest_addr " != ' ipv4' ] && [ " $filter_group_dest_addr " != ' ipv4_negative' ]; then
2025+ nft6 " $param6 " " $dest6 " || ipv6_error=' 1'
2026+ fi
19962027 if [ -n " $ipv6_enabled " ] && [ " $ipv4_error " -eq ' 1' ] && [ " $ipv6_error " -eq ' 1' ]; then
19972028 processPolicyError=' true'
19982029 json add error ' errorPolicyProcessInsertionFailed' " $name "
@@ -2078,10 +2109,6 @@ dns_policy_process() {
20782109
20792110 unset processDnsPolicyError
20802111 output 2 " Routing '$name ' DNS to $dest_dns :$dest_dns_port "
2081- if [ -z " $src_addr " ]; then
2082- json add error ' errorPolicyNoSrcDest' " $name "
2083- output_fail; return 1;
2084- fi
20852112 if [ -z " $dest_dns " ]; then
20862113 json add error ' errorPolicyNoDns' " $name "
20872114 output_fail; return 1;
@@ -2253,7 +2280,9 @@ interface_routing() {
22532280 ip -4 route flush table " $tid " > /dev/null 2>&1
22542281
22552282 if [ -n " $gw4 " ] || [ -n " $strict_enforcement " ]; then
2256- if [ -z " $gw4 " ]; then
2283+ if [ -z " $gw4 " ] && ip address show dev " $dev4 " 2> /dev/null | grep -q " POINTOPOINT" ; then
2284+ try ip -4 route replace default dev " $dev4 " table " $tid " || ipv4_error=1
2285+ elif [ -z " $gw4 " ]; then
22572286 try ip -4 route replace unreachable default table " $tid " || ipv4_error=1
22582287 else
22592288 try ip -4 route replace default via " $gw4 " dev " $dev4 " table " $tid " || ipv4_error=1
@@ -2274,7 +2303,9 @@ interface_routing() {
22742303 ip -6 route flush table " $tid " > /dev/null 2>&1
22752304
22762305 if { [ -n " $gw6 " ] && [ " $gw6 " != " ::/0" ]; } || [ -n " $strict_enforcement " ]; then
2277- if [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; then
2306+ if { [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; } && ip address show dev " $dev6 " 2> /dev/null | grep -q " POINTOPOINT" ; then
2307+ try ip -6 route replace default dev " $dev6 " table " $tid " metric " $uplink_interface6_metric " || ipv6_error=1
2308+ elif [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; then
22782309 try ip -6 route replace unreachable default table " $tid " || ipv6_error=1
22792310 elif ip -6 route list table main | grep -q " dev $dev6 " ; then
22802311 if ip -6 address show dev " $dev6 " | grep -q " BROADCAST" ; then
@@ -2338,7 +2369,9 @@ interface_routing() {
23382369 ip -4 rule flush fwmark " ${mark} /${fw_mask} " table " $tid " > /dev/null 2>&1
23392370 ip -4 route flush table " $tid " > /dev/null 2>&1
23402371 if [ -n " $gw4 " ] || [ -n " $strict_enforcement " ]; then
2341- if [ -z " $gw4 " ]; then
2372+ if [ -z " $gw4 " ] && ip address show dev " $dev4 " 2> /dev/null | grep -q " POINTOPOINT" ; then
2373+ try ip -4 route replace default dev " $dev4 " table " $tid " || ipv4_error=1
2374+ elif [ -z " $gw4 " ]; then
23422375 try ip -4 route replace unreachable default table " $tid " || ipv4_error=1
23432376 else
23442377 try ip -4 route replace default via " $gw4 " dev " $dev4 " table " $tid " || ipv4_error=1
@@ -2358,7 +2391,9 @@ interface_routing() {
23582391 ip -6 rule flush fwmark " ${mark} /${fw_mask} " table " $tid " > /dev/null 2>&1
23592392 ip -6 route flush table " $tid " > /dev/null 2>&1
23602393 if { [ -n " $gw6 " ] && [ " $gw6 " != " ::/0" ]; } || [ -n " $strict_enforcement " ]; then
2361- if [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; then
2394+ if { [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; } && ip address show dev " $dev6 " 2> /dev/null | grep -q " POINTOPOINT" ; then
2395+ try ip -6 route replace default dev " $dev6 " table " $tid " metric " $uplink_interface6_metric " || ipv6_error=1
2396+ elif [ -z " $gw6 " ] || [ " $gw6 " = " ::/0" ]; then
23622397 try ip -6 route replace unreachable default table " $tid " || ipv6_error=1
23632398 elif ip -6 route list table main | grep -q " dev $dev6 " ; then
23642399 if ip -6 address show dev " $dev6 " | grep -q " BROADCAST" ; then
@@ -2427,6 +2462,7 @@ process_interface() {
24272462 return 0
24282463 ;;
24292464 create_global_rules)
2465+ # shellcheck disable=SC2329
24302466 _wg_server () {
24312467 local iface=" $1 "
24322468 if is_wg_server " $iface " && ! is_ignored_interface " $iface " ; then
@@ -2750,30 +2786,33 @@ user_file_process() {
27502786}
27512787
27522788boot () {
2789+ load_package_config ' on_boot'
27532790 nft_file ' delete' ' main'
2754- rc_procd start_service ' on_boot' && service_started ' on_boot'
2791+ [ -n " $enabled " ] || return 0
2792+ rc_procd start_service ' on_boot'
2793+ service_started ' on_boot'
27552794}
27562795
27572796on_interface_reload () {
2758- if ! exists_lockfile; then
2759- logger -t " $packageName " " Reload on interface change aborted: service is stopped."
2760- return 0
2761- else
2762- rc_procd start_service ' on_interface_reload' " $1 "
2763- fi
2797+ exists_lockfile || return 1
2798+ rc_procd start_service ' on_interface_reload' " $1 "
2799+ service_started ' on_interface_reload'
27642800}
27652801
27662802start_service () {
27672803 local param=" $1 "
27682804 local resolverStoredHash resolverNewHash reloadedIface
27692805 local i k
27702806
2771- load_package_config " $param "
2772- stop_forward
27732807 [ " $param " = ' on_boot' ] && pbrBootFlag=1 && return 0
2808+
27742809 json init
2775- load_environment " ${ param:- on_start} " " $( load_validate_config ) " || return 1
2810+ load_package_config " $param "
27762811
2812+ trap ' enable_forward' EXIT
2813+ stop_forward
2814+
2815+ load_environment " ${param:- on_start} " " $( load_validate_config) " || return 1
27772816 output " Processing environment (${param:- on_start} ) "
27782817 if ! is_wan_up " $param " ; then
27792818 output_failn
@@ -2898,7 +2937,7 @@ start_service() {
28982937
28992938 json_add_int ' packageCompat' " $packageCompat "
29002939 json_add_object ' status'
2901- [ -n " $gatewaySummary " ] && json_add_string ' gateways' " $gatewaySummary " || json add error ' errorNoGateways'
2940+ if [ -n " $gatewaySummary " ]; then json_add_string ' gateways' " $gatewaySummary " ; else json_add_error ' errorNoGateways' ; fi
29022941 json_close_object
29032942 json_add_array ' errors'
29042943 for k in $( json get errors) ; do
@@ -2921,13 +2960,14 @@ start_service() {
29212960 fi
29222961 procd_close_data
29232962 procd_close_instance
2924- enable_forward
29252963}
29262964
29272965service_running () { is_service_running; }
29282966service_started () {
2929- [ -n " $pbrBootFlag " ] && return 0
29302967 local error warning c
2968+ enable_forward
2969+ trap - EXIT
2970+ [ -n " $pbrBootFlag " ] && return 0
29312971 if nft_file ' exists' ' main' ; then
29322972 resolver ' compare_hash' && resolver ' restart'
29332973 [ -n " $gatewaySummary " ] && output " $serviceName started with gateways:\n${gatewaySummary} "
@@ -2964,12 +3004,15 @@ service_started() {
29643004}
29653005service_stopped () { procd_set_config_changed firewall; }
29663006
2967- # shellcheck disable=SC2015
29683007service_triggers () {
29693008 local n
29703009 if [ -n " $pbrBootFlag " ]; then
29713010 output " Setting trigger (on_boot) "
2972- procd_add_raw_trigger " interface.*.up" " $procd_boot_trigger_delay " " /etc/init.d/${packageName} " start && output_okn || output_failn
3011+ if procd_add_raw_trigger " interface.*.up" " $procd_boot_trigger_delay " " /etc/init.d/${packageName} " start; then
3012+ output_okn
3013+ else
3014+ output_failn
3015+ fi
29733016 else
29743017 PROCD_RELOAD_DELAY=$(( procd_reload_delay * 1000 ))
29753018 procd_open_validate
@@ -2985,7 +3028,11 @@ service_triggers() {
29853028 output 1 " Setting interface triggers "
29863029 for n in $ifacesTriggers ; do
29873030 output 2 " Setting interface trigger for $n "
2988- procd_add_interface_trigger " interface.*" " $n " " /etc/init.d/${packageName} " on_interface_reload " $n " && output_ok || output_fail
3031+ if procd_add_interface_trigger " interface.*" " $n " " /etc/init.d/${packageName} " on_interface_reload " $n " ; then
3032+ output_ok
3033+ else
3034+ output_fail
3035+ fi
29893036 done
29903037 output_1_newline
29913038 fi
@@ -2996,7 +3043,6 @@ service_triggers() {
29963043 fi
29973044}
29983045
2999- # shellcheck disable=SC2015
30003046stop_service () {
30013047 local i nft_file_mode
30023048 json init
@@ -3035,13 +3081,15 @@ stop_service() {
30353081}
30363082
30373083restart () {
3038- load_package_config
3084+ load_package_config ' on_restart'
3085+ trap ' enable_forward' EXIT
30393086 stop_forward
30403087 stop
30413088 # it takes time before routes are cleaned up, if started immediately a leak can occur
30423089 [ -n " $strict_enforcement " ] && sleep 2
30433090 start
30443091 enable_forward
3092+ trap - EXIT
30453093}
30463094
30473095version () { echo " $PKG_VERSION " ; }
0 commit comments