Hi,

I'm making a first attempt to synchronize group membership from our
openldap server to our active directory server. Groups are created
correctly, but unfortunately I'm receiving some errors while syncing
the group membership. Here's the config I'm using right now:

<lsc xmlns="http://lsc-project.org/XSD/lsc-core-2.1.xsd"; revision="0">
  <connections>
    <!-- Connection to Active Directory. -->
    <ldapConnection>
      <name>AD</name>
      <url>ldaps://addc.adds.example.com:636/dc=example,dc=com</url>
      <username>cn=Administrator,cn=Users,dc=adds,dc=example,dc=com</username>
      <password>REDACTED</password>
      <authentication>SIMPLE</authentication>
      <pageSize>1000</pageSize>
    </ldapConnection>
    <!-- Connection to OpenLDAP. -->
    <ldapConnection>
      <name>openldap</name>
      <url>ldaps://ldap.intranet.example.com:636/dc=example,dc=com</url>
      <username>cn=admin,dc=example,dc=com</username>
      <password>REDACTED</password>
      <authentication>SIMPLE</authentication>
      <pageSize>1000</pageSize>
    </ldapConnection>
  </connections>
  <!-- Tasks configuration. -->
  <tasks>
    <!-- Task for synchronize users from OpenLDAP to Active Directory. -->
    <task>
      <name>SyncPeople</name>
      <bean>org.lsc.beans.SimpleBean</bean>
      <!-- LDAP source service. -->
      <ldapSourceService>
        <name>openldap-source-service</name>
        <connection reference="openldap" />
        <baseDn>ou=People,dc=example,dc=com</baseDn>
        <pivotAttributes>
          <string>uid</string>
        </pivotAttributes>
        <fetchedAttributes>
          <string>cn</string>
          <string>description</string>
          <string>givenName</string>
          <string>mail</string>
          <string>sn</string>
          <string>uid</string>
          <string>userpassword</string>
          <string>homePhone</string>
          <string>randomstuff</string>
        </fetchedAttributes>
        <getAllFilter><![CDATA[(objectClass=inetOrgPerson)]]></getAllFilter>
        
<getOneFilter><![CDATA[(&(objectClass=inetOrgPerson)(uid={uid}))]]></getOneFilter>
        
<cleanFilter><![CDATA[(&(objectClass=inetOrgPerson)(uid={sAMAccountName}))]]></cleanFilter>
      </ldapSourceService>
      <!-- LDAP destination service. -->
      <ldapDestinationService>
        <name>ad-dst-service</name>
        <connection reference="AD" />
        <baseDn>ou=People,dc=adds,dc=example,dc=com</baseDn>
        <pivotAttributes>
          <string>sAMAccountName</string>
        </pivotAttributes>
        <fetchedAttributes>
          <string>objectclass</string>
          <string>cn</string>
          <string>description</string>
          <string>givenName</string>
          <string>mail</string>
          <string>pwdLastSet</string>
          <string>sAMAccountName</string>
          <string>sn</string>
          <string>unicodePwd</string>
          <string>userAccountControl</string>
          <string>userPrincipalName</string>
          <string>homePhone</string>
        </fetchedAttributes>
        <getAllFilter><![CDATA[(objectClass=user)]]></getAllFilter>
        
<getOneFilter><![CDATA[(&(objectClass=user)(sAMAccountName={uid}))]]></getOneFilter>
      </ldapDestinationService>
      <!-- Synchronization rules. -->
      <propertiesBasedSyncOptions>
        <mainIdentifier>js:"cn=" +
srcBean.getDatasetFirstValueById("cn") + ",ou=" + getOu(srcBean.DN) +
",dc=adds,dc=example,dc=com"</mainIdentifier>
        <defaultDelimiter>;</defaultDelimiter>
        <defaultPolicy>FORCE</defaultPolicy>
        <conditions>
          <create>true</create>
          <update>true</update>
          <delete>true</delete>
          <changeId>true</changeId>
        </conditions>
        <!-- objectClass = user/organizationalPerson/person/top -->
        <dataset>
          <name>objectClass</name>
          <policy>KEEP</policy>
          <createValues>
            <string>"user"</string>
            <string>"organizationalPerson"</string>
            <string>"person"</string>
            <string>"top"</string>
          </createValues>
          <delimiter>,</delimiter>
        </dataset>
        <!-- sAMAccountName = uid -->
        <dataset>
          <name>sAMAccountName</name>
          <policy>KEEP</policy>
          <createValues>
            <string>srcBean.getDatasetFirstValueById("uid")</string>
          </createValues>
        </dataset>
        <!-- userPrincipalName = uid + "@domainName.org" -->
        <dataset>
          <name>userPrincipalName</name>
          <policy>FORCE</policy>
          <forceValues>
            <string>srcBean.getDatasetFirstValueById("uid") +
