View difference between Paste ID: e9rj1uTV and CDyG20GB
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"