|
NAMERT::Extension::LDAPImport - Import Users from an LDAP storeSYNOPSISIn "RT_SiteConfig.pm":Set($LDAPHost,'my.ldap.host') Set($LDAPUser,'me'); Set($LDAPPassword,'mypass'); Set($LDAPFilter, '(&(cn = users))'); Set($LDAPMapping, {Name => 'uid', # required EmailAddress => 'mail', RealName => 'cn', WorkPhone => 'telephoneNumber', Organization => 'departmentName'}); # Add to any existing plugins Set(@Plugins, qw(RT::Extension::LDAPImport)); # If you want to sync Groups from LDAP into RT Set($LDAPGroupBase, 'ou=Groups,o=Our Place'); Set($LDAPGroupFilter, '(&(cn = Groups))'); Set($LDAPGroupMapping, {Name => 'cn', Member_Attr => 'member', Member_Attr_Value => 'dn' }); Running the import: # Run a test import /opt/rt4/local/plugins/RT-Extension-LDAPImport/bin/rtldapimport \ --debug > ldapimport.debug 2>&1 # Run for real, possibly put in cron /opt/rt4/local/plugins/RT-Extension-LDAPImport/bin/rtldapimport \ --import INSTALLATION
CONFIGURATIONAll of the configuration for the importer goes your "RT_SiteConfig.pm" file. Some of these values pass through to Net::LDAP so you can check there for valid values and more advanced options.
The keys in the mapping (i.e. the RT fields, the left hand side) may be a user custom field name prefixed with "UserCF.", for example 'UserCF.Employee Number' => 'employeeId'. Note that this only adds values at the moment, which on single value CFs will remove any old value first. Multiple value CFs may behave not quite how you expect. If the attribute no longer exists on a user in LDAP, it will be cleared on the RT side as well. You may also prefix any RT custom field name with "CF." inside your mapping to add available values to a Select custom field. This effectively takes user attributes in LDAP and adds the values as selectable options in a CF. It does not set a CF value on any RT object (User, Ticket, Queue, etc). You might use this to populate a ticket Location CF with all the locations of your users so that tickets can be associated with the locations in use.
Mapping Groups Between RT and LDAPIf you are using the importer, you likely want to manage access via LDAP by putting people in groups like 'DBAs' and 'IT Support', but also have groups for other non-RT related things. In this case, you won't want to create all of your LDAP groups in RT. To limit the groups that get mirrored, construct your $LDAPGroupFilter as an OR (|) with all of the RT groups you want to mirror from LDAP. For example:Set($LDAPGroupBase, 'OU=Groups,OU=Company,DC=COM'); Set($LDAPGroupFilter, '(|(CN=DBAs)(CN=IT Support))'); The importer will then import only the groups that match. In this case, import means:
The import script will also issue a warning if a user isn't found in RT, but this should only happen when testing. When running with --import on, users are created before groups are processed, so all users (group members) should exist unless there are inconsistencies in your LDAP configuration. Running the ImportExecuting "rtldapimport" will run a test that connects to your LDAP server and prints out a list of the users found. To see more about these users, and to see more general debug information, include the "--debug" flag.That debug information is also sent to the RT log with the debug level. Errors are logged to the screen and to the RT log. Executing "rtldapimport" with the "--import" flag will cause it to import users into your RT database. It is recommended that you make a database backup before doing this. If your filters aren't set properly this could create a lot of users or groups in your RT instance. RT VersionsThe importer works with RT 4.0 and above.LDAP FiltersThe ldapsearch <http://www.openldap.org/software/man.cgi?query=ldapsearch&manpath=OpenLDAP+2.0-Release> utility in openldap can be very helpful while refining your filters.DevelopingIf you want to run tests for this extension, you should create the inc/.author directory and will need to set RT_DBA_USER and RT_DBA_PASSWORD environment variables to a database user that can create/drop tests databases as needed.Do not run tests in a production environment. METHODSconnect_ldapRelies on the config variables $RT::LDAPHost, $RT::LDAPUser and $RT::LDAPPassword being set in your RT Config files.Set($LDAPHost,'my.ldap.host') Set($LDAPUSER,'me'); Set($LDAPPassword,'mypass'); LDAPUser and LDAPPassword can be blank, which will cause an anonymous bind. LDAPHost can be a hostname or an ldap:// ldaps:// uri. run_user_searchSet up the appropriate arguments for a listing of users._run_searchExecutes a search using the provided base and filter.Will connect to LDAP server using "connect_ldap". Returns an array of Net::LDAP::Entry objects, possibly consolidated from multiple LDAP pages. import_users import => 1|0Takes the results of the search from run_search and maps attributes from LDAP into "RT::User" attributes using $RT::LDAPMapping. Creates RT users if they don't already exist.With no arguments, only prints debugging information. Pass "--import" to actually change data. $RT::LDAPMapping> should be set in your "RT_SiteConfig.pm" file and look like this. Set($LDAPMapping, { RTUserField => LDAPField, RTUserField => LDAPField }); RTUserField is the name of a field on an "RT::User" object LDAPField can be a simple scalar and that attribute will be looked up in LDAP. It can also be an arrayref, in which case each of the elements will be evaluated in turn. Scalars will be looked up in LDAP and concatenated together with a single space. If the value is a sub reference, it will be executed. The sub should return a scalar, which will be examined. If it is a scalar, the value will be looked up in LDAP. If it is an arrayref, the values will be concatenated together with a single space. By default users are created as Unprivileged, but you can change this by setting $LDAPCreatePrivileged to 1. _import_userWe have found a user to attempt to import; returns the RT::User object if it was found (or created), "undef" if not._cache_user ldap_entry => Net::LDAP::Entry, [user => { ... }]Adds the user to a global cache which is used when importing groups later.Optionally takes a second argument which is a user data object returned by _build_user_object. If not given, _cache_user will call _build_user_object itself. Returns the user Name. _check_ldap_mappingReturns true is there is an "LDAPMapping" configured, returns false, logs an error and disconnects from ldap if there is no mapping._build_user_objectUtility method which wraps "_build_object" to provide sane defaults for building users. It also tries to ensure a Name exists in the returned object._build_objectInternal method - a wrapper around "_parse_ldap_mapping" that flattens results turning every value into a scalar.The following: [ [$first_value1, ... ], [$first_value2], $scalar_value, ] Turns into: "$first_value1 $first_value2 $scalar_value" Arguments are just passed into "_parse_ldap_mapping". _parse_ldap_mapping Internal helper method that maps an LDAP entry to a hash according to passed arguments. Takes named arguments:
Returns hash reference with results, each value is an array with elements either scalars or arrays as described above. create_rt_userTakes a hashref of args to pass to "RT::User::Create" Will try loading the user and will only create a new user if it can't find an existing user with the "Name" or "EmailAddress" arg passed in.If the $LDAPUpdateUsers variable is true, data in RT will be clobbered with data in LDAP. Otherwise we will skip to the next user. If $LDAPUpdateOnly is true, we will not create new users but we will update existing ones. add_user_to_groupAdds new users to the group specified in the $LDAPGroupName variable (defaults to 'Imported from LDAP'). You can avoid this if you set $LDAPSkipAutogeneratedGroup.setup_groupPulls the $LDAPGroupName object out of the DB or creates it if we need to do so.add_custom_field_value Adds values to a Select (one|many) Custom Field. The Custom Field should already exist, otherwise this will throw an error and not import any data. This could probably use some caching. update_object_custom_field_values Adds CF values to an object (currently only users). The Custom Field should already exist, otherwise this will throw an error and not import any data. Note that this code only adds values at the moment, which on single value CFs will remove any old value first. Multiple value CFs may behave not quite how you expect. import_groups import => 1|0Takes the results of the search from "run_group_search" and maps attributes from LDAP into "RT::Group" attributes using $RT::LDAPGroupMapping.Creates groups if they don't exist. Removes users from groups if they have been removed from the group on LDAP. With no arguments, only prints debugging information. Pass "--import" to actually change data. run_group_search Set up the appropriate arguments for a listing of users. _import_groupThe user has run us with "--import", so bring data in.create_rt_groupTakes a hashref of args to pass to "RT::Group::Create" Will try loading the group and will only create a new group if it can't find an existing group with the "Name" or "EmailAddress" arg passed in.If $LDAPUpdateOnly is true, we will not create new groups but we will update existing ones. There is currently no way to prevent Group data from being clobbered from LDAP. find_rt_group Loads groups by Name and by the specified LDAP id. Attempts to resolve renames and other out-of-sync failures between RT and LDAP. find_rt_group_by_ldap_id Loads an RT::Group by the ldap provided id (different from RT's internal group id) add_group_members Iterate over the list of values in the "Member_Attr" LDAP entry. Look up the appropriate username from LDAP. Add those users to the group. Remove members of the RT Group who are no longer members of the LDAP group. _show_groupShow debugging information about the group record we're going to import when the groups reruns us with "--import".disconnect_ldap Disconnects from the LDAP server. Takes no arguments, returns nothing. Utility FunctionsscreendebugWe always log to the RT log file with level 'debug'. This duplicates the messages to the screen. AUTHORBest Practical Solutions, LLC <modules@bestpractical.com>BUGSAll bugs should be reported via email toL<bug-RT-Extension-LDAPImport@rt.cpan.org|mailto:bug-RT-Extension-LDAPImport@rt.cpan.org> or via the web at L<rt.cpan.org|http://rt.cpan.org/Public/Dist/Display.html?Name=RT-Extension-LDAPImport>. LICENSE AND COPYRIGHTThis software is Copyright (c) 2007-2014 by Best Practical Solutions, LLCThis is free software, licensed under: The GNU General Public License, Version 2, June 1991
Visit the GSP FreeBSD Man Page Interface. |