from time import sleep, time import gpiozero as GP from signal import pause import base64 import sys from Cryptodome.PublicKey import RSA from Cryptodome.Cipher import PKCS1_OAEP import urllib import urllib2 import traceback if len(sys.argv) < 2: print "No id" exit(1) if len(sys.argv) < 3: print "No url" exit(1) ext = "" if len(sys.argv) > 3: ext = sys.argv[3] id = int(sys.argv[1]) url_base = sys.argv[2] l = GP.LED(18) b = GP.Button(16) l.source = b status = False private_key = RSA.import_key(open("private.pem").read()) rsa = PKCS1_OAEP.new(private_key); last_report = 0 def report(val): global last_report 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() last_report = time() except Exception as e: print str(e) traceback.print_tb(sys.exc_info()[2]) report(False) while True: now_pressed = b.is_pressed if now_pressed == status: if now_pressed: b.wait_for_release(5) else: b.wait_for_press(5) now_pressed = b.is_pressed if now_pressed != status or time() - last_report > 120: status = now_pressed print "status now: " + str(status) report(status) sleep(1)