pyBackup.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. #!/usr/bin/env python3
  2. # Backup Python Script
  3. # Version: 0.0.1.0
  4. # Maintainer: Tobias Simetsreiter <tobias@tsimnet.eu>
  5. import sys
  6. import os
  7. def main():
  8. args = _parser()
  9. print("Arguments: ", args) if args.debug else None
  10. if "func" in args:
  11. return args.func(args)
  12. def _parser():
  13. import argparse as ap
  14. parser = ap.ArgumentParser()
  15. parser.set_defaults(func=parser.print_help)
  16. parser.add_argument("-d", "--debug", action="count", default=0)
  17. subp = parser.add_subparsers()
  18. subp_sc = subp.add_parser("shellscript")
  19. subp_sc.set_defaults(func=_shellscript_command)
  20. subp_sc = subp.add_parser("cronjob")
  21. subp_sc.set_defaults(func=lambda:print(Cronjob(command="asdf")))
  22. subp_sc = subp.add_parser("install")
  23. subp_sc.set_defaults(func=_install_command)
  24. subp_sc = subp.add_parser("test")
  25. subp_sc.set_defaults(func=_test_command)
  26. return parser.parse_args()
  27. def _shellscript_command(args):
  28. return bash(SHELLSCRIPT).returncode
  29. def _install_command(args):
  30. return bash(SHELLSCRIPT).returncode
  31. def _test_command(args):
  32. proc = tarxz(".", "/dev/null", debug=args.debug)
  33. proc.wait()
  34. return proc.returncode
  35. def bash(script="", args=[], encoding="utf-8"):
  36. import subprocess as sub
  37. proc = sub.Popen(["bash"], stdin=sub.PIPE)
  38. proc.stdin.write(script.encode(encoding))
  39. proc.stdin.flush()
  40. proc.wait()
  41. return proc
  42. def checkmount(mountpoints):
  43. if type(mountpoints) == str:
  44. mountpoints = [mountpoints]
  45. mounts = [a.split() for a in open("/proc/mounts").readlines()]
  46. for mp in mountpoints:
  47. pass
  48. def tarxz(infiles, tarxzfile, relative_root="/", parallel=0, debug=0):
  49. import subprocess as sub
  50. if type(infiles) == str:
  51. infiles = [infiles]
  52. infiles = [
  53. os.path.relpath(f, start=relative_root)
  54. for f in infiles
  55. ]
  56. env = os.environ.copy()
  57. env.update({
  58. "XZ_OPT": "-4e -T {parallel}".format(parallel=parallel),
  59. })
  60. CMD = ["tar", "-c", "-J", "-C", relative_root, "-f", tarxzfile] + infiles
  61. print("tarxz env:",env) if debug>1 else None
  62. print("tarxz CMD:",CMD) if debug else None
  63. proc = sub.Popen(CMD, env=env)
  64. return proc
  65. class Cronjob:
  66. _minute = "*"
  67. _hour = "*"
  68. _day_of_month = "*"
  69. _month = "*"
  70. _day_of_week = "*"
  71. _user = "root"
  72. _command = ""
  73. def __init__(self, *args, **kwargs):
  74. for key,value in kwargs.items():
  75. getattr(self,"_"+key)
  76. setattr(self,"_"+key,value)
  77. def __str__(self):
  78. CRON_TEMPLATE = '{self.minute} {self.hour} {self.day_of_month} {self.month} {self.day_of_week} {self.user} {self.command}'
  79. return CRON_TEMPLATE.format(self=self)
  80. crontab_defaults={
  81. "minute":"*",
  82. "hour":"*",
  83. "day_of_month": "*",
  84. "month": "*",
  85. "day_of_week": "*",
  86. "user": "root",
  87. "command": "",
  88. }
  89. def crontab(name=__file__, args={}):
  90. format_args = crontab_defaults.copy()
  91. format_args.update(args)
  92. SHELLSCRIPT = '''#!/usr/bin/env bash
  93. main(){
  94. trap 'errhandler $LINENO' ERR
  95. BACKUPDIR="/mnt/backup"
  96. MAILRCP=""
  97. checkmount "$BACKUPDIR"
  98. tarxz root/scripts/ "$BACKUPDIR/root-scripts.tar.xz"
  99. tarxz etc/apache2/ "$BACKUPDIR/apache-config.tar.xz"
  100. tarxz etc/postfix/ "$BACKUPDIR/etc-postfix.tar.xz"
  101. tarxz var/www/html/ "$BACKUPDIR/adms-html.tar.xz"
  102. }
  103. setup(){
  104. while getopts "h?vf:" opt; do
  105. case "$opt" in
  106. h|\?)
  107. show_help
  108. exit 0
  109. ;;
  110. v) verbose=1
  111. set -x
  112. ;;
  113. f) output_file=$OPTARG
  114. ;;
  115. esac
  116. done
  117. if [ -t 1 ]
  118. then
  119. export TTY=/dev/tty
  120. else
  121. export TTY=/dev/null
  122. fi
  123. set -o history
  124. shopt -s lastpipe
  125. export LOG=""
  126. }
  127. errhandler(){
  128. local RETURNCODE="$?"
  129. local LAST_CMD=$(echo `history |tail -n3 |head -n1` | sed 's/[0-9]* //')
  130. printf "Error on line: $1,RETURNCODE: $RETURNCODE, CMD: [$LAST_CMD]\n"
  131. printf ">>>LOG:\n$LOG<<<END LOG\n"
  132. exit $RETURNCODE
  133. }
  134. log_wrap(){
  135. export BASHOPTS
  136. LOG="$LOG$($@)\n";RETURNCODE=$?;
  137. export LOG
  138. return $RETURNCODE
  139. }
  140. log_send(){
  141. printf "$LOG" | sendmail
  142. }
  143. checkmount(){
  144. log_wrap grep -qs "$1" /proc/mounts
  145. }
  146. tarxz(){
  147. local SOURCE="$1"
  148. local TARGET="$2"
  149. XZ_OPT="-4e -T 0" log_wrap tar -c -J -C / -f "$TARGET" "$SOURCE"
  150. return $?
  151. }
  152. setup "$@"
  153. main
  154. exit 0
  155. '''
  156. if __name__=='__main__':
  157. sys.exit(main())