acmecert: Removed obsolete saved code.
[utils.git] / acmecert
index f10f4a3..a4fb4a4 100755 (executable)
--- a/acmecert
+++ b/acmecert
@@ -1,9 +1,13 @@
 #!/usr/bin/python3
 
-import sys, os, getopt, binascii, json, pprint, signal, time
+import sys, os, getopt, binascii, json, pprint, signal, time, threading
 import urllib.request
 import Crypto.PublicKey.RSA, Crypto.Random, Crypto.Hash.SHA256, Crypto.Signature.PKCS1_v1_5
 
+class msgerror(Exception):
+    def report(self, out):
+        out.write("acmecert: undefined error\n")
+
 service = "https://acme-v02.api.letsencrypt.org/directory"
 _directory = None
 def directory():
@@ -189,8 +193,6 @@ class htconfig(object):
 
 def register(keysize=4096):
     key = Crypto.PublicKey.RSA.generate(keysize, Crypto.Random.new().read)
-    # jwk = {"kty": "RSA", "e": ebignum(key.e), "n": ebignum(key.n)}
-    # cjwk = json.dumps(jwk, separators=(',', ':'), sort_keys=True)
     data, headers = jreq(directory()["newAccount"], {"termsOfServiceAgreed": True}, jwkauth(key))
     return account(headers["Location"], key)
     
@@ -248,6 +250,13 @@ def authorder(acct, htconf, orderid):
                     resp, headers = jreq(ch["url"], {}, acct)
                     if resp["status"] == "processing":
                         time.sleep(2)
+                    elif resp["status"] == "pending":
+                        # I don't think this should happen, but it
+                        # does. LE bug? Anyway, just retry.
+                        if n < 5:
+                            time.sleep(2)
+                        else:
+                            break
                     elif resp["status"] == "valid":
                         break
                     else:
@@ -301,11 +310,16 @@ class maybeopen(object):
             self.fp.close()
         return False
 
-class usageerr(Exception):
-    pass
-
+invdata = threading.local()
 commands = {}
 
+class usageerr(msgerror):
+    def __init__(self):
+        self.cmd = invdata.cmd
+
+    def report(self, out):
+        out.write("%s\n" % (self.cmd.__doc__,))
+
 def cmd_reg(args):
     "usage: acmecert reg [OUTPUT-FILE]"
     acct = register()
@@ -330,7 +344,7 @@ commands["acct-info"] = cmd_acct_info
 
 def cmd_order(args):
     "usage: acmecert order ACCOUNT-FILE CSR [OUTPUT-FILE]"
-    if len(args) < 4: raise usageerr()
+    if len(args) < 3: raise usageerr()
     with maybeopen(args[1], "r") as fp:
         acct = account.read(fp)
     with maybeopen(args[2], "r") as fp:
@@ -440,9 +454,13 @@ def main(argv):
         usage(sys.stderr)
         sys.exit(1)
     try:
-        cmd(args)
-    except usageerr:
-        sys.stderr.write("%s\n" % (cmd.__doc__,))
+        try:
+            invdata.cmd = cmd
+            cmd(args)
+        finally:
+            invdata.cmd = None
+    except msgerror as exc:
+        exc.report(sys.stderr)
         sys.exit(1)
 
 if __name__ == "__main__":