def __init__(self, socket='/tmp/liquiddaemon.sock'): logging.Handler.__init__(self) self.logger = logging.getLogger('LiquidsoapDaemon') self.logger.setLevel(logging.INFO) self.logger.addHandler(self) self.liquidsoap_logger = logging.getLogger('Liquidsoap') self.liquidsoap_logger.setLevel(logging.INFO) self.liquidsoap_logger.addHandler(self) self.process = None self.socket_handler = SocketHandler(get_path(socket), self) self.log = RingBuffer(100) self.quit = False self.run_liquid = True self.skip_telnet = True
def __init__(self, socket="/tmp/liquiddaemon.sock"): logging.Handler.__init__(self) self.logger = logging.getLogger("LiquidsoapDaemon") self.logger.setLevel(logging.INFO) self.logger.addHandler(self) self.liquidsoap_logger = logging.getLogger("Liquidsoap") self.liquidsoap_logger.setLevel(logging.INFO) self.liquidsoap_logger.addHandler(self) self.process = None self.socket_handler = SocketHandler(get_path(socket), self) self.log = RingBuffer(100) self.quit = False self.run_liquid = True self.skip_telnet = True
class LiquidsoapDaemon(logging.Handler): telnet_ignore_pattern = re.compile( '(New client: localhost)|(Client localhost)') def __init__(self, socket='/tmp/liquiddaemon.sock'): logging.Handler.__init__(self) self.logger = logging.getLogger('LiquidsoapDaemon') self.logger.setLevel(logging.INFO) self.logger.addHandler(self) self.liquidsoap_logger = logging.getLogger('Liquidsoap') self.liquidsoap_logger.setLevel(logging.INFO) self.liquidsoap_logger.addHandler(self) self.process = None self.socket_handler = SocketHandler(get_path(socket), self) self.log = RingBuffer(100) self.quit = False self.run_liquid = True self.skip_telnet = True def shutdown(self): self.logger.info('Shutting down...') self.run_liquid = False self.quit = True c = 0 while self.process.returncode is None: c += 1 self.logger.info( "Asking liquidsoap nicely to terminate... (Try #%d)", c) self.process.terminate() self.process.poll() time.sleep(2) if c > 5: break if self.process.returncode is None: self.logger.warn('Killing Liquidsoap...') self.process.kill() self.logger.error('NACH FRANKREICH NUR AUF KETTEN') def get_log(self, offset=None): lo = 0 if offset is not None: lo = offset - self.log.offset if lo < 0: lo = 0 return (self.log.offset + (len(self.log)), self.log.get()[lo:]) def emit(self, record): self.log.append( [time.time(), record.name, record.levelno, record.getMessage()]) def run(self): self.socket_handler.start() try: while True: try: self.run_liquidsoap() if self.process.returncode == 0: self.logger.info("Liquidsoap quit with: %d ", self.process.returncode) else: self.logger.error("Liquidsoap quit with: %d!", self.process.returncode) except Exception as err: exc_type, exc_value, exc_tb = sys.exc_info() for tb in traceback.format_exception( exc_type, exc_value, exc_tb): self.logger.error(tb) if self.run_liquid and not self.quit: # we want to autorestart liquidsoap and dont want to quit the daemon self.logger.info( 'Trying to restart liquidsoap in 10 seconds') btime = time.time() while (time.time() - btime < 10) and not self.quit: # impatience is a gift time.sleep(.5) else: break if not self.run_liquid or self.quit: # not autorestart or we want to exit the daemon break time.sleep(1) while not self.quit: time.sleep(1) except KeyboardInterrupt: self.logger.info('SIGINT: shutting down...') self.shutdown() finally: self.socket_handler.shutdown() def run_liquidsoap(self): self.process = subprocess.Popen(['/usr/local/bin/liquidsoap', '-'], bufsize=-1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) self.process.stdin.write(rfk.liquidsoap.gen_script().encode('utf-8')) #leave the database in a rather clean state rfk.database.session.rollback() rfk.database.session.remove() self.process.stdin.close() while self.process.returncode == None: try: line = re.sub(r'^\d{4}/d{2}/d{2} d{2}:d{2}:d{2} ', '', self.process.stdout.readline()) if not (self.skip_telnet and self.telnet_ignore_pattern.search(line) is not None): self.liquidsoap_logger.info(line.rstrip("\n \t\r")) finally: self.process.poll() def set_debug(self, debug): if debug: self.logger.setLevel(logging.DEBUG) else: self.logger.setLevel(logging.INFO) def enable_stdout(self): formatter = logging.Formatter( '%(asctime)s:%(levelname)s:%(name)s - %(message)s') ch = logging.StreamHandler() ch.setLevel(self.logger.level) ch.setFormatter(formatter) self.logger.addHandler(ch) self.liquidsoap_logger.addHandler(ch)
class LiquidsoapDaemon(logging.Handler): telnet_ignore_pattern = re.compile("(New client: localhost)|(Client localhost)") def __init__(self, socket="/tmp/liquiddaemon.sock"): logging.Handler.__init__(self) self.logger = logging.getLogger("LiquidsoapDaemon") self.logger.setLevel(logging.INFO) self.logger.addHandler(self) self.liquidsoap_logger = logging.getLogger("Liquidsoap") self.liquidsoap_logger.setLevel(logging.INFO) self.liquidsoap_logger.addHandler(self) self.process = None self.socket_handler = SocketHandler(get_path(socket), self) self.log = RingBuffer(100) self.quit = False self.run_liquid = True self.skip_telnet = True def shutdown(self): self.logger.info("Shutting down...") self.run_liquid = False self.quit = True c = 0 while self.process.returncode is None: c += 1 self.logger.info("Asking liquidsoap nicely to terminate... (Try #%d)", c) self.process.terminate() self.process.poll() time.sleep(2) if c > 5: break if self.process.returncode is None: self.logger.warn("Killing Liquidsoap...") self.process.kill() self.logger.error("NACH FRANKREICH NUR AUF KETTEN") def get_log(self, offset=None): lo = 0 if offset is not None: lo = offset - self.log.offset if lo < 0: lo = 0 return (self.log.offset + (len(self.log)), self.log.get()[lo:]) def emit(self, record): self.log.append([time.time(), record.name, record.levelno, record.getMessage()]) def run(self): self.socket_handler.start() try: while True: try: self.run_liquidsoap() if self.process.returncode == 0: self.logger.info("Liquidsoap quit with: %d ", self.process.returncode) else: self.logger.error("Liquidsoap quit with: %d!", self.process.returncode) except Exception as err: exc_type, exc_value, exc_tb = sys.exc_info() for tb in traceback.format_exception(exc_type, exc_value, exc_tb): self.logger.error(tb) if ( self.run_liquid and not self.quit ): # we want to autorestart liquidsoap and dont want to quit the daemon self.logger.info("Trying to restart liquidsoap in 10 seconds") btime = time.time() while (time.time() - btime < 10) and not self.quit: # impatience is a gift time.sleep(0.5) else: break if not self.run_liquid or self.quit: # not autorestart or we want to exit the daemon break time.sleep(1) while not self.quit: time.sleep(1) except KeyboardInterrupt: self.logger.info("SIGINT: shutting down...") self.shutdown() finally: self.socket_handler.shutdown() def run_liquidsoap(self): self.process = subprocess.Popen( ["/usr/local/bin/liquidsoap", "-"], bufsize=-1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) self.process.stdin.write(rfk.liquidsoap.gen_script().encode("utf-8")) # leave the database in a rather clean state rfk.database.session.rollback() rfk.database.session.remove() self.process.stdin.close() while self.process.returncode == None: try: line = re.sub(r"^\d{4}/d{2}/d{2} d{2}:d{2}:d{2} ", "", self.process.stdout.readline()) if not (self.skip_telnet and self.telnet_ignore_pattern.search(line) is not None): self.liquidsoap_logger.info(line.rstrip("\n \t\r")) finally: self.process.poll() def set_debug(self, debug): if debug: self.logger.setLevel(logging.DEBUG) else: self.logger.setLevel(logging.INFO) def enable_stdout(self): formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(name)s - %(message)s") ch = logging.StreamHandler() ch.setLevel(self.logger.level) ch.setFormatter(formatter) self.logger.addHandler(ch) self.liquidsoap_logger.addHandler(ch)