annotate service/usbReset/usbReset.py @ 114:4cd065b97fa1

bugs in async http client. move trig helpers to rdflibtrig, which can work with rdflib 4 Ignore-this: 81dc30256f5d2658e53fce60abea66db
author drewp@bigasterisk.com
date Tue, 10 Sep 2013 00:38:52 -0700
parents 855deb1509a5
children e367cdd15a24
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
1 #!bin/python
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
2 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
3 resets usb ports and restarts other services. Must run as root for the usb part.
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
4
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
5 Other systems that might be able to do conditional tests and commands like this:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
6 https://github.com/azkaban/azkaban
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
7 nagios
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
8
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
9
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
10
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
11 run this as root to reset a whole usb device. Ported from
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
12 http://marc.info/?l=linux-usb&m=121459435621262&w=2
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
13
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
14 how to learn what device to reset? lsusb or lsusb -t
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
15
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
16 how to learn the ioctl number? cpp on this file:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
17
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
18 #include "/usr/include/linux/usbdevice_fs.h"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
19 #include "/usr/include/asm-generic/ioctl.h"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
20 USBDEVFS_RESET
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
21
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
22 last line comes out like this:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
23 (((0U) << (((0 +8)+8)+14)) | ((('U')) << (0 +8)) | (((20)) << 0) | ((0) << ((0 +8)+8)))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
24
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
25 this is a py expression:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
26 (((0) << (((0 +8)+8)+14)) | ((ord('U')) << (0 +8)) | (((20)) << 0) | ((0) << ((0 +8)+8)))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
27
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
28 ----------------
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
29
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
30 also this other usb reset:
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
31
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
32 http://davidjb.com/blog/2012/06/restartreset-usb-in-ubuntu-12-04-without-rebooting
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
33
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
34 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
35
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
36 from __future__ import division
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
37
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
38 import cyclone.web, json, traceback, os, sys, time, logging, re
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
39 import os, fcntl, commands, socket, logging, time, xmlrpclib, subprocess
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
40
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
41 from twisted.internet import reactor, task
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
42 from twisted.internet.defer import inlineCallbacks, returnValue, Deferred
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
43 from twisted.web.client import getPage
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
44 sys.path.append("/my/proj/house/frontdoor")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
45 from loggingserial import LoggingSerial
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
46 sys.path.append("/my/proj/homeauto/lib")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
47 from cycloneerr import PrettyErrorHandler
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
48 from logsetup import log
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
49
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
50 USBDEVFS_RESET = 21780
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
51
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
52 class Id(object):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
53 ftdi = "0403:6001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
54 frontDoorHub0 = "8087:0024" # bus2 dev 2
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
55 frontDoorHub1 = "0451:2046" # bus2 dev 3
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
56 frontDoorHub2 = "1a40:0101" # bus2 dev 7
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
57 frontDoorHub3 = "0409:0058" # bus2 dev 62
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
58 frontDoorCam = "0ac8:307b"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
59
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
60 bedroomHub0 = "8087:0020"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
61 bedroomHub1 = "05e3:0608"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
62 bedroomHub2 = "058f:6254"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
63 bedroomHub3 = "0409:005a"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
64 bedroomCam = "046d:08aa"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
65 bedroomSba = "04d8:000a"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
66 bedroomArduino = "0403:6001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
67
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
68 garageHub0 = "1d6b:0002" # bus2 dev1
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
69 garageHub1 = "05e3:0604" # bus2 dev4
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
70 garageArduino = "2341:0001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
71 garagePowerSerial = "0557:2008"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
72
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
73 blueHub = "1a40:0101"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
74
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
75 hostname = socket.gethostname()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
76
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
77 @inlineCallbacks
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
78 def getOk(url, timeout=1):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
79 """can we get a successful status from this url in a short time?"""
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
80 log.debug("testing %s" % url)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
81 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
82 resp = yield getPage(url, timeout=timeout)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
83 except Exception, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
84 log.warn("getPage %s", e)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
85 returnValue(False)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
86
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
87 returnValue(True)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
88
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
89 def hubDevice(usbId="1a40:0101"):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
90 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
91 what's the /dev path to the device with this usb id
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
92 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
93 for line in commands.getoutput("lsusb").splitlines():
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
94 if 'ID '+usbId in line:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
95 words = line.split()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
96 return "/dev/bus/usb/%s/%s" % (words[1], words[3].rstrip(':'))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
97 raise ValueError("no usb device found with id %r" % usbId)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
98
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
99 def haveDevice(usbId):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
100 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
101 log.debug("checking for %s", usbId)
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
102 dev = hubDevice(usbId)
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
103 # sometimes the dev will exist but fail to open
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
104 open(dev, "r")
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
105 return True
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
106 except (ValueError, IOError):
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
107 return False
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
108
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
109 def resetDevice(dev):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
110 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
111 send USBDEVFS_RESET to the given /dev address
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
112 """
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
113 d = Deferred()
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
114 log.debug("resetting %s" % dev)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
115 f=os.open(dev, os.O_WRONLY)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
116 ret = fcntl.ioctl(f, USBDEVFS_RESET, 0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
117 if ret != 0:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
118 raise ValueError("ioctl failed with %s" % ret)
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
119 reactor.callLater(3, d.callback, None)
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
120 return d
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
121
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
122 def supervisorRestart(cmds, supervisor="http://localhost:9001"):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
123 serv = xmlrpclib.ServerProxy(supervisor)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
124 for c in cmds:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
125 log.info("restarting %s", c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
126 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
127 serv.supervisor.stopProcessGroup(c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
128 except xmlrpclib.ResponseError, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
129 log.warn("supervisor.stopProcessGroup error %r, ignoring", e)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
130 serv.supervisor.startProcess(c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
131
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
132 def resetModules(modules):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
133 log.info("reloading modules: %s", modules)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
134 for m in modules:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
135 subprocess.call(['modprobe', '-r', m])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
136 for m in modules:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
137 subprocess.check_call(['modprobe', m])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
138
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
139
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
140 class Background(object):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
141 def __init__(self, config, period):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
142 self.config = config
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
143 self.period = period
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
144 self.lastPollTime = 0
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
145
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
146 def assertIsCurrent(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
147 """raise an error if the poll data is not fresh"""
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
148 dt = time.time() - self.lastPollTime
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
149 if dt > self.period * 2:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
150 raise ValueError("last poll time was too old: %.1f sec ago" % dt)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
151
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
152 @inlineCallbacks
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
153 def step(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
154 now = time.time()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
155 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
156 if hostname == 'bang':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
157 if (not haveDevice(Id.bedroomCam) or
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
158 not haveDevice(Id.bedroomArduino)):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
159 if haveDevice(Id.bedroomHub3):
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
160 yield resetDevice(hubDevice(Id.bedroomHub3))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
161 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
162 if haveDevice(Id.bedroomHub2):
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
163 yield resetDevice(hubDevice(Id.bedroomHub2))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
164 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
165 if haveDevice(Id.bedroomHub1):
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
166 yield resetDevice(hubDevice(Id.bedroomHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
167 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
168 if haveDevice(Id.bedroomHub0):
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
169 yield resetDevice(hubDevice(Id.bedroomHub0))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
170 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
171 raise ValueError(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
172 "don't even have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
173 resetModules(['gspca_zc3xx'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
174 supervisorRestart(['webcam_9053'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
175 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
176 log.debug("usb devices look ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
177
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
178 elif hostname == 'slash':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
179 haveFrontHub0 = haveDevice(Id.frontDoorHub0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
180 haveFrontHub1 = haveDevice(Id.frontDoorHub1)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
181 haveFrontHub2 = haveDevice(Id.frontDoorHub2)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
182 haveFrontHub3 = haveDevice(Id.frontDoorHub3)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
183 haveGarageHub0 = haveDevice(Id.garageHub0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
184 haveGarageHub1 = haveDevice(Id.garageHub1)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
185 haveFrontDoorCam = haveDevice(Id.frontDoorCam)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
186 haveV4lDevice = os.path.exists(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
187 "/dev/v4l/by-id/usb-Vimicro_Corp._PC_Camera-video-index0")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
188 haveFrontArduinoServe = (yield getOk('http://slash:9080/'))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
189 haveFrontWebcamImage = (yield getOk(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
190 "http://slash:9023/frontDoor", timeout=10))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
191
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
192 log.info(str(vars()))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
193
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
194 if not haveDevice(Id.ftdi):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
195 if haveFrontHub3:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
196 yield resetDevice(hubDevice(Id.frontDoorHub3))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
197 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
198 if haveFrontHub2:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
199 yield resetDevice(hubDevice(Id.frontDoorHub2))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
200 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
201 if haveFrontHub1:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
202 yield resetDevice(hubDevice(Id.frontDoorHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
203 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
204 if haveFrontHub0:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
205 yield resetDevice(hubDevice(Id.frontDoorHub0))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
206 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
207 raise ValueError("don't have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
208 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
209 log.debug("front door chain looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
210
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
211 if not haveDevice(Id.garagePowerSerial):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
212 if haveGarageHub1:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
213 yield resetDevice(hubDevice(Id.garageHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
214 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
215 if haveGarageHub0:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
216 yield resetDevice(hubDevice(Id.garageHub0))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
217 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
218 raise ValueError("don't have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
219 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
220 log.debug("garage chain looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
221
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
222 if not haveDevice(Id.garageArduino):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
223 if haveGarageHub1:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
224 yield resetDevice(hubDevice(Id.garageHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
225 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
226 raise ValueError("don't even have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
227 resetModules(['gspca_zc3xx'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
228 supervisorRestart(['frontDoorArduino_9080'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
229 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
230 if not haveFrontArduinoServe:
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
231 yield resetDevice(hubDevice(Id.frontDoorHub3))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
232 supervisorRestart(['frontDoorArduino_9080'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
233 time.sleep(10)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
234 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
235 log.debug("frontDoorArduino looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
236
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
237 if not haveFrontWebcamImage:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
238 supervisorRestart(['webcam_frontDoor_9023'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
239 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
240 log.debug("front webcam looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
241
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
242 elif hostname == 'dash':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
243 if not os.path.exists("/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900gbcG-if00-port0"):
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
244 yield resetDevice(hubDevice("/dev/bus/usb/003/001"))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
245
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
246 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
247 raise NotImplementedError
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
248
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
249 log.debug(" -- finished")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
250 self.lastPollTime = now
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
251
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
252 except Exception, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
253 print "poll error", e
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
254 traceback.print_exc()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
255
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
256 class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
257 def get(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
258 self.settings.background.assertIsCurrent()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
259
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
260 self.set_header("Content-Type", "application/xhtml+xml")
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
261 self.write(open("index.html").read())
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
262
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
263 class Devices(PrettyErrorHandler, cyclone.web.RequestHandler):
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
264 def get(self):
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
265 out = []
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
266 for line in commands.getoutput("lsusb").splitlines():
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
267 words = line.split(None, 6)
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
268 for name, usbId in Id.__dict__.items():
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
269 if usbId == words[5]:
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
270 break
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
271 else:
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
272 name = "?"
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
273 out.append(dict(dev="/dev/bus/usb/%s/%s" % (words[1], words[3].rstrip(':')),
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
274 name=name,
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
275 usbId=words[5],
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
276 usbName=words[6] if len(words) > 6 else ""))
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
277
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
278 self.set_header("Content-Type", "application/json")
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
279 self.write(json.dumps({'devices':out}))
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
280
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
281 class Reset(PrettyErrorHandler, cyclone.web.RequestHandler):
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
282 @inlineCallbacks
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
283 def post(self):
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
284 dev = self.get_argument('dev')
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
285 assert re.match("^[a-z0-9/]+$", dev), dev
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
286 yield resetDevice(dev)
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
287
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
288 self.set_header("Content-Type", "text/plain")
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
289 self.write("ok")
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
290
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
291 if __name__ == '__main__':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
292 config = { # to be read from a file
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
293 'servePort' : 9100,
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
294 'checkPeriod' : 30,
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
295 }
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
296
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
297 from twisted.python import log as twlog
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
298 #twlog.startLogging(sys.stdout)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
299
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
300 log.setLevel(logging.DEBUG)
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
301
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
302 p = Background(config, config['checkPeriod'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
303 task.LoopingCall(p.step).start(config['checkPeriod'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
304
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
305 reactor.listenTCP(config['servePort'], cyclone.web.Application([
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
306 (r"/", Index),
80
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
307 (r"/devices", Devices),
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
308 (r"/devices/reset", Reset),
855deb1509a5 updated device tree. web ui for resetting things
drewp@bigasterisk.com
parents: 42
diff changeset
309 ], background=p, static_path="static"))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
310 reactor.run()