From be815d9b3b62cd4dd2749c070e467cc58efc7b79 Mon Sep 17 00:00:00 2001 From: Chris Sewell Date: Fri, 20 Oct 2023 10:42:08 -0400 Subject: [PATCH] Create mongotos3py.py --- mongotos3py.py | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 mongotos3py.py diff --git a/mongotos3py.py b/mongotos3py.py new file mode 100644 index 0000000..8a40932 --- /dev/null +++ b/mongotos3py.py @@ -0,0 +1,94 @@ +import os +import subprocess +from datetime import datetime +import configparser +import argparse +import logging + +# Configuration file +config = configparser.ConfigParser() +config.read('config.ini') + +# Configuration values +S3BUCKET = config.get('Settings', 'S3BUCKET') +FILENAME = config.get('Settings', 'FILENAME') +S3PATH = config.get('Settings', 'S3PATH') +MONGODUMPPATH = config.get('Settings', 'MONGODUMPPATH') +TMP_PATH = config.get('Settings', 'TMP_PATH') + +TIMESTAMP = datetime.now().strftime(".%m.%d.%Y") +DAY = datetime.now().strftime("%d") +DAYOFWEEK = datetime.now().strftime("%A") + +# Set up logging +logging.basicConfig(filename='backup.log', level=logging.INFO, format='%(asctime)s - %(message)s') + +class BackupManager: + def __init__(self, period): + self.period = period + + def backup_database(self): + logging.info("Starting backing up the database to a file...") + subprocess.run(['mongodump', '--out', MONGODUMPPATH], check=True) + logging.info("Done backing up the database to a file.") + + def compress_backup(self): + logging.info("Starting compression...") + subprocess.run(['tar', 'cvzf', f"{TMP_PATH}{FILENAME}{TIMESTAMP}.tar.gz", MONGODUMPPATH], check=True) + logging.info("Done compressing the backup file.") + + def upload_backup(self): + logging.info("Uploading the new backup...") + subprocess.run(['s3cmd', 'put', '-f', f"{TMP_PATH}{FILENAME}{TIMESTAMP}.tar.gz", f"s3://{S3BUCKET}/{S3PATH}{self.period}/"], check=True) + logging.info("New backup uploaded.") + + def clean_old_backups(self): + logging.info("Removing old backups (2 periods ago)...") + subprocess.run(['s3cmd', 'del', '--recursive', f"s3://{S3BUCKET}/{S3PATH}previous_{self.period}/"], check=True) + logging.info("Old backups removed.") + + def move_past_backup(self): + logging.info("Moving the backups from past period to another folder...") + subprocess.run(['s3cmd', 'mv', '--recursive', f"s3://{S3BUCKET}/{S3PATH}{self.period}/", f"s3://{S3BUCKET}/{S3PATH}previous_{self.period}/"], check=True) + logging.info("Past backup moved.") + + def remove_cache_files(self): + logging.info("Removing the cache files...") + subprocess.run(['rm', '-rf', TMP_PATH], check=True) + logging.info("Files removed.") + + def perform_backup(self): + try: + self.backup_database() + self.compress_backup() + self.upload_backup() + self.clean_old_backups() + self.move_past_backup() + self.remove_cache_files() + logging.info("All done.") + except subprocess.CalledProcessError as e: + logging.error(f"Error: {e}") + exit(1) + +def main(): + parser = argparse.ArgumentParser(description='Backup manager') + parser.add_argument('-p', '--period', help='Backup period', default='day') + args = parser.parse_args() + + period = args.period + + if period == 'auto': + if DAY == '01': + period = 'month' + elif DAYOFWEEK == 'Sunday': + period = 'week' + else: + period = 'day' + + logging.info(f"Selected period: {period}.") + + backup_manager = BackupManager(period) + backup_manager.perform_backup() + +if __name__ == "__main__": + main()