user: More refactoring

This commit is contained in:
Ossi Salmi 2013-08-03 21:46:14 +03:00
parent 0b73e7782c
commit 528df05aea
2 changed files with 89 additions and 111 deletions

View file

@ -1,23 +1,22 @@
require 'set' require "set"
require 'uri' require "uri"
require 'ldap' require "ldap"
basedn = '' conn = nil
conn = '' basedn = nil
File.readlines('/etc/openldap/ldap.conf').each do |line| File.readlines("/etc/openldap/ldap.conf").each do |line|
line = line.strip line = line.strip
next if line.empty? next if line.empty? or line.start_with?("#")
next if line.start_with?('#')
line = line.split line = line.split
if line[0] == 'BASE' if line[0] == "BASE"
basedn = line[1] basedn = line[1]
elsif line[0] == 'URI' elsif line[0] == "URI"
line.shift line.shift
line.each do |uri| line.each do |uri|
uri = URI.parse(uri) uri = URI.parse(uri)
begin begin
if uri.scheme == 'ldaps' if uri.scheme == "ldaps"
uri.port = 636 unless uri.port uri.port = 636 unless uri.port
conn = LDAP::SSLConn.new(uri.host, uri.port) conn = LDAP::SSLConn.new(uri.host, uri.port)
else else
@ -33,53 +32,49 @@ File.readlines('/etc/openldap/ldap.conf').each do |line|
end end
end end
groups = {}
user_pp = [] user_pp = []
group_pp = [] group_pp = []
groups = {} filter = "objectClass=posixAccount"
attrib = %w(uid gidNumber)
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, attrib) do |entry|
uid = entry["uid"].first
next if uid.include?("$") # skip samba machine accounts
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE,
'objectClass=posixAccount', ['uid', 'gidNumber']) do |entry|
dn = entry.get_dn dn = entry.get_dn
uid = entry['uid'][0] gidnumber = entry["gidNumber"].first
# skip samba machine accounts
next if uid.include?('?')
gids = Set.new gids = Set.new
# find primary group # find primary group
filter = '(&(objectClass=posixGroup)(gidNumber=%s))' % entry['gidNumber'][0] filter = "(&(objectClass=posixGroup)(gidNumber=#{gidnumber}))"
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ['cn']) do |group| conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ["cn"]) do |group|
gid = group['cn'][0] gid = group["cn"].first
gids << gid gids << gid
groups[gid] = Set.new unless groups.has_key?(gid) groups[gid] = Set.new unless groups.has_key?(gid)
groups[gid] << uid groups[gid] << uid
end end
# find supplementary groups # find supplementary groups
filter = '(&(objectClass=posixGroup)(|(uniqueMember=%s)(memberUid=%s)))' % [ dn, uid ] filter = "(&(objectClass=posixGroup)(|(uniqueMember=#{dn})(memberUid=#{uid})))"
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ['cn']) do |group| conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ["cn"]) do |group|
gid = group['cn'][0] gid = group["cn"].first
gids << gid gids << gid
groups[gid] = Set.new unless groups.has_key?(gid) groups[gid] = Set.new unless groups.has_key?(gid)
groups[gid] << uid groups[gid] << uid
end end
user_pp << "class user::user::%s inherits user::virtual {\n\n" % uid user_pp << "class user::user::#{uid} inherits user::virtual {\n\n"
user_pp << " realize(User::Add[\"%s\"])\n" % uid user_pp << " realize(User::Add[\"#{uid}\"])\n"
gids.sort.each do |gid| gids.sort.each { |gid| user_pp << " realize(Group[\"#{gid}\"])\n" }
user_pp << " realize(Group[\"%s\"])\n" % gid
end
user_pp << "\n}\n\n" user_pp << "\n}\n\n"
end end
groups.each do |gid, uids| groups.each do |gid, uids|
next if uids.length == 1 and uids.include?(gid) next if uids.length == 1 and uids.include?(gid)
group_pp << "class user::group::%s {\n\n" % gid group_pp << "class user::group::%s {\n\n" % gid
uids.sort.each do |uid| uids.sort.each { |uid| group_pp << " include user::user::#{uid}\n" }
group_pp << " include user::user::%s\n" % uid
end
group_pp << "\n}\n\n" group_pp << "\n}\n\n"
end end

View file

