| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- #!/usr/bin/env python3
- # Backup Python Script
- # Version: 0.0.1.0
- # Maintainer: Tobias Simetsreiter <tobias@tsimnet.eu>
- 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<<<END LOG\n"
- exit $RETURNCODE
- }
- log_wrap(){
- export BASHOPTS
- LOG="$LOG$($@)\n";RETURNCODE=$?;
- export LOG
- return $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 "$@"
- main
- exit 0
- '''
- if __name__=='__main__':
- sys.exit(main())
|