1
1
#! /bin/bash
2
2
3
- # Copyright (2017) Timothe Litt litt at acm _dot org
3
+ # Copyright (C) 2017,2018 Timothe Litt litt at acm _dot org
4
4
5
- VERSION=" 1.0.1 "
5
+ VERSION=" 1.0.3 "
6
6
PROG=" ` basename $0 ` "
7
7
8
8
# This script is used to update TXT records in GoDaddy DNS server
@@ -31,6 +31,7 @@ DEBUG="$GODADDY_DEBUG"
31
31
32
32
while getopts ' dhj:k:s:t:qv' opt; do
33
33
case $opt in
34
+ b) GODADDY_BASE=" $OPTARG " ;;
34
35
d) DEBUG=" Y" ;;
35
36
j) JSON=" $OPTARG " ;;
36
37
k) GODADDY_KEY=" $OPTARG " ;;
@@ -72,6 +73,9 @@ Arguments:
72
73
For minimal trace output (to override -q), define GODADDY_TRACE="y".
73
74
74
75
Options
76
+ -b Domain name(s) in which challenge records are stored
77
+ E.g. often, www.example.net is stored in example.net.
78
+ Default from GODADDY_BASE
75
79
-d Provide debugging output - all requests and responses
76
80
-h This help.
77
81
-j: Location of JSON.sh Default ` dirname $0 ` /JSON.sh, or
@@ -84,6 +88,7 @@ Options
84
88
All output, except for this help text, is to stderr.
85
89
86
90
Environment variables
91
+ GODADDY_BASE Domain name(s) in which challenge records are stored
87
92
GODADDY_JSON location of the JSOH.sh script
88
93
GODADDY_KEY default API key
89
94
GODADDY_SCRIPT location of this script, default location of JSON.sh
@@ -92,7 +97,7 @@ Environment variables
92
97
GODADDY_TFILE appends protocol trace to file. Overrides -t
93
98
94
99
BUGS
95
- Due to a limitation of the gOdADDY API, deleting the last TXT record
100
+ Due to a limitation of the GoDaddy API, deleting the last TXT record
96
101
would be too risky for my taste. So in that case, I replace it with
97
102
_dummy.record_.domain. TXT "Ihis record is not used". This record is
98
103
not automatically deleted by this script, though it's perfectly OK to
@@ -155,6 +160,7 @@ if [ -z "$name" ]; then
155
160
echo " 'name' parameter is required, see -h" >&2
156
161
exit 3
157
162
fi
163
+ ! [[ " $name " =~ [.]$ ]] && name=" ${name} .${domain} ."
158
164
data=" $4 "
159
165
if [ -z " $data " ]; then
160
166
echo " 'data' parameter is required, see -h" >&2
@@ -206,7 +212,23 @@ if [ "$op" = "add" ]; then
206
212
207
213
while [[ " $domain " =~ [^.]+\. [^.]+ ]]; do
208
214
209
- url=" $API /$domain /records/TXT/$name "
215
+ reqname=" $name "
216
+ # The API doesn't trim the base domain from the name (it used to)
217
+ # If specified, remove any listed base.
218
+ if [ -n " $GODADDY_BASE " ]; then
219
+ for GDB in $GODADDY_BASE ; do
220
+ gdb=" ` echo " $GDB " | sed -e' s/\\.$//;s/\\./\\\\./g;' ` "
221
+ gdb=" ^(.+)\\ .$gdb \\ .?$"
222
+ if [[ " $name " =~ $gdb ]]; then
223
+ reqname=" ${BASH_REMATCH[1]} "
224
+ break ;
225
+ fi
226
+ done
227
+ else
228
+ eval ' reqname="$' ' {name%' " '.$domain .'}" ' "'
229
+ fi
230
+
231
+ url=" $API /$domain /records/TXT/$reqname "
210
232
211
233
request=' [{"data":"' $data ' ","ttl":' $ttl ' }]'
212
234
[ -n " $DEBUG " ] && cat >&2 << EOF
@@ -332,10 +354,14 @@ Old TXT RRSET:
332
354
$current
333
355
EOF
334
356
335
- # Remove the desired record. The name must be relative.
357
+ # Remove the desired record. The name must be relative. Order varies.
336
358
337
359
eval ' name="$' ' {name%' " '.$domain .'}" ' "'
338
360
361
+ match=" $( printf ' "name":"%s","data":"%s","ttl":' " $name " " $data " ) "
362
+ cmd=" $( printf ' echo %s%s%s | grep -v %s%s%s' " '" " $current " " '" " '" " $match " " '" ) "
363
+ eval ' new="$(' " $cmd " ' )"'
364
+
339
365
match=" $( printf ' "data":"%s","name":"%s","ttl":' " $data " " $name " ) "
340
366
cmd=" $( printf ' echo %s%s%s | grep -v %s%s%s' " '" " $current " " '" " '" " $match " " '" ) "
341
367
eval ' new="$(' " $cmd " ' )"'
0 commit comments