@ -1,23 +1,22 @@
require 'set' require "set"
require 'uri' require "uri"
require 'ldap' require "ldap"
basedn = '' conn = nil
conn = '' basedn = nil
File.readlines('/etc/openldap/ldap.conf').each do |line| File.readlines("/etc/openldap/ldap.conf").each do |line|
line = line.strip line = line.strip
next if line.empty? next if line.empty? or line.start_with?("#")
next if line.start_with?('#')
line = line.split line = line.split
if line[0] == 'BASE' if line[0] == "BASE"
basedn = line[1] basedn = line[1]
elsif line[0] == 'URI' elsif line[0] == "URI"
line.shift line.shift
line.each do |uri| line.each do |uri|
uri = URI.parse(uri) uri = URI.parse(uri)
begin begin
if uri.scheme == 'ldaps' if uri.scheme == "ldaps"
uri.port = 636 unless uri.port uri.port = 636 unless uri.port
conn = LDAP::SSLConn.new(uri.host, uri.port) conn = LDAP::SSLConn.new(uri.host, uri.port)
else else
@ -33,89 +32,73 @@ File.readlines('/etc/openldap/ldap.conf').each do |line|
end end
end end
print "class user::virtual {\n" virtual = "class user::virtual {\n"
filter = 'objectClass=posixAccount' filter = "objectClass=posixAccount"
attrs = [ attrib = %w(uid uidNumber gidNumber gecos homeDirectory loginShell)
'uid', conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, attrib) do |entry|
'uidNumber',
'gidNumber',
'gecos',
'homeDirectory',
'loginShell',
]
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, attrs) do |entry|
dn = entry.get_dn dn = entry.get_dn
uid = entry['uid'][0] uid = entry["uid"].first
uidnumber=entry['uidNumber'][0] uidnumber = entry["uidNumber"].first
gidnumber=entry['gidNumber'][0] gidnumber = entry["gidNumber"].first
primarygroup = nil primarygroup = nil
groups = Set.new groups = Set.new
filter = '(&(objectClass=posixGroup)(gidNumber=%s))' % gidnumber filter = "(&(objectClass=posixGroup)(gidNumber=#{gidnumber}))"
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ['cn']) do |group| conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ["cn"]) do |group|
primarygroup = group['cn'][0] primarygroup = group["cn"].first
end end
continue if primarygroup.nil? continue if primarygroup.nil?
filter = '(&(objectClass=posixGroup)(|(uniqueMember=%s)(memberUid=%s)))' % [ dn, uid ] filter = "(&(objectClass=posixGroup)(|(uniqueMember=#{dn})(memberUid=#{uid})))"
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ['cn']) do |group| conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, ["cn"]) do |group|
groups << group['cn'][0] groups << group["cn"].first
end end
print "\n" comment = entry["gecos"] ? entry["gecos"].first : entry["uid"].first
print " @user::add { \"%s\":\n" % uid shell = entry["loginShell"] ? entry["loginShell"].first : "/bin/bash"
print " uid => \"%s\",\n" % uidnumber home = entry["homeDirectory"].first
print " gid => \"%s\",\n" % gidnumber
begin virtual << <<-EOF
print " comment => \"%s\",\n" % entry['gecos'][0]
rescue @user::add { "#{uid}":
print " comment => \"%s\",\n" % entry['uid'][0] uid => "#{uidnumber}",
end gid => "#{gidnumber}",
print " home => \"%s\",\n" % entry['homeDirectory'][0] comment => "#{comment}",
begin home => "#{home}",
print " shell => \"%s\",\n" % entry['loginShell'][0] shell => "#{shell}",
rescue EOF
print " shell => \"%s\",\n" % "/bin/bash"
end
unless groups.empty? unless groups.empty?
print " groups => $::operatingsystem ? {\n" virtual << " groups => $::operatingsystem ? {\n"
print " \"openbsd\" => [ " virtual << " \"openbsd\" => [ "
groups.each do |group| groups.each { |group| virtual << "\"#{group}\", " }
print "\"%s\", " % group virtual << "\"wheel\", " if groups.include?("sysadm")
virtual << "},\n default => [ "
groups.each { |group| virtual << "\"#{group}\", " }
virtual << "],\n },\n"
end end
print "\"wheel\", " if groups.include?('sysadm') virtual << " require => [\n"
print "],\n" virtual << " Group[\"#{primarygroup}\"],\n"
print " default => [ " groups.each { |group| virtual << " Group[\"#{group}\"],\n" }
groups.each do |group| virtual << " ],\n }\n"
print "\"%s\", " % group
end
print "],\n },\n"
end
print " require => [\n"
print " Group[\"%s\"],\n" % primarygroup
groups.each do |group|
print " Group[\"%s\"],\n" % group
end
print " ],\n"
print " }\n"
end end
filter = 'objectClass=posixGroup' filter = "objectClass=posixGroup"
attrs = [ attrib = %w(cn gidNumber memberUid uniqueMember)
'cn', conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, attrib) do |entry|
'gidNumber', cn = entry["cn"].first
'memberUid', gid = entry["gidNumber"].first
'uniqueMember',
] virtual << <<-EOF
conn.search(basedn, LDAP::LDAP_SCOPE_SUBTREE, filter, attrs) do |entry|
print "\n" @group { "#{cn}":
print " @group { \"%s\":\n" % entry['cn'][0] ensure => present,
print " ensure => present,\n" gid => "#{gid}",
print " gid => %s,\n" % entry['gidNumber'][0] }
print " }\n" EOF
end end
print "\n}\n" puts virtual, "\n}"