mirror of
https://github.com/RsyncProject/rsync.git
synced 2026-01-13 17:38:04 -05:00
51 lines
1.5 KiB
Python
Executable File
51 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
# This implements a simple protocol to do user & group conversions between
|
|
# names & ids. All input and output consists of simple strings with a
|
|
# terminating newline.
|
|
#
|
|
# The requests can be:
|
|
#
|
|
# uid ID_NUM\n -> NAME\n
|
|
# gid ID_NUM\n -> NAME\n
|
|
# usr NAME\n -> ID_NUM\n
|
|
# grp NAME\n -> ID_NUM\n
|
|
#
|
|
# An unknown ID_NUM or NAME results in an empty return value.
|
|
#
|
|
# This is used by an rsync daemon when configured with the "name converter" and
|
|
# (often) "use chroot = true". While this converter uses real user & group
|
|
# lookups you could change it to use any mapping idiom you'd like.
|
|
|
|
import sys, argparse, pwd, grp
|
|
|
|
def main():
|
|
for line in sys.stdin:
|
|
try:
|
|
req, arg = line.rstrip().split(' ', 1)
|
|
except:
|
|
req = None
|
|
try:
|
|
if req == 'uid':
|
|
ans = pwd.getpwuid(int(arg)).pw_name
|
|
elif req == 'gid':
|
|
ans = grp.getgrgid(int(arg)).gr_name
|
|
elif req == 'usr':
|
|
ans = pwd.getpwnam(arg).pw_uid
|
|
elif req == 'grp':
|
|
ans = grp.getgrnam(arg).gr_gid
|
|
else:
|
|
print("Invalid request", file=sys.stderr)
|
|
sys.exit(1)
|
|
except KeyError:
|
|
ans = ''
|
|
print(ans, flush=True)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser(description="Convert users & groups between names & numbers for an rsync daemon.")
|
|
args = parser.parse_args()
|
|
main()
|
|
|
|
# vim: sw=4 et
|