user: More refactoring
This commit is contained in:
parent
0b73e7782c
commit
528df05aea
2 changed files with 89 additions and 111 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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}"
|
||||||
|
|
Loading…
Add table
Reference in a new issue