diff options
-rw-r--r-- | scripts/mirror-repos | 59 |
1 files changed, 56 insertions, 3 deletions
diff --git a/scripts/mirror-repos b/scripts/mirror-repos index d013b14..22228ed 100644 --- a/scripts/mirror-repos +++ b/scripts/mirror-repos @@ -2,12 +2,14 @@ # Copyright (C) 2013 Linaro Ltd. import argparse +import logging import os +import pwd import subprocess import sys import urlparse -import pwd +from logging.handlers import TimedRotatingFileHandler from tempfile import gettempdir @@ -21,6 +23,18 @@ DEFAULT_API_HOST = "http://0.0.0.0:5000" LOCK_FILE_NAME = "mirror-repos.lock" LOCK_FILE = os.path.join(gettempdir(), LOCK_FILE_NAME) +FILE_NAME = os.path.basename(__file__) +# Default log directory and log file. +DEFAULT_LOG_DIR = "/var/log/rhodecode" +LOG_FILE_NAME = FILE_NAME + ".log" +# When to rotate logs. +DEFAULT_ROTATING_TIME = 'midnight' +# How many old logs to keep. +KEEP_MAX_LOGS = 10 + +# Default logger. +logger = logging.getLogger(FILE_NAME) + def args_parser(): """Sets up the argument parser.""" @@ -44,9 +58,41 @@ def args_parser(): default=DEFAULT_API_HOST, help="The host URL where API interface is located. " "Defaults to '%s'." % DEFAULT_API_HOST) + parser.add_argument("--log-dir", + default=DEFAULT_LOG_DIR, + help="Directory to store logs. Defaults to '%s'." % + DEFAULT_LOG_DIR) + parser.add_argument("--debug", + action="store_true", + help="Print debugging statements.") return parser +def setup_logging(debug, log_dir): + """Sets up logging. + + :param debug: If the level should be set to DEBUG. + :type bool + :param log_dir: Where to store file based logs. + """ + th_formatter = "%(asctime)s %(levelname)-8s %(message)s" + log_file = os.path.join(log_dir, LOG_FILE_NAME) + + timed_handler = TimedRotatingFileHandler(log_file, + when=DEFAULT_ROTATING_TIME, + backupCount=KEEP_MAX_LOGS) + timed_handler.setFormatter(logging.Formatter(th_formatter)) + + if debug: + logger.setLevel(logging.DEBUG) + timed_handler.setLevel(logging.DEBUG) + else: + logger.setLevel(logging.INFO) + timed_handler.setLevel(logging.INFO) + + logger.addHandler(timed_handler) + + def check_args(args, parser): """Checks command line arguments passed. @@ -106,8 +152,11 @@ def mirror_repos(file, dest, user=None): full_repo = urlparse.urljoin(BASE_PATH, line) cmd_args = ["git", "clone", "--mirror", full_repo] - print "Cloning repository %s..." % full_repo + logger.info("Cloning repository %s..." % full_repo) execute_command(cmd_args, work_dir=full_path, user=user) + else: + logger.debug("Skipping repository '%s', does not seem a valid " + "git one." % base_dir) def rescan_git_directory(api_key, api_host, user=None): @@ -158,7 +207,10 @@ def execute_command(cmd_args, as_sudo=True, user=None, work_dir=os.getcwd()): p_out, p_err = process.communicate() if process.returncode != 0: - print "Error executing the following command: %s" % " ".join(cmd_args) + logger.error("Error executing the following command: %s" % + " ".join(cmd_args)) + logger.debug("The full command line is: %s" % " ".join(exec_args)) + logger.debug(p_err) if __name__ == '__main__': @@ -169,6 +221,7 @@ if __name__ == '__main__': if os.path.exists(LOCK_FILE): print "Another process is still running: cannot acquire lock." else: + setup_logging(args.debug, args.log_dir) try: with open(LOCK_FILE, 'w'): mirror_repos(args.repos_list, |