Author: <span>Kenio Carvalho</span>

The Purge Interval Replication settings stop expired documents from replicating back into databases

The   Purge Interval Replication Controle ( PIRC )  is set on a database, to prevent expired documents or deletions to replicate back into that database from a different replica
It will not stop new documents or new deletions from replicating to that replica.

– If Pirc is disabled on a replica, then expired documents and deletions will replicate to that replica.
New documents  and new deletions will always replicate – Pirc does not interfere with new documents

PIRC is set in the Notes client :    File > Replication > Options for this Application > Space Savers.

There are 6 different scenario’s possible :
1- Push ( sent )  from a PIRC enabled to a Pirc enabled database replica

2.-  Pull ( receive )  from a PIRC enabled to a Pirc enabled database replica

3.-  Push ( sent ) from a PIRC enabled to a Pirc disabled database replica

4.- Push ( sent ) from a PIRC disabled to a  Pirc enabled database replica

5.- Pull ( receive ) from a PIRC disabled to a  Pirc enabled database replica

6.- Pull ( receive ) from a PIRC enabled to a  Pirc disabled database replica

 
What will the result be in the different scenario’s above ?

Expired documents and deletions will NOT replicate in scenarios 1.   2,  4 and 5. Pirc stops them because Pirc is Enabled on the destination.

Expired documents and deletions will   replicate in scenarios 3 and 6

So only in the case where the destination of the replication does not have PIRC enabled, the replication will pull in expired documents and deletions.
This happens even if the source replica has PIRC enabled.

I found the information above on a draft TN when i was searching information about PIRC

Uncategorized

Uncategorized

The Lotus Domino server is designed to execute agents that exist in the same database sequentially, with only one agent running at a time.  The Agent Manager task has a built-in scheduler that, for optimization reasons, runs only scheduled agents that exist in the same database with the same agent start time as sequential.

You need to run multiple agents at the same time or outside of the frequency of the Agent Manager’s schedule.

Create a Program document, and fill out the following fields on the form as shown:

Program Name:  nserver   (or server if not Windows platform)

Command Line:  -c “tell amgr run ‘database.nsf‘ ‘agent‘”

Substitute your database name and agent name.  The correct use of quotation marks ( ” ) and apostrophe ( ‘ ) is important.

When Domino runs the agent this way, a separate thread is created to process the agent. This separate thread allows it to run while other agents are being processed through the Agent Manager task.

Caveats

There are a number of serious issues you should be aware of if you plan to use such a process.

Because the agent is spawned in a separate thread, the Agent Manager task is unable to access this agent once it is running. This means that you cannot stop the agent once it is running.

A large number of agents running on the same database at the same time can have potential performance issues.

Your agent must be coded to anticipate other agents working on the same data. For example, having one agent write to a document while the other agent is reading could have unexpected results.  You might need document locking logic in the agent.

The information above is from this TechNote

Uncategorized

  If you plan to upgrade to V2.5.1 of the EditLive! editor included with IBM Connections 4.5 IFR2 and have the original EditLive! V1.0 editor installed, you must remove it before upgrading to a later      version.

To remove EditLive! for IBM Connections 1.0, follow instructions at:
http://docs.ephox.com/display/IBMConnections/Uninstalling+EditLive!+for+IBM+Connections+1.0

You can then install the EditLive! for Connections package included with IBM Connections 4.5 IFR2. For instructions, see:

http://www-10.lotus.com/ldd/lcwiki.nsf/xpViewCategories.xsp?lookupName=EditLive%21+for+IBM+Connections+4.5+IFR2

Uncategorized

Some users make the mistake of sending messages that should not go to some people and  not save the sent message which complicates the use of the recall. I found this documentation in a TechNote that can help solve the problem

Create one LotusScript agent in Domino Directory with all default properties such as it will run on event and target documents are all selected documents.  Paste below code in the agent.

Save the agent and open domino directory from Notes Client.  Select the person documents for which users the mail has to be deleted from their mail file.  And then select Tools–><>.

Once successful, the confirmation message will be popped up.  Please ensure that the id by which agent will be signed should be present in mail file of user’s ACL.

Change subject text in below code.

Option Public
Option Declare

