core.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # Copyright (C) 2009-2010 OpenWrt.org
  2. FW_LIBDIR=${FW_LIBDIR:-/lib/firewall}
  3. . $FW_LIBDIR/fw.sh
  4. include /lib/network
  5. fw_start() {
  6. fw_init
  7. FW_DEFAULTS_APPLIED=
  8. fw_is_loaded && {
  9. echo "firewall already loaded" >&2
  10. exit 1
  11. }
  12. uci_set_state firewall core "" firewall_state
  13. fw_clear DROP
  14. fw_callback pre core
  15. echo "Loading defaults"
  16. fw_config_once fw_load_defaults defaults
  17. echo "Loading zones"
  18. config_foreach fw_load_zone zone
  19. echo "Loading forwardings"
  20. config_foreach fw_load_forwarding forwarding
  21. echo "Loading redirects"
  22. config_foreach fw_load_redirect redirect
  23. echo "Loading rules"
  24. config_foreach fw_load_rule rule
  25. echo "Loading includes"
  26. config_foreach fw_load_include include
  27. [ -z "$FW_NOTRACK_DISABLED" ] && {
  28. echo "Optimizing conntrack"
  29. config_foreach fw_load_notrack_zone zone
  30. }
  31. echo "Loading interfaces"
  32. config_foreach fw_configure_interface interface add
  33. fw_callback post core
  34. uci_set_state firewall core zones "$FW_ZONES"
  35. uci_set_state firewall core loaded 1
  36. }
  37. fw_stop() {
  38. fw_init
  39. fw_callback pre stop
  40. local z n i
  41. config_get z core zones
  42. for z in $z; do
  43. config_get n core "${z}_networks"
  44. for n in $n; do
  45. config_get i core "${n}_ifname"
  46. [ -n "$i" ] && env -i ACTION=remove ZONE="$z" \
  47. INTERFACE="$n" DEVICE="$i" /sbin/hotplug-call firewall
  48. done
  49. done
  50. fw_clear ACCEPT
  51. fw_callback post stop
  52. uci_revert_state firewall
  53. config_clear
  54. local h
  55. for h in $FW_HOOKS; do unset $h; done
  56. unset FW_HOOKS
  57. unset FW_INITIALIZED
  58. }
  59. fw_restart() {
  60. fw_stop
  61. fw_start
  62. }
  63. fw_reload() {
  64. fw_restart
  65. }
  66. fw_is_loaded() {
  67. local bool=$(uci_get_state firewall.core.loaded)
  68. return $((! ${bool:-0}))
  69. }
  70. fw_die() {
  71. echo "Error:" "$@" >&2
  72. fw_log error "$@"
  73. fw_stop
  74. exit 1
  75. }
  76. fw_log() {
  77. local level="$1"
  78. [ -n "$2" ] && shift || level=notice
  79. [ "$level" != error ] || echo "Error: $@" >&2
  80. logger -t firewall -p user.$level "$@"
  81. }
  82. fw_init() {
  83. [ -z "$FW_INITIALIZED" ] || return 0
  84. . $FW_LIBDIR/config.sh
  85. scan_interfaces
  86. fw_config_append firewall
  87. local hooks="core stop defaults zone notrack synflood"
  88. local file lib hk pp
  89. for file in $FW_LIBDIR/core_*.sh; do
  90. . $file
  91. hk=$(basename $file .sh)
  92. hk=${hk#core_}
  93. append hooks $hk
  94. done
  95. for file in $FW_LIBDIR/*.sh; do
  96. lib=$(basename $file .sh)
  97. lib=${lib##[0-9][0-9]_}
  98. case $lib in
  99. core*|fw|config|uci_firewall) continue ;;
  100. esac
  101. . $file
  102. for hk in $hooks; do
  103. for pp in pre post; do
  104. type ${lib}_${pp}_${hk}_cb >/dev/null && {
  105. append FW_CB_${pp}_${hk} ${lib}
  106. append FW_HOOKS FW_CB_${pp}_${hk}
  107. }
  108. done
  109. done
  110. done
  111. fw_callback post init
  112. FW_INITIALIZED=1
  113. return 0
  114. }