Initial commit - untested
This commit is contained in:
commit
78ba2af316
4 changed files with 91 additions and 0 deletions
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
*.pyc
|
||||||
|
__pycache__/
|
||||||
|
venv/
|
||||||
|
.vscode/
|
19
logger.py
Normal file
19
logger.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
class Logger:
|
||||||
|
@staticmethod
|
||||||
|
def _format(message: str, severity: str) -> str:
|
||||||
|
datestr = str(datetime.now())
|
||||||
|
return f"{datestr} - {severity} - {message}"
|
||||||
|
|
||||||
|
def debug(self, message: str) -> None:
|
||||||
|
print(self.__class__()._format(message, "DEBUG"))
|
||||||
|
|
||||||
|
def info(self, message: str) -> None:
|
||||||
|
print(self.__class__()._format(message, "INFO"))
|
||||||
|
|
||||||
|
def error(self, message: str) -> None:
|
||||||
|
print(self.__class__()._format(message, "ERROR"))
|
||||||
|
|
||||||
|
def fatal(self, message: str) -> None:
|
||||||
|
print(self.__class__()._format(message, "FATAL"))
|
15
settings.py
Normal file
15
settings.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Full path to the base directory of the Moodle installation
|
||||||
|
MOODLE_PATH = "/var/www/html/prod/"
|
||||||
|
|
||||||
|
# Full path to the Moosh executable
|
||||||
|
MOOSH_PATH = "/usr/local/bin/moosh"
|
||||||
|
|
||||||
|
# Full path to the signalling directory
|
||||||
|
# Must be read-writeable by the user executing the worker
|
||||||
|
|
||||||
|
SIGNAL_PATH = "/tmp/moodle-export-worker/"
|
||||||
|
|
||||||
|
# Full path to the destination directory for export files
|
||||||
|
# Must exist and be writeable by the user executing the worker
|
||||||
|
|
||||||
|
OUTPUT_PATH = "/replication/courses/"
|
53
worker.py
Executable file
53
worker.py
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from settings import *
|
||||||
|
from logger import Logger
|
||||||
|
|
||||||
|
|
||||||
|
logger = Logger()
|
||||||
|
|
||||||
|
|
||||||
|
def trigger_export(courseid, categoryid):
|
||||||
|
output_name = f"course_{courseid}_{categoryid}_{datetime.now().timestamp()}"
|
||||||
|
subprocess.run([MOOSH_PATH, "-p", MOODLE_PATH, "course-backup",
|
||||||
|
"-p", OUTPUT_PATH, "-f", output_name, "--template", courseid])
|
||||||
|
return output_name
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
logger.info("Moodle Export Worker starting")
|
||||||
|
SIGNAL_PATH = Path(SIGNAL_PATH)
|
||||||
|
|
||||||
|
if test.exists():
|
||||||
|
if not test.is_dir():
|
||||||
|
logger.fatal(
|
||||||
|
f"Cannot create signalling directory {SIGNAL_PATH} because a file with that name exists.")
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
try:
|
||||||
|
test.mkdir()
|
||||||
|
except Exception as e:
|
||||||
|
logger.fatal(
|
||||||
|
f"Cannot create signalling directory {SIGNAL_PATH}: {e}")
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
for f in test.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}")
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(
|
||||||
|
f"Export of course {f.name.split('.')[0].split('-')[0]} failed: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in a new issue