It appears you do not have a dataset for cn.  Cn is the rdn of the record and 
you must include at least one cn value that matches the cn value of the dn.

-Jon C. Kidder
American Electric Power
Middleware Services
Email: [email protected]
Phone: 614-716-4970

-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Frederic Van Espen
Sent: Tuesday, June 07, 2016 9:51 AM
To: [email protected]
Subject: [lsc-users] group membership sync from openldap to active directory

 This is an EXTERNAL email. STOP. THINK before you CLICK links or OPEN 
attachments.

**********************************************************************
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
[email protected]
http://lists.lsc-project.org/listinfo/lsc-users
_______________________________________________________________
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