"@example.com"</string>
          </forceValues>
        </dataset>
        <!-- Configuring account like normal and non admin. -->
        <dataset>
          <name>userAccountControl</name>
          <policy>KEEP</policy>
          <createValues>
            <string>AD.userAccountControlSet( "0", [
AD.UAC_SET_PASSWD_NOTREQD,AD.UAC_SET_NORMAL_ACCOUNT ])</string>
          </createValues>
        </dataset>
        <!-- pwdLastSet = -1; no require to user for changing password
on next logon. -->
        <dataset>
          <name>pwdLastSet</name>
          <policy>KEEP</policy>
          <createValues>
            <string>"0"</string>
          </createValues>
        </dataset>
        <dataset>
          <name>unicodePwd</name>
          <policy>KEEP</policy>
          <createValues>
            
<string>AD.getUnicodePwd(srcBean.getDatasetFirstValueById("userpassword"))</string>
          </createValues>
        </dataset>
      </propertiesBasedSyncOptions>
      <scriptInclude>
        <string>../scripts/getOu.js</string>
      </scriptInclude>
    </task>
    <!-- Task for synchronize groups from OpenLDAP to Active Directory. -->

    <task>
      <name>group</name>
      <bean>org.lsc.beans.SimpleBean</bean>
      <asyncLdapSourceService>
        <name>group-source-service</name>
        <connection reference="openldap" />
        <baseDn>ou=Group,dc=example,dc=com</baseDn>
        <pivotAttributes>
          <string>cn</string>
        </pivotAttributes>
        <fetchedAttributes>
          <string>cn</string>
          <string>description</string>
          <string>memberUid</string>
        </fetchedAttributes>
        <getAllFilter><![CDATA[(objectClass=posixGroup)]]></getAllFilter>
        
<getOneFilter><![CDATA[(&(objectClass=posixGroup)(cn={cn}))]]></getOneFilter>
        
<cleanFilter><![CDATA[(&(objectClass=posixGroup)(cn={cn}))]]></cleanFilter>
        <serverType>OpenLDAP</serverType>
      </asyncLdapSourceService>
      <ldapDestinationService>
        <name>group-dst-service</name>
        <connection reference="AD" />
        <baseDn>OU=Group,DC=adds,DC=example,DC=com</baseDn>
        <pivotAttributes>
          <string>cn</string>
        </pivotAttributes>
        <fetchedAttributes>
          <string>cn</string>
          <string>description</string>
          <string>member</string>
          <string>objectClass</string>
        </fetchedAttributes>
        <getAllFilter><![CDATA[(objectClass=group)]]></getAllFilter>
        <getOneFilter><![CDATA[(&(objectClass=group)(cn={cn}))]]></getOneFilter>
      </ldapDestinationService>
      <propertiesBasedSyncOptions>
        <mainIdentifier>js:"cn=" +
javax.naming.ldap.Rdn.escapeValue(srcBean.getDatasetFirstValueById("cn"))
+ ",OU=Group,DC=adds,DC=example,DC=com"</mainIdentifier>
        <defaultDelimiter>;</defaultDelimiter>
        <defaultPolicy>FORCE</defaultPolicy>
        <conditions>
          <create>true</create>
          <update>true</update>
          <delete>true</delete>
          <changeId>true</changeId>
        </conditions>
        <dataset>
          <name>objectclass</name>
          <policy>KEEP</policy>
          <createValues>
            <string>"group"</string>
            <string>"top"</string>
          </createValues>
        </dataset>
        <dataset>
          <name>member</name>
          <policy>FORCE</policy>
          <forceValues>
            <string>
