Mercurial > code > home > repos > homeauto
changeset 563:7f57d171d6d3
py3 and new build
Ignore-this: 69cf69e5d43adfa65b3f62c5c0af2014
author | drewp@bigasterisk.com |
---|---|
date | Wed, 01 May 2019 00:30:54 -0700 |
parents | 82e9480c3b7d |
children | d0830394bf7b |
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}')