X-Git-Url: https://git.adam-barratt.org.uk/?a=blobdiff_plain;f=ud-generate;h=a4a74b57b2988c15e2413964d27663dc95312a3c;hb=627dc95eaf71520b27b7893b96eff318925a099a;hp=1ec522243f1efeea0291ad8dd55d262daad51c60;hpb=92bcab0d33785d01219d0a83dcf0690027a52a23;p=mirror%2Fuserdir-ldap.git diff --git a/ud-generate b/ud-generate index 1ec5222..a4a74b5 100755 --- a/ud-generate +++ b/ud-generate @@ -74,8 +74,13 @@ isSSHFP = re.compile("^\s*IN\s+SSHFP") DNSZone = ".debian.net" Keyrings = ConfModule.sync_keyrings.split(":") GitoliteSSHRestrictions = getattr(ConfModule, "gitolitesshrestrictions", None) +GitoliteSSHCommand = getattr(ConfModule, "gitolitesshcommand", None) GitoliteExportHosts = re.compile(getattr(ConfModule, "gitoliteexporthosts", ".")) MX_remap = json.loads(ConfModule.MX_remap) +use_mq = getattr(ConfModule, "use_mq", True) + +rtc_realm = getattr(ConfModule, "rtc_realm", None) +rtc_append = getattr(ConfModule, "rtc_append", None) def prettify(elem): """Return a pretty-printed XML string for the Element. @@ -160,9 +165,6 @@ def IsRetired(account): return False -#def IsGidDebian(account): -# return account['gidNumber'] == 800 - # See if this user is in the group list def IsInGroup(account, allowed, current_host): # See if the primary group is in the list @@ -306,7 +308,7 @@ def GenShadowSudo(accounts, File, untrusted, current_host): Pass = '*' if 'sudoPassword' in a: for entry in a['sudoPassword']: - Match = re.compile('^('+UUID_FORMAT+') (confirmed:[0-9a-f]{40}|unconfirmed) ([a-z0-9.,*]+) ([^ ]+)$').match(entry) + Match = re.compile('^('+UUID_FORMAT+') (confirmed:[0-9a-f]{40}|unconfirmed) ([a-z0-9.,*-]+) ([^ ]+)$').match(entry) if Match == None: continue uuid = Match.group(1) @@ -340,8 +342,10 @@ def GenShadowSudo(accounts, File, untrusted, current_host): Done(File, F, None) # Generate the sudo passwd file -def GenSSHGitolite(accounts, hosts, File): +def GenSSHGitolite(accounts, hosts, File, sshcommand=None, current_host=None): F = None + if sshcommand is None: + sshcommand = GitoliteSSHCommand try: OldMask = os.umask(0022) F = open(File + ".tmp", "w", 0600) @@ -352,19 +356,30 @@ def GenSSHGitolite(accounts, hosts, File): if not 'sshRSAAuthKey' in a: continue User = a['uid'] - prefix = GitoliteSSHRestrictions.replace('@@USER@@', User) + prefix = GitoliteSSHRestrictions + prefix = prefix.replace('@@COMMAND@@', sshcommand) + prefix = prefix.replace('@@USER@@', User) for I in a["sshRSAAuthKey"]: + if I.startswith("allowed_hosts=") and ' ' in line: + if current_host is None: + continue + machines, I = I.split('=', 1)[1].split(' ', 1) + if current_host not in machines.split(','): + continue # skip this key + if I.startswith('ssh-'): line = "%s %s"%(prefix, I) else: - line = "%s,%s"%(prefix, I) + continue # do not allow keys with other restrictions that might conflict line = Sanitize(line) + "\n" F.write(line) for dn, attrs in hosts: if not 'sshRSAHostKey' in attrs: continue hostname = "host-" + attrs['hostname'][0] - prefix = GitoliteSSHRestrictions.replace('@@USER@@', hostname) + prefix = GitoliteSSHRestrictions + prefix = prefix.replace('@@COMMAND@@', sshcommand) + prefix = prefix.replace('@@USER@@', hostname) for I in attrs["sshRSAHostKey"]: line = "%s %s"%(prefix, I) line = Sanitize(line) + "\n" @@ -422,10 +437,11 @@ def GenRtcPassword(accounts, File): os.umask(OldMask) for a in accounts: + if a.is_guest_account(): continue if not 'rtcPassword' in a: continue if not a.pw_active(): continue - Line = "%s@debian.org:%s:rtc.debian.org:AUTHORIZED" % (a['uid'], str(a['rtcPassword'])) + Line = "%s%s:%s:%s:AUTHORIZED" % (a['uid'], rtc_append, str(a['rtcPassword']), rtc_realm) Line = Sanitize(Line) + "\n" F.write("%s" % (Line)) @@ -872,17 +888,21 @@ def ExtractDNSInfo(x): Algorithm = 1 if Split[0] == 'ssh-dss': Algorithm = 2 + if Split[0] == 'ssh-ed25519': + Algorithm = 4 if Algorithm == None: continue Fingerprint = hashlib.new('sha1', base64.decodestring(Split[1])).hexdigest() DNSInfo.append("%sIN\tSSHFP\t%u 1 %s" % (TTLprefix, Algorithm, Fingerprint)) + Fingerprint = hashlib.new('sha256', base64.decodestring(Split[1])).hexdigest() + DNSInfo.append("%sIN\tSSHFP\t%u 2 %s" % (TTLprefix, Algorithm, Fingerprint)) if 'architecture' in x[1]: Arch = GetAttr(x, "architecture") Mach = "" if x[1].has_key("machine"): Mach = " " + GetAttr(x, "machine") - DNSInfo.append("%sIN\tHINFO\t\"%s%s\" \"%s\"" % (TTLprefix, Arch, Mach, "Debian GNU/Linux")) + DNSInfo.append("%sIN\tHINFO\t\"%s%s\" \"%s\"" % (TTLprefix, Arch, Mach, "Debian")) if x[1].has_key("mXRecord"): for I in x[1]["mXRecord"]: @@ -1177,7 +1197,6 @@ def generate_all(global_dir, ldap_conn): accounts_disabled = GenDisabledAccounts(accounts, global_dir + "disabled-accounts") accounts = filter(lambda x: not IsRetired(x), accounts) - #accounts_DDs = filter(lambda x: IsGidDebian(x), accounts) CheckForward(accounts) @@ -1207,7 +1226,6 @@ def generate_all(global_dir, ldap_conn): GenMarkers(accounts, global_dir + "markers") GenSSHKnown(host_attrs, global_dir + "ssh_known_hosts") GenHosts(host_attrs, global_dir + "debianhosts") - GenSSHGitolite(accounts, host_attrs, global_dir + "ssh-gitolite") GenDNS(accounts, global_dir + "dns-zone") GenZoneRecords(host_attrs, global_dir + "dns-sshfp") @@ -1302,14 +1320,23 @@ def generate_host(host, global_dir, all_accounts, all_hosts, ssh_userkeys): DoLink(global_dir, OutDir, "debian-private") if 'GITOLITE' in ExtraList: - DoLink(global_dir, OutDir, "ssh-gitolite") + GenSSHGitolite(all_accounts, all_hosts, OutDir + "ssh-gitolite", current_host=current_host) if 'exportOptions' in host[1]: for entry in host[1]['exportOptions']: v = entry.split('=',1) if v[0] != 'GITOLITE' or len(v) != 2: continue - gitolite_accounts = filter(lambda x: IsInGroup(x, [v[1]], current_host), all_accounts) - gitolite_hosts = filter(lambda x: GitoliteExportHosts.match(x[1]["hostname"][0]), all_hosts) - GenSSHGitolite(gitolite_accounts, gitolite_hosts, OutDir + "ssh-gitolite-%s"%(v[1],)) + options = v[1].split(',') + group = options.pop(0); + gitolite_accounts = filter(lambda x: IsInGroup(x, [group], current_host), all_accounts) + if not 'nohosts' in options: + gitolite_hosts = filter(lambda x: GitoliteExportHosts.match(x[1]["hostname"][0]), all_hosts) + else: + gitolite_hosts = [] + command = None + for opt in options: + if opt.startswith('sshcmd='): + command = opt.split('=',1)[1] + GenSSHGitolite(gitolite_accounts, gitolite_hosts, OutDir + "ssh-gitolite-%s"%(group,), sshcommand=command, current_host=current_host) if 'WEB-PASSWORDS' in ExtraList: DoLink(global_dir, OutDir, "web-passwords") @@ -1401,7 +1428,7 @@ def mq_notify(options, message): msg = { 'message': message, - timestamp: int(time.time()) + 'timestamp': int(time.time()) } conn = None try: @@ -1420,8 +1447,6 @@ def ud_generate(): help="Output directory.") parser.add_option("-f", "--force", dest="force", action="store_true", help="Force generation, even if no update to LDAP has happened.") - parser.add_option("-m", "--mq", action="store_true", default=False, - help="Send update trigger over MQ") (options, args) = parser.parse_args() if len(args) > 0: @@ -1455,7 +1480,7 @@ def ud_generate(): if need_update or options.force: msg = 'Update forced' if options.force else 'Update needed' generate_all(generate_dir, l) - if options.mq: + if use_mq: mq_notify(options, msg) last_run = int(time.time()) fd.write("%s\n%s\n%s\n" % (ldap_last_mod, unix_last_mod, last_run))