Ruby/LDAP を使う。Ruby/LDAP
- People からユーザとそのメイングループ番号を gidNumber から取得する。
- 各ユーザーのメイングループの cn を取得する。
- グループを全て走査して、所属するユーザーにマップをグループに追加する。
- 「user:group1,group2」という形式で書き出す。
#!/usr/bin/env ruby
require 'ldap'
people = Hash.new
LDAP::SSLConn.new("ldap.company.com") do |conn|
conn.set_option(LDAP::LDAP_OPT_PROTOCOL_VERSION,3)
bind_conn = conn.bind(バインドユーザのDN, バインドユーザのパスワード)
bind_conn.search2("ou=People,dc=company,dc=com",
LDAP::LDAP_SCOPE_SUBTREE,
"uidNumber=*", ['uid', 'gidNumber']) { |entry|
uid = entry['uid'].first
gid = entry['gidNumber'].first
people.store(uid, gid)
}
people.each do |k, v|
bind_conn.search2("ou=Group,dc=company,dc=com",
LDAP::LDAP_SCOPE_SUBTREE,
"gidNumber=#{v}", ['cn']) { |entry|
cn = entry['cn'].first
people.store(k, [cn])
}
end
groups = Array.new
bind_conn.search2("ou=Group,dc=company,dc=com",
LDAP::LDAP_SCOPE_SUBTREE,
"gidNumber=*", ['dn']) { |entry|
entry['dn'].each { |e|
groups.push e
}
}
groups.each do |group|
bind_conn.search2(group,
LDAP::LDAP_SCOPE_SUBTREE,
"(objectClass=*)", ['cn', 'memberUid']) { |entry|
cn = entry['cn'].first
uids = entry['memberUid']
next if uids.nil?
uids = [uids] unless uids.is_a?(Array)
uids.each { |uid|
if people.key? uid
people[uid].push(cn)
end
}
}
end
end
people.each do |uid, groups|
print "#{uid}:"
puts groups.join(",")
end