You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.6 KiB

  1. #!/bin/sh /etc/rc.common
  2. # Copyright 2019 Stan Grishin (stangri@melmac.net)
  3. # shellcheck disable=SC2039
  4. export START=80
  5. export USE_PROCD=1
  6. PROG=/usr/sbin/https_dns_proxy
  7. xappend() { param="$param $1"; }
  8. append_parm() {
  9. local section="$1"
  10. local option="$2"
  11. local switch="$3"
  12. local default="$4"
  13. local _loctmp
  14. config_get _loctmp "$section" "$option" "$default"
  15. [ -z "$_loctmp" ] && return 0
  16. xappend "$switch $_loctmp"
  17. }
  18. start_instance() {
  19. local cfg="$1" param listen_addr listen_port
  20. append_parm "$cfg" 'listen_addr' '-a' '127.0.0.1'
  21. append_parm "$cfg" 'listen_port' '-p' "$p"
  22. append_parm "$cfg" 'bootstrap_dns' '-b'
  23. append_parm "$cfg" 'url_prefix' '-r'
  24. append_parm "$cfg" 'user' '-u' 'nobody'
  25. append_parm "$cfg" 'group' '-g' 'nogroup'
  26. append_parm "$cfg" 'subnet_addr' '-e'
  27. append_parm "$cfg" 'proxy_server' '-t'
  28. procd_open_instance
  29. # shellcheck disable=SC2086
  30. procd_set_param command ${PROG} ${param}
  31. procd_set_param respawn
  32. procd_close_instance
  33. config_get listen_addr "$cfg" 'listen_addr' '127.0.0.1'
  34. config_get listen_port "$cfg" 'listen_port' "$p"
  35. config_load 'dhcp'
  36. # shellcheck disable=SC2154
  37. config_foreach dnsmasq_add_doh_server 'dnsmasq' "${listen_addr}#${listen_port}"
  38. p="$((p+1))"
  39. }
  40. service_triggers() {
  41. procd_add_reload_trigger 'https_dns_proxy'
  42. }
  43. start_service() {
  44. local p=5053
  45. dhcp_backup 'create'
  46. config_load 'https_dns_proxy'
  47. config_foreach start_instance 'https_dns_proxy'
  48. if [ -z "$(uci -q get dhcp.@dnsmasq[0].server)" ]; then
  49. dhcp_backup 'restore'
  50. fi
  51. if [ -n "$(uci -q changes dhcp)" ]; then
  52. uci -q commit dhcp
  53. [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
  54. fi
  55. }
  56. stop_service() {
  57. dhcp_backup 'restore'
  58. if [ -n "$(uci -q changes dhcp)" ]; then
  59. uci -q commit dhcp
  60. [ -x /etc/init.d/dnsmasq ] && /etc/init.d/dnsmasq restart >/dev/null 2>&1
  61. fi
  62. }
  63. dnsmasq_add_doh_server() {
  64. local cfg="$1" value="$2"
  65. uci -q add_list dhcp."$cfg".server="$value"
  66. }
  67. dnsmasq_create_server_backup() {
  68. local cfg="$1" i
  69. if ! uci -q get "dhcp.$cfg.doh_backup_server" >/dev/null; then
  70. for i in $(uci -q get "dhcp.$cfg.server"); do
  71. uci -q add_list dhcp."$cfg".doh_backup_server="$i"
  72. done
  73. fi
  74. uci -q del "dhcp.$cfg.server"
  75. }
  76. dnsmasq_restore_server_backup() {
  77. local cfg="$1" i
  78. if uci -q get "dhcp.$cfg.doh_backup_server" >/dev/null; then
  79. uci -q del "dhcp.$cfg.server"
  80. for i in $(uci -q get "dhcp.$cfg.doh_backup_server"); do
  81. uci -q add_list dhcp."$cfg".server="$i"
  82. done
  83. fi
  84. }
  85. dhcp_backup() {
  86. config_load 'dhcp'
  87. case "$1" in
  88. create)
  89. config_foreach dnsmasq_create_server_backup 'dnsmasq';;
  90. restore)
  91. config_foreach dnsmasq_restore_server_backup 'dnsmasq';;
  92. esac
  93. }