# HG changeset patch # User drewp@bigasterisk.com # Date 1716168713 25200 # Node ID 7a5c7721bf6d243905f827b9231f6613abb0e861 # Parent 560c9eab6647a035a6bf77d3c8b8d6a3d2d8ec8b better collector err handling diff -r 560c9eab6647 -r 7a5c7721bf6d src/light9/collector/output.py --- a/src/light9/collector/output.py Sat May 18 23:23:30 2024 -0700 +++ b/src/light9/collector/output.py Sun May 19 18:31:53 2024 -0700 @@ -192,7 +192,7 @@ from pyudmx import pyudmx self.dev = pyudmx.uDMXDevice() if not self.dev.open(bus=self.bus, address=self.address): - raise ValueError("dmx open failed") + raise ValueError(f"dmx open(bus={self.bus}, address={self.address}) failed") log.info(f'opened {self.dev}') metrics('connected', output=self.shortId()).set(1) metrics('reconnections', output=self.shortId()).inc() @@ -252,6 +252,9 @@ self.reconnect() return + if e.errno == 110: # USBTimeoutError + return self.crash() + raise dt = time.time() - t1 if dt > 1 / self.rate * 1.5: diff -r 560c9eab6647 -r 7a5c7721bf6d src/light9/collector/service.py --- a/src/light9/collector/service.py Sat May 18 23:23:30 2024 -0700 +++ b/src/light9/collector/service.py Sun May 19 18:31:53 2024 -0700 @@ -9,6 +9,8 @@ import asyncio import functools import logging +import os +import stat import subprocess import traceback from typing import List @@ -94,7 +96,10 @@ words = line.split(':')[0].split() dev = f'/dev/bus/usb/{words[1]}/{words[3]}' log.info(f'device will be {dev}') - return dev, int(words[3]) + st = os.stat(dev) + if not (st.st_mode & (stat.S_IWUSR | stat.S_IRUSR)): + raise ValueError(f'{dev} has insufficient stat ({stat.filemode(st.st_mode)})') + return dev, int(words[1]), int(words[3]) raise ValueError("no matching uDMX found") @@ -107,7 +112,7 @@ graph = SyncedGraph(networking.rdfdb.url, "collector") - devPath, usbAddress = findDevice() + devPath, bus, usbAddress = findDevice() # if user doesn't have r/w, fail now try: # todo: drive outputs with config files @@ -117,7 +122,7 @@ # port=6445, # rate=rate), #sudo chmod a+rw /dev/bus/usb/003/021 - Udmx(L9['output/dmxA/'], bus=3, address=usbAddress, lastDmxChannel=200, rate=RATE), + Udmx(L9['output/dmxA/'], bus=bus, address=usbAddress, lastDmxChannel=200, rate=RATE), ] except Exception: log.error("setting up outputs:")