| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 | #!/usr/bin/env python3# Backup Python Script# Version: 0.0.1.0# Maintainer: Tobias Simetsreiter <tobias@tsimnet.eu>import sysimport osdef 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).returncodedef _install_command(args):    return bash(SHELLSCRIPT).returncodedef _test_command(args):    proc = tarxz(".", "/dev/null", debug=args.debug)    proc.wait()    return proc.returncodedef 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 procdef checkmount(mountpoints):    if type(mountpoints) == str:        mountpoints = [mountpoints]    mounts = [a.split() for a in open("/proc/mounts").readlines()]    for mp in mountpoints:        passdef 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 bashmain(){    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        ;;    esacdoneif [ -t 1 ]then     export TTY=/dev/ttyelse    export TTY=/dev/nullfiset -o historyshopt -s lastpipeexport 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<<<END LOG\n"    exit $RETURNCODE}log_wrap(){export BASHOPTSLOG="$LOG$($@)\n";RETURNCODE=$?;export LOGreturn $RETURNCODE}log_send(){    printf "$LOG" | sendmail}checkmount(){    log_wrap grep -qs "$1" /proc/mounts }tarxz(){    local SOURCE="$1"    local TARGET="$2"    XZ_OPT="-4e -T 0" log_wrap tar -c -J -C / -f "$TARGET" "$SOURCE"    return $?}setup "$@"mainexit 0'''if __name__=='__main__':    sys.exit(main())
 |