2014-03-26 1:51 GMT+01:00 John Kristensen <[email protected]
>:

>
>
> On 26/03/14 00:29, Clément OUDOT wrote:
>
>>
>>
>>
>> 2014-03-25 11:08 GMT+01:00 John Kristensen
>> <[email protected]
>> <mailto:[email protected]>>:
>>
>>
>>     On 2014-03-25 19:47, Clément OUDOT wrote:
>>
>>         2014-03-25 9:42 GMT+01:00 John Kristensen
>>         <[email protected].__gov.au
>>         <mailto:[email protected]>>:
>>
>>
>>             On 2014-03-25 18:55, Clément OUDOT wrote:
>>             2014-03-25 1:30 GMT+01:00 John Kristensen
>>             <[email protected].__gov.au
>>             <mailto:[email protected]>>:
>>
>>
>>             On 24/03/14 19:02, Clément OUDOT wrote:
>>
>>             2014-03-24 6:24 GMT+01:00 John Kristensen
>>             <[email protected].__gov.au
>>             <mailto:[email protected]>
>>             <mailto:john.kristensen@__dpipwe.tas.gov.au
>>
>>             <mailto:[email protected]>>>:
>>
>>             Hello,
>>
>>             I have the following javascript to translate AD groups into
>>             OpenLDAP
>>             groups:
>>
>>             <dataset>
>>             <name>member</name>
>>             <policy>FORCE</policy>
>>             <forceValues>
>>             <string>
>>             <![CDATA[
>>             var members = new Array();
>>             var query =
>>             '(&(!(objectClass=group))(____memberOf:1.2.840.113556.1.4.__
>> __1941:='
>>
>>             +
>>
>>             srcBean.getDN()+'))';
>>             var member_list = srcLdap.search('', query).toArray();
>>
>>             for ( var i = 0; i < member_list.length; i++ ) {
>>             var uid = srcLdap.attribute(member_list[____i],
>>
>>
>>             'sAMAccountName').get(0);
>>
>>             try {
>>             var user = ldap.list('ou=people', '(uid=' + uid +
>>             ')').get(0);
>>             members.push(user + ',' + ldap.getContextDn());
>>             } catch(e) {
>>             continue;
>>             }
>>             }
>>
>>             // Need to convert to a java array if using OpenJDK
>>             membersJava =
>>             java.lang.reflect.Array.____newInstance(java.lang.String,
>>
>>             members.length);
>>
>>             for ( var i = 0; i < members.length; i++ ) {
>>             membersJava[i] = members[i];
>>             }
>>             membersJava
>>             ]]>
>>             </string>
>>             </forceValues>
>>             </dataset>
>>
>>             But because I am only syncing only a selection of users some
>> of
>>             these groups may not contain members after the javascript
>>             manipulation has been performed, which results in errors like:
>>
>>             ERROR - Error while adding entry cn=Example
>>             Users,ou=groups,dc=example,dc=____com in directory
>>             :javax.naming.directory.____SchemaViolationException: [LDAP:
>>
>>             error
>>
>>             code 65 - object class 'groupOfNames' requires attribute
>>             'member'];
>>             remaining name 'cn=Distributed COM Users,ou=groups'
>>
>>             Is there anyway to skip a group if it would contain no members
>>             instead of generating these errors? There will be potentially
>>             lots
>>             of them and there is a high likelihood that "real" errors
>>             will be
>>             lost in the noise of these "false" errors.
>>
>>             Hi,
>>
>>             I think the best way is to change the LDAP filter used to
>>             get all
>>             groups. Just add in the filter a condition like (!(member=*)),
>>             which
>>             will ignore all entries that did not have any member values.
>>
>>             Clément.
>>
>>           ------------------------------__----------------------------
>> --__------------
>>
>>
>>             Hello Clément,
>>
>>             I am already using a condition that contains (member=*), but
>> the
>>             problem is that the AD groups are not empty - the AD groups
>> may
>>             contain only service accounts - but the 'membersJava' array
>>             that is
>>             generated will be empty - because we are not syncing the AD
>>             service
>>             accounts, which is essentially filtering the AD service
>> accounts
>>             out
>>             of the groups.
>>
>>             If the 'membersJava' array does happen to be empty then the
>>             error
>>             is generated. It would be good if we could "return"
>>             something from
>>             the javascript to indicate the entry should be skipped, or
>>             have an
>>             option that an entry should be skipped if an attribute (ie.
>>             members)
>>             is empty.
>>
>>
>>           You can use a javascript code inside the <condition> markup, for
>>           example in the <update> condition. Return false in this code
>>         to tell
>>           LSC to skip the modification of the entry.
>>
>>           Clément.
>>
>>           Hello Clément,
>>
>>           the <condition> stuff sort of seems to be what I am after, but
>>         how do
>>         I access the generated array (membersJava) for the member
>>         attribute to
>>         see if its length is >0? From the documentation the only thing I
>>         seem
>>         to have access to with <create> is the srcBean, which will just
>>         contain the unfiltered members which isn't much use in this case.
>>
>>         You can access to srcBean in create, update and changeId
>> conditions,
>>         and dstBean in update, changeId and delete conditions.
>>
>>           Clément.
>>
>>
>>     Hello Clément,
>>
>>     Yes, I understand those beans are available but they don't provide
>>     anything useful in this case.
>>
>>     The most common case will be <create> because groups with all it's
>>     members filtered out via javascript will attempt to be created on
>>     each run. The srcBean.getDatasetAsSetById("__member") is not very
>>
>>     useful because it will just contain what is in the source LDAP, and
>>     not the filtered member list which could be empty. So what I need is
>>     some way to access the filtered list ('membersJava' in the script
>>     above) to determine if the entry should be created.
>>
>>     The other thought I had was just to duplicate most of the script in
>>     the <condition> section, but 'srcLdap' and 'ldap' don't seem to be
>>     available, so that is not really an option either.
>>
>>     Any other thoughts?
>>
>>
>>
>> In your javascript, why can't you test the size of the membersJava array
>> ? If it is empty, you just have to return dstBean member attributes, and
>> in this case, LSC will see that "src" and "dst" values are the same and
>> will not update anything. You also can try the MERGE policy to merge
>> values from src and dst.
>>
>>
>> Clément.
>>
>>
> Hello Clément,
>
> The dstBean won't exist for a create because the the group (groupOfNames)
> doesn't exist, LSC is seeing that the group doesn't exist so is attempting
> to create a new group with no member attributes. There are no member
> attributes because in some cases there are no valid members (the invalid
> ones have been filtered out using javascript) which then results in an
> error and the group is not being created. The next time LSC runs this
> entire process repeats.
>
> Something similar would happen with an update that should actually delete
> an entry. The dstBean may have one or more members, but if the source is
> changed to contain no valid members (ie. all members would be filtered out
> by javascript) then LSC will attempt to update the dstBean with no member
> attributes which again would result in an error. If I were to check the
> length of membersJava and return the dstBean member attributes then there
> wouldn't be an error, but the groups would be inconsistent between the
> source and destination.
>
> It is starting to sound like LSC can't handle the use case I am throwing
> at it.
>



Hi,

you can maybe give a look to the Executable plugin and LSC 2.1 (we released
a RC some days ago) :
http://lsc-project.org/wiki/documentation/plugins/executable

This plugin allow you to call scripts for each operation (create, update,
etc.) and so you wouldbe able to program the behavior you want.

Clément.
_______________________________________________________________
Ldap Synchronization Connector (LSC) - http://lsc-project.org

lsc-users mailing list
[email protected]
http://lists.lsc-project.org/listinfo/lsc-users

Reply via email to