X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=ud-host;h=4ba05719ff238ce6aded1f34923c3adecbedb731;hb=c3bdc0a516ee5036c5d9ff45847e89e972dfb32f;hp=8c04ba222d4f0653d5a893a2f382718d984d50c8;hpb=0615d76c2c3cc5c334ca528248551e8771d52b46;p=mirror%2Fuserdir-ldap.git diff --git a/ud-host b/ud-host index 8c04ba2..4ba0571 100755 --- a/ud-host +++ b/ud-host @@ -4,7 +4,7 @@ # Copyright (c) 2000-2001 Jason Gunthorpe # Copyright (c) 2001 Ryan Murray # Copyright (c) 2003 James Troup -# Copyright (c) 2004 Joey Schulze +# Copyright (c) 2004-2005 Joey Schulze # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -29,8 +29,12 @@ # -a Set the authentication user (the user whose password you are # going to enter) # -h Set the host to display +# -l list all hosts and their status +# -f list all SSH fingerprints -import string, time, os, pwd, sys, getopt, ldap, crypt, whrandom, readline, copy; +import string, time, os, pwd, sys, getopt, ldap, crypt, readline, copy; +from tempfile import mktemp +from os import O_CREAT, O_EXCL, O_WRONLY from userdir_ldap import *; RootMode = 0; @@ -112,20 +116,19 @@ def ShowAttrs(Attrs): def Overview(Attrs): """Display a one-line overview for a given host""" - if 'status' in Attrs[1].keys(): - status = Attrs[1]['status'][0] - else: - status = '' + for i in ['host','architecture','distribution','access','status']: + if i not in Attrs[1].keys(): + Attrs[1][i] = [''] print "%-12s %-10s %-38s %-25s %s" % (\ Attrs[1]['host'][0], \ Attrs[1]['architecture'][0], \ Attrs[1]['distribution'][0], \ Attrs[1]['access'][0], \ - status) + Attrs[1]['status'][0]) # Change a single attribute def ChangeAttr(Attrs,Attr): - if (Attr == "sponsor" or Attr == "hostname" or Attr == "sshRSAHostKey"): + if (Attr == "sponsor" or Attr == "sshRSAHostKey"): return MultiChangeAttr(Attrs,Attr); print "Old value: '%s'" % (GetAttr(Attrs,Attr,"")); @@ -191,11 +194,32 @@ def MultiChangeAttr(Attrs,Attr): Attrs[1][Attr].append(NewValue); print; +def CalcTempFile(): + unique = 0 + while unique == 0: + name = mktemp() + try: + fd = os.open(name, O_CREAT | O_EXCL | O_WRONLY, 0600) + except OSError: + continue + os.close(fd) + unique = 1 + return name + + # Main program starts here User = pwd.getpwuid(os.getuid())[0]; BindUser = User; +ListMode = 0 +FingerPrints = 0 +Host = None # Process options -(options, arguments) = getopt.getopt(sys.argv[1:], "nh:a:rl") +try: + (options, arguments) = getopt.getopt(sys.argv[1:], "nh:a:rlf") +except getopt.GetoptError, data: + print data + sys.exit(1) + for (switch, val) in options: if (switch == '-h'): Host = val; @@ -208,6 +232,9 @@ for (switch, val) in options: elif (switch == '-l'): BindUser = ""; ListMode = 1 + elif (switch == '-f'): + BindUser = ""; + FingerPrints = 1 if (BindUser != ""): l = passwdAccessLDAP(LDAPServer, BaseDn, BindUser) @@ -215,7 +242,7 @@ else: l = ldap.open(LDAPServer); l.simple_bind_s("","") -HBaseDn = "ou=hosts,dc=debian,dc=org"; +HBaseDn = HostBaseDn if ListMode == 1: Attrs = l.search_s(HBaseDn,ldap.SCOPE_ONELEVEL,"host=*") @@ -231,6 +258,32 @@ if ListMode == 1: if host == hAttrs[1]['host'][0]: Overview(hAttrs) sys.exit(0) +elif FingerPrints == 1: + if Host is not None: + Attrs = l.search_s(HBaseDn,ldap.SCOPE_ONELEVEL,"host=" + Host) + else: + Attrs = l.search_s(HBaseDn,ldap.SCOPE_ONELEVEL,"host=*") + hosts = [] + for hAttrs in Attrs: + hosts.append(hAttrs[1]['host'][0]) + hosts.sort() + + tmpfile = CalcTempFile() + for host in hosts: + for hAttrs in Attrs: + if host == hAttrs[1]['host'][0]: + if 'sshRSAHostKey' in hAttrs[1].keys(): + for key in hAttrs[1]['sshRSAHostKey']: + tmp = open(tmpfile, 'w') + tmp.write(key + '\n') + tmp.close() + fp = os.popen('/usr/bin/ssh-keygen -l -f ' + tmpfile, "r") + input = fp.readline() + fp.close() + fingerprint = input.split(' ') + print "%s %s root@%s" % (fingerprint[0], fingerprint[1], host) + os.unlink(tmpfile) + sys.exit(0) HostDn = "host=" + Host + "," + HBaseDn;