| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame] | 1 | #!/bin/sh /etc/rc.common |
| 2 | |
| 3 | # Startup before dnsmasq |
| 4 | START=18 |
| 5 | USE_PROCD=1 |
| 6 | PROG=/usr/sbin/dnscrypt-proxy |
| 7 | CONFIG_DIR=/var/etc |
| 8 | USER=nobody |
| 9 | |
| 10 | boot() { |
| 11 | dnscrypt_boot=1 |
| 12 | rc_procd start_service |
| 13 | } |
| 14 | |
| 15 | dnscrypt_instance() { |
| 16 | local config_path="$CONFIG_DIR/dnscrypt-proxy-$1.conf" |
| 17 | create_config_file $1 "$config_path" |
| 18 | |
| 19 | procd_open_instance |
| 20 | procd_set_param command $PROG "$config_path" |
| 21 | procd_close_instance |
| 22 | } |
| 23 | |
| 24 | create_config_file() { |
| 25 | local address port resolver resolvers_list ephemeral_keys client_key log_level syslog syslog_prefix local_cache query_log_file block_ipv6 provider_name provider_key resolver_address |
| 26 | local config_path="$2" |
| 27 | local plugins_support_enabled=$(dnscrypt-proxy --version | grep 'Support for plugins: present' | wc -l) |
| 28 | |
| 29 | [ ! -d "$CONFIG_DIR" ] && mkdir -p "$CONFIG_DIR" |
| 30 | [ -f "$config_path" ] && rm "$config_path" |
| 31 | |
| 32 | config_get address $1 'address' '127.0.0.1' |
| 33 | config_get port $1 'port' '5353' |
| 34 | config_get resolver $1 'resolver' '' |
| 35 | config_get provider_name $1 'providername' '' |
| 36 | config_get provider_key $1 'providerkey' '' |
| 37 | config_get resolver_address $1 'resolveraddress' '' |
| 38 | config_get resolvers_list $1 'resolvers_list' '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv' |
| 39 | config_get client_key $1 'client_key' '' |
| 40 | config_get syslog_prefix $1 'syslog_prefix' 'dnscrypt-proxy' |
| 41 | config_get query_log_file $1 'query_log_file' '' |
| 42 | config_get log_level $1 'log_level' '6' |
| 43 | config_get blacklist $1 'blacklist' '' |
| 44 | config_get_bool syslog $1 'syslog' '1' |
| 45 | config_get_bool ephemeral_keys $1 'ephemeral_keys' '0' |
| 46 | config_get_bool local_cache $1 'local_cache' '0' |
| 47 | config_get_bool block_ipv6 $1 'block_ipv6' '0' |
| 48 | |
| 49 | append_param_not_empty "ResolverName" "$resolver" $config_path |
| 50 | append_param "ResolversList" "$resolvers_list" $config_path |
| 51 | append_param_not_empty "ProviderName" "$provider_name" $config_path |
| 52 | append_param_not_empty "ProviderKey" "$provider_key" $config_path |
| 53 | append_param_not_empty "ResolverAddress" "$resolver_address" $config_path |
| 54 | append_param "User" "$USER" $config_path |
| 55 | append_param "LocalAddress" "$address:$port" $config_path |
| 56 | append_param_not_empty "ClientKey" "$client_key" $config_path |
| 57 | append_on_off "EphemeralKeys" $ephemeral_keys $config_path |
| 58 | append_param "LogLevel" "$log_level" $config_path |
| 59 | append_on_off "Syslog" $syslog $config_path |
| 60 | append_param "SyslogPrefix" "$syslog_prefix" $config_path |
| 61 | append_on_off "LocalCache" $local_cache $config_path |
| 62 | append_param_not_empty "QueryLogFile" "$query_log_file" $config_path |
| 63 | |
| 64 | if [ $plugins_support_enabled -ne 0 ] && [ $block_ipv6 -ne 0 ] |
| 65 | then |
| 66 | append_yes_no "BlockIPv6" $block_ipv6 $config_path |
| 67 | elif [ $block_ipv6 -ne 0 ] |
| 68 | then |
| 69 | log_ignored_param "block_ipv6" |
| 70 | fi |
| 71 | |
| 72 | if [ $plugins_support_enabled -ne 0 ] && [ -n "$blacklist" ] |
| 73 | then |
| 74 | config_list_foreach $1 'blacklist' append_blacklists $config_path |
| 75 | elif [ -n "$blacklist" ] |
| 76 | then |
| 77 | log_ignored_param "blacklist" |
| 78 | fi |
| 79 | } |
| 80 | |
| 81 | log_ignored_param() { |
| 82 | local param_name=$1 |
| 83 | logger -t dnscrypt-proxy -p user.warn "dnscrypt-proxy plugins support not present, ignoring '$param_name' parameter." |
| 84 | } |
| 85 | |
| 86 | append_on_off() { |
| 87 | local param_name=$1 |
| 88 | local param_value=$2 |
| 89 | local config_path=$3 |
| 90 | local value |
| 91 | |
| 92 | if [ $param_value -eq 1 ] |
| 93 | then |
| 94 | value="on" |
| 95 | else |
| 96 | value="off" |
| 97 | fi |
| 98 | |
| 99 | echo "$param_name $value" >> $config_path |
| 100 | } |
| 101 | |
| 102 | append_yes_no() { |
| 103 | local param_name=$1 |
| 104 | local param_value=$2 |
| 105 | local config_path=$3 |
| 106 | local value |
| 107 | |
| 108 | if [ $param_value -eq 1 ] |
| 109 | then |
| 110 | value="yes" |
| 111 | else |
| 112 | value="no" |
| 113 | fi |
| 114 | |
| 115 | echo "$param_name $value" >> $config_path |
| 116 | } |
| 117 | |
| 118 | append_param() { |
| 119 | local param_name=$1 |
| 120 | local param_value=$2 |
| 121 | local config_path=$3 |
| 122 | |
| 123 | echo "$param_name $param_value" >> $config_path |
| 124 | } |
| 125 | |
| 126 | append_param_not_empty() { |
| 127 | local param_name=$1 |
| 128 | local param_value=$2 |
| 129 | local config_path=$3 |
| 130 | |
| 131 | if [ ! -z "$param_value" -a "$param_value" != " " ] |
| 132 | then |
| 133 | append_param "$param_name" "$param_value" "$config_path" |
| 134 | fi |
| 135 | } |
| 136 | |
| 137 | append_blacklists() { |
| 138 | local value="$1" |
| 139 | local config_path="$2" |
| 140 | append_param_not_empty "BlackList" "$value" $config_path |
| 141 | } |
| 142 | |
| 143 | start_service() { |
| 144 | if [ -n "${dnscrypt_boot}" ] |
| 145 | then |
| 146 | return 0 |
| 147 | fi |
| 148 | config_load dnscrypt-proxy |
| 149 | config_foreach dnscrypt_instance dnscrypt-proxy |
| 150 | } |
| 151 | |
| 152 | service_triggers() { |
| 153 | local trigger |
| 154 | local triggerlist="$(uci_get dnscrypt-proxy.@global[0].procd_trigger)" |
| 155 | |
| 156 | PROCD_RELOAD_DELAY=2000 |
| 157 | if [ -n "${triggerlist}" ] |
| 158 | then |
| 159 | for trigger in ${triggerlist} |
| 160 | do |
| 161 | procd_add_interface_trigger "interface.*.up" "${trigger}" /etc/init.d/dnscrypt-proxy reload |
| 162 | done |
| 163 | else |
| 164 | procd_add_raw_trigger "interface.*.up" 2000 /etc/init.d/dnscrypt-proxy reload |
| 165 | fi |
| 166 | procd_add_reload_trigger 'dnscrypt-proxy' |
| 167 | } |