]> git.proxmox.com Git - mirror_acme.sh.git/blob - dnsapi/dns_me.sh
bugfix
[mirror_acme.sh.git] / dnsapi / dns_me.sh
1 #!/bin/sh
2
3 # bug reports to dev@1e.ca
4
5 # ME_Key=qmlkdjflmkqdjf
6 # ME_Secret=qmsdlkqmlksdvnnpae
7
8 ME_Api=https://api.dnsmadeeasy.com/V2.0/dns/managed
9
10 ######## Public functions #####################
11
12 #Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
13 dns_me_add(){
14 fulldomain=$1
15 txtvalue=$2
16
17 if [ -z "$ME_Key" ] || [ -z "$ME_Secret" ] ; then
18 _err "You didn't specify DNSMadeEasy api key and secret yet."
19 _err "Please create you key and try again."
20 return 1
21 fi
22
23 #save the api key and email to the account conf file.
24 _saveaccountconf ME_Key "$ME_Key"
25 _saveaccountconf ME_Secret "$ME_Secret"
26
27 _debug "First detect the root zone"
28 if ! _get_root $fulldomain ; then
29 _err "invalid domain"
30 return 1
31 fi
32 _debug _domain_id "$_domain_id"
33 _debug _sub_domain "$_sub_domain"
34 _debug _domain "$_domain"
35
36 _debug "Getting txt records"
37 _me_rest GET "${_domain_id}/records?recordName=$_sub_domain&type=TXT"
38
39 if ! printf "$response" | grep \"totalRecords\": > /dev/null ; then
40 _err "Error"
41 return 1
42 fi
43
44 count=$(printf "%s\n" "$response" | _egrep_o \"totalRecords\":[^,]* | cut -d : -f 2)
45 _debug count "$count"
46 if [ "$count" = "0" ] ; then
47 _info "Adding record"
48 if _me_rest POST "$_domain_id/records/" "{\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"; then
49 if [ "$?" = "0" ]; then
50 _info "Added"
51 #todo: check if the record takes effect
52 return 0
53 else
54 _err "Add txt record error."
55 return 1
56 fi
57 fi
58 _err "Add txt record error."
59 else
60 _info "Updating record"
61 record_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | cut -d : -f 2 | head -n 1)
62 _debug "record_id" $record_id
63
64 _me_rest PUT "$_domain_id/records/$record_id/" "{\"id\":\"$record_id\",\"type\":\"TXT\",\"name\":\"$_sub_domain\",\"value\":\"$txtvalue\",\"gtdLocation\":\"DEFAULT\",\"ttl\":120}"
65 if [ "$?" = "0" ]; then
66 _info "Updated"
67 #todo: check if the record takes effect
68 return 0;
69 fi
70 _err "Update error"
71 return 1
72 fi
73
74 }
75
76
77 #fulldomain
78 dns_me_rm() {
79 fulldomain=$1
80
81 }
82
83
84 #################### Private functions bellow ##################################
85 #_acme-challenge.www.domain.com
86 #returns
87 # _sub_domain=_acme-challenge.www
88 # _domain=domain.com
89 # _domain_id=sdjkglgdfewsdfg
90 _get_root() {
91 domain=$1
92 i=2
93 p=1
94 while [ '1' ] ; do
95 h=$(printf $domain | cut -d . -f $i-100)
96 if [ -z "$h" ] ; then
97 #not valid
98 return 1;
99 fi
100
101 if ! _me_rest GET "name?domainname=$h" ; then
102 return 1
103 fi
104
105 if printf $response | grep \"name\":\"$h\" >/dev/null ; then
106 _domain_id=$(printf "%s\n" "$response" | _egrep_o \"id\":[^,]* | head -n 1 | cut -d : -f 2 )
107 if [ "$_domain_id" ] ; then
108 _sub_domain=$(printf $domain | cut -d . -f 1-$p)
109 _domain=$h
110 return 0
111 fi
112 return 1
113 fi
114 p=$i
115 i=$(expr $i + 1)
116 done
117 return 1
118 }
119
120 _me_rest() {
121 m=$1
122 ep="$2"
123 data="$3"
124 _debug $ep
125
126 cdate=$(date -Ru)
127 hmac=$(printf "$cdate" | openssl dgst -sha1 -hmac $ME_Secret | cut -d = -f 2 | tr -d ' ')
128
129 _H1="x-dnsme-apiKey: $ME_Key"
130 _H2="x-dnsme-requestDate: $cdate"
131 _H3="x-dnsme-hmac: $hmac"
132
133 if [ "$data" ] ; then
134 _debug data "$data"
135 response="$(_post "$data" "$ME_Api/$ep" "" $m)"
136 else
137 response="$(_get "$ME_Api/$ep")"
138 fi
139
140 if [ "$?" != "0" ] ; then
141 _err "error $ep"
142 return 1
143 fi
144 _debug2 response "$response"
145 return 0
146 }
147
148