b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | #!/bin/sh /etc/rc.common |
| 2 | |
| 3 | START=95 |
| 4 | STOP=10 |
| 5 | |
| 6 | PIDFILE=/var/run/privoxy.pid |
| 7 | CFGFILE=/var/etc/privoxy.conf |
| 8 | CFGTEMP=/var/etc/privoxy.conf.tmp |
| 9 | |
| 10 | _uci2conf() { |
| 11 | # redefined callback for options when calling config_load |
| 12 | config_cb() { |
| 13 | if [ ."$2" != ."privoxy" ]; then |
| 14 | option_cb() { return 0; } |
| 15 | else |
| 16 | option_cb() |
| 17 | { |
| 18 | # $1 name of variable |
| 19 | # $2 value |
| 20 | local __OPT="$1" |
| 21 | local __VAL="$2" |
| 22 | case $__OPT in |
| 23 | confdir|templdir|temporary_directory|logdir|logfile) |
| 24 | # needs to be handled separately because we need to set permissions |
| 25 | # AND needs to be defined first because of a BUG inside privoxy |
| 26 | # require directories to be defined first inside config |
| 27 | ;; |
| 28 | debug_*) |
| 29 | [ $__VAL -eq 0 ] && return # not set ignore |
| 30 | echo -e "debug\t$(echo $__OPT | sed -e 's#debug_##g')" >> $CFGTEMP ;; |
| 31 | *) |
| 32 | # detect list options (LENGTH) and ignore |
| 33 | echo $__OPT | grep -i "_LENGTH" >/dev/null 2>&1 && return |
| 34 | # detect list options (ITEM) and ignore |
| 35 | echo $__OPT | grep -i "_ITEM" >/dev/null 2>&1 && __OPT=$(echo $__OPT | sed -e "s#_ITEM.*##g") |
| 36 | # uci only accept "_" but we need "-" |
| 37 | local __OPT=$(echo $__OPT | sed -e "s#_#-#g") |
| 38 | # write to config |
| 39 | echo -e "$__OPT\t$__VAL" >> $CFGTEMP |
| 40 | ;; |
| 41 | esac |
| 42 | } |
| 43 | |
| 44 | list_cb() |
| 45 | { |
| 46 | option_cb "$@" |
| 47 | } |
| 48 | fi |
| 49 | } |
| 50 | |
| 51 | # temporary config file |
| 52 | # privoxy need read access |
| 53 | mkdir -m0755 -p /var/etc |
| 54 | echo "" > $CFGTEMP |
| 55 | chmod 644 $CFGTEMP |
| 56 | chgrp privoxy $CFGTEMP |
| 57 | |
| 58 | echo '### AUTO-GENERATED CONFIGURATION' >> $CFGTEMP |
| 59 | echo '### USED BY PRIVOXY' >> $CFGTEMP |
| 60 | echo '### DO NOT EDIT' >> $CFGTEMP |
| 61 | echo '### SEE /etc/config/privoxy INSTEAD' >> $CFGTEMP |
| 62 | echo '' >> $CFGTEMP |
| 63 | |
| 64 | # logdir and logfile |
| 65 | # privoxy needs read/write access |
| 66 | _LOGDIR=$(uci -q get privoxy.privoxy.logdir) || _LOGDIR="/var/log" |
| 67 | _LOGFILE=$(uci -q get privoxy.privoxy.logfile) || _LOGFILE="privoxy.log" |
| 68 | mkdir -m0755 -p $_LOGDIR |
| 69 | touch $_LOGDIR/$_LOGFILE |
| 70 | chmod 664 $_LOGDIR/$_LOGFILE |
| 71 | chown privoxy:privoxy $_LOGDIR/$_LOGFILE |
| 72 | echo -e "logdir\t$_LOGDIR" >> $CFGTEMP |
| 73 | echo -e "logfile\t$_LOGFILE" >> $CFGTEMP |
| 74 | |
| 75 | # confdir |
| 76 | # privoxy needs read access (possibly write access) |
| 77 | _CONFDIR=$(uci -q get privoxy.privoxy.confdir) || _CONFDIR="/etc/privoxy" |
| 78 | chmod 755 $_CONFDIR |
| 79 | chmod 664 $_CONFDIR/* |
| 80 | chgrp privoxy $_CONFDIR $_CONFDIR/* |
| 81 | echo -e "confdir\t$_CONFDIR" >> $CFGTEMP |
| 82 | |
| 83 | # templdir |
| 84 | # privoxy need read access |
| 85 | _TEMPLDIR=$(uci -q get privoxy.privoxy.templdir) # no default needed |
| 86 | if [ -z "$_TEMPLDIR" ]; then |
| 87 | chmod 755 $_CONFDIR/templates |
| 88 | chmod 644 $_CONFDIR/templates/* |
| 89 | chgrp privoxy $_CONFDIR/templates $_CONFDIR/templates/* |
| 90 | else |
| 91 | chmod 755 $_TEMPLDIR |
| 92 | chmod 644 $_TEMPLDIR/* |
| 93 | chgrp privoxy $_TEMPLDIR $_TEMPLDIR/* |
| 94 | echo -e "templdir\t$_TEMPLDIR" >> $CFGTEMP |
| 95 | fi |
| 96 | |
| 97 | # temporary-directory |
| 98 | # privoxy needs read/write access |
| 99 | _TMP_DIR=$(uci -q get privoxy.privoxy.temporary_directory) # no default needed |
| 100 | if [ -n "$_TMP_DIR" ]; then |
| 101 | mkdir -m0750 -p $_TMP_DIR |
| 102 | chown privoxy:privoxy $_TMP_DIR |
| 103 | echo -e "temporary-directory\t$_TMP_DIR" >> $CFGTEMP |
| 104 | fi |
| 105 | |
| 106 | config_load "privoxy" # calling above option_cb() and write the rest into $CFGTEMP |
| 107 | |
| 108 | # move temp to final privoxy readable configuration |
| 109 | mv -f $CFGTEMP $CFGFILE |
| 110 | return 0 |
| 111 | } |
| 112 | |
| 113 | boot() { |
| 114 | # wait a given time (default 10 seconds) before startup |
| 115 | # to wait for interfaces to come up / not using hotplug events during boot |
| 116 | _start() { |
| 117 | [ $1 -gt 0 ] && { |
| 118 | logger -p daemon.info -t "privoxy[]" "Scheduled startup in $1 seconds" |
| 119 | sleep $1 |
| 120 | } |
| 121 | start |
| 122 | } |
| 123 | |
| 124 | local _DELAY |
| 125 | _DELAY=$(uci_get "privoxy" "system" "boot_delay" "10") |
| 126 | _start $_DELAY & |
| 127 | return 0 |
| 128 | } |
| 129 | |
| 130 | shutdown() { |
| 131 | rm -f /tmp/privoxy.hotplug |
| 132 | stop |
| 133 | } |
| 134 | |
| 135 | start() { |
| 136 | # if already running do nothing |
| 137 | local _PID=$(cat $PIDFILE 2>/dev/null) |
| 138 | kill -1 $_PID 2>/dev/null && return 0 |
| 139 | |
| 140 | _uci2conf |
| 141 | /usr/sbin/privoxy --pidfile $PIDFILE --user privoxy.privoxy $CFGFILE |
| 142 | touch /tmp/privoxy.hotplug |
| 143 | |
| 144 | # verify startup |
| 145 | _PID=$(cat $PIDFILE 2>/dev/null) |
| 146 | kill -1 $_PID 2>/dev/null |
| 147 | local _ERR=$? |
| 148 | [ $_ERR -eq 0 ] \ |
| 149 | && logger -p daemon.notice -t "privoxy[$_PID]" "Started successfully"\ |
| 150 | || logger -p daemon.warn -t "privoxy[]" "Failed to start" |
| 151 | return $_ERR |
| 152 | } |
| 153 | |
| 154 | reload() { |
| 155 | # reload is also used by luci-app-privoxy |
| 156 | local _PID=$(cat $PIDFILE 2>/dev/null) |
| 157 | kill -1 $_PID 2>/dev/null |
| 158 | if [ $? -eq 0 ]; then |
| 159 | # only restart if already running |
| 160 | restart |
| 161 | else |
| 162 | # only start if enabled |
| 163 | enabled && start |
| 164 | fi |
| 165 | return 0 |
| 166 | } |
| 167 | |
| 168 | stop() { |
| 169 | local _PID=$(cat $PIDFILE 2>/dev/null) |
| 170 | kill -15 $_PID 2>/dev/null |
| 171 | sleep 1 # give time to shutdown |
| 172 | local _tmp=$(pgrep /usr/sbin/privoxy | tr "\n" " ") |
| 173 | if [ -z "$_tmp" ]; then |
| 174 | logger -p daemon.notice -t "privoxy[$_PID]" "Shutdown successfully" |
| 175 | else |
| 176 | kill -9 $_tmp # Normally never come here |
| 177 | logger -p daemon.warn -t "privoxy[$_tmp]" "Shutdown forced by KILL" |
| 178 | fi |
| 179 | return 0 |
| 180 | } |