annotate service/usbReset/usbReset.py @ 42:022921fdafd0

catch another broken-usb state Ignore-this: 5b9545e31635c27d1d8d9ecdf3dcdf28
author drewp@bigasterisk.com
date Thu, 27 Sep 2012 15:43:44 -0700
parents 75e3812e712b
children 855deb1509a5
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
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
28
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
29 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
30
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
31 from __future__ import division
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
32
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
33 import cyclone.web, json, traceback, os, sys, time, logging
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
34 import os, fcntl, commands, socket, logging, time, xmlrpclib, subprocess
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
35
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
36 from twisted.internet import reactor, task
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
37 from twisted.internet.defer import inlineCallbacks, returnValue
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
38 from twisted.web.client import getPage
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
39 sys.path.append("/my/proj/house/frontdoor")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
40 from loggingserial import LoggingSerial
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
41 sys.path.append("/my/proj/homeauto/lib")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
42 from cycloneerr import PrettyErrorHandler
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
43 from logsetup import log
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
44
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
45 USBDEVFS_RESET = 21780
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
46
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
47 class Id(object):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
48 ftdi = "0403:6001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
49 frontDoorHub0 = "8087:0024" # bus2 dev 2
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
50 frontDoorHub1 = "0451:2046" # bus2 dev 3
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
51 frontDoorHub2 = "1a40:0101" # bus2 dev 7
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
52 frontDoorHub3 = "0409:0058" # bus2 dev 62
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
53 frontDoorCam = "0ac8:307b"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
54
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
55 bedroomHub0 = "8087:0020"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
56 bedroomHub1 = "05e3:0608"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
57 bedroomHub2 = "058f:6254"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
58 bedroomHub3 = "0409:005a"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
59 bedroomCam = "046d:08aa"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
60 bedroomSba = "04d8:000a"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
61 bedroomArduino = "0403:6001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
62
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
63 garageHub0 = "1d6b:0002" # bus2 dev1
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
64 garageHub1 = "05e3:0604" # bus2 dev4
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
65 garageArduino = "2341:0001"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
66 garagePowerSerial = "0557:2008"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
67
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
68 blueHub = "1a40:0101"
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
69
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
70 hostname = socket.gethostname()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
71
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
72 @inlineCallbacks
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
73 def getOk(url, timeout=1):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
74 """can we get a successful status from this url in a short time?"""
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
75 log.debug("testing %s" % url)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
76 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
77 resp = yield getPage(url, timeout=timeout)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
78 except Exception, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
79 log.warn("getPage %s", e)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
80 returnValue(False)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
81
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
82 returnValue(True)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
83
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
84 def hubDevice(usbId="1a40:0101"):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
85 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
86 what's the /dev path to the device with this usb id
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
87 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
88 for line in commands.getoutput("lsusb").splitlines():
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
89 if 'ID '+usbId in line:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
90 words = line.split()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
91 return "/dev/bus/usb/%s/%s" % (words[1], words[3].rstrip(':'))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
92 raise ValueError("no usb device found with id %r" % usbId)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
93
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
94 def haveDevice(usbId):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
95 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
96 log.debug("checking for %s", usbId)
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
97 dev = hubDevice(usbId)
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
98 # sometimes the dev will exist but fail to open
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
99 open(dev, "r")
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
100 return True
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
101 except (ValueError, IOError):
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
102 return False
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
103
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
104 def resetDevice(dev):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
105 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
106 send USBDEVFS_RESET to the given /dev address
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
107 """
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
108 log.debug("resetting %s" % dev)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
109 f=os.open(dev, os.O_WRONLY)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
110 ret = fcntl.ioctl(f, USBDEVFS_RESET, 0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
111 if ret != 0:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
112 raise ValueError("ioctl failed with %s" % ret)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
113 time.sleep(3)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
114
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
115 def supervisorRestart(cmds, supervisor="http://localhost:9001"):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
116 serv = xmlrpclib.ServerProxy(supervisor)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
117 for c in cmds:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
118 log.info("restarting %s", c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
119 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
120 serv.supervisor.stopProcessGroup(c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
121 except xmlrpclib.ResponseError, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
122 log.warn("supervisor.stopProcessGroup error %r, ignoring", e)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
123 serv.supervisor.startProcess(c)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
124
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
125 def resetModules(modules):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
126 log.info("reloading modules: %s", modules)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
127 for m in modules:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
128 subprocess.call(['modprobe', '-r', m])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
129 for m in modules:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
130 subprocess.check_call(['modprobe', m])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
131
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
132
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
133 class Background(object):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
134 def __init__(self, config, period):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
135 self.config = config
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
136 self.period = period
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
137 self.lastPollTime = 0
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
138
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
139 def assertIsCurrent(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
140 """raise an error if the poll data is not fresh"""
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
141 dt = time.time() - self.lastPollTime
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
142 if dt > self.period * 2:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
143 raise ValueError("last poll time was too old: %.1f sec ago" % dt)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
144
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
145 @inlineCallbacks
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
146 def step(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
147 now = time.time()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
148 try:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
149 if hostname == 'bang':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
150 if (not haveDevice(Id.bedroomCam) or
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
151 not haveDevice(Id.bedroomArduino)):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
152 if haveDevice(Id.bedroomHub3):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
153 resetDevice(hubDevice(Id.bedroomHub3))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
154 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
155 if haveDevice(Id.bedroomHub2):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
156 resetDevice(hubDevice(Id.bedroomHub2))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
157 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
158 if haveDevice(Id.bedroomHub1):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
159 resetDevice(hubDevice(Id.bedroomHub1))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
160 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
161 if haveDevice(Id.bedroomHub0):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
162 resetDevice(hubDevice(Id.bedroomHub0))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
163 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
164 raise ValueError(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
165 "don't even have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
166 resetModules(['gspca_zc3xx'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
167 supervisorRestart(['webcam_9053'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
168 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
169 log.debug("usb devices look ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
170
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
171 elif hostname == 'slash':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
172 haveFrontHub0 = haveDevice(Id.frontDoorHub0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
173 haveFrontHub1 = haveDevice(Id.frontDoorHub1)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
174 haveFrontHub2 = haveDevice(Id.frontDoorHub2)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
175 haveFrontHub3 = haveDevice(Id.frontDoorHub3)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
176 haveGarageHub0 = haveDevice(Id.garageHub0)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
177 haveGarageHub1 = haveDevice(Id.garageHub1)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
178 haveFrontDoorCam = haveDevice(Id.frontDoorCam)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
179 haveV4lDevice = os.path.exists(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
180 "/dev/v4l/by-id/usb-Vimicro_Corp._PC_Camera-video-index0")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
181 haveFrontArduinoServe = (yield getOk('http://slash:9080/'))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
182 haveFrontWebcamImage = (yield getOk(
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
183 "http://slash:9023/frontDoor", timeout=10))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
184
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
185 log.info(str(vars()))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
186
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
187 if not haveDevice(Id.ftdi):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
188 if haveFrontHub3:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
189 resetDevice(hubDevice(Id.frontDoorHub3))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
190 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
191 if haveFrontHub2:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
192 resetDevice(hubDevice(Id.frontDoorHub2))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
193 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
194 if haveFrontHub1:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
195 resetDevice(hubDevice(Id.frontDoorHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
196 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
197 if haveFrontHub0:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
198 resetDevice(hubDevice(Id.frontDoorHub0))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
199 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
200 raise ValueError("don't have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
201 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
202 log.debug("front door chain looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
203
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
204 if not haveDevice(Id.garagePowerSerial):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
205 if haveGarageHub1:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
206 resetDevice(hubDevice(Id.garageHub1))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
207 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
208 if haveGarageHub0:
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
209 resetDevice(hubDevice(Id.garageHub0))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
210 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
211 raise ValueError("don't have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
212 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
213 log.debug("garage chain looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
214
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
215 if not haveDevice(Id.garageArduino):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
216 if haveGarageHub1:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
217 resetDevice(hubDevice(Id.garageHub1))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
218 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
219 raise ValueError("don't even have the first hub")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
220 resetModules(['gspca_zc3xx'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
221 supervisorRestart(['frontDoorArduino_9080'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
222 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
223 if not haveFrontArduinoServe:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
224 resetDevice(hubDevice(Id.frontDoorHub3))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
225 supervisorRestart(['frontDoorArduino_9080'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
226 time.sleep(10)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
227 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
228 log.debug("frontDoorArduino looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
229
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
230 if not haveFrontWebcamImage:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
231 supervisorRestart(['webcam_frontDoor_9023'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
232 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
233 log.debug("front webcam looks ok")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
234
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
235 elif hostname == 'dash':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
236 if not os.path.exists("/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A900gbcG-if00-port0"):
42
022921fdafd0 catch another broken-usb state
drewp@bigasterisk.com
parents: 41
diff changeset
237 resetDevice(hubDevice("/dev/bus/usb/003/001"))
41
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
238
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
239 else:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
240 raise NotImplementedError
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
241
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
242 log.debug(" -- finished")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
243 self.lastPollTime = now
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
244
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
245 except Exception, e:
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
246 print "poll error", e
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
247 traceback.print_exc()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
248
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
249 class Index(PrettyErrorHandler, cyclone.web.RequestHandler):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
250 def get(self):
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
251 self.settings.background.assertIsCurrent()
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
252
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
253 self.set_header("Content-Type", "application/xhtml+xml")
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
254 self.write("usbreset is ok")#open("index.html").read())
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
255
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
256 if __name__ == '__main__':
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
257 config = { # to be read from a file
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
258 'servePort' : 9100,
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
259 'checkPeriod' : 30,
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
260 }
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
261
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
262 from twisted.python import log as twlog
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
263 #twlog.startLogging(sys.stdout)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
264
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
265 log.setLevel(logging.INFO)
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
266
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
267 p = Background(config, config['checkPeriod'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
268 task.LoopingCall(p.step).start(config['checkPeriod'])
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
269
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
270 reactor.listenTCP(config['servePort'], cyclone.web.Application([
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
271 (r"/", Index),
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
272 ], background=p))
75e3812e712b usb reset mess
drewp@bigasterisk.com
parents:
diff changeset
273 reactor.run()