Newer
Older
bathroom-plugin / pi / monitor.py
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)