Hi everybody, I noticed a weird behaviour in the last release of lsc-2.0.
1/ when using a logback.xml with all levels at "INFO", I got nothing synchronized... It stays blocked with no special message. Note : I use ldap async source service, with a sunDS. Note: logback.xml is shown below, with all INFO values replaced by DEBUG 2/ This one is more a comment than a bug : when moving from lsc1.0 to lsc2.0 : - with a ldapsourceservice, no problem - with an async ldap source service, binary attributes does not seem to be synchronized the same way. Indeed, attribute : <string>userCertificate;binary</string> as shown below must be replaced by : <string>userCertificate</string> Maybe the job to get the binary attribute is done in internal ? Once it is done, you must also take care to the Delimiter, else, the userCertificate could be splitted into two certificate. Maybe these points can be added to the documentation ? Thank you for the helpers ! David Coutadeur <?xml version="1.0" ?> <lsc xmlns="http://lsc-project.org/XSD/lsc-core-2.0.xsd" id="1" revision="0"> <connections id="2"> <ldapConnection id="3"> <name>src-ldap</name> <url>ldap://src-sunds.domain.com:389/dc=domain,dc=com</url> <username>cn=Directory manager</username> <password>secret</password> <authentication>SIMPLE</authentication> <referral>IGNORE</referral> <derefAliases>NEVER</derefAliases> <version>VERSION_3</version> <pageSize>-1</pageSize> <factory>com.sun.jndi.ldap.LdapCtxFactory</factory> <tlsActivated>false</tlsActivated> <saslMutualAuthentication>false</saslMutualAuthentication> </ldapConnection> <ldapConnection id="4"> <name>dst-ldap</name> <url>ldap://dest-oldap.domain.com:389/dc=domain,dc=com</url> <username>cn=Manager,dc=domain,dc=com</username> <password>secret</password> <authentication>SIMPLE</authentication> <referral>IGNORE</referral> <derefAliases>NEVER</derefAliases> <version>VERSION_3</version> <pageSize>-1</pageSize> <factory>com.sun.jndi.ldap.LdapCtxFactory</factory> <tlsActivated>false</tlsActivated> <saslMutualAuthentication>false</saslMutualAuthentication> </ldapConnection> </connections> <tasks id="6"> <task id="7"> <name>people</name> <bean>org.lsc.beans.SimpleBean</bean> <asyncLdapSourceService> <name>people-src</name> <connection reference="src-ldap" /> <baseDn>ou=People,dc=domain,dc=com</baseDn> <pivotAttributes id="9"> <string>employeeNumber</string> </pivotAttributes> <fetchedAttributes id="10"> <string>domainAccountsClosed</string> <string>cn</string> <string>ctr</string> <string>description</string> <string>displayName</string> <string>dn</string> <string>employeeNumber</string> <string>userCertificate;binary</string> </fetchedAttributes> <getAllFilter>(&(objectClass=domainPerson)(employeeNumber=1390))</getAllFilter> <getOneFilter>(employeeNumber={employeeNumber})</getOneFilter> <serverType>SunDS</serverType> </asyncLdapSourceService> <ldapDestinationService> <name>people-dst</name> <connection reference="dst-ldap" /> <baseDn>ou=People,dc=domain,dc=com</baseDn> <pivotAttributes id="12"> <string>employeeNumber</string> </pivotAttributes> <fetchedAttributes id="13"> <string>domainAccountsClosed</string> <string>cn</string> <string>ctr</string> <string>description</string> <string>displayName</string> <string>dn</string> <string>employeeNumber</string> <string>userCertificate;binary</string> </fetchedAttributes> <getAllFilter>(&(objectClass=domainPerson)(employeeNumber=test))</getAllFilter> <getOneFilter>(employeeNumber={employeeNumber})</getOneFilter> </ldapDestinationService> <propertiesBasedSyncOptions> <mainIdentifier>"cn=" + srcBean.getDatasetFirstValueById("cn") + ",ou=People,dc=domain,dc=com"</mainIdentifier> <defaultDelimiter>µ</defaultDelimiter> <defaultPolicy>FORCE</defaultPolicy> <conditions> <create>true</create> <update>true</update> <delete>false</delete> <changeId>true</changeId> </conditions> <dataset> <name>telephoneNumberPrivate</name> <policy>FORCE</policy> <forceValues id="19"> <string> <![CDATA[ var j = 0; var tmp = new Array(); var t = srcBean.getDatasetValuesById( "telephoneNumberPrivate" ).toArray(); for ( var i=0; i<t.length; i++ ) { var tableau=String(t[i]).split( /[|,;]+/g ); for (var k=0; k<tableau.length; k++) { tmp[j] = tableau[k]; j++; } } var resTab = java.lang.reflect.Array.newInstance(java.lang.String, j); for ( var i = 0; i<j; i++) { resTab[i] = tmp[i]; } resTab ]]> </string> </forceValues> </dataset> <dataset id="21"> <name>telephoneNumber</name> <policy>FORCE</policy> <forceValues id="23"> <string> <![CDATA[ var j = 0; var tmp = new Array(); var t = srcBean.getDatasetValuesById( "telephoneNumber" ).toArray(); for ( var i=0; i<t.length; i++ ) { var tableau=String(t[i]).split( /[|,;]+/g ); for (var k=0; k<tableau.length; k++) { tmp[j] = tableau[k]; j++; } } var resTab = java.lang.reflect.Array.newInstance(java.lang.String, j); for ( var i = 0; i<j; i++) { resTab[i] = tmp[i]; } resTab ]]> </string> </forceValues> </dataset> <dataset id="25"> <name>objectClass</name> <policy>FORCE</policy> <forceValues id="27"> <string> <![CDATA[ var j = 0; var tmp = new Array(); if ( typeof(dstBean) != "undefined" ) { var t1 = dstBean.getDatasetValuesById( "objectClass" ).toArray(); for ( var i=0; i<t1.length; i++ ) { tmp[j] = t1[i]; j++; } } var t2 = srcBean.getDatasetValuesById( "objectClass" ).toArray(); for ( var i=0; i<t2.length; i++ ) { var ok=1; if (t2[i].toLowerCase() != "enateluser" ) { for ( k=0; k<j; k++ ) { if ( t2[i].toLowerCase() == tmp[k].toLowerCase() ) { ok=0; } } if ( ok == 1 ) { tmp[j] = t2[i]; j++; } } } var resTab = java.lang.reflect.Array.newInstance(java.lang.String, j); for ( var i = 0; i<j; i++) { resTab[i] = tmp[i]; } resTab ]]> </string> </forceValues> </dataset> <dataset id="29"> <name>domainIrisRole</name> <policy>FORCE</policy> <forceValues id="31"> <string> <![CDATA[ var t = srcBean.getDatasetFirstValueById( "hidden" ); t = String(t).replace( /editeur_bascule/, "ROLE1"); t = String(t).replace( /producteur_bascule/, "ROLE2"); t ]]> </string> </forceValues> </dataset> <dataset id="33"> <name>domainIrisAlternateRole</name> <policy>FORCE</policy> <forceValues id="35"> <string> <![CDATA[ var t = srcBean.getDatasetFirstValueById( "domainIrisAlternateRole" ); t = String(t).replace( /editeur_bascule/, "ROLE1"); t = String(t).replace( /producteur_bascule/, "ROLE2"); t ]]> </string> </forceValues> </dataset> </propertiesBasedSyncOptions> </task> </tasks> <security id="434"> <encryption id="435"> <algorithm>AES</algorithm> <strength>128</strength> </encryption> </security> </lsc> <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- standard output to console --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="org.lsc.utils.output.LdifLayout"> <Pattern>%date{MMM dd HH:mm:ss} - %-5level - %message%n</Pattern> </layout> </encoder> </appender> <!-- log all application messages to the file /tmp/lsc.log --> <!-- this file is rotated every 10000KB, compressed and 7 files are kept for history --> <appender name="LSC" class="ch.qos.logback.core.rolling.RollingFileAppender"> <Append>true</Append> <File>${LSC_HOME}/logs/lsc.log</File> <layout class="org.lsc.utils.output.LdifLayout"> <Pattern>%date{MMM dd HH:mm:ss} - %-5level - %message%n</Pattern> </layout> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>lsc.log.%i.gz</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>7</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10000KB</MaxFileSize> </triggeringPolicy> </appender> <!-- special logger to have a LDIF file of all modifications applied --> <!-- this file is rotated every 10000KB, compressed and 7 files are kept for history --> <appender name="LDIF" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--See also http://logback.qos.ch/manual/appenders.html#RollingFileAppender--> <Append>true</Append> <File>/tmp/lsc.ldif</File> <layout class="org.lsc.utils.output.LdifLayout"> <Pattern>%m%n</Pattern> </layout> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>DEBUG</level> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <FileNamePattern>lsc.ldif.%i.gz</FileNamePattern> <MinIndex>1</MinIndex> <MaxIndex>7</MaxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10000KB</MaxFileSize> </triggeringPolicy> </appender> <!-- link log sources and log appenders --> <logger name="communicationLogger" level="WARN"> <appender-ref ref="CONSOLE"/> </logger> <logger name="org.lsc" level="DEBUG"> <appender-ref ref="LSC"/> </logger> <logger name="lsc" level="DEBUG"> <appender-ref ref="LDIF"/> </logger> <logger name="org.apache" level="WARN"> <appender-ref ref="CONSOLE"/> </logger> <logger name="poolLogger" level="ERROR"> <appender-ref ref="CONSOLE"/> </logger> <root level="WARN"> <appender-ref ref="CONSOLE"/> </root> </configuration> _______________________________________________________________ Ldap Synchronization Connector (LSC) - http://lsc-project.org lsc-users mailing list [email protected] http://lists.lsc-project.org/listinfo/lsc-users

