changeset 1423:ba56263fe3b2

arduinonode to docker Ignore-this: 8f689c7491819bc47200018b517fd7de darcs-hash:e3602fc781c7b66e98ca950d5782ecc41e506bad
author drewp <drewp@bigasterisk.com>
date Wed, 07 Aug 2019 20:23:04 -0700
parents 975d6c25be7d
children 458355ee1b99
files service/arduinoNode/Dockerfile service/arduinoNode/arduinoNode.py service/arduinoNode/makefile service/arduinoNode/requirements.txt service/arduinoNode/tasks.py
diffstat 5 files changed, 77 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/service/arduinoNode/Dockerfile	Sun Aug 04 13:03:18 2019 -0700
+++ b/service/arduinoNode/Dockerfile	Wed Aug 07 20:23:04 2019 -0700
@@ -2,18 +2,15 @@
 
 WORKDIR /opt
 
+RUN apt-get install -y arduino-mk indent
+
 COPY requirements.txt ./
-RUN pip install -r requirements.txt
-RUN apt-get install -y arduino-mk indent
+RUN pip install --index-url https://projects.bigasterisk.com/ --extra-index-url https://pypi.org/simple -r requirements.txt
 
 COPY arduino-libraries/ ./arduino-libraries/
 COPY *.py ./
-COPY static/ ./static/
 COPY config/ ./config/
 
-ADD https://projects.bigasterisk.com/rdfdb/more.tgz ./
-RUN tar xvzf more.tgz
-
 EXPOSE 9059
 
 CMD [ "python", "./arduinoNode.py" ]
--- a/service/arduinoNode/arduinoNode.py	Sun Aug 04 13:03:18 2019 -0700
+++ b/service/arduinoNode/arduinoNode.py	Wed Aug 07 20:23:04 2019 -0700
@@ -1,5 +1,5 @@
 from __future__ import division
-import glob, sys, logging, subprocess, socket, hashlib, time, tempfile
+import glob, sys, logging, subprocess, socket, hashlib, time, tempfile, pkg_resources
 import shutil, json
 import serial
 import cyclone.web
@@ -24,11 +24,9 @@
 
 from loggingserial import LoggingSerial
 
-sys.path.append("../../lib")
 from patchablegraph import PatchableGraph, CycloneGraphHandler, CycloneGraphEventsHandler
 from export_to_influxdb import InfluxExporter
 
-sys.path.append("/my/proj/rdfdb")
 from rdfdb.patch import Patch
 from rdfdb.rdflibpatch import inContext
 
@@ -57,7 +55,7 @@
         self.configGraph = ConjunctiveGraph()
 
         self.etcPrefix = 'arduino/'
-        
+
         self.boards = []
         self.reread()
 
@@ -78,7 +76,7 @@
         if getattr(self, 'rereadLater', None):
             self.rereadLater.cancel()
         self.rereadLater = None
-        
+
     def reread(self):
         self.cancelRead()
         log.info('read config')
@@ -117,7 +115,7 @@
         for b in self.boards:
             b.startPolling(period=.1 if not self.slowMode else 10)
 
-        
+
 class Board(object):
     """an arduino connected to this computer"""
     baudrate = 115200
@@ -138,7 +136,7 @@
         self._devCommandNum = dict((dev.uri, ACTION_BASE + devIndex)
                                    for devIndex, dev in enumerate(self._devs))
         self._polledDevs = [d for d in self._devs if d.generatePollCode()]
-        
+
         self._statementsFromInputs = {} # input device uri: latest statements
         self._lastPollTime = {} # input device uri: time()
         self._influx = InfluxExporter(self.configGraph)
@@ -154,14 +152,14 @@
             'baudrate': self.baudrate,
             'devices': [d.description() for d in self._devs],
             }
-        
+
     def open(self):
         self.ser = LoggingSerial(port=self.dev, baudrate=self.baudrate,
                                  timeout=2)
-        
+
     def startPolling(self, period=.5):
         task.LoopingCall(self._poll).start(period)
-            
+
     def _poll(self):
         """
         even boards with no inputs need some polling to see if they're
@@ -175,7 +173,7 @@
         except Exception as e:
             import traceback; traceback.print_exc()
             log.warn("poll: %r" % e)
-            
+
     def _pollWork(self):
         t1 = time.time()
         self.ser.write("\x60\x00") # "poll everything"
@@ -229,7 +227,7 @@
         self.masterGraph.patch(Patch.fromDiff(inContext(prev, dev),
                                               inContext(new, dev)))
         self._statementsFromInputs[dev] = new
-              
+
     def _sendOneshot(self, oneshot):
         body = (' '.join('%s %s %s .' % (s.n3(), p.n3(), o.n3())
                          for s,p,o in oneshot)).encode('utf8')
@@ -309,13 +307,13 @@
         except Exception as e:
             log.info("can't get code version from board: %r" % e)
         return False
-        
+
     def deployToArduino(self):
         code, cksum = self.generateArduinoCode()
 
         if self._boardIsCurrent(cksum):
             return
-        
+
         try:
             if hasattr(self, 'ser'):
                 self.ser.close()
@@ -338,11 +336,11 @@
             main.write(code)
 
         subprocess.check_call(['make', 'upload'], cwd=workDir)
-        
+
 
     def currentGraph(self):
         g = Graph()
-        
+
 
         for dev in self._devs:
             for stmt in dev.hostStatements():
@@ -354,7 +352,7 @@
         configGraph = self.settings.config.graph
         dot = dotrender.render(configGraph, self.settings.config.boards)
         self.write(dot)
-        
+
 class ArduinoCode(cyclone.web.RequestHandler):
     def get(self):
         board = [b for b in self.settings.config.boards if
@@ -374,7 +372,7 @@
         stmts = list(rdfGraphBody(self.request.body, self.request.headers))
         for b in self.settings.config.boards:
             b.outputStatements(stmts)
-            
+
     def put(self):
         subj = URIRef(self.get_argument('s'))
         pred = URIRef(self.get_argument('p'))
@@ -388,8 +386,8 @@
         stmt = (subj, pred, obj)
         for b in self.settings.config.boards:
             b.outputStatements([stmt])
-        
-        
+
+
 class Boards(cyclone.web.RequestHandler):
     def get(self):
         self.set_header('Content-type', 'application/json')
@@ -397,11 +395,11 @@
             'host': hostname,
             'boards': [b.description() for b in self.settings.config.boards]
         }, indent=2))
-            
+
 def currentSerialDevices():
     log.info('find connected boards')
     return glob.glob('/dev/serial/by-id/*')
-        
+
 def main():
     arg = docopt("""
     Usage: arduinoNode.py [options]