%Include "lsconst.lss"
Sub Initialize
        Dim s As New NotesSession
        Dim db As NotesDatabase
        Dim view As NotesView
        Dim dc As NotesDocumentCollection
        Dim doc As NotesDocument
        Dim db1 As NotesDatabase        
        Dim noofrec As Integer        
        Dim mailserv As String
        Dim mailfl As String
        noofrec =0
        Dim doccol As NotesDocumentCollection
        Dim searchstring As String
        Dim doc1 As NotesDocument
        Dim doc2 As NotesDocument
       
        Set db=s.Currentdatabase
        Set view=db.Getview("($Users)")
        Set dc=db.Unprocesseddocuments
        Set doc=dc.GetFirstDocument
        searchstring "hi swati how r u"  'change this text
       
        While Not doc Is Nothing
                mailserv = doc.GetItemValue("MailServer")(0)
                mailfl = doc.GetItemValue ("MailFile")(0)
                Set db1 = s.GetDatabase(mailserv,mailfl)
                If Not db1 Is Nothing Then
                        If db1.IsOpen Then
                                Set doccol = db1.FTSearch(searchstring,0)
                                Set doc1 = doccol.GetFirstDocument
                                While Not doc1 Is Nothing
                                        Set doc2 = doccol.GetNextDocument(doc1)
                                        Call doc1.RemovePermanently(True)  
                                        Set doc1 = doc2
                                Wend
                                noofrec = noofrec + 1
                        End If
                End If
                Set doc = dc.Getnextdocument(doc)
        Wend        
        If noofrec <> 0 Then
                MsgBox noofrec & " record(s) successfully updated " , MB_OK, "Lotus Notes"
        End If
        End sub

Uncategorized

JRE Bugs and Compatibility with WCM FileTransferApplet and Ephox EditLive
Due to changes and bugs introduced to the JRE from Oracle, there have been some compatibility issues with WCM’s FileTransferApplet and EditLive rich text editor. Some of the more problematic versions include recent updates of JRE 1.7 (example: update 25, 45, 51) and JRE 1.6 (example: update 45).

See the TechNote here

Uncategorized

It is not so frequent for me to build Windows 2008 images. Yesterday when i made the Windows VM an add a second disk the error message above was displayed

Windows Server: The operation failed to complete because the Disk Management console view is not up-to-date

Context:
 
I was trying to format a newly added disk on Windows Server 2008 R2 however, couldn’t format the disk or assign a drive letter to the disk.

The Server was a Virtual Machine hosted on a VMware Workstation 10. I tried to refresh the disk management console and even did restart the server however, same error persisted.

To my suprise, there were no warnings or erros in event viewer for this issue. Since it was a virtual machine, I removed the virtual disk and added a new virtual disk on the VM but in vain. No luck at all, error didnt vanish.

Finally to fix this issue, I had to use diskpart and format the disk.

Complete instructions here

Uncategorized

Moderation is a component in IBM® Connections  that allows moderators and Community owners to better control what is displayed in certain applications. Moderators can review Blogs, Forums, and Files content before it is posted to Connections, and manage content after it is added to IBM Connections. This article provides a detailed introduction to Connections Moderation configurations so you can better understand and use it.

http://www-10.lotus.com/ldd/lcwiki.nsf/dx/Using_the_Moderation_application_in_IBM_Connections_4.0

Uncategorized

One of our Connections customers has the following as a requirement:

Inactivate users based on LDAP GROUP

Solution

The solution I found was to create a text file based on LDAP group and run sync_all_dns.sh command and then run the command delete_or_inactivate_employees.sh

The java program

The class bellow read the LDAP and verify if the user is a member of the group. I not found good information on how to use the ITDS API to check if a user is a member of a group, so i need to do it “manually”.

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Properties;
import javax.naming.ldap.InitialLdapContext;

import javax.naming.*;

import javax.naming.directory.*;

public class GroupSearch

{

     public static boolean compara(String nome, ArrayList grupo) {

             
             boolean blnFound = grupo.contains(nome.toUpperCase());
             
             return blnFound;
     }

     @SuppressWarnings({ “rawtypes”, “unchecked” })
     public static void main(String args[])

