diff options
author | Wayne Davison <wayne@opencoder.net> | 2022-11-16 00:06:05 -0800 |
---|---|---|
committer | Wayne Davison <wayne@opencoder.net> | 2022-11-16 00:10:09 -0800 |
commit | ab0d5021ed1c9b4c1b74f5d80b7c6668d8989ba5 (patch) | |
tree | dab48bd1db50e069e86cc39600827b81c6bdee4a | |
parent | 740289652347573508688d7fb3e7e48d697f8742 (diff) | |
download | rsync-ab0d5021ed1c9b4c1b74f5d80b7c6668d8989ba5.tar.gz |
Convert a few more scripts to python3.
-rwxr-xr-x | support/files-to-excludes | 58 | ||||
-rwxr-xr-x | support/idmap | 45 | ||||
-rwxr-xr-x | support/json-rsync-version | 2 | ||||
-rwxr-xr-x | support/mapfrom | 15 | ||||
-rwxr-xr-x | support/mapto | 15 |
5 files changed, 80 insertions, 55 deletions
diff --git a/support/files-to-excludes b/support/files-to-excludes index a28955cb..a47d7f8a 100755 --- a/support/files-to-excludes +++ b/support/files-to-excludes @@ -1,27 +1,37 @@ -#!/usr/bin/env perl -# This script takes an input of filenames and outputs a set of -# include/exclude directives that can be used by rsync to copy -# just the indicated files using an --exclude-from=FILE option. -use strict; +#!/usr/bin/env python3 +# This script takes an input of filenames and outputs a set of include/exclude +# directives that can be used by rsync to copy just the indicated files using +# an --exclude-from=FILE or -f'. FILE' option. To be able to delete files on +# the receiving side, either use --delete-excluded or change the exclude (-) +# rules to hide filter rules (H) that only affect the sending side. -my %hash; +import os, fileinput, argparse -while (<>) { - chomp; - s#^/+##; - my $path = '/'; - while (m#([^/]+/)/*#g) { - $path .= $1; - print "+ $path\n" unless $hash{$path}++; - } - if (m#([^/]+)$#) { - print "+ $path$1\n"; - } else { - delete $hash{$path}; - } -} +def main(): + paths = set() + for line in fileinput.input(args.files): + dirs = line.strip().lstrip('/').split('/') + if not dirs: + continue + for j in range(1, len(dirs)): + if dirs[j] == '': + continue + path = '/' + '/'.join(dirs[:j]) + '/' + if path not in paths: + print('+', path) + paths.add(path) + print('+', '/' + '/'.join(dirs)) -foreach (sort keys %hash) { - print "- $_*\n"; -} -print "- /*\n"; + for path in sorted(paths): + print('-', path + '*') + print('-', '/*') + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Transform a list of files into a set of include/exclude rules.", add_help=False) + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the pathnames to translate. Defaults to stdin.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/idmap b/support/idmap new file mode 100755 index 00000000..b212aaf6 --- /dev/null +++ b/support/idmap @@ -0,0 +1,45 @@ +#!/usr/bin/env python3 +# This helper script makes it easy to use a passwd or group file to map values +# in a LOCAL transfer. For instance, if you mount a backup that does not have +# the same passwd setup as the local machine, you can do a copy to/from the +# backup area as follows and get the differing ID values mapped just like a +# remote transfer to/from the backed-up machine would do: +# +# rsync -av --usermap=`idmap --to /mnt/backup/etc/passwd` \ +# --groupmap=`idmap --to /mnt/backup/etc/group` \ +# /some/src/ /mnt/backup/some/dest/ +# +# rsync -av --usermap=`idmap --from /mnt/backup/etc/passwd` \ +# --groupmap=`idmap --from /mnt/backup/etc/group` \ +# /mnt/backup/some/src/ /some/dest/ + +import re, fileinput, argparse + +NAME_ID_RE = re.compile(r'^(\w+):[^:]+:(\d+)') + +def main(): + maps = [ ] + for line in fileinput.input(args.files): + m = NAME_ID_RE.match(line) + if not m: + continue + if args.to: + pair = (m[1], m[2]) + else: + pair = (m[2], m[1]) + maps.append(':'.join(pair)) + print(','.join(maps)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description="Output usermap or groupmap args for rsync.", add_help=False) + action = parser.add_argument_group() + action = parser.add_mutually_exclusive_group(required=True) + action.add_argument("--from", action="store_true", help="Output the map for use on the sending side.") + action.add_argument("--to", action="store_true", help="Output the map for use on the receiving side.") + parser.add_argument("--help", "-h", action="help", help="Output this help message and exit.") + parser.add_argument("files", metavar="FILE", default='-', nargs='*', help="The file(s) that hold the name & id pairs. Defaults to stdin.") + args = parser.parse_args() + main() + +# vim: sw=4 et diff --git a/support/json-rsync-version b/support/json-rsync-version index 31fed7f1..b01e1e49 100755 --- a/support/json-rsync-version +++ b/support/json-rsync-version @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 import sys, argparse, subprocess, json diff --git a/support/mapfrom b/support/mapfrom deleted file mode 100755 index 88946bc0..00000000 --- a/support/mapfrom +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env perl -# This helper script makes it easy to use a passwd or group file to map -# values in a LOCAL transfer. For instance, if you mount a backup that -# does not have the same passwd setup as the local machine, you can do -# a copy FROM the backup area as follows and get the differing ID values -# mapped just like a remote transfer FROM the backed-up machine would do: -# -# rsync -av --usermap=`mapfrom /mnt/backup/etc/passwd` \ -# --groupmap=`mapfrom /mnt/backup/etc/group` \ -# /mnt/backup/some/src/ /some/dest/ - -while (<>) { - push @_, "$2:$1" if /^(\w+):[^:]+:(\d+)/; -} -print join(',', @_), "\n"; diff --git a/support/mapto b/support/mapto deleted file mode 100755 index 95887523..00000000 --- a/support/mapto +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env perl -# This helper script makes it easy to use a passwd or group file to map -# values in a LOCAL transfer. For instance, if you mount a backup that -# does not have the same passwd setup as the local machine, you can do -# a copy TO the backup area as follows and get the differing ID values -# mapped just like a remote transfer TO the backed-up machine would do: -# -# rsync -av --usermap=`mapto /mnt/backup/etc/passwd` \ -# --groupmap=`mapto /mnt/backup/etc/group` \ -# /some/src/ /mnt/backup/some/dest/ - -while (<>) { - push @_, "$1:$2" if /^(\w+):[^:]+:(\d+)/; -} -print join(',', @_), "\n"; |