summaryrefslogtreecommitdiffstats
path: root/support/idmap
diff options
context:
space:
mode:
Diffstat (limited to 'support/idmap')
-rwxr-xr-xsupport/idmap45
1 files changed, 45 insertions, 0 deletions
diff --git a/support/idmap b/support/idmap
new file mode 100755
index 0000000..b212aaf
--- /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