Exemple #1
0
    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()
Exemple #2
0
 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)
Exemple #3
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()