annotate service/usbReset/usbReset.py @ 1153:e4f49cd9dda3

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