#!/usr/bin/env python3 # Backup Python Script # Version: 0.0.1.0 # Maintainer: Tobias Simetsreiter import sys import os def main(): args = _parser() print("Arguments: ", args) if args.debug else None if "func" in args: return args.func(args) def _parser(): import argparse as ap parser = ap.ArgumentParser() parser.set_defaults(func=parser.print_help) parser.add_argument("-d", "--debug", action="count", default=0) subp = parser.add_subparsers() subp_sc = subp.add_parser("shellscript") subp_sc.set_defaults(func=_shellscript_command) subp_sc = subp.add_parser("cronjob") subp_sc.set_defaults(func=lambda:print(Cronjob(command="asdf"))) subp_sc = subp.add_parser("install") subp_sc.set_defaults(func=_install_command) subp_sc = subp.add_parser("test") subp_sc.set_defaults(func=_test_command) return parser.parse_args() def _shellscript_command(args): return bash(SHELLSCRIPT).returncode def _install_command(args): return bash(SHELLSCRIPT).returncode def _test_command(args): proc = tarxz(".", "/dev/null", debug=args.debug) proc.wait() return proc.returncode def bash(script="", args=[], encoding="utf-8"): import subprocess as sub proc = sub.Popen(["bash"], stdin=sub.PIPE) proc.stdin.write(script.encode(encoding)) proc.stdin.flush() proc.wait() return proc def checkmount(mountpoints): if type(mountpoints) == str: mountpoints = [mountpoints] mounts = [a.split() for a in open("/proc/mounts").readlines()] for mp in mountpoints: pass def tarxz(infiles, tarxzfile, relative_root="/", parallel=0, debug=0): import subprocess as sub if type(infiles) == str: infiles = [infiles] infiles = [ os.path.relpath(f, start=relative_root) for f in infiles ] env = os.environ.copy() env.update({ "XZ_OPT": "-4e -T {parallel}".format(parallel=parallel), }) CMD = ["tar", "-c", "-J", "-C", relative_root, "-f", tarxzfile] + infiles print("tarxz env:",env) if debug>1 else None print("tarxz CMD:",CMD) if debug else None proc = sub.Popen(CMD, env=env) return proc class Cronjob: _minute = "*" _hour = "*" _day_of_month = "*" _month = "*" _day_of_week = "*" _user = "root" _command = "" def __init__(self, *args, **kwargs): for key,value in kwargs.items(): getattr(self,"_"+key) setattr(self,"_"+key,value) def __str__(self): CRON_TEMPLATE = '{self.minute} {self.hour} {self.day_of_month} {self.month} {self.day_of_week} {self.user} {self.command}' return CRON_TEMPLATE.format(self=self) crontab_defaults={ "minute":"*", "hour":"*", "day_of_month": "*", "month": "*", "day_of_week": "*", "user": "root", "command": "", } def crontab(name=__file__, args={}): format_args = crontab_defaults.copy() format_args.update(args) SHELLSCRIPT = '''#!/usr/bin/env bash main(){ trap 'errhandler $LINENO' ERR BACKUPDIR="/mnt/backup" MAILRCP="" checkmount "$BACKUPDIR" tarxz root/scripts/ "$BACKUPDIR/root-scripts.tar.xz" tarxz etc/apache2/ "$BACKUPDIR/apache-config.tar.xz" tarxz etc/postfix/ "$BACKUPDIR/etc-postfix.tar.xz" tarxz var/www/html/ "$BACKUPDIR/adms-html.tar.xz" } setup(){ while getopts "h?vf:" opt; do case "$opt" in h|\?) show_help exit 0 ;; v) verbose=1 set -x ;; f) output_file=$OPTARG ;; esac done if [ -t 1 ] then export TTY=/dev/tty else export TTY=/dev/null fi set -o history shopt -s lastpipe export LOG="" } errhandler(){ local RETURNCODE="$?" local LAST_CMD=$(echo `history |tail -n3 |head -n1` | sed 's/[0-9]* //') printf "Error on line: $1,RETURNCODE: $RETURNCODE, CMD: [$LAST_CMD]\n" printf ">>>LOG:\n$LOG<<