First cut at a Python version of the automount script for ssh keys
[pl_sshd.git] / auto.pl_sshd.py
1 #!/usr/bin/python
2 #
3 # Copyright 2005 Princeton University
4 #
5 # autofs(5) executable map for /var/pl_sshd/keys/
6 #
7
8 import cStringIO
9 import os
10 import pwd
11 import pycurl
12 import sys
13
14
15
16 def abort(msg):
17     print >>sys.stderr, msg
18     sys.exit(1)
19     
20 if len(sys.argv) != 2:
21     print >>sys.stderr, "usage:\n    %s <slicename>" % sys.argv[0]
22     sys.exit(1)
23
24 slice = sys.argv[1]
25 try:
26     (name, passwd, uid, gid, comment, home, sh) = pwd.getpwnam(slice)
27 except KeyError, ex:
28     abort("no such user: " + slice)
29
30 result = "--bind,-r :"
31
32 sshdir = home + "/.ssh"
33 keyfile = sshdir + "/authorized_keys"
34
35 # check whether authorized_keys exists in the real home dir
36 if os.access(keyfile, os.R_OK):
37     # yes - use it
38     result += sshdir
39 else:
40     # no - look in the vserver
41     # try to get keys from KeySensor
42     sys.stderr.write("Retrieving SSH keys for %s... " % slice)
43     pycurl.global_init(pycurl.GLOBAL_ALL)
44     c = pycurl.Curl()
45     c.setopt(pycurl.URL, "http://localhost:815/keys?slice=" + slice)
46     out = cStringIO.StringIO()
47     c.setopt(pycurl.WRITEFUNCTION, out.write)
48     c.setopt(pycurl.NOSIGNAL, 1)
49     c.setopt(pycurl.TIMEOUT, 1)
50     try:
51         c.perform()
52         rc = c.getinfo(pycurl.HTTP_CODE)
53         if rc != 200:
54             abort("HTTP error: " + str(rc))
55     except pycurl.error, ex:
56         if ex[0] == 28:  # XXX - pycurl doesn't define error constants
57             abort("timed-out")
58         abort("curl error: " + ex[1])
59     keydata = out.getvalue()
60
61     # try to update keyfile
62     vsbase = "/vservers/" + slice
63     os.chroot(vsbase)
64     os.setgid(gid)
65     os.setuid(uid)
66     if not os.path.isdir(sshdir):
67         os.mkdir(sshdir, 0700)
68         
69     f = file(keyfile, "w")
70     f.write(keydata)
71     f.close()
72     os.chmod(keyfile, 0600)
73     result += vsbase + sshdir
74     print >>sys.stderr, "succeeded."
75
76 print result