Guten Tag liebes Forum,
Das ist mein erster Post, und höchstwahrscheinlich falsch eingeordnet. Ich habe angefangen, für die DNS-Challenge von Let's Encrypt ein Python Script als Hook zu schreiben. Im ersten Schritt möchte ich nur das aktuelle DNS ohne Änderungen updaten. Dabei nehme ich den Output von infoDnsReocrds und packe ihn direkt wieder in updateDnsRecords. Allerdings ist es angeblich fehlformatiert - ich habe mEn alles nach Dokumentation gemacht.
Hier ist das aktuelle Skript ohne Daten:
import json
import requests
import time
#JSON strings for API interaction
login = '{"action":"login","param":{"apipassword":"","clientrequestid":"","apikey":"","customernumber":""}}'
logout = '{"action":"logout","param":{"apisessionid":"","clientrequestid":"","apikey":"","customernumber":""}}'
infoDnsRecords = '{"action":"infoDnsRecords","param":{"apisessionid":"","clientrequestid":"","apikey":"","customernumber":"","domainname":""}}'
updateDnsRecords = '{"action":"updateDnsRecords","param":{"apisessionid":"","clientrequestid":"","apikey":"","customernumber":"","domainname":"","dnsrecordset":""}}'
#URI for REST call
uri = "https://ccp.netcup.net/run/webservice/servers/endpoint.php?JSON"
#apikey, apipasswd, customernumber > in future there will be a config file
apikey="Ich Bin ein Awesome Platzhalter"
apipassword="IchBinEinPlatzhalter"
customernumber= 133750
domainname="domain.de"
#fill the JSON strings
loginArray = json.loads(login)
loginArray["param"]["customernumber"]=customernumber
loginArray["param"]["apikey"]=apikey
loginArray["param"]["apipassword"]=apipassword
loginArray["param"]["clientrequestid"]="acmeChallenge"
login = json.dumps(loginArray)
#those strings must be filled further down
logoutArray = json.loads(logout)
logoutArray["param"]["customernumber"]=customernumber
logoutArray["param"]["apikey"]=apikey
logoutArray["param"]["apipassword"]=apipassword
logoutArray["param"]["clientrequestid"]="acmeChallenge"
infoDnsRecordsArray = json.loads(infoDnsRecords)
infoDnsRecordsArray["param"]["customernumber"]=customernumber
infoDnsRecordsArray["param"]["apikey"]=apikey
infoDnsRecordsArray["param"]["domainname"]=domainname
infoDnsRecordsArray["param"]["clientrequestid"]="acmeChallenge"
updateDnsRecordsArray = json.loads(updateDnsRecords)
updateDnsRecordsArray["param"]["customernumber"]=customernumber
updateDnsRecordsArray["param"]["apikey"]=apikey
updateDnsRecordsArray["param"]["domainname"]=domainname
updateDnsRecordsArray["param"]["clientrequestid"]="acmeChallenge"
#login
loginResponse = requests.post(uri,login)
loginResponse = json.loads(loginResponse.text)
#quit if something is wrong with the login
if loginResponse["statuscode"] != 2000:
exit(loginResponse["longmessage"])
#fill the JSON strings with the session-id
apisessionid = loginResponse["responsedata"]["apisessionid"]
infoDnsRecordsArray["param"]["apisessionid"]=apisessionid
infoDnsRecords = json.dumps(infoDnsRecordsArray)
updateDnsRecordsArray["param"]["apisessionid"]=apisessionid
logoutArray["param"]["apisessionid"]=apisessionid
logout = json.dumps(logoutArray)
#get current dns records
infoDnsRecordsResponse = requests.post(uri,infoDnsRecords)
infoDnsRecordsResponse = json.loads(infoDnsRecordsResponse.text)
dnsrecords=infoDnsRecordsResponse["responsedata"]["dnsrecords"]
#cast the id to an int, which isn't done by json.dumps
for x in range(len(dnsrecords)-1):
dnsrecords[x]["id"]=int(dnsrecords[x]["id"])
#add the dnsrecords to the JSON
updateDnsRecordsArray["param"]["dnsrecordset"]=dnsrecords
updateDnsRecords = json.dumps(updateDnsRecordsArray)
#update DNS
updateDnsRecordsResponse = requests.post(uri,updateDnsRecords)
updateDnsRecordsResponse = json.loads(updateDnsRecordsResponse.text)
#logout
logoutResponse = requests.post(uri,logout)
logoutResponse = json.loads(logoutResponse.text)
#print result of update
print(json.dumps(updateDnsRecordsResponse, indent=4, sort_keys=True))
Alles anzeigen
Und hier das Ergebnis:
{
"action": "updateDnsRecords",
"clientrequestid": "acmeChallenge",
"longmessage": "The DNS records are not in valid format.",
"responsedata": "",
"serverrequestid": "YWZQ0Bohz0NX=MBFt",
"shortmessage": "Update of DNS records failed",
"status": "error",
"statuscode": 4018
}
Wie man sieht, habe ich bereits ein Problem behoben, welches mit der ID bestand - diese wurde als `String` statt als `int` interpretiert. Ein (geschwärztes) Besipiel für einen Record:
{
"deleterecord": false,
"destination": "192.168.1.1",
"hostname": "@",
"id": 29202084,
"priority": "0",
"state": "yes",
"type": "A"
}
Weiß jemand, woran das liegt? Laut Doku müsste alles stimmen, aber vielleicht habe ich etwas übersehen.