changeset 1366:5836e88a0287

py3 and new build Ignore-this: 69cf69e5d43adfa65b3f62c5c0af2014 darcs-hash:a82563e9bfce399590ffd2229d997b490c0b038d
author drewp <drewp@bigasterisk.com>
date Wed, 01 May 2019 00:30:54 -0700
parents e6c6574f3d24
children b287950fbcf4
files service/frontDoorLock/Dockerfile service/frontDoorLock/front_door_lock.py service/frontDoorLock/makefile service/frontDoorLock/requirements.txt service/frontDoorLock/tasks.py
diffstat 5 files changed, 60 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/service/frontDoorLock/Dockerfile	Wed May 01 00:24:13 2019 -0700
+++ b/service/frontDoorLock/Dockerfile	Wed May 01 00:30:54 2019 -0700
@@ -3,10 +3,12 @@
 WORKDIR /opt
 
 COPY requirements.txt ./
-RUN pip install -r requirements.txt
+RUN pip3 install --index-url https://projects.bigasterisk.com/ --extra-index-url https://pypi.org/simple -r requirements.txt
+# not sure why this doesn't work from inside requirements.txt
+RUN pip3 install -U 'https://github.com/drewp/cyclone/archive/python3.zip?v3'
 
 COPY *.py *.html *.css *.js ./
 
 EXPOSE 10011:10011
 
-CMD [ "python", "./front_door_lock.py" ]
+CMD [ "python3", "./front_door_lock.py" ]
--- a/service/frontDoorLock/front_door_lock.py	Wed May 01 00:24:13 2019 -0700
+++ b/service/frontDoorLock/front_door_lock.py	Wed May 01 00:30:54 2019 -0700
@@ -6,15 +6,17 @@
 
 reasoning can infer :frontDoorLock :putState ?s to do that put request.
 """
+import time, json
+
 from docopt import docopt
-from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
 from rdflib import Namespace, URIRef, Literal, Graph
 from rdflib.parser import StringInputSource
 from twisted.internet import reactor, task
 import cyclone.web
-import logging, time, json
+
 from mqtt_client import MqttClient
-from logsetup import log, enableTwistedLog
+from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
+from standardservice.logsetup import log, verboseLogging
 
 ROOM = Namespace('http://projects.bigasterisk.com/room/')
 
@@ -25,36 +27,38 @@
     g.parse(StringInputSource(body), format='nt')
     return g
 
-def mqttMessageFromState(state):
+def mqttMessageFromState(state: URIRef):
     return {
         ROOM['locked']: b'OFF',
         ROOM['unlocked']: b'ON',
         }[state]
 
-def stateFromMqtt(msg):
+def stateFromMqtt(msg: bytes):
     return {
-        'OFF': ROOM['locked'],
-        'ON': ROOM['unlocked'],
-    }[msg.decode('ascii')]
+        b'OFF': ROOM['locked'],
+        b'ON': ROOM['unlocked'],
+    }[bytes(msg)]
     
 class OutputPage(cyclone.web.RequestHandler):
     def put(self):
         try:
-            user = URIRef(self.request.headers['x-foaf-agent'])
+            # what happened to the case-insens dict?
+            h = dict((k.lower(), v) for k,v in self.request.headers.items())
+            user = URIRef(h['x-foaf-agent'])
         except KeyError:
-            log.warn('request without x-foaf-agent: %s', self.request.headers)
+            log.warn('request without x-foaf-agent: %s', h)
             self.set_status(403, 'need x-foaf-agent')
             return
         arg = self.request.arguments
         if arg.get('s') and arg.get('p'):
             subj = URIRef(arg['s'][-1])
             pred = URIRef(arg['p'][-1])
-            obj = URIRef(self.request.body)
+            obj = URIRef(self.request.body.strip().decode('ascii'))
             stmt = (subj, pred, obj)
         else:
             g = rdfGraphBody(self.request.body, self.request.headers)
             assert len(g) == 1, len(g)
-            stmt = g.triples((None, None, None)).next()
+            stmt = next(g.triples((None, None, None)))
         self._onStatement(user, stmt)
     post = put
     
@@ -66,7 +70,7 @@
                 self.settings.autoLock.onUnlockedStmt()
             if stmt[2] == ROOM['locked']:
                 self.settings.autoLock.onLockedStmt()
-            self.settings.mqtt.publish("frontdoor/switch/strike/command",
+            self.settings.mqtt.publish(b"frontdoor/switch/strike/command",
                                        mqttMessageFromState(stmt[2]))
             return
         log.warn("ignoring %s", stmt)
@@ -83,7 +87,7 @@
 
     def relock(self):
         log.info('autolock is up: requesting lock')
-        self.mqtt.publish("frontdoor/switch/strike/command",
+        self.mqtt.publish(b"frontdoor/switch/strike/command",
                           mqttMessageFromState(ROOM['locked']))
 
     def reportTimes(self, unlockedFor):
@@ -144,7 +148,8 @@
         log.info('POST bluetoothButton %r', body)
         if body['addr'] == 'zz:zz:zz:zz:zz:zz' and body['key'] == 'top':
             log.info('unlock for %r', body['addr'])
-            self.settings.mqtt.publish("frontdoor/switch/strike/command", 'ON')
+            self.settings.mqtt.publish(
+                b"frontdoor/switch/strike/command", b'ON')
 
             
 if __name__ == '__main__':
@@ -153,10 +158,7 @@
 
     -v   Verbose
     """)
