aboutsummaryrefslogtreecommitdiffstats
path: root/modules/openssh
diff options
context:
space:
mode:
authorNicolas Vigier <boklm@mageia.org>2011-08-21 12:22:27 +0000
committerNicolas Vigier <boklm@mageia.org>2011-08-21 12:22:27 +0000
commitcdb5d5f293e097f472320a7718c18f8ff18162f0 (patch)
tree95751ba56d9832e16354748dee7c47908ac8d01e /modules/openssh
parent9b0eab0b661c79263d0d30001428b8ccc46287c9 (diff)
downloadpuppet-cdb5d5f293e097f472320a7718c18f8ff18162f0.tar
puppet-cdb5d5f293e097f472320a7718c18f8ff18162f0.tar.gz
puppet-cdb5d5f293e097f472320a7718c18f8ff18162f0.tar.bz2
puppet-cdb5d5f293e097f472320a7718c18f8ff18162f0.tar.xz
puppet-cdb5d5f293e097f472320a7718c18f8ff18162f0.zip
move ldap-sshkey2file.py to openssh module (where it is used)
Diffstat (limited to 'modules/openssh')
-rw-r--r--modules/openssh/manifests/init.pp2
-rwxr-xr-xmodules/openssh/templates/ldap-sshkey2file.py92
2 files changed, 93 insertions, 1 deletions
diff --git a/modules/openssh/manifests/init.pp b/modules/openssh/manifests/init.pp
index 8c929d79..44561ee0 100644
--- a/modules/openssh/manifests/init.pp
+++ b/modules/openssh/manifests/init.pp
@@ -84,7 +84,7 @@ class openssh {
owner => root,
group => root,
mode => 755,
- content => template("restrictshell/ldap-sshkey2file.py"),
+ content => template("openssh/ldap-sshkey2file.py"),
require => Package['python-ldap']
}
cron { 'sshkey2file':
diff --git a/modules/openssh/templates/ldap-sshkey2file.py b/modules/openssh/templates/ldap-sshkey2file.py
new file mode 100755
index 00000000..af29a203
--- /dev/null
+++ b/modules/openssh/templates/ldap-sshkey2file.py
@@ -0,0 +1,92 @@
+#!/usr/bin/python
+
+import sys
+import os
+import random
+
+try:
+ import ldap
+except ImportError, e:
+ print "Please install python-ldap before running this program"
+ sys.exit(1)
+
+basedn="<%= dc_suffix %>"
+peopledn="ou=people,%s" % basedn
+uris=['ldap://ldap.<%= domain %>']
+random.shuffle(uris)
+uri = " ".join(uris)
+timeout=5
+binddn="cn=<%= fqdn %>,ou=Hosts,%s" % basedn
+pwfile="<%= ldap_pwfile %>"
+# filter out disabled accounts also
+# too bad uidNumber doesn't support >= filters
+filter="(&(objectClass=inetOrgPerson)(objectClass=ldapPublicKey)(objectClass=posixAccount)(sshPublicKey=*))"
+keypathprefix="<%= pubkeys_directory %>"
+
+def usage():
+ print "%s" % sys.argv[0]
+ print
+ print "Will fetch all enabled user accounts under %s" % peopledn
+ print "with ssh keys in them and write each one to"
+ print "%s/<login>/authorized_keys" % keypathprefix
+ print
+ print "This script is intented to be run from cron as root"
+ print
+
+def get_pw(pwfile):
+ try:
+ f = open(pwfile, 'r')
+ except IOError, e:
+ print "Error while reading password file, aborting"
+ print e
+ sys.exit(1)
+ pw = f.readline().strip()
+ f.close()
+ return pw
+
+def write_keys(keys, user, uid, gid):
+ try:
+ os.makedirs("%s/%s" % (keypathprefix,user), 0700)
+ except:
+ pass
+ keyfile = "%s/%s/authorized_keys" % (keypathprefix,user)
+ f = open(keyfile, 'w')
+ for key in keys:
+ f.write(key.strip() + "\n")
+ f.close()
+ os.chmod(keyfile, 0600)
+ os.chown(keyfile, uid, gid)
+ os.chmod("%s/%s" % (keypathprefix,user), 0700)
+ os.chown("%s/%s" % (keypathprefix,user), uid, gid)
+
+if len(sys.argv) != 1:
+ usage()
+ sys.exit(1)
+
+bindpw = get_pw(pwfile)
+
+try:
+ ld = ldap.initialize(uri)
+ ld.set_option(ldap.OPT_NETWORK_TIMEOUT, timeout)
+ ld.start_tls_s()
+ ld.bind_s(binddn, bindpw)
+ res = ld.search_s(peopledn, ldap.SCOPE_ONELEVEL, filter, ['uid','sshPublicKey','uidNumber','gidNumber'])
+ try:
+ os.makedirs(keypathprefix, 0701)
+ except:
+ pass
+ for result in res:
+ dn, entry = result
+ # skip possible system users
+ if int(entry['uidNumber'][0]) < 500:
+ continue
+ write_keys(entry['sshPublicKey'], entry['uid'][0], int(entry['uidNumber'][0]), int(entry['gidNumber'][0]))
+ ld.unbind_s()
+except Exception, e:
+ print "Error"
+ raise
+
+sys.exit(0)
+
+
+# vim:ts=4:sw=4:et:ai:si