removing references to dowser, comment pytracemalloc usage, very useful though painfu...
[python-delta-tar] / backup.py
1 import argparse
2 import binascii
3 import json
4 import logging
5 import os
6 import re
7 import random
8 import shutil
9 from datetime import datetime
10 from functools import partial
11
12 from deltatar.deltatar import DeltaTar, NO_MATCH, MATCH, PARENT_MATCH
13 from deltatar.tarfile import TarFile, GNU_FORMAT
14
15 MODE = ''
16 PASSWORD = ''
17
18 consoleLogger = logging.StreamHandler()
19 consoleLogger.setLevel(logging.DEBUG)
20
21 def check_equal_dirs(path1, path2, deltatar):
22     '''
23     compare the two directories source_dir and target_dir and check
24     # they are the same
25     '''
26     nbars1 = len(path1.split('/'))
27     nbars2 = len(path2.split('/'))
28
29     source_it = deltatar._recursive_walk_dir(path1)
30     source_it = deltatar.jsonize_path_iterator(source_it, strip=nbars1)
31     target_it = deltatar._recursive_walk_dir(path2)
32     target_it = deltatar.jsonize_path_iterator(target_it, strip=nbars2)
33     while True:
34         try:
35             sitem = source_it.next()
36             titem = target_it.next()
37         except StopIteration:
38             try:
39                 titem = target_it.next()
40                 raise Exception("iterators do not stop at the same time")
41             except StopIteration:
42                 break
43         try:
44             assert deltatar._equal_stat_dicts(sitem, titem)
45         except Exception, e:
46             print sitem
47             print titem
48             print "FAIL"
49             raise
50
51 if __name__ == "__main__":
52     #import tracemalloc
53     #tracemalloc.enable()
54     #top = tracemalloc.DisplayTop(25)
55     #top.show_lineno = True
56     #top.start(60)
57     parser = argparse.ArgumentParser()
58
59     parser.add_argument("-m", "--mode", default='',
60                         help="Mode in which to read/write the backup")
61     parser.add_argument("-t", "--targetpath", help="target path directory")
62     parser.add_argument("-s", "--sourcepath", help="source path directory")
63     parser.add_argument("-p", "--password", default='', help="password")
64     parser.add_argument("-v", "--volsize", default=None, help="maximum volume size, in Megabytes")
65     parser.add_argument("-r", "--restore", action='store_true', help="Restore a backup")
66     parser.add_argument("-f", "--full", action='store_true', help="Create a full backup")
67     parser.add_argument("-d", "--diff", action='store_true', help="Create a diff backup")
68     parser.add_argument("-i", "--indexes", nargs='+', help="indexes paths")
69     parser.add_argument("-l", "--list-files", action='store_true', help="List files in a tarball")
70     parser.add_argument("-x", "--excluded", nargs='+', default=[],
71                         help="excluded files")
72     parser.add_argument("-xp", "--excluded-path", default=None,
73                         help="path to the file containing excluded paths")
74     parser.add_argument("-e", "--equals", action='store_true', help="Checks two dirs are equal")
75
76     args = parser.parse_args()
77
78     if args.excluded_path:
79         f = open(args.excluded_path, 'r')
80         excluded_files = f.readlines()
81         f.close()
82     else:
83         excluded_files = args.excluded
84
85     deltatar = DeltaTar(mode=args.mode, password=args.password,
86         logger=consoleLogger, excluded_files=excluded_files)
87
88     if args.full:
89         deltatar.create_full_backup(args.sourcepath, args.targetpath, args.volsize)
90     elif args.diff:
91         deltatar.create_diff_backup(args.sourcepath, args.targetpath, args.indexes[0], args.volsize)
92     elif args.list_files:
93         deltatar.list_backup(args.sourcepath)
94     elif args.restore:
95         if args.indexes is not None:
96             deltatar.restore_backup(args.targetpath, backup_indexes_paths=args.indexes)
97         else:
98             deltatar.restore_backup(args.targetpath, backup_tar_path=args.sourcepath)
99     elif args.equals:
100         check_equal_dirs(os.path.abspath(args.sourcepath), os.path.abspath(args.targetpath), deltatar)