示例#1
0
    def __init__(self):
        parser = ArgumentParser(description='Solar Controller Data Collector')
        parser.add_argument('-s', '--src', type=str, help='Controller IP Address')
        parser.add_argument('-p', '--port', type=int, help='Controller Port')
        parser.add_argument('-f', '--format', type=str, help='Data logger type', default='json')
        parser.add_argument('-d', '--dst', type=str, help='Data file', default='/tmp/vbus_data.log')      
        parser.add_argument('-P', '--pass', type=str, help='Password', default=None)      
        parser.add_argument('-k', '--keys', type=str, help='Comma delimited list of keys to dump', default=None)      
        parser.add_argument('-l', '--log', type=str, help='Debug log path', default='/tmp/vbus_debug.log')      
        parser.add_argument('-t', '--timeout', type=int, help='Socket timeout', default=5)      
        parser.add_argument('-u', '--user', type=str, help='System user to run as', default='vbus')      
        parser.add_argument('-g', '--group', type=str, help='System group to run as', default='vbus')      
        self.args = vars(parser.parse_args())

        try:
            if os.getuid() == 0:
                os.setgroups([])
                os.setgid(grp.getgrnam(self.args['user']).gr_gid)
                os.setuid(pwd.getpwnam(self.args['group']).pw_uid)
                os.umask(077)
        except:
            exit(255)

        self.__setup_logging()
   
        self.packet_processor = DeltaSolC(
            results_callback=self.write_data, 
            log_callback=self._log
        )
        
        if self.args['keys']:
            keys = self.args['keys'].split(',')
        else:
            keys = None

        if self.args['format'] == 'json':
            from logger.JSONLogger import JSONLogger 
            self.data_logger = JSONLogger(self.args['dst'], keys)
        elif self.args['format'] == 'rrd':
            from logger.RRDLogger import RRDLogger 
            self.data_logger = RRDLogger(self.args['dst'], keys)
        else:
            raise Exception('Unknown format type')

        signal.signal(signal.SIGTERM, self.__term_handler)
示例#2
0
    def __init__(self):
        parser = ArgumentParser(description='Solar Controller Data Collector')
        parser.add_argument('-s',
                            '--src',
                            type=str,
                            help='Controller IP Address')
        parser.add_argument('-p', '--port', type=int, help='Controller Port')
        parser.add_argument('-f',
                            '--format',
                            type=str,
                            help='Data logger type',
                            default='json')
        parser.add_argument('-d',
                            '--dst',
                            type=str,
                            help='Data file',
                            default='/tmp/vbus_data.log')
        parser.add_argument('-P',
                            '--pass',
                            type=str,
                            help='Password',
                            default=None)
        parser.add_argument('-k',
                            '--keys',
                            type=str,
                            help='Comma delimited list of keys to dump',
                            default=None)
        parser.add_argument('-l',
                            '--log',
                            type=str,
                            help='Debug log path',
                            default='/tmp/vbus_debug.log')
        parser.add_argument('-t',
                            '--timeout',
                            type=int,
                            help='Socket timeout',
                            default=5)
        parser.add_argument('-u',
                            '--user',
                            type=str,
                            help='System user to run as',
                            default='vbus')
        parser.add_argument('-g',
                            '--group',
                            type=str,
                            help='System group to run as',
                            default='vbus')
        self.args = vars(parser.parse_args())

        try:
            if os.getuid() == 0:
                os.setgroups([])
                os.setgid(grp.getgrnam(self.args['user']).gr_gid)
                os.setuid(pwd.getpwnam(self.args['group']).pw_uid)
                os.umask(077)
        except:
            exit(255)

        self.__setup_logging()

        self.packet_processor = DeltaSolC(results_callback=self.write_data,
                                          log_callback=self._log)

        if self.args['keys']:
            keys = self.args['keys'].split(',')
        else:
            keys = None

        if self.args['format'] == 'json':
            from logger.JSONLogger import JSONLogger
            self.data_logger = JSONLogger(self.args['dst'], keys)
        elif self.args['format'] == 'rrd':
            from logger.RRDLogger import RRDLogger
            self.data_logger = RRDLogger(self.args['dst'], keys)
        else:
            raise Exception('Unknown format type')

        signal.signal(signal.SIGTERM, self.__term_handler)
