#!/usr/bin/env python3 from pathlib import Path from datetime import datetime import subprocess from settings import * from logger import Logger logger = Logger() def trigger_export(courseid, categoryid): output_name = f"course_{courseid}_{categoryid}_{int(datetime.now().timestamp())}.mbz" result = subprocess.run([MOOSH_PATH, "-p", MOODLE_PATH, "course-backup", "-p", OUTPUT_PATH, "-f", output_name, "--template", courseid], stdout=subprocess.PIPE, stderr=subprocess.PIPE) for message in result.stdout.decode().splitlines(): logger.debug(message) for error in result.stderr.decode().splitlines(): logger.error(error) return output_name def trigger_categories_export(): OUTPUT_PATH = Path(OUTPUT_PATH) output_name = f"categories_{int(datetime.now().timestamp())}.xml" result = subprocess.run([MOOSH_PATH, "-p", MOODLE_PATH, "category-export", "0"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) try: with open(OUTPUT_PATH / output_name, "wb") as xmlfile: xmlfile.write(result.stdout) except IOError as e: logger.error( f"Could not write categories to {OUTPUT_PATH / output_name}: {e}") for error in result.stderr.decode().splitlines(): logger.error(error) def main(): global SIGNAL_PATH, OUTPUT_PATH logger.info("Moodle Export Worker starting") SIGNAL_PATH = Path(SIGNAL_PATH) OUTPUT_PATH = Path(OUTPUT_PATH) if SIGNAL_PATH.exists(): if not SIGNAL_PATH.is_dir(): logger.fatal( f"Cannot create signalling directory {SIGNAL_PATH} because a file with that name exists.") exit(1) else: try: SIGNAL_PATH.mkdir() except Exception as e: logger.fatal( f"Cannot create signalling directory {SIGNAL_PATH}: {e}") exit(1) for f in SIGNAL_PATH.glob("*-*.mew"): logger.debug(f"Found file {f.name} - start processing") try: pre = datetime.now() output_name = trigger_export(*f.name.split(".")[0].split("-")) dur = datetime.now() - pre size = Path(OUTPUT_PATH / output_name).stat().st_size f.unlink() logger.debug( f"Created file {output_name} ({size} bytes) in {dur.seconds} seconds") except Exception as e: logger.error( f"Export of course {f.name.split('.')[0].split('-')[0]} failed: {e}") if (SIGNAL_PATH / "categories.mew").exists(): logger.debug(f"Found file categories.mew - processing categories") try: pre = datetime.now() output_name = trigger_categories_export() dur = datetime.now() - pre size = Path(OUTPUT_PATH / output_name).stat().st_size f.unlink() logger.debug( f"Created file {output_name} ({size} bytes) in {dur.seconds} seconds") except Exception as e: logger.error( f"Export of categories failed: {e}") logger.info("Moodle Export Worker done") if __name__ == "__main__": main()