Wayne DavisonTweak a comment.617d7266 years agoHistory
50 lines · 1.5 KB · Text
RawDownload
#!/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