示例#3
0
class VBusListener():  
        
    def __init__(self):
        parser = ArgumentParser(description='Solar Controller Data Collector')
        parser.add_argument('-s', '--src', type=str, help='Controller IP Address')
        parser.add_argument('-p', '--port', type=int, help='Controller Port')
        parser.add_argument('-f', '--format', type=str, help='Data logger type', default='json')
        parser.add_argument('-d', '--dst', type=str, help='Data file', default='/tmp/vbus_data.log')      
        parser.add_argument('-P', '--pass', type=str, help='Password', default=None)      
        parser.add_argument('-k', '--keys', type=str, help='Comma delimited list of keys to dump', default=None)      
        parser.add_argument('-l', '--log', type=str, help='Debug log path', default='/tmp/vbus_debug.log')      
        parser.add_argument('-t', '--timeout', type=int, help='Socket timeout', default=5)      
        parser.add_argument('-u', '--user', type=str, help='System user to run as', default='vbus')      
        parser.add_argument('-g', '--group', type=str, help='System group to run as', default='vbus')      
        self.args = vars(parser.parse_args())

        try:
            if os.getuid() == 0:
                os.setgroups([])
                os.setgid(grp.getgrnam(self.args['user']).gr_gid)
                os.setuid(pwd.getpwnam(self.args['group']).pw_uid)
                os.umask(077)
        except:
            exit(255)

        self.__setup_logging()
   
        self.packet_processor = DeltaSolC(
            results_callback=self.write_data, 
            log_callback=self._log
        )
        
        if self.args['keys']:
            keys = self.args['keys'].split(',')
        else:
            keys = None

        if self.args['format'] == 'json':
            from logger.JSONLogger import JSONLogger 
            self.data_logger = JSONLogger(self.args['dst'], keys)
        elif self.args['format'] == 'rrd':
            from logger.RRDLogger import RRDLogger 
            self.data_logger = RRDLogger(self.args['dst'], keys)
        else:
            raise Exception('Unknown format type')

        signal.signal(signal.SIGTERM, self.__term_handler)

    def __term_handler(self, _signo, _stack_frame):
        self._log.info('TERM signal received. Quitting!');
        self.cleanup()
        exit(0)

    def __setup_logging(self):
        self._log = logging.getLogger(__name__)
        self._log.setLevel(logging.DEBUG)
        handler = logging.handlers.RotatingFileHandler(self.args['log'], maxBytes=1048576, backupCount=1)
        handler.setFormatter(logging.Formatter(
            fmt='%(asctime)s %(message)s', 
            datefmt='%d-%m-%Y %H:%M:%S'
        ))
        self._log.addHandler(handler)

    def write_data(self):
        result_q = self.packet_processor.result_q
        while True:
            result = result_q.get()
            if result is None:
                break
            self.data_logger.write_data(result)
   
    def cleanup(self):
        self.sock.close()
        self.packet_processor.stop()        

    def connect(self):
        while True:
            try:
                self.sock = socket(AF_INET, SOCK_STREAM, SOL_TCP)
                self.sock.settimeout(self.args['timeout'])
                vbus = (self.args['src'], self.args['port'])
                self._log.info('Connecting to %s:%s' % vbus)
                self.sock.connect(vbus)
                break
            except timeout as e:
                self._log.exception('Retrying: %s' % e)
                self.sock.close()
                sleep(5)
                continue

    def run(self):
        self.connect()
        self.packet_processor.start()
        
        while True:
            try:
                while self.packet_processor.is_alive():
                    r = self.sock.recv(1024)
                    if len(r) == 0:
                        self._log.error('No data received!')
                        self.sock.close()
                        self.connect()
                        continue
                            
                    if '+HELLO' in r:                
                        self.sock.sendall('PASS %s' % self.args['pass'])
                        continue
                            
                    if '+OK: Password accepted' in r:
                        self.sock.sendall('DATA')
                        continue
                                      
                    if '+OK: Data incoming...' in r:
                        self._log.info('Connected!')             
                
                    d = ''
                    ''' The fun part '''
                    while True:
                        r = self.sock.recv(1024)
                        if len(r) == 0:
                            self._log.error('No data received!')
                            self.connect()
                            break

                        d += r
                        if '\xaa' in d:
                            try:
                                s = d.index('\xaa')
                                e = d[s + 1:].index('\xaa')
                                p = d[s:e + 1]
                                d = d[e + 1:]                         
                                self.packet_processor.put_packet(p)
                            except ValueError:
                                continue
            except Exception as e:
                self._log.exception(e)
                self.sock.close()
                self.connect()
                continue
