class Seiso::ImportLdap

Imports LDAP person data into Seiso.

Author

Willie Wheeler (wwheeler@expedia.com)

Copyright

Copyright © 2014-2015 Expedia, Inc.

License

Apache 2.0

Constants

ACTIVE_DIRECTORY_ATTRS

Active Directory: msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx

BATCH_SIZE

Public Class Methods

new(ldap_settings, seiso_settings) click to toggle source

Creates a new LDAP importer.

  • ldap_settings: Has the following settings

    • host

    • port

    • username

    • password

    • ldap_base_dn: tree base (for searching)

    • ldap_user_dn: user filter (for searching)

  • seiso_settings

See sample-conf for example configurations.

# File lib/seiso/import_ldap.rb, line 65
def initialize(ldap_settings, seiso_settings)
  @source = ldap_settings['source']

  # LDAP connector
  @ldap = Net::LDAP.new
  @ldap.host = ldap_settings['host']
  @ldap.port = ldap_settings['port']
  @ldap.auth ldap_settings['username'], ldap_settings['password']

  # Seiso connector
  @seiso = Seiso::Connector.new seiso_settings

  # LDAP search params
  @tree_base = ldap_settings['tree_base']
  @person_filter = Net::LDAP::Filter::FilterParser.parse(ldap_settings['person_filter'])
  puts "tree_base=#{@tree_base}"
  puts "person_filter=#{@person_filter}"
end

Public Instance Methods

import_all() click to toggle source
# File lib/seiso/import_ldap.rb, line 92
    def import_all
      if !ldap.bind
        raise Seiso::ImportLdap::AuthenticationFailedError
      end
      
      # TODO Currently we assume Active Directory. Will generalize if/when somebody asks for it.
      attrs = ACTIVE_DIRECTORY_ATTRS

      # Hash so we can resolve managers by distinguished name (DN)
      users = {}
      ldap.search(:base => @tree_base, :filter => @person_filter, :attributes => attrs) do |user|
        dn = single_value(user, "dn")
        users[dn] = user
      end

      # Step #1: Delete stale users
#      seiso_users = seiso.get_keys("people", @source, 0)
#      puts seiso_users
      # TODO
      
      # Step #2: Create users
      people = []
      users.each do |dn, user|
        people << to_seiso_person(user)
      end

      # TODO Page this, and use PATCH instead of PUT to avoid nulling out managers
      seiso.post_items("people", people)
      
      # Step #3: Link managers
      # TODO
    end
ldap() click to toggle source
# File lib/seiso/import_ldap.rb, line 84
def ldap
  @ldap
end
seiso() click to toggle source
# File lib/seiso/import_ldap.rb, line 88
def seiso
  @seiso
end

Private Instance Methods

single_value(user, attr) click to toggle source
# File lib/seiso/import_ldap.rb, line 145
def single_value(user, attr)
  values = user[attr]
  (values.nil? || values.empty?) ? nil : values[0].to_s.force_encoding("UTF-8")
end
to_seiso_person(user) click to toggle source
# File lib/seiso/import_ldap.rb, line 127
def to_seiso_person(user)
  {
    "username" => single_value(user, "sAMAccountName"),
    "firstName" => single_value(user, "givenName"),
    "lastName" => single_value(user, "sn"),
    "title" => single_value(user, "title"),
    "company" => single_value(user, "company"),
    "department" => single_value(user, "department"),
    "division" => single_value(user, "division"),
    "location" => single_value(user, "l"),
    "streetAddress" => single_value(user, "streetAddress"),
    "workPhone" => single_value(user, "telephoneNumber"),
    "email" => single_value(user, "mail"),
    "ldapDn" => single_value(user, "dn"),
    "source" => @source
  }
end