def run(self, sensor_id): ''' Perform the main listen and send loop of the program. (See file and class docstrings.) ''' basicConfig(filename=(settings.FAKER_LOG_FILE_TEMPL % sensor_id), format=settings.LOG_FORMAT, datefmt=settings.LOG_DATEFMT, level=LOGGING_DEBUG) # Register exit and signal behaviors. atexit.register(self.cleanup) signal.signal(signal.SIGHUP, signal.SIG_IGN) signal.signal(signal.SIGINT, self.handle_signal) signal.signal(signal.SIGTERM, self.handle_signal) signal.signal(signal.SIGQUIT, self.handle_signal) self.sensor = Sensor.objects.get(pk=sensor_id) addr = '%s:%d' % (self.sensor.ip, self.sensor.port) if self.sensor.name == '': desc = self.sensor.sensor_group.name else: desc = '%s %s' % (self.sensor.sensor_group.name, self.sensor.name) # TODO: is there a better way to give the profile to the # handler? FakeRhizomeHandler.profile = [unhexlify(s) for s in FAKE_RHIZOME_PROFILES[sensor_id]] self.sock = TCPServer((self.sensor.ip, self.sensor.port), FakeRhizomeHandler) status_msg = LogMessage(sensor=self.sensor, reading_time=datetime.datetime.now(), \ sensor_type='F', log_type='S', topic='Started',\ details='Started serving data') status_msg.save() info('Serving for sensor %d (%s, %s).' % (sensor_id, desc, addr)) self.sock.serve_forever()
def handle_signal(self, signum, frame): ''' If a SIGQUIT, SIGTERM, or SIGINT is received, shutdown cleanly. ''' if signum == signal.SIGQUIT: quit_msg = LogMessage(sensor=self.sensor, \ reading_time=datetime.datetime.now(),\ sensor_type='M', log_type='S', topic="Off",\ details="Caught Quit Signal") quit_msg.save() logging.info('Caught SIGQUIT.') elif signum == signal.SIGTERM: quit_msg = LogMessage(sensor=self.sensor, \ reading_time=datetime.datetime.now(),\ sensor_type='M', log_type='S', topic="Off",\ details="Caught Terminate Signal") quit_msg.save() logging.info('Caught SIGTERM.') elif signum == signal.SIGINT: quit_msg = LogMessage(sensor=self.sensor, \ reading_time=datetime.datetime.now(),\ sensor_type='M', log_type='S', topic="Off",\ details="Caught Interrupt Signal") quit_msg.save() logging.info('Caught SIGINT.') # cleanup() will be called since it is registered with atexit sys.exit(0)
def cleanup(self): ''' Close database and socket connections in preparation for termination. ''' info('Cleaning up: rolling back, disconnecting, disconnecting.') error_msg = LogMessage(sensor=self.sensor, reading_time=datetime.datetime.now(), \ sensor_type='F', log_type='S', topic='Closed',\ details='rolling back and disconnecting.') error_msg.save() if hasattr(self, 'sock'): self.sock.shutdown()