From 5345595e9f2ad9e0a5b78ecbbe7ed712ee7e3d78 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 21 Nov 2016 21:54:35 -0500 Subject: [PATCH 01/11] [ENH] Preserve Perm and Owner/Group --- time-machine.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/time-machine.py b/time-machine.py index 7f9bdba..8da7ed7 100755 --- a/time-machine.py +++ b/time-machine.py @@ -52,6 +52,9 @@ '--itemize-changes', '--progress', '--relative', + '--perms', + '--owner', + '--group' ) # '--perms', # '--partial', From dc440cdce0724b4c954c386070cc15bd01cd61b6 Mon Sep 17 00:00:00 2001 From: fmonthel Date: Tue, 22 Nov 2016 21:57:15 -0500 Subject: [PATCH 02/11] [ENH] add space consumed by snapshots before/after --- time-machine.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/time-machine.py b/time-machine.py index 8da7ed7..7e72a01 100755 --- a/time-machine.py +++ b/time-machine.py @@ -500,6 +500,11 @@ def print_fs_stat(stat): logger(' free inodes: %s, %.1f%% used' % ( humanize_inodes(inodes_free), inodes_used)) +def size_dir(dir): + return int(subprocess.check_output(['du','-s', dir]).split()[0].decode('utf-8')) * 1024 + +def print_snaps_stat(stat): + logger(' used space by snapshot(s): %s' % (humanize_bytes(stat))) def check_freespace(stat): ''' abort backup if not enough free space or inodes ''' @@ -540,6 +545,7 @@ def main(): sys.exit(2) stat_before = os.statvfs(cfg['dest_path']) + stat_snaps_before = size_dir(cfg['dest_path']) check_freespace(stat_before) t_start = datetime.now() @@ -553,13 +559,17 @@ def main(): # report stat_after = os.statvfs(cfg['dest_path']) + stat_snaps_after = size_dir(cfg['dest_path']) logger('Filesystem before backup:') print_fs_stat(stat_before) + print_snaps_stat(stat_snaps_before) logger('Filesystem after backup:') print_fs_stat(stat_after) - + print_snaps_stat(stat_snaps_after) t_used = datetime.now() - t_start + s_used_diff = stat_snaps_after - stat_snaps_before logger('Backup runtime: %s' % str(t_used).split('.')[0]) + logger('Backup snapshots(s) space diff before/after: %s' % str(humanize_bytes(s_used_diff))) flock_release(fd) From 714572cfc28df206a2c1c4278f11ed791f3914a4 Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Wed, 2 Jan 2019 18:26:04 -0500 Subject: [PATCH 03/11] Update time-machine.py --- time-machine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/time-machine.py b/time-machine.py index 7e72a01..07095a0 100755 --- a/time-machine.py +++ b/time-machine.py @@ -120,7 +120,7 @@ def flock_release(fd): def run_rsync(args, verbose=False): - cmd = ['rsync'] + cmd = ['rsync --bwlimit=5000'] cmd.extend(args) logger('running cmd: %s' % ' '.join(cmd)) try: From 49b2d9c60ab0828a3f099102e4e3b8a3fcf7f0e7 Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Tue, 8 Jan 2019 08:43:53 -0500 Subject: [PATCH 04/11] Update time-machine.py --- time-machine.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/time-machine.py b/time-machine.py index 07095a0..d70a90c 100755 --- a/time-machine.py +++ b/time-machine.py @@ -545,7 +545,7 @@ def main(): sys.exit(2) stat_before = os.statvfs(cfg['dest_path']) - stat_snaps_before = size_dir(cfg['dest_path']) + #stat_snaps_before = size_dir(cfg['dest_path']) check_freespace(stat_before) t_start = datetime.now() @@ -559,17 +559,17 @@ def main(): # report stat_after = os.statvfs(cfg['dest_path']) - stat_snaps_after = size_dir(cfg['dest_path']) + #stat_snaps_after = size_dir(cfg['dest_path']) logger('Filesystem before backup:') print_fs_stat(stat_before) - print_snaps_stat(stat_snaps_before) + #print_snaps_stat(stat_snaps_before) logger('Filesystem after backup:') print_fs_stat(stat_after) - print_snaps_stat(stat_snaps_after) + #print_snaps_stat(stat_snaps_after) t_used = datetime.now() - t_start - s_used_diff = stat_snaps_after - stat_snaps_before + #s_used_diff = stat_snaps_after - stat_snaps_before logger('Backup runtime: %s' % str(t_used).split('.')[0]) - logger('Backup snapshots(s) space diff before/after: %s' % str(humanize_bytes(s_used_diff))) + #logger('Backup snapshots(s) space diff before/after: %s' % str(humanize_bytes(s_used_diff))) flock_release(fd) From 688b019f52515bd1e2eb0026fe64d6b9c5adc73a Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Tue, 8 Jan 2019 09:04:27 -0500 Subject: [PATCH 05/11] Update time-machine.py --- time-machine.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/time-machine.py b/time-machine.py index d70a90c..e9cae87 100755 --- a/time-machine.py +++ b/time-machine.py @@ -8,7 +8,7 @@ __license__ = 'GNU GPL v2' __copyright__ = '2016, Chen Wei ' -__version__ = '0.0.2' +__version__ = '0.0.3' import os import sys From 379a0857ccc9cba75f409a623d34363e5b99beb3 Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:04:49 -0500 Subject: [PATCH 06/11] Update time-machine.py --- time-machine.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/time-machine.py b/time-machine.py index e9cae87..e461109 100755 --- a/time-machine.py +++ b/time-machine.py @@ -165,6 +165,7 @@ def take_snapshot(): now = datetime.utcnow() backup_dst = os.path.join(cfg['dest_path'], now.strftime("%Y-%m-%d_%H:%M:%S_GMT")) + os.mkdir(backup_dst) args = [x for x in RSYNC_ARGS] exclude_patterns = ['--exclude=%s' % x for x in cfg['exclude_patterns']] args.extend(exclude_patterns) @@ -181,13 +182,12 @@ def take_snapshot(): elif len(snapshots) > 0 and not os.path.exists(latest): if os.path.lexists(latest): - logger('Error, the "latest" symbol link is broken. Remove' - ' "latest" and recreate that link by run:\n' - 'ln -fs yyyy-mm-dd_HH:MM:SS_GMT latest') + os.remove(latest) + logger('Error, the "latest" symbol link is broken and will be recreated empty for next backup...') else: logger('Error, cannot find the last snapshot, maybe the "latest" ' - 'symbol link has been deleted. Please create that link by ' - 'run:\nln -s yyyy-mm-dd_HH:MM:SS_GMT latest') + 'symbol link has been deleted. We will recreate it empty for next backup...') + os.symlink(backup_dst, latest) exit(2) else: # len(snapshots) == 0 From 14767e2956a143e874d3bb2dc51404f50c5c904c Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:19:46 -0500 Subject: [PATCH 07/11] Update time-machine.py --- time-machine.py | 1 + 1 file changed, 1 insertion(+) diff --git a/time-machine.py b/time-machine.py index e461109..3c1d3fa 100755 --- a/time-machine.py +++ b/time-machine.py @@ -54,6 +54,7 @@ '--relative', '--perms', '--owner', + '-e "ssh -q"', '--group' ) # '--perms', From 546e80a2d9848e8bc3b55904844632d5821109f9 Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:25:56 -0500 Subject: [PATCH 08/11] Update time-machine.py --- time-machine.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/time-machine.py b/time-machine.py index 3c1d3fa..3f6d56b 100755 --- a/time-machine.py +++ b/time-machine.py @@ -121,7 +121,7 @@ def flock_release(fd): def run_rsync(args, verbose=False): - cmd = ['rsync --bwlimit=5000'] + cmd = ['rsync'] cmd.extend(args) logger('running cmd: %s' % ' '.join(cmd)) try: @@ -195,7 +195,7 @@ def take_snapshot(): if os.path.lexists(latest): os.remove(latest) - args.extend(cfg['sources']) + args.extend(cfg['sources'] + str("/")) args.append(backup_dst) ret = run_rsync(args) From ec423d29783b5fa8eab214bc55ca95ae23b6c53e Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:30:00 -0500 Subject: [PATCH 09/11] Update time-machine.py --- time-machine.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/time-machine.py b/time-machine.py index 3f6d56b..2a25c08 100755 --- a/time-machine.py +++ b/time-machine.py @@ -195,7 +195,7 @@ def take_snapshot(): if os.path.lexists(latest): os.remove(latest) - args.extend(cfg['sources'] + str("/")) + args.extend(cfg['sources']) args.append(backup_dst) ret = run_rsync(args) @@ -418,10 +418,10 @@ def get_config(conf): source_paths = config.get('source', 'path') if source_host and source_user: # ssh remote - cfg['sources'] = ['%s@%s:%s' % (source_user, source_host, p) + cfg['sources'] = ['%s@%s:%s/' % (source_user, source_host, p) for p in source_paths] elif source_host and not source_user: # ssh username in .ssh/config - cfg['sources'] = ['%s:%s' % (source_host, p) + cfg['sources'] = ['%s:%s/' % (source_host, p) for p in source_paths] else: # local path cfg['sources'] = source_paths From 1146d1481ded512497f41de9a66fcbbd5d4c3e70 Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:43:54 -0500 Subject: [PATCH 10/11] Update time-machine.py --- time-machine.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/time-machine.py b/time-machine.py index 2a25c08..f46206f 100755 --- a/time-machine.py +++ b/time-machine.py @@ -166,7 +166,6 @@ def take_snapshot(): now = datetime.utcnow() backup_dst = os.path.join(cfg['dest_path'], now.strftime("%Y-%m-%d_%H:%M:%S_GMT")) - os.mkdir(backup_dst) args = [x for x in RSYNC_ARGS] exclude_patterns = ['--exclude=%s' % x for x in cfg['exclude_patterns']] args.extend(exclude_patterns) @@ -188,6 +187,7 @@ def take_snapshot(): else: logger('Error, cannot find the last snapshot, maybe the "latest" ' 'symbol link has been deleted. We will recreate it empty for next backup...') + os.mkdir(backup_dst) os.symlink(backup_dst, latest) exit(2) @@ -195,15 +195,16 @@ def take_snapshot(): if os.path.lexists(latest): os.remove(latest) + if not os.path.exists(backup_dst): + os.mkdir(backup_dst) + args.extend(cfg['sources']) args.append(backup_dst) ret = run_rsync(args) - if ret == 0: - if os.path.exists(latest): - os.remove(latest) - - os.symlink(backup_dst, latest) + if os.path.exists(latest): + os.remove(latest) + os.symlink(backup_dst, latest) return now From ebeb7e691f58c5ed999375b71a0adfc0fcb0a33a Mon Sep 17 00:00:00 2001 From: Florent MONTHEL Date: Mon, 6 Jan 2020 21:50:36 -0500 Subject: [PATCH 11/11] Update time-machine.py --- time-machine.py | 1 - 1 file changed, 1 deletion(-) diff --git a/time-machine.py b/time-machine.py index f46206f..caf38b6 100755 --- a/time-machine.py +++ b/time-machine.py @@ -54,7 +54,6 @@ '--relative', '--perms', '--owner', - '-e "ssh -q"', '--group' ) # '--perms',