@@ -421,10 +419,11 @@
 
     masterGraph = PatchableGraph()
     config = Config(masterGraph, slowMode=arg['-l'])
+    static = pkg_resources.resource_filename('homeauto_anynode', 'static/')
 
     reactor.listenTCP(9059, cyclone.web.Application([
-        (r"/()", cyclone.web.StaticFileHandler, {
-            "path": "static", "default_filename": "index.html"}),
+        (r"/(|output-widgets.html)", cyclone.web.StaticFileHandler, {
+            "path": static, "default_filename": "index.html"}),
         (r'/static/(.*)', cyclone.web.StaticFileHandler, {"path": "static"}),
         (r'/stats/(.*)', StatsHandler, {'serverName': 'arduinoNode'}),
         (r'/boards', Boards),
--- a/service/arduinoNode/makefile	Sun Aug 04 13:03:18 2019 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-build_image:
-	(cd /my/proj/homeauto/lib; tar czf /my/site/projects/rdfdb/more.tgz *.py)
-	docker build --network=host -t bang6:5000/arduino_node .
-	docker push bang6:5000/arduino_node
-
-shell: build_image
-	docker run -it --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node  /bin/bash
-
-local_run: build_image
-	docker run -it -p 9059:9059 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0 --net=host bang6:5000/arduino_node python ./arduinoNode.py -v
-
-push_config:
-	docker run -it --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node python pushConfig.py arduino/
-
-lightsout:
-	curl http://bang:9059/output\?s\=http://projects.bigasterisk.com/room/speakersStrips\&p\=http://projects.bigasterisk.com/room/x -XPUT -d 199
-
-redeploy: build_image
-	ctl restart arduinoNodeBang_9059
--- a/service/arduinoNode/requirements.txt	Sun Aug 04 13:03:18 2019 -0700
+++ b/service/arduinoNode/requirements.txt	Wed Aug 07 20:23:04 2019 -0700
@@ -1,16 +1,24 @@
 cryptography
 cyclone
 docopt
+etcd3==0.10.0
+git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales
+imageio==2.2.0
+influxdb==3.0.0
 numpy
+pillow>=5
 pyOpenSSL
+pyserial
 python-dateutil
-service_identity
-pillow>=5
-rdflib==4.2.2
 rdflib-jsonld==0.3
-influxdb==3.0.0
-imageio==2.2.0
-https://projects.bigasterisk.com/rdfdb/rdfdb-0.8.0.tar.gz
-pyserial
-etcd3
-git+http://github.com/drewp/scales.git@448d59fb491b7631877528e7695a93553bfaaa93#egg=scales
+rdflib==4.2.2
+service_identity
+
+cycloneerr
+devices_shared==0.3.0
+export_to_influxdb==0.1.0
+homeauto_anynode==0.8.0
+patchablegraph==0.5.0
+rdfdb==0.8.0
+standardservice==0.6.0
+patchablegraph==0.5.0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/arduinoNode/tasks.py	Wed Aug 07 20:23:04 2019 -0700
@@ -0,0 +1,34 @@
+from invoke import task
+
+JOB = 'arduinoNode'
+PORT = 9059
+TAG = f'bang6:5000/{JOB.lower()}:latest'
+ANSIBLE_TAG = JOB
+
+@task
+def build_image(ctx):
+    ctx.run(f'docker build -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 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0  -v `pwd`/config:/opt/config  {TAG} /bin/bash', pty=True)
+
+@task(pre=[build_image])
+def local_run(ctx):
+    ctx.run(f'docker run --name={JOB}_local --rm -it -p 9059:9059 --device=/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900cepU-if00-port0 --net=host   --dns 10.2.0.1 --dns-search bigasterisk.com {TAG} python ./arduinoNode.py -v', pty=True)
+
+@task
+def push_config(ctx):
+    ctx.run(f'docker run --rm --net=host -v `pwd`/config:/opt/config bang6:5000/arduino_node python pushConfig.py arduino/')
+
+@task(pre=[push_image])
+def redeploy(ctx):
+    ctx.run(f'sudo /my/proj/ansible/playbook -l bang -t {ANSIBLE_TAG}')
+
+@task
+def lightsout(ctx):
+    ctx.run(rf'curl http://bang:9059/output\?s\=http://projects.bigasterisk.com/room/speakersStrips\&p\=http://projects.bigasterisk.com/room/x -XPUT -v -d 199')