     {

             InitialLdapContext ctx = null;

             Hashtable hashtable null;
             
             Properties prop = new Properties();
               
                             
             try

             {
                     //load a properties file
                 prop.load(new FileInputStream(“config.properties”));

            //get the property value and print it out
       
                 String url = “ldap://”+prop.getProperty(“server”);
                 String username = prop.getProperty(“username”);
                 String password = prop.getProperty(“password”);
                 String base = prop.getProperty(“base”);
                 String groupName = prop.getProperty(“groupFilter”);
                 String userFilter = prop.getProperty(“userFilter”);

                     // Set up LDAP config settings

                     hashtable = new Hashtable();

                     hashtable.put(“java.naming.ldap.version”, “3”);

                     hashtable.put(“java.naming.factory.initial”,
                                     “com.sun.jndi.ldap.LdapCtxFactory”);

                     hashtable.put(“java.naming.security.authentication”, “Simple”);

                     hashtable.put(“java.naming.referral”, “follow”);

                     hashtable.put(“java.naming.provider.url”, url);

                     hashtable.put(“java.naming.security.principal”, username);

                     hashtable.put(“java.naming.security.credentials”, password);

                     // Make LDAP connection

                     ctx = new InitialLdapContext(hashtable, null);

                     System.out.println(“Connection established”);

                     // Set up Search Controls”

                     SearchControls sc = new SearchControls();
                     SearchControls gc = new SearchControls();

                     sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
                     gc.setSearchScope(SearchControls.SUBTREE_SCOPE);
                     
                     sc.setReturningAttributes(new String [] { “uid”,”sn”,”cn”});

                     // perform search on directory
                     System.out.println(“Searching the directory please wait.”);
                     NamingEnumeration results = ctx.search(base,userFilter,sc);
                     NamingEnumeration groupResult = ctx.search(base,groupName, gc);
                     
                     // loop until we have gotten all entries returned by search

                     // Arraylist with group members

                     ArrayList members = new ArrayList();
                     while (groupResult.hasMore()) {

                             SearchResult gr = (SearchResult) groupResult.next();
                     

                             Attributes gattrs = gr.getAttributes();
                             NamingEnumeration gattrsList = gattrs.getAll();

                             while (gattrsList.hasMore()) {

                                     Attribute gatribute = (Attribute) gattrsList.next();
                                     NamingEnumeration values = gatribute.getAll();

                                     while (values.hasMore()) {

                                             members.add(values.next().toString().toUpperCase());

                                     }

                             }

                     }
                     // dump users to file
                     System.out.println(“File createdrn BUILD SUCCESSFUL”);
                     File file = new File (“delete_or_inactivate_employees.in”);
                     if (!file.exists()){
                             file.createNewFile();
                     }
                     FileWriter fw = new FileWriter (file.getAbsoluteFile());
                     BufferedWriter bw = new BufferedWriter(fw);
                     
                     while (results.hasMore())

                     {

                             // get the SearchResult object

                             SearchResult sr = (SearchResult) results.next();
                             Attributes attributes=sr.getAttributes();
                             Attribute shortName = attributes.get(“sn”);
                             //ouptput DN of entry
                             
                             
                             String nome = sr.getName().toString()+”,”+base;
                             Attribute userName = attributes.get(“uid”);
                         String usuario = userName.toString();
                         
                                //IF A USER ARE ON THE GROUP WRITE TO FILE                                
                             if (compara(nome,members)){
                                             
                                     String dn = usuario.replace(“uid: “, “$dn:uid=”)+”,”+base+”rn”;
                                     String cnshortName.toString().replace(“sn: “,”uid:”)+”rn”+”.”+”rn”;
                                     bw.write(dn+cn);                
                             }
                                     
                     }

                     bw.close();        
                                             
                     // Close the connection to LDAP

                     ctx.close();

             }

             catch (Exception ex)

             {

                     System.out.println(“EXCEPTION = ” + ex.toString());

             }

     }

}

Configuration

The file config.properties set the parameters. GroupFilter is the filter for the desired group and userFilter is the filter to search for users on the ldap server. This filter must be the same used on the profiles_tdi.properties to avoid problems.

This file must be on the same folder of ExportLdap.jar

The file must have the following lines:

Server=
username=
password=
base=
groupFilter=
userFilter=

I put the files ExportLdap.jar and config.properties on /Wizards/TDIPopulation/linux/TDI

For example :

server=yourldapserver:389
username=cn=root
password= base=
groupFilter=(&(objectclass=groupOfUniqueNames)(cn=DenyGroup))
userFilter=  (&(uid=*)(objectclass=inetOrgPerson))

Running the solution

Put the files config.properties and ExportLdap.jar in the folder:

/Wizards/TDIPopulation/linux/TDI

Run the  script sync_all_dns.sh

Run java –jar ExportLdap.jar

the program will genereate the file  delete_or_inactivate_employees.in

The final step run ./delete_or_inactivate_employees.sh script

Uncategorized

The IBM Web Content Manager Library Dependency Graph v1.0 (LDG1.0) is a portlet that visualizes your Web Content Libraries and their dependencies. The portlet allows you to see very quickly the relative size of a Web Content Library, as well as identify any interactions between your libraries. It even allows you to modify those interactions and dependencies between those libraries in place.

Features include:

  • Visualization of Web Content Libraries relative size.
  • Visualization of dependencies between Web Content Libraries.
  • View and alter references between libraries in place.
  • Delete multiple dependent libraries within a single operation.
  • Save Library Dependency Reports for later access.

Uncategorized