#! /usr/bin/env python3 # -*- coding: utf-8 -*- import sys import os import logging import tempfile import subprocess import threading import time from logging.handlers import RotatingFileHandler try: import MySQLdb except ImportError: try: import pymysql pymysql.install_as_MySQLdb() import MySQLdb except ImportError as exc: print('ERROR: missing the mysql python module please run:') print('pip install -r requirements.txt') print('ERROR: %s' % exc) sys.exit(2) logger = logging.getLogger(__name__) # Logging functions ######################################################## FORMATTER = logging.Formatter('%(asctime)s :: %(levelname)s :: %(message)s') def logger_get_console_handler(): try: console_handler = logging.StreamHandler(sys.stdout) except OSError as exc: print('Cannot log to stdout, trying stderr. Message %s' % exc) try: console_handler = logging.StreamHandler(sys.stderr) console_handler.setFormatter(FORMATTER) return console_handler except OSError as exc: print('Cannot log to stderr neither. Message %s' % exc) return False else: console_handler.setFormatter(FORMATTER) return console_handler def logger_get_file_handler(log_file): err_output = None try: file_handler = RotatingFileHandler(log_file, mode='a', encoding='utf-8', maxBytes=1024000, backupCount=3) except OSError as exc: try: print('Cannot create logfile. Trying to obtain temporary log file.\nMessage: %s' % exc) err_output = str(exc) temp_log_file = tempfile.gettempdir() + os.sep + __name__ + '.log' print('Trying temporary log file in ' + temp_log_file) file_handler = RotatingFileHandler(temp_log_file, mode='a', encoding='utf-8', maxBytes=1000000, backupCount=1) file_handler.setFormatter(FORMATTER) err_output += '\nUsing [%s]' % temp_log_file return file_handler, err_output except OSError as exc: print('Cannot create temporary log file either. Will not log to file. Message: %s' % exc) return False else: file_handler.setFormatter(FORMATTER) return file_handler, err_output def logger_get_logger(log_file=None, temp_log_file=None, debug=False): # If a name is given to getLogger, than modules can't log to the root logger _logger = logging.getLogger() if debug is True: _logger.setLevel(logging.DEBUG) else: _logger.setLevel(logging.INFO) console_handler = logger_get_console_handler() if console_handler: _logger.addHandler(console_handler) if log_file is not None: file_handler, err_output = logger_get_file_handler(log_file) if file_handler: _logger.addHandler(file_handler) _logger.propagate = False if err_output is not None: print(err_output) _logger.warning('Failed to use log file [%s], %s.', log_file, err_output) if temp_log_file is not None: if os.path.isfile(temp_log_file): try: os.remove(temp_log_file) except OSError: logger.warning('Cannot remove temp log file [%s].' % temp_log_file) file_handler, err_output = logger_get_file_handler(temp_log_file) if file_handler: _logger.addHandler(file_handler) _logger.propagate = False if err_output is not None: print(err_output) _logger.warning('Failed to use log file [%s], %s.', log_file, err_output) return _logger # Generic functions ######################################################## def check_for_file(file): try: with open(file) as f: pass except IOError as exc: logger.error('Oh dear... %s does not seem readable' % file) logger.debug('ERROR:', exc_info=True) sys.exit(2) # Config functions ######################################################### def get_config_data(install_dir): config_cmd = ['/usr/bin/env', 'php', '%s/config_to_json.php' % install_dir] try: proc = subprocess.Popen(config_cmd, stdout=subprocess.PIPE, stdin=subprocess.PIPE) return proc.communicate()[0].decode() except Exception as e: print("ERROR: Could not execute: %s" % config_cmd) print(e) sys.exit(2) # Database functions ####################################################### def db_open(db_socket, db_server, db_port, db_username, db_password, db_dbname): try: options = dict(host=db_server, port=int(db_port), user=db_username, passwd=db_password, db=db_dbname) if db_socket: options['unix_socket'] = db_socket return MySQLdb.connect(**options) except Exception as dbexc: print('ERROR: Could not connect to MySQL database!') print('ERROR: %s' % dbexc) sys.exit(2)