diff --git a/.gitignore b/.gitignore
index 636e7ee..f007981 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,33 +1,14 @@
-__pycache__
+.vscode/*
!.vscode/extensions.json
!.vscode/launch.json
!.vscode/settings.json
!.vscode/tasks.json
-!gradle-wrapper.jar
+
+__pycache__
.classpath
.DS_Store
.gradle
.history
-.idea_modules/
-.idea/**/contentModel.xml
-.idea/**/dataSources.ids
-.idea/**/dataSources.local.xml
-.idea/**/dataSources/
-.idea/**/dbnavigator.xml
-.idea/**/dictionaries
-.idea/**/dynamic.xml
-.idea/**/gradle.xml
-.idea/**/libraries
-.idea/**/mongoSettings.xml
-.idea/**/shelf
-.idea/**/sqlDataSources.xml
-.idea/**/tasks.xml
-.idea/**/uiDesigner.xml
-.idea/**/usage.statistics.xml
-.idea/**/workspace.xml
-.idea/caches/build_file_checksums.ser
-.idea/httpRequests
-.idea/replstate.xml
.kobalt
.mtj.tmp/
.mvn/timing.properties
@@ -36,20 +17,39 @@ __pycache__
.project
.scannerwork
.settings
-.vscode/*
*.class
*.code-workspace
*.ctxt
-*.ear
*.iws
-*.jar
*.log
*.nar
*.rar
*.sublime-*
*.tar.gz
-*.war
*.zip
+/**/.idea_modules/
+/**/.idea/**/caches/build_file_checksums.ser
+/**/.idea/**/contentModel.xml
+/**/.idea/**/dataSources.ids
+/**/.idea/**/dataSources.local.xml
+/**/.idea/**/dataSources/
+/**/.idea/**/dbnavigator.xml
+/**/.idea/**/dictionaries
+/**/.idea/**/dynamic.xml
+/**/.idea/**/gradle.xml
+/**/.idea/**/httpRequests
+/**/.idea/**/libraries
+/**/.idea/**/mongoSettings.xml
+/**/.idea/**/replstate.xml
+/**/.idea/**/shelf
+/**/.idea/**/shelf/
+/**/.idea/**/sqlDataSources.xml
+/**/.idea/**/tasks.xml
+/**/.idea/**/uiDesigner.xml
+/**/.idea/**/usage.statistics.xml
+/**/.idea/**/workspace.xml
+/**/.idea/$CACHE_FILE$
+/**/.idea/$PRODUCT_WORKSPACE_FILE$
atlassian-ide-plugin.xml
bin/
build/
diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml
new file mode 100644
index 0000000..a55e7a1
--- /dev/null
+++ b/.idea/codeStyles/codeStyleConfig.xml
@@ -0,0 +1,5 @@
+
certbot certonly --manual --email you@example.com \ @@ -40,17 +42,4 @@ certbot certonly --manual --email you@example.com \ -d *.example.com -d example.com-Or to renew an existing certificate: - -
-certbot renew --manual --email you@example.com \ ---agree-tos --manual-public-ip-logging-ok \ ---preferred-challenges=dns \ ---manual-auth-hook /path/to/authenticator.py \ ---manual-cleanup-hook /path/to/cleanup.py \ --d *.example.com -d example.com -- -Please note that NameSilo DNS propagation takes up to **15 minutes**, -so the scripts will wait 16 minutes before completing. - +Please note that NameSilo DNS propagation takes up to **15 minutes**. The scripts will wait **25 minutes** before completing, just to be safe. diff --git a/authenticator.py b/authenticator.py old mode 100644 new mode 100755 index 30d88e6..510aa1f --- a/authenticator.py +++ b/authenticator.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python3.7 +#!/usr/bin/env python3 # authenticator.py # -# Copyright (c) 2019, Erik C. Thauvin (erik@thauvin.net) +# Copyright (c) 2019-2020, Erik C. Thauvin (erik@thauvin.net) # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -22,14 +22,14 @@ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# AREDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVERCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USEOF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +# THE POSSIBILITY OF SUCH DAMAGE. import os import sys @@ -37,28 +37,41 @@ import tempfile import time import urllib.request +import tldextract import untangle -from config import apikey +from config import apikey, wait + + +def sleep(minutes): + if minutes < 16: + minutes = 16 + time.sleep(minutes * 60) + domain = os.environ['CERTBOT_DOMAIN'] validation = os.environ['CERTBOT_VALIDATION'] -tmpdir = os.path.join(tempfile.gettempdir(), f"CERTBOT_{domain}") +tmpdir = os.path.join(tempfile.gettempdir(), "CERTBOT_" + domain) +rrhost = "_acme-challenge" if "NAMESILO_API" in os.environ: apikey = os.environ['NAMESILO_API'] -url = f"https://www.namesilo.com/api/dnsAddRecord?\ -version=1&type=xml&key={apikey}&domain={domain}&rrtype=TXT\ -&rrhost=_acme-challenge&rrvalue={validation}&rrttl=3600" +tld = tldextract.extract(domain) +nsdomain = tld.domain + "." + tld.suffix +if tld.subdomain: + rrhost += "." + tld.subdomain + +url = "https://www.namesilo.com/api/dnsAddRecord?\ +version=1&type=xml&key=" + apikey + "&domain=" + nsdomain + "&rrtype=TXT\ +&rrhost=" + rrhost + "&rrvalue=" + validation + "&rrttl=3600" req = urllib.request.Request( url, data=None, headers={ - 'User-Agent': ('Mozilla/5.0 (X11; CrOS x86_64 11647.154.0) ' - 'AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/73.0.3683.114 Safari/537.36') + 'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) ' + 'Gecko/20100101 Firefox/74.0') } ) @@ -79,5 +92,5 @@ else: xml.namesilo.reply.code.cdata), file=sys.stderr) sys.exit(1) -# Sleep 16 minutes -time.sleep(960) +# Sleep X minutes +sleep(wait) diff --git a/cleanup.py b/cleanup.py old mode 100644 new mode 100755 index 27d38c4..c15d05c --- a/cleanup.py +++ b/cleanup.py @@ -1,8 +1,8 @@ -#!/usr/bin/env python3.7 +#!/usr/bin/env python3 # cleanup.py # -# Copyright (c) 2019, Erik C. Thauvin (erik@thauvin.net) +# Copyright (c) 2019-2020, Erik C. Thauvin (erik@thauvin.net) # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -22,32 +22,36 @@ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -# AREDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVERCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USEOF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +# THE POSSIBILITY OF SUCH DAMAGE. import os import sys import tempfile import urllib.request +import tldextract import untangle from config import apikey domain = os.environ['CERTBOT_DOMAIN'] -tmpdir = os.path.join(tempfile.gettempdir(), f"CERTBOT_{domain}") +tmpdir = os.path.join(tempfile.gettempdir(), "CERTBOT_" + domain) if "NAMESILO_API" in os.environ: apikey = os.environ['NAMESILO_API'] -url = f"https://www.namesilo.com/api/dnsDeleteRecord\ -?version=1&type=xml&key={apikey}&domain={domain}&rrid=" +tld = tldextract.extract(domain) +nsdomain = tld.domain + "." + tld.suffix + +url = "https://www.namesilo.com/api/dnsDeleteRecord\ +?version=1&type=xml&key=" + apikey + "&domain=" + nsdomain + "&rrid=" def getrequest(record_id): @@ -55,9 +59,8 @@ def getrequest(record_id): url + record_id, data=None, headers={ - 'User-Agent': ('Mozilla/5.0 (X11; CrOS x86_64 11647.154.0) ' - 'AppleWebKit/537.36 (KHTML, like Gecko) ' - 'Chrome/73.0.3683.114 Safari/537.36') + 'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) ' + 'Gecko/20100101 Firefox/74.0') } ) diff --git a/config.py b/config.py index b30c1c3..0bcd226 100644 --- a/config.py +++ b/config.py @@ -1,2 +1,4 @@ -# Get your API Key from: https://www.namesilo.com/account_api.php +# Get your API Key from: https://www.namesilo.com/account/api-manager apikey = "YOUR_API_KEY" +# Minutes to wait for DNS changes to complete. +wait = 25 diff --git a/release.sh b/release.sh new file mode 100755 index 0000000..6689a1b --- /dev/null +++ b/release.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +RELEASE=release + +if [ $# != 1 ]; +then + echo "Usage: $(basename "$0")