示例#4
0
class VBusListener():
    def __init__(self):
        parser = ArgumentParser(description='Solar Controller Data Collector')
        parser.add_argument('-s',
                            '--src',
                            type=str,
                            help='Controller IP Address')
        parser.add_argument('-p', '--port', type=int, help='Controller Port')
        parser.add_argument('-f',
                            '--format',
                            type=str,
                            help='Data logger type',
                            default='json')
        parser.add_argument('-d',
                            '--dst',
                            type=str,
                            help='Data file',
                            default='/tmp/vbus_data.log')
        parser.add_argument('-P',
                            '--pass',
                            type=str,
                            help='Password',
                            default=None)
        parser.add_argument('-k',
                            '--keys',
                            type=str,
                            help='Comma delimited list of keys to dump',
                            default=None)
        parser.add_argument('-l',
                            '--log',
                            type=str,
                            help='Debug log path',
                            default='/tmp/vbus_debug.log')
        parser.add_argument('-t',
                            '--timeout',
                            type=int,
                            help='Socket timeout',
                            default=5)
        parser.add_argument('-u',
                            '--user',
                            type=str,
                            help='System user to run as',
                            default='vbus')
        parser.add_argument('-g',
                            '--group',
                            type=str,
                            help='System group to run as',
                            default='vbus')
        self.args = vars(parser.parse_args())

        try:
            if os.getuid() == 0:
                os.setgroups([])
                os.setgid(grp.getgrnam(self.args['user']).gr_gid)
                os.setuid(pwd.getpwnam(self.args['group']).pw_uid)
                os.umask(077)
        except:
            exit(255)

        self.__setup_logging()

        self.packet_processor = DeltaSolC(results_callback=self.write_data,
                                          log_callback=self._log)

        if self.args['keys']:
            keys = self.args['keys'].split(',')
        else:
            keys = None

        if self.args['format'] == 'json':
            from logger.JSONLogger import JSONLogger
            self.data_logger = JSONLogger(self.args['dst'], keys)
        elif self.args['format'] == 'rrd':
            from logger.RRDLogger import RRDLogger
            self.data_logger = RRDLogger(self.args['dst'], keys)
        else:
            raise Exception('Unknown format type')

        signal.signal(signal.SIGTERM, self.__term_handler)

    def __term_handler(self, _signo, _stack_frame):
        self._log.info('TERM signal received. Quitting!')
        self.cleanup()
        exit(0)

    def __setup_logging(self):
        self._log = logging.getLogger(__name__)
        self._log.setLevel(logging.DEBUG)
        handler = logging.handlers.RotatingFileHandler(self.args['log'],
                                                       maxBytes=1048576,
                                                       backupCount=1)
        handler.setFormatter(
            logging.Formatter(fmt='%(asctime)s %(message)s',
                              datefmt='%d-%m-%Y %H:%M:%S'))
        self._log.addHandler(handler)

    def write_data(self):
        result_q = self.packet_processor.result_q
        while True:
            result = result_q.get()
            if result is None:
                break
            self.data_logger.write_data(result)

    def cleanup(self):
        self.sock.close()
        self.packet_processor.stop()

    def connect(self):
        while True:
            try:
                self.sock = socket(AF_INET, SOCK_STREAM, SOL_TCP)
                self.sock.settimeout(self.args['timeout'])
                vbus = (self.args['src'], self.args['port'])
                self._log.info('Connecting to %s:%s' % vbus)
                self.sock.connect(vbus)
                break
            except timeout as e:
                self._log.exception('Retrying: %s' % e)
                self.sock.close()
                sleep(5)
                continue

    def run(self):
        self.connect()
        self.packet_processor.start()

        while True:
            try:
                while self.packet_processor.is_alive():
                    r = self.sock.recv(1024)
                    if len(r) == 0:
                        self._log.error('No data received!')
                        self.sock.close()
                        self.connect()
                        continue

                    if '+HELLO' in r:
                        self.sock.sendall('PASS %s' % self.args['pass'])
                        continue

                    if '+OK: Password accepted' in r:
                        self.sock.sendall('DATA')
                        continue

                    if '+OK: Data incoming...' in r:
                        self._log.info('Connected!')

                    d = ''
                    ''' The fun part '''
                    while True:
                        r = self.sock.recv(1024)
                        if len(r) == 0:
                            self._log.error('No data received!')
                            self.connect()
                            break

                        d += r
                        if '\xaa' in d:
                            try:
                                s = d.index('\xaa')
                                e = d[s + 1:].index('\xaa')
                                p = d[s:e + 1]
                                d = d[e + 1:]
                                self.packet_processor.put_packet(p)
                            except ValueError:
                                continue
            except Exception as e:
                self._log.exception(e)
                self.sock.close()
                self.connect()
                continue