|
2 | 2 |
|
3 | 3 | # Name: generate_dnsmasq_chinalist.sh
|
4 | 4 | # Desription: A script which auto-download newest dnsmasq-china-list and add ipset rules to the config file.
|
5 |
| -# Version: 0.1 |
6 |
| -# Date: 2017-01-30 |
| 5 | +# Version: 0.2 |
| 6 | +# Date: 2017-03-13 |
7 | 7 | # Author: Cokebar Chi
|
8 | 8 | # Website: https://github.com/cokebar
|
9 | 9 |
|
10 |
| -usage() { |
| 10 | +_usage() { |
11 | 11 | cat <<-EOF
|
12 |
| - Usage: generate_dnsmasq_chinalist [options] -f FILE |
13 | 12 |
|
14 |
| - Valid options are: |
15 |
| -
|
16 |
| - -d <dns_ip> DNS IP address for the China domains (Default: 114.114.114.114) |
17 |
| - -s <ipset_name> IP set name for the China domains (If not given, ipset rules will not be generated.) |
18 |
| - -f <FILE> /path/to/output_filename |
19 |
| - -h Usage |
| 13 | +Usage: sh generate_dnsmasq_chinalist.sh [options] -o FILE |
| 14 | +Valid options are: |
| 15 | + -d, --dns <dns_ip> |
| 16 | + DNS IP address for the GfwList Domains (Default: 114.114.114.114) |
| 17 | + -p, --port <dns_port> |
| 18 | + DNS Port for the GfwList Domains (Default: 53) |
| 19 | + -s, --ipset <ipset_name> |
| 20 | + Ipset name for the China-List domains |
| 21 | + (If not given, ipset rules will not be generated.) |
| 22 | + -o, --output <FILE> |
| 23 | + /path/to/output_filename |
| 24 | + -i, --insecure |
| 25 | + Force bypass certificate validation (insecure) |
| 26 | + -h, --help Usage |
20 | 27 | EOF
|
21 | 28 | exit $1
|
22 | 29 | }
|
23 | 30 |
|
24 |
| -DNS_IP='' |
25 |
| -FILE_FULLPATH='' |
26 |
| -IPSET_NAME='' |
| 31 | +_clean_and_exit(){ |
| 32 | + # Clean up temp files |
| 33 | + printf 'Cleaning up...' |
| 34 | + rm -rf $_WORKING_DIR |
| 35 | + printf ' Done.\n\n' |
| 36 | + exit $1 |
| 37 | +} |
27 | 38 |
|
28 |
| -while getopts "d:s:f:h" arg; do |
29 |
| - case "$arg" in |
30 |
| - f) |
31 |
| - FILE_FULLPATH=$OPTARG |
32 |
| - ;; |
33 |
| - d) |
34 |
| - DNS_IP=$OPTARG |
35 |
| - ;; |
36 |
| - s) |
37 |
| - IPSET_NAME=$OPTARG |
38 |
| - ;; |
39 |
| - h) |
40 |
| - usage 0 |
41 |
| - ;; |
42 |
| - *) |
43 |
| - echo "Invalid argument: -$OPTARG" |
44 |
| - exit 1 |
45 |
| - ;; |
46 |
| - esac |
47 |
| -done |
| 39 | +_check_depends(){ |
| 40 | + which awk curl >/dev/null |
| 41 | + if [ $? != 0 ]; then |
| 42 | + printf '\033[31mError: Missing Dependency.\nPlease check whether you have the following binaries on you system:\nawk, curl\033[m\n' |
| 43 | + exit 3 |
| 44 | + fi |
| 45 | +} |
48 | 46 |
|
49 |
| -# Check input arguments |
| 47 | +_get_args(){ |
| 48 | + _DNS_IP='114.114.114.114' |
| 49 | + _DNS_PORT='53' |
| 50 | + _IPSET_NAME='' |
| 51 | + _OUT_FILE='' |
| 52 | + _CURL_EXTARG='' |
| 53 | + _WITH_IPSET=0 |
50 | 54 |
|
51 |
| -# Check path & file name |
52 |
| -if [ -z $FILE_FULLPATH ]; then |
53 |
| - echo 'Please enter full path to the file.( Use: -f /path/to/output_filename)' |
54 |
| - exit 1 |
55 |
| -else |
56 |
| - if [ -z ${FILE_FULLPATH##*/} ]; then |
57 |
| - echo 'Please enter full path to the file, include file name.' |
| 55 | + while [ ${#} -gt 0 ]; do |
| 56 | + case "${1}" in |
| 57 | + --help | -h) |
| 58 | + _usage 0 |
| 59 | + ;; |
| 60 | + --insecure | -i) |
| 61 | + _CURL_EXTARG='--insecure' |
| 62 | + ;; |
| 63 | + --dns | -d) |
| 64 | + _DNS_IP="$2" |
| 65 | + shift |
| 66 | + ;; |
| 67 | + --port | -p) |
| 68 | + _DNS_PORT="$2" |
| 69 | + shift |
| 70 | + ;; |
| 71 | + --ipset | -s) |
| 72 | + _IPSET_NAME="$2" |
| 73 | + shift |
| 74 | + ;; |
| 75 | + --output | -o) |
| 76 | + _OUT_FILE="$2" |
| 77 | + shift |
| 78 | + ;; |
| 79 | + *) |
| 80 | + echo "Invalid argument: $1" |
| 81 | + _usage 1 |
| 82 | + ;; |
| 83 | + esac |
| 84 | + shift 1 |
| 85 | + done |
| 86 | + |
| 87 | + # Check path & file name |
| 88 | + if [ -z $_OUT_FILE ]; then |
| 89 | + echo 'Please enter full path to the file.(/path/to/output_filename)' |
58 | 90 | exit 1
|
59 | 91 | else
|
60 |
| - if [ ! -d ${FILE_FULLPATH%/*} ]; then |
61 |
| - echo "Folder do not exist: ${FILE_FULLPATH%/*}" |
| 92 | + if [ -z ${_OUT_FILE##*/} ]; then |
| 93 | + echo 'Please enter full path to the file, include file name.' |
62 | 94 | exit 1
|
| 95 | + else |
| 96 | + if [ ${_OUT_FILE}a != ${_OUT_FILE%/*}a ] && [ ! -d ${_OUT_FILE%/*} ]; then |
| 97 | + echo "Folder do not exist: ${_OUT_FILE%/*}" |
| 98 | + exit 1 |
| 99 | + fi |
63 | 100 | fi
|
64 | 101 | fi
|
65 |
| -fi |
66 | 102 |
|
67 |
| -# Check DNS IP |
68 |
| -if [ -z $DNS_IP ]; then |
69 |
| - DNS_IP=114.114.114.114 |
70 |
| -else |
71 |
| - IP_TEST=$(echo $DNS_IP | grep -E '^((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)$') |
72 |
| - if [ "$IP_TEST" != "$DNS_IP" ]; then |
| 103 | + # Check DNS IP |
| 104 | + _IP_TEST=$(echo $_DNS_IP | grep -E '^((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)$') |
| 105 | + if [ "$_IP_TEST" != "$_DNS_IP" ]; then |
73 | 106 | echo 'Please enter a valid DNS server IP address.'
|
74 | 107 | exit 1
|
75 | 108 | fi
|
76 |
| -fi |
77 | 109 |
|
78 |
| -# Check IP set name |
79 |
| -if [ -z $IPSET_NAME ]; then |
80 |
| - # Download dnsmasq-china-list and replace DNS IP |
81 |
| - echo "Download & writing file to $FILE_FULLPATH without ipset ..." |
82 |
| - ( wget -O- 'https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf' || (echo "Failed to download dnsmasq-china-list"; exit 2;) ) |\ |
83 |
| - sed -r 's#server=/(\S+)/(((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?))#server=/\1/'$DNS_IP'#g' >\ |
84 |
| - /tmp/dnsmasq_chinalist.tmp |
85 |
| -else |
86 |
| - IPSET_TEST=$(echo $IPSET_NAME | grep -E '^\w+$') |
87 |
| - if [ "$IPSET_TEST" != "$IPSET_NAME" ]; then |
88 |
| - echo 'Please enter a valid IP set name.' |
| 110 | + # Check DNS port |
| 111 | + if [ $_DNS_PORT -lt 1 -o $_DNS_PORT -gt 65535 ]; then |
| 112 | + echo 'Please enter a valid DNS server port.' |
89 | 113 | exit 1
|
| 114 | + fi |
| 115 | + |
| 116 | + # Check ipset name |
| 117 | + if [ -z $_IPSET_NAME ]; then |
| 118 | + _WITH_IPSET=0 |
| 119 | + else |
| 120 | + _IPSET_TEST=$(echo $_IPSET_NAME | grep -E '^\w+$') |
| 121 | + if [ "$_IPSET_TEST" != "$_IPSET_NAME" ]; then |
| 122 | + echo 'Please enter a valid IP set name.' |
| 123 | + exit 1 |
| 124 | + else |
| 125 | + _WITH_IPSET=1 |
| 126 | + fi |
| 127 | + fi |
| 128 | +} |
| 129 | + |
| 130 | +_process(){ |
| 131 | + _BASE_URL='https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf' |
| 132 | + _WORKING_DIR=`mktemp -d /tmp/generate_dnsmasq_chinalist.XXXXXX` |
| 133 | + _CHINA_LIST_FILE=$_WORKING_DIR/accelerated-domains.china.conf |
| 134 | + _TMP_FILE=$_WORKING_DIR/generate_dnsmasq_chinalist.tmp |
| 135 | + |
| 136 | + # Fetch China-List |
| 137 | + printf 'Fetching China-List...' |
| 138 | + curl -s -L $CURL_EXTARG -o$_CHINA_LIST_FILE $_BASE_URL |
| 139 | + if [ $? != 0 ]; then |
| 140 | + printf '\033[31mFailed to fetch China-List. Please check your Internet connection.\033[m\n' |
| 141 | + _clean_and_exit 2 |
| 142 | + fi |
| 143 | + printf ' Done.\n\n' |
| 144 | + |
| 145 | + # Convert |
| 146 | + if [ $_WITH_IPSET == 0 ]; then |
| 147 | + echo "Writing file to $_OUT_FILE without ipset ..." |
| 148 | + awk -v _dns="$_DNS_IP" -v _port="$_DNS_PORT" -F'/' '{printf("%s/%s/%s#%s\n",$1,$2,_dns,_port)}' $_CHINA_LIST_FILE > $_TMP_FILE |
90 | 149 | else
|
91 |
| - echo "Download & writing file to $FILE_FULLPATH with ipset ..." |
92 |
| - # Download dnsmasq-china-list, and replace DNS IP and add ipset rules |
93 |
| - ( wget -O- 'https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/accelerated-domains.china.conf' || (echo "Failed to download dnsmasq-china-list"; exit 2;) ) |\ |
94 |
| - sed -r 's#server=/(\S+)/(((2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?))#server=/\1/'$DNS_IP'\nipset=/\1/'$IPSET_NAME'#g' >\ |
95 |
| - /tmp/dnsmasq_chinalist.tmp |
| 150 | + echo "Writing file to $_OUT_FILE with ipset ..." |
| 151 | + awk -v _dns="$_DNS_IP" -v _port="$_DNS_PORT" -v _ipset="$_IPSET_NAME" -F'/' '{printf("%s/%s/%s#%s\nipset=/%s/%s\n",$1,$2,_dns,_port,_dns,_ipset)}' $_CHINA_LIST_FILE > $_TMP_FILE |
96 | 152 | fi
|
97 |
| -fi |
| 153 | + |
| 154 | + mv $_TMP_FILE $_OUT_FILE |
| 155 | + |
| 156 | + _clean_and_exit 0 |
| 157 | +} |
| 158 | + |
| 159 | +main() { |
| 160 | + if [ -z "$1" ]; then |
| 161 | + _usage 0 |
| 162 | + else |
| 163 | + _check_depends |
| 164 | + _get_args "$@" |
| 165 | + _process |
| 166 | + fi |
| 167 | +} |
98 | 168 |
|
99 |
| -mv /tmp/dnsmasq_chinalist.tmp $FILE_FULLPATH |
| 169 | +main "$@" |
0 commit comments