289 def run(self):
290 cls = self._device_def["cls"]
291 cls_name = cls.__name__
292
293
294
295
296
297
298
299 root_logger = logging.getLogger()
300
301
302 for handler in list(root_logger.handlers):
303 root_logger.removeHandler(handler)
304
305 root_logger.setLevel(self._options.logging_level)
306
307
308
309
310
311 stderr_handler = StreamHandler(sys.stderr)
312 stderr_handler.setFormatter(_create_log_formatter(cls_name))
313 root_logger.addHandler(stderr_handler)
314 root_logger.debug("Debugging messages on.")
315
316 root_logger.addFilter(Filter())
317
318
319
320 cls_is_type = isinstance(cls, type)
321
322 if not cls_is_type:
323 self._devices = cls(**self._device_def["conf"])
324 else:
325 while not self.exit_event.is_set():
326 try:
327 device = cls(**self._device_def["conf"])
328 except Exception as e:
329 _logger.info(
330 "Failed to start device. Retrying in 5s.", exc_info=e
331 )
332 time.sleep(5)
333 else:
334 break
335 self._devices = {cls_name: device}
336
337 if cls_is_type and issubclass(cls, FloatingDeviceMixin):
338 uid = str(list(self._devices.values())[0].get_id())
339 if uid not in self._id_to_host or uid not in self._id_to_port:
340 raise Exception(
341 "Host or port not found for device %s" % (uid,)
342 )
343 host = self._id_to_host[uid]
344 port = self._id_to_port[uid]
345 else:
346 host = self._device_def["host"]
347 port = self._device_def["port"]
348
349 pyro_daemon = Pyro4.Daemon(port=port, host=host)
350
351 log_handler = RotatingFileHandler(
352 "%s_%s_%s.log" % (cls_name, host, port)
353 )
354 log_handler.setFormatter(_create_log_formatter(cls_name))
355 root_logger.addHandler(log_handler)
356
357 _logger.info("Device initialized; starting daemon.")
358 for obj_id, device in self._devices.items():
359 _register_device(pyro_daemon, device, obj_id=obj_id)
360
361
362
363 pyro_thread = Thread(target=pyro_daemon.requestLoop)
364 pyro_thread.daemon = True
365 pyro_thread.start()
366 for device in self._devices.values():
367 _logger.info("Serving %s", pyro_daemon.uriFor(device))
368 if isinstance(device, FloatingDeviceMixin):
369 _logger.info(
370 "Device UID on port %s is %s", port, device.get_id()
371 )
372
373
374
375
376 while self.exit_event and not self.exit_event.is_set():
377
378 try:
379 time.sleep(5)
380 except (KeyboardInterrupt, IOError):
381 pass
382 pyro_daemon.shutdown()
383 pyro_thread.join()
384 for device in self._devices.values():
385 try:
386 device.shutdown()
387 except Exception as ex:
388
389
390 _logger.error("Failure to shutdown device %s", device, ex)
391
392