<![CDATA[
              rdjs:

                var membersSrcDn = srcBean.getDatasetValuesById("memberUid");
                var membersDstDn = [];

                for  (var i=0; i<membersSrcDn.size(); i++) {
                  var memberSrcDn = membersSrcDn.get(i);
                  var uid = "";
                  try {
                    uid = srcLdap.attribute(memberSrcDn, "uid").get(0);
                  } catch(e) {
                    continue;
                  }
                  var destDn = ldap.search("ou=People",
"(sAMAccountName=" + uid + ")");
                  if (destDn.size() == 0 || destDn.size() > 1) {
                    continue;
                  }
                  var destMemberDn = destDn.get(0) + "," +  ldap.getContextDn();
                  membersDstDn.push(destMemberDn);
                }
                membersDstDn
             ]]>
            </string>
          </forceValues>
        </dataset>
      </propertiesBasedSyncOptions>
    </task>
  </tasks>
</lsc>


This is the error I'm receiving:
Jun 07 15:43:40 - ERROR - All entries: 69, to modify entries: 1,
successfully modified entries: 0, errors: 1
Jun 07 15:43:40 - INFO  - Starting clean for SyncPeople
Jun 07 15:43:40 - DEBUG - Using pagedResults control for 1000 entries at a time
Jun 07 15:43:41 - INFO  - All entries: 68, to modify entries: 0,
successfully modified entries: 0, errors: 0
Jun 07 15:43:41 - INFO  - Starting sync for group
Jun 07 15:43:41 - DEBUG - In object
"CN=vpn-smp-production,OU=Group,DC=adds,DC=example,DC=com":  List of
attributes considered for writing in destination: [member, cn,
description, objectClass]
Jun 07 15:43:41 - DEBUG - In object
"CN=vpn-smp-production,OU=Group,DC=adds,DC=example,DC=com":  Attribute
"member" is in FORCE status
Jun 07 15:43:41 - ERROR - Programmatic error
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at org.lsc.jndi.ScriptableObject.wrap(ScriptableObject.java:92)
[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.ScriptableObject.wrapString(ScriptableObject.java:155)
[lsc-core-2.1.3.jar:na]
at 
org.lsc.jndi.ScriptableJndiServices.attribute(ScriptableJndiServices.java:211)
[lsc-core-2.1.3.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at sun.org.mozilla.javascript.internal.MemberBox.invoke(MemberBox.java:167)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.NativeJavaMethod.call(NativeJavaMethod.java:245)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.Interpreter.interpretLoop(Interpreter.java:1706)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.Interpreter.interpret(Interpreter.java:849)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.InterpretedFunction.call(InterpretedFunction.java:162)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:430)
[na:1.7.0_67]
at 
com.sun.script.javascript.RhinoScriptEngine$1.superDoTopCall(RhinoScriptEngine.java:116)
[na:1.7.0_67]
at 
com.sun.script.javascript.RhinoScriptEngine$1.doTopCall(RhinoScriptEngine.java:109)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:3160)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.InterpretedFunction.exec(InterpretedFunction.java:173)
[na:1.7.0_67]
at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1169)
[na:1.7.0_67]
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214)
[na:1.7.0_67]
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:240)
[na:1.7.0_67]
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
[na:1.7.0_67]
at org.lsc.utils.JScriptEvaluator.instanceEval(JScriptEvaluator.java:222)
[lsc-core-2.1.3.jar:na]
at org.lsc.utils.JScriptEvaluator.evalToStringList(JScriptEvaluator.java:119)
[lsc-core-2.1.3.jar:na]
at 
org.lsc.utils.ScriptingEvaluator.evalToStringList(ScriptingEvaluator.java:136)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.getValuesToSet(BeanComparator.java:602)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.getUpdatedObject(BeanComparator.java:284)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.calculateModifications(BeanComparator.java:176)
[lsc-core-2.1.3.jar:na]
at org.lsc.SynchronizeTask.run(AbstractSynchronize.java:773)
[lsc-core-2.1.3.jar:na]
at org.lsc.SynchronizeTask.run(AbstractSynchronize.java:707)
[lsc-core-2.1.3.jar:na]
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[na:1.7.0_67]
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[na:1.7.0_67]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
Caused by: java.lang.RuntimeException:
org.apache.directory.api.ldap.model.exception.LdapInvalidDnException:
ERR_04202 A value is missing on some RDN
at org.lsc.jndi.JndiServices.rewriteBase(JndiServices.java:659)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.JndiServices.doReadEntry(JndiServices.java:691)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.JndiServices.readEntry(JndiServices.java:666)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.ScriptableJndiServices._attr(ScriptableJndiServices.java:218)
[lsc-core-2.1.3.jar:na]
... 36 common frames omitted
Caused by: org.apache.directory.api.ldap.model.exception.LdapInvalidDnException:
ERR_04202 A value is missing on some RDN
at org.apache.directory.api.ldap.model.name.Dn.<init>(Dn.java:279)
~[api-all-1.0.0-M22.jar:1.0.0-M22]
at org.apache.directory.api.ldap.model.name.Dn.<init>(Dn.java:211)
~[api-all-1.0.0-M22.jar:1.0.0-M22]
at org.lsc.jndi.JndiServices.rewriteBase(JndiServices.java:647)
~[lsc-core-2.1.3.jar:na]
... 39 common frames omitted
Jun 07 15:43:41 - ERROR - Programmatic error
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at org.lsc.jndi.ScriptableObject.wrap(ScriptableObject.java:92)
[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.ScriptableObject.wrapString(ScriptableObject.java:155)
[lsc-core-2.1.3.jar:na]
at 
org.lsc.jndi.ScriptableJndiServices.attribute(ScriptableJndiServices.java:211)
[lsc-core-2.1.3.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.7.0_67]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
~[na:1.7.0_67]
at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
~[na:1.7.0_67]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_67]
at sun.org.mozilla.javascript.internal.MemberBox.invoke(MemberBox.java:167)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.NativeJavaMethod.call(NativeJavaMethod.java:245)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.Interpreter.interpretLoop(Interpreter.java:1706)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.Interpreter.interpret(Interpreter.java:849)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.InterpretedFunction.call(InterpretedFunction.java:162)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:430)
[na:1.7.0_67]
at 
com.sun.script.javascript.RhinoScriptEngine$1.superDoTopCall(RhinoScriptEngine.java:116)
[na:1.7.0_67]
at 
com.sun.script.javascript.RhinoScriptEngine$1.doTopCall(RhinoScriptEngine.java:109)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:3160)
[na:1.7.0_67]
at 
sun.org.mozilla.javascript.internal.InterpretedFunction.exec(InterpretedFunction.java:173)
[na:1.7.0_67]
at sun.org.mozilla.javascript.internal.Context.evaluateReader(Context.java:1169)
[na:1.7.0_67]
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:214)
[na:1.7.0_67]
at com.sun.script.javascript.RhinoScriptEngine.eval(RhinoScriptEngine.java:240)
[na:1.7.0_67]
at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:233)
[na:1.7.0_67]
at org.lsc.utils.JScriptEvaluator.instanceEval(JScriptEvaluator.java:222)
[lsc-core-2.1.3.jar:na]
at org.lsc.utils.JScriptEvaluator.evalToStringList(JScriptEvaluator.java:119)
[lsc-core-2.1.3.jar:na]
at 
org.lsc.utils.ScriptingEvaluator.evalToStringList(ScriptingEvaluator.java:136)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.getValuesToSet(BeanComparator.java:602)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.getUpdatedObject(BeanComparator.java:284)
[lsc-core-2.1.3.jar:na]
at org.lsc.beans.BeanComparator.calculateModifications(BeanComparator.java:176)
[lsc-core-2.1.3.jar:na]
at org.lsc.SynchronizeTask.run(AbstractSynchronize.java:773)
[lsc-core-2.1.3.jar:na]
at org.lsc.SynchronizeTask.run(AbstractSynchronize.java:707)
[lsc-core-2.1.3.jar:na]
at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
[na:1.7.0_67]
at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
[na:1.7.0_67]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_67]
Caused by: java.lang.RuntimeException:
org.apache.directory.api.ldap.model.exception.LdapInvalidDnException:
ERR_04202 A value is missing on some RDN
at org.lsc.jndi.JndiServices.rewriteBase(JndiServices.java:659)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.JndiServices.doReadEntry(JndiServices.java:691)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.JndiServices.readEntry(JndiServices.java:666)
~[lsc-core-2.1.3.jar:na]
at org.lsc.jndi.ScriptableJndiServices._attr(ScriptableJndiServices.java:218)
[lsc-core-2.1.3.jar:na]
... 36 common frames omitted

I assume the error is in the javascript code, but I'm at a loss on
finding out where exactly, or how to do the debugging. Can anyone
point me in the right direction?

Any help would be greatly appreciated!

Cheers,

Frederic
_______________________________________________________________
Ldap Synchronization Connector (LSC) - http://lsc-project.org

lsc-users mailing list
lsc-users@lists.lsc-project.org
http://lists.lsc-project.org/listinfo/lsc-users

Reply via email to