from Cryptodome.PublicKey import RSA from Cryptodome.Cipher import PKCS1_OAEP import base64 import urllib import urllib2 import sys import traceback def load_rsa_key_file(fileName): private_key = RSA.import_key(open(fileName).read()) return PKCS1_OAEP.new(private_key); def get_args(args): if len(args) < 1: print "No id" return None if len(args) < 2: print "No url" return None ext = "" if len(args) > 2: ext = args[2] id = int(args[0]) url_base = args[1] return (id, url_base, ext) def report(rsa, id, url_base, ext, val): try: url = url_base + "status-update" + ext + "?door_id=" + str(id) + "&status=" + ("1" if val else "0") print " open " + url response = urllib2.urlopen(url) responseStr = response.read() print "Response: " + responseStr enc_verify = base64.b64decode(responseStr) verify = rsa.decrypt(enc_verify) if ext == "": verify = base64.b64encode(verify) print " verifying with: " + verify url = url_base + "verify-status" + ext + "?door_id=" + str(id) + "&verify=" + urllib.quote(verify) print " open " + url response = urllib2.urlopen(url) print " returned: " + response.read() return True except Exception as e: print str(e) traceback.print_tb(sys.exc_info()[2]) return False if __name__ == "__main__": if len(sys.argv) < 2: print "No status" exit(1) args = get_args(sys.argv[2:]) if args is None: exit(1) id, url_base, ext = args rsa = load_rsa_key_file("private.pem") report(rsa, id, url_base, ext, int(sys.argv[1]))