PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB` #!/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