-    log.setLevel(logging.INFO)
-    if arg['-v']:
-        enableTwistedLog()
-        log.setLevel(logging.DEBUG)
+    verboseLogging(arg['-v'])
 
     masterGraph = PatchableGraph()
     mqtt = MqttClient(brokerPort=10010)
@@ -167,7 +169,7 @@
         masterGraph.patchObject(ctx, ROOM['frontDoorLock'], ROOM['state'],
                                 stateFromMqtt(payload))
 
-    mqtt.subscribe("frontdoor/switch/strike/state").subscribe(on_next=toGraph)
+    mqtt.subscribe(b"frontdoor/switch/strike/state").subscribe(on_next=toGraph)
     port = 10011
     reactor.listenTCP(port, cyclone.web.Application(
         [
--- a/service/frontDoorLock/makefile	Wed May 01 00:24:13 2019 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-JOB=front_door_lock
-PORT=10011
-
-TAG=bang6:5000/${JOB}_x86:latest
-
-build_image:
-	rm -rf tmp_ctx
-	mkdir -p tmp_ctx
-	cp -a Dockerfile ../../lib/*.py *.py *.txt *.html tmp_ctx
-	docker build --network=host -t ${TAG} tmp_ctx
-	docker push ${TAG}
-	rm -rf tmp_ctx
-
-
-shell:
-	docker run --rm -it --cap-add SYS_PTRACE --net=host bang6:5000/$(JOB)_x86:latest  /bin/sh
-
-local_run: build_image
-	docker run --rm -it --net=host -v `pwd`/index.html:/opt/index.html bang6:5000/$(JOB)_x86:latest python ./front_door_lock.py -v
-
-redeploy: build_image
-	supervisorctl restart $(JOB)_$(PORT)
--- a/service/frontDoorLock/requirements.txt	Wed May 01 00:24:13 2019 -0700
+++ b/service/frontDoorLock/requirements.txt	Wed May 01 00:30:54 2019 -0700
@@ -2,6 +2,11 @@
 rdflib-jsonld==0.4.0
 rdflib==4.2.2
 twisted-mqtt==0.3.6
-https://projects.bigasterisk.com/rdfdb/rdfdb-0.8.0.tar.gz
 rx==1.6.1
 git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales
+
+cycloneerr
+patchablegraph==0.5.0
+rdfdb==0.8.0
+standardservice==0.4.0
+mqtt_client==0.4.0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/frontDoorLock/tasks.py	Wed May 01 00:30:54 2019 -0700
@@ -0,0 +1,28 @@
+from invoke import task
+
+
+JOB = 'front_door_lock'
+PORT = 10011
+TAG = f'bang6:5000/{JOB}_x86:latest'
+ANSIBLE_TAG = 'door'
+
+@task
+def build_image(ctx):
+    ctx.run(f'docker build --network=host -t {TAG} .')
+
+@task(pre=[build_image])
+def push_image(ctx):
+    ctx.run(f'docker push {TAG}')
+
+@task(pre=[build_image])
+def shell(ctx):
+    ctx.run(f'docker run --name={JOB}_shell --rm -it --cap-add SYS_PTRACE --net=host {TAG} /bin/bash', pty=True)
+
+@task(pre=[build_image])
+def local_run(ctx):
+    ctx.run(f'docker run --name={JOB}_local --rm -it --net=host -v `pwd`/index.html:/opt/index.html {TAG} python3 ./front_door_lock.py -v', pty=True)
+
+@task(pre=[push_image])
+def redeploy(ctx):
+    ctx.run(f'sudo /my/proj/ansible/playbook -l bang -t {ANSIBLE_TAG}')
+    ctx.run(f'supervisorctl -s http://bang:9001/ restart {JOB}_{PORT}')