initial commit

master
Tomek Dubrownik 2013-02-18 03:42:23 +01:00
commit 5c63a83c9a
2 changed files with 55 additions and 0 deletions

5
README Normal file
View File

@ -0,0 +1,5 @@
A script to sync our LDAP and Redmine user bases.
Currently it only makes sure every person in our member groups is in the redmine database.
Have mercy, I really, *really* don't know ruby.

50
sync_users.rb Normal file
View File

@ -0,0 +1,50 @@
ENV['RAILS_ENV'] = 'production'
require '../config/environment.rb'
require 'net/ldap'
require 'test/unit/assertions'
require 'set'
class AuthSourceLdap < AuthSource
# monkey patch because redmine authors didn't think this is needed.
def attrs_for_user(ldap_con, login)
search_filter = base_filter & Net::LDAP::Filter.eq(self.attr_login, login)
ldap_con.search( :base => self.base_dn,
:filter => search_filter,
:attributes=> search_attributes) do |entry|
return get_user_attributes_from_ldap_entry(entry).except(:dn) # nice method name, btw
end
end
end
def ldap_get_logins(ldap, search_base, filter)
Net::LDAP.new.search(:base => search_base, :filter => filter,
:attributes => ["uid"]).collect { |entry| entry.uid.first }
end
search_base = "ou=People,dc=hackerspace,dc=pl"
group_base = "ou=Group,dc=hackerspace,dc=pl"
filter = "(|(memberOf=cn=fatty,#{group_base})(memberOf=cn=starving,#{group_base}))"
ldap = Net::LDAP.new
unregistered = ldap_get_logins(ldap, search_base, filter) - User.pluck(:login)
puts "Missing users:"
puts unregistered
sources = AuthSource.all # sigh
unless sources.size == 1 then
raise RuntimeError.new "More than one AuthSource, bailing"
end
auth_source = sources.first
unregistered.each { |login|
attrs = auth_source.attrs_for_user(ldap, login)
user = User.new(attrs)
user.login = login
user.language = Setting.default_language
if user.save
user.reload
Rails.logger.info("User '#{user.login}' added by sync_users")
end
}