#!/usr/bin/python # # Copyright 2005 Princeton University # # autofs(5) executable map for /var/pl_sshd/keys/ # import cStringIO import os import pwd import pycurl import sys def abort(msg): print >>sys.stderr, msg sys.exit(1) if len(sys.argv) != 2: print >>sys.stderr, "usage:\n %s " % sys.argv[0] sys.exit(1) slice = sys.argv[1] try: (name, passwd, uid, gid, comment, home, sh) = pwd.getpwnam(slice) except KeyError, ex: abort("no such user: " + slice) result = "--bind,-r :" sshdir = home + "/.ssh" keyfile = sshdir + "/authorized_keys" # check whether authorized_keys exists in the real home dir if os.access(keyfile, os.R_OK): # yes - use it result += sshdir else: # no - look in the vserver # try to get keys from KeySensor sys.stderr.write("Retrieving SSH keys for %s... " % slice) pycurl.global_init(pycurl.GLOBAL_ALL) c = pycurl.Curl() c.setopt(pycurl.URL, "http://localhost:815/keys?slice=" + slice) out = cStringIO.StringIO() c.setopt(pycurl.WRITEFUNCTION, out.write) c.setopt(pycurl.NOSIGNAL, 1) c.setopt(pycurl.TIMEOUT, 1) try: c.perform() rc = c.getinfo(pycurl.HTTP_CODE) if rc != 200: abort("HTTP error: " + str(rc)) except pycurl.error, ex: if ex[0] == 28: # XXX - pycurl doesn't define error constants abort("timed-out") abort("curl error: " + ex[1]) keydata = out.getvalue() # try to update keyfile vsbase = "/vservers/" + slice os.chroot(vsbase) os.setgid(gid) os.setuid(uid) if not os.path.isdir(sshdir): os.mkdir(sshdir, 0700) f = file(keyfile, "w") f.write(keydata) f.close() os.chmod(keyfile, 0600) result += vsbase + sshdir print >>sys.stderr, "succeeded." print result