SHOW:
|
|
- or go back to the newest paste.
1 | #!/bin/sh | |
2 | #set -x # uncomment/comment to enable/disable debug mode | |
3 | ||
4 | # name: ddwrt-installer.sh | |
5 | - | # version: 3.2.0, 10-nov-2024, by eibgrad |
5 | + | # version: 3.0.1, 15-aug-2022, by eibgrad |
6 | # purpose: install pastebin script into dd-wrt router | |
7 | ||
8 | # function usage() | |
9 | usage() { | |
10 | echo 'Usage: ddwrt-installer.sh [options] pastebin-id [ext=sh]' | |
11 | echo | |
12 | echo ' Install pastebin script into dd-wrt router.' | |
13 | echo | |
14 | echo ' Installation directory hierarchy:' | |
15 | echo ' </path> (from --dir option)' | |
16 | echo ' /jffs/etc/config' | |
17 | echo ' /tmp' | |
18 | echo | |
19 | echo ' Options:' | |
20 | echo ' --dir PATH installation directory (created as necessary)' | |
21 | echo " --pre NUM add prefix to filename (e.g., '01')" | |
22 | echo ' --nocom remove blank lines and non-functional comments' | |
23 | echo ' --comp same as --nocom, plus remove leading whitespace' | |
24 | echo ' --noprompt silently overwrite files and accept defaults' | |
25 | echo ' --debug install script w/ debugging mode enabled' | |
26 | echo ' -h,--help this usage information' | |
27 | echo | |
28 | echo ' # e.g., install script w/o comments and w/ bash (sh) extension' | |
29 | echo ' ddwrt-installer.sh --nocom MxA19W1M' | |
30 | echo | |
31 | } | |
32 | ||
33 | # function query( message [default-reply] ) | |
34 | query() { | |
35 | local reply | |
36 | ||
37 | read -p "$1 " reply < /dev/tty | |
38 | [ "$reply" ] && echo "$reply" || echo "$2" | |
39 | } | |
40 | ||
41 | # function is_mounted( mounting-point ) | |
42 | is_mounted() { df | grep -Eq "[[:space:]]+${1}$"; } | |
43 | ||
44 | # function customize() | |
45 | customize() { | |
46 | # function _ddwrt_ovpn_split() | |
47 | _ddwrt_ovpn_split() { | |
48 | local route_up | |
49 | local route_down | |
50 | local default_vpn | |
51 | ||
52 | # function __add_directives() | |
53 | __add_directives() { | |
54 | local CONFIG='openvpncl_config' | |
55 | local TEMPF="/tmp/ddwrt-installer.$$.tmp" | |
56 | ||
57 | # retrieve current openvpn client config | |
58 | nvram get $CONFIG | tr -d '\r' > $TEMPF | |
59 | ||
60 | # delete any matching/competing directives (active or inactive) | |
61 | sed -r \ | |
62 | -e '/^([[:space:]]|#|;)*(|--)route-up/d' \ | |
63 | -e '/^([[:space:]]|#|;)*(|--)route-pre-down/d' \ | |
64 | -e '/^([[:space:]]|#|;)*(|--)pull-filter.*redirect-gateway/d' \ | |
65 | -e '/^([[:space:]]|#|;)*(|--)redirect-gateway/d' \ | |
66 | -e '/^([[:space:]]|#|;)*(|--)redirect-private/d' \ | |
67 | -i $TEMPF | |
68 | ||
69 | # delete old banner header and footer | |
70 | sed -i '/ added by ddwrt-installer /d' $TEMPF | |
71 | ||
72 | # configure default gateway (wan or vpn) | |
73 | local com="$([ ${default_vpn+x} ] && echo '#')" | |
74 | ||
75 | # add our directives | |
76 | { | |
77 | echo '# --- begin directives added by ddwrt-installer --- #' | |
78 | echo "route-up ${route_up}" | |
79 | echo "route-pre-down ${route_down}" | |
80 | echo "${com}pull-filter ignore redirect-gateway" | |
81 | echo "${com}redirect-private def1" | |
82 | echo '# ---- end directives added by ddwrt-installer ---- #' | |
83 | } >> $TEMPF | |
84 | ||
85 | # delete blank lines | |
86 | sed -i '/^[[:space:]]*$/d' $TEMPF | |
87 | ||
88 | # update openvpn client config | |
89 | nvram set $CONFIG="$(cat $TEMPF | tr -d '\r')" | |
90 | nvram commit &>/dev/null | |
91 | ||
92 | rm -f $TEMPF | |
93 | } | |
94 | ||
95 | if [ ! ${noprompt+x} ]; then | |
96 | # obtain openvpn default routing preference (default=lan->wan) | |
97 | while :; do | |
98 | case "$(query 'Default routing ([1]=lan->wan 2=lan->vpn)?' '1')" in | |
99 | '1') break;; | |
100 | '2') default_vpn=; break;; | |
101 | esac | |
102 | done | |
103 | fi | |
104 | ||
105 | route_up="$file_dir/route-up" | |
106 | route_down="$file_dir/route-down" | |
107 | ||
108 | # add symbolic links | |
109 | ln -sf "$file" "$route_up" | |
110 | ln -sf "$file" "$route_down" | |
111 | ||
112 | __add_directives | |
113 | } | |
114 | ||
115 | # script-specific customization (optional) | |
116 | case "$pbid" in | |
117 | 'nC27ETsp') _ddwrt_ovpn_split;; | |
118 | 'W2P3TDZT') _ddwrt_ovpn_split;; | |
119 | *) ;; | |
120 | esac | |
121 | } | |
122 | ||
123 | # function exit_1( [message] ) | |
124 | exit_1() { [ "$1" ] && echo "$1"; exit 1; } | |
125 | ||
126 | # function exit_0( [message] ) | |
127 | exit_0() { [ "$1" ] && echo "$1"; exit 0; } | |
128 | ||
129 | # handle help/usage requests | |
130 | for opt; do case $opt in -h|--help) usage; exit 0;; esac; done | |
131 | ||
132 | # try curl, fallback to wget | |
133 | which curl &>/dev/null && GET_URL='curl -sLk' || GET_URL='wget -qO -' | |
134 | ||
135 | # process command line options/arguments | |
136 | while [ $# -gt 0 ]; do | |
137 | case $1 in | |
138 | '--dir') shift; file_dir="${1//[[:space:]]/}";; | |
139 | '--pre') shift; file_pre="${1//[[:space:]]/}";; | |
140 | '--nocom') nocom=; unset comp;; | |
141 | '--comp') comp=; unset nocom;; | |
142 | '--noprompt') noprompt=;; | |
143 | '--debug') debug=;; | |
144 | *) break 2;; | |
145 | esac | |
146 | shift | |
147 | done | |
148 | ||
149 | # set pastebin-id | |
150 | [ "$1" ] && pbid="$1" || exit_0 'info: nothing to do' | |
151 | ||
152 | # set and verify extension | |
153 | ext="$([ "$2" ] && echo "${2//[[:space:]]/}" || echo sh)" | |
154 | echo $ext | grep -q '\.' && exit_1 "error: extension cannot contain '.'" | |
155 | ||
156 | # construct pastebin url for retrieving raw file (obscure from hosting site) | |
157 | url="$(echo wastebin | sed s/w/p/).com/raw/$pbid" | |
158 | ||
159 | if [ ! "$file_dir" ]; then | |
160 | # locate storage | |
161 | if is_mounted '/jffs'; then | |
162 | file_dir='/jffs/etc/config' | |
163 | else | |
164 | file_dir='/tmp' | |
165 | echo 'warning: /jffs not mounted; using /tmp' | |
166 | fi | |
167 | fi | |
168 | ||
169 | # convert cryptic pastebin id to common name | |
170 | case "$pbid" in | |
171 | - | 'gnxtZuqg') file='ddwrt-bind-static-routes-to-wan';; |
171 | + | 'hYwdStCx') file='ddwrt-blacklist-domains';; |
172 | - | 'aySi7RhY') file='ddwrt-blacklist-domains';; |
172 | + | |
173 | 'VDZ32r2D') file='ddwrt-mount-usb-drives';; | |
174 | 'TKdKUmY1') file='ddwrt-ovpn-client-killswitch';; | |
175 | 'iNC273ER') file='ddwrt-ovpn-client-watchdog';; | |
176 | 'gnxtZuqg') file='ddwrt-ovpn-remote-access';; | |
177 | - | '4QyiANWh') file='ddwrt-ovpn-server-watchdog';; |
177 | + | |
178 | 'W2P3TDZT') file='ddwrt-ovpn-split-basic';; | |
179 | '9DUMFJgN') file='ddwrt-pptp-policy-based-routing';; | |
180 | 'NkKUUjsn') file='ddwrt-ultimate-dns-leak-test';; | |
181 | 'NUb73JqK') file='ddwrt-wol-port-forward';; | |
182 | '2gg5ZdRY') file='importvpncl';; | |
183 | *) file="pastebin-$pbid";; | |
184 | esac | |
185 | ||
186 | # check for existing files | |
187 | efiles="$(echo $file_dir/*$file*)" | |
188 | ||
189 | if [ ! ${noprompt+x} ] && [ "$efiles" != "$file_dir/*$file*" ]; then | |
190 | efile_count=0 | |
191 | ||
192 | for efile in $efiles; do | |
193 | echo "warning: existing file: $efile" | |
194 | let efile_count++ | |
195 | done | |
196 | ||
197 | if [ $efile_count -gt 0 ]; then | |
198 | # obtain permission to overwrite existing file(s) | |
199 | while :; do | |
200 | case "$(query 'Overwrite existing file(s) (yes/[no])?' 'no')" in | |
201 | 'yes') break;; | |
202 | 'no') exit_0 'info: installation aborted';; | |
203 | esac | |
204 | done | |
205 | ||
206 | # delete existing files | |
207 | for efile in $efiles; do rm -f $efile; done | |
208 | fi | |
209 | fi | |
210 | ||
211 | # option pre: add prefix to filename | |
212 | [ "$file_pre" ] && file="${file_pre}-$file" | |
213 | ||
214 | # create directory | |
215 | if ! mkdir -p "$file_dir" 2>/dev/null; then | |
216 | exit_1 "error: cannot create directory: $file_dir" | |
217 | fi | |
218 | ||
219 | # construct full path + filename + extension | |
220 | file="$file_dir/$file.$ext" | |
221 | ||
222 | # confirm file can be created through initialization | |
223 | if ! (> "$file") 2>/dev/null; then | |
224 | exit_1 "error: cannot create file: $file" | |
225 | fi | |
226 | ||
227 | # retrieve raw file from pastebin | |
228 | $GET_URL $url | tr -d '\r' > "$file"; echo >> "$file" | |
229 | ||
230 | # verify file is bash script by locating shebang | |
231 | if ! head -n1 "$file" | grep -Eq '^#!/bin/sh($|[[:space:]]+)'; then | |
232 | rm -f "$file" | |
233 | exit_1 "error: file not found: $pbid" | |
234 | fi | |
235 | ||
236 | # option nocom: remove blank lines and non-functional comments | |
237 | [ ${nocom+x} ] && sed -ri '/^[[:space:]]*($|#([[:space:]]|#|$))/d' "$file" | |
238 | ||
239 | # option comp: same as --nocom, plus remove leading whitespace | |
240 | [ ${comp+x} ] && sed -ri 's/^[[:space:]]*//;/^($|#([[:space:]]|#|$))/d' "$file" | |
241 | ||
242 | # option debug: install script w/ debugging mode enabled | |
243 | [ ${debug+x} ] && sed -ri '2 s/^#(DEBUG=; )/\1/' "$file" | |
244 | ||
245 | # mark file executable | |
246 | chmod +x "$file" | |
247 | ||
248 | # check for any script-specific customization | |
249 | customize | |
250 | ||
251 | exit_0 "installed: $file" |