changeset 2413:7a5c7721bf6d

better collector err handling
author drewp@bigasterisk.com
date Sun, 19 May 2024 18:31:53 -0700
parents 560c9eab6647
children 6c61735514e9
files src/light9/collector/output.py src/light9/collector/service.py
diffstat 2 files changed, 12 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- 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:
--- 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:")