Documentum 21.4 PostgreSQL WSL2 Install Guide

This is a step-by-step guide to install Documentum 21.4 in WSL2 using the Ubuntu 20.04 image with PostgreSQL 12.

Environment

  • Host:
    Windows 11 x64 8GB RAM
  • WSL2:
    Ubuntu 20.04 LTS

WSL2 Configuration

  • Make sure you’re using the Ubuntu 20.04 image with WSL2:

wsl -l -v
NAME STATE VERSION
* Legacy Stopped 1
* Ubuntu-20.04 Running 2

  • Create dmadmin user and add it to the sudoers group:

aldago@laptop:/$ sudo adduser dmadmin
Adding user `dmadmin’ …
Adding new group `dmadmin’ (1001) …
Adding new user `dmadmin’ (1001) with group `dmadmin’ …
Creating home directory `/home/dmadmin’ …
Copying files from `/etc/skel’ …
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for dmadmin
Enter the new value, or press ENTER for the default
Full Name []: dmadmin
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y

aldago@laptop:/$ sudo usermod -aG sudo dmadmin

  • Configure nameserver to access Internet:

dmadmin@laptop:~$ sudo vi /etc/resolv.conf
nameserver 8.8.8.8

  • Install pacakges:

dmadmin@laptop:~$ sudo apt-get update
dmadmin@laptop:~$ sudo apt -y install tcl expect

PostgreSQL Configuration

  • Install required packages:

dmadmin@laptop:~$ sudo apt -y install postgresql postgresql-contrib

  • Start the PostgreSQL service:

dmadmin@laptop:~$ sudo service postgresql start
* Starting PostgreSQL 12 database server [ OK ]

  • Configure the postgres user:

dmadmin@laptop:~$ sudo passwd postgres
New password:
Retype new password:
passwd: password updated successfully

dmadmin@laptop:~$ sudo -u postgres psql postgres
psql (12.8 (Ubuntu 12.8-0ubuntu0.20.04.1))
Type “help” for help.

postgres=# \password postgres
Enter new password:
Enter it again:
postgres=# exit

  • Restart PostgreSQL service to apply the changes:

dmadmin@laptop:~$ sudo service postgresql restart
* Starting PostgreSQL 12 database server [ OK ]

phpPgAdmin Configuration

  • Install required packages:

dmadmin@laptop:~$ sudo apt install -y phppgadmin

  • Configure phpPgAdmin:

dmadmin@laptop:~$ sudo vi /etc/phppgadmin/config.inc.php
$conf[‘extra_login_security’] = false;

  • Restart httpd service to apply the changes:

dmadmin@laptop:~$ sudo /etc/init.d/apache2 restart
* Restarting Apache httpd web server apache2

Now you should be able to login to the console from http://localhost/phppgadmin/.

ODBC Configuration

  • Install required packages:

dmadmin@laptop:~$ sudo apt -y install unixodbc unixodbc-dev odbc-postgresql

  • Configure .ini files:

dmadmin@dctm212:~$ sudo vi /etc/odbc.ini
[MyPostgres]
Description=PostgreSQL
Driver=PostgreSQL
Database=postgres
Servername=localhost
UserName=postgres
Password=dmadmin
Port=5432
Protocol=12
ReadOnly=No
RowVersioning=No
ShowSystemTables=No
ShowOidColumn=No
FakeOidIndex=No
UpdateableCursors=Yes
DEBUG=Yes

dmadmin@laptop:~$ sudo vi /etc/odbcinst.ini
[PostgreSQL]
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Driver64 = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup64 = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
FileUsage = 1

  • Test the connection:

dmadmin@dctm212:~$ isql -v MyPostgres
 dmadmin@laptop:~$ isql -v MyPostgres
+—————————————+
| Connected!                                  
|                                                     
| sql-statement                               
| help [tablename]                         
| quit                                             
|                                                     
+—————————————+
SQL>

Documentum server

  • Create folders:

dmadmin@laptop:~$ sudo mkdir -p /opt/documentum/sw && sudo mkdir -p /opt/documentum/product/21.4
dmadmin@laptop:~$ sudo chown -R dmadmin.dmadmin /opt/documentum

  • Install openJDK 11.0.13 (remember to remove “anon” from the list of disabled algorithms or the installer will fail to connect to the repository)

dmadmin@laptop:/opt/documentum$ tar -xvf /mnt/d/dctm214/sw/OpenJDK11U-jdk_x64_linux_11.0.12_7.tar.gz -C .

  • Set up environment variables:

dmadmin@laptop:~$ vi .bash_profile
#Required for X11 forwarding
export DISPLAY=$(ip route | awk ‘/default via / {print $3; exit}’ 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

DOCUMENTUM=/opt/documentum
export DOCUMENTUM

DM_HOME=$DOCUMENTUM/product/21.4
export DM_HOME

DM_JMS_HOME=$DOCUMENTUM/tomcat9.0.52
export DM_JMS_HOME

POSTGRESQL_HOME=/usr/lib/postgresql/12
export POSTGRESQL_HOME

JAVA_HOME=$DOCUMENTUM/openjdk-11.0.12_7
export JAVA_HOME

JAVA_TOOL_OPTIONS=”-Djava.locale.providers=COMPAT,SPI”
export JAVA_TOOL_OPTIONS

PATH=$PATH:$DM_HOME/bin:$POSTGRESQL_HOME/bin:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
export PATH

LC_ALL=C
export LC_ALL

LD_LIBRARY_PATH=$POSTGRESQL_HOME/lib:$DM_HOME/bin:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

  • Reserve ports for services:

dmadmin@laptop:~$ sudo vi /etc/services
dctm214 50000/tcp # dctm 21.4 repo
dctm214_s 50001/tcp # dctm 21.4 repo

  • Configure limits.conf:

dmadmin@laptop:~$ sudo vi /etc/security/limits.conf
dmadmin – core -1

  • Run the installer:

dmadmin@laptop:/opt/documentum/sw/cs$ tar -xvf /mnt/d/dctm214/sw/documentum_server_21.4_linux64_postgres.tar -C .
dmadmin@laptop:/opt/documentum/sw/cs$ chmod 777 serverSetup.bin
dmadmin@laptop:/opt/documentum/sw/cs$ ./serverSetup.bin

Docbroker and repository

  • Create the tablespace file for the repository (dctm214):

dmadmin@laptop:/$ su – postgres
postgres@laptop:~$ mkdir /var/lib/postgresql/12/main/db_dctm214_dat.dat
postgres@laptop:~$ exit

  • Run the configurator:

dmadmin@laptop:/opt/documentum/product/21.4/install$ ./dm_launch_server_config_program.sh

And you’re good to go 🙂

 

Documentum REST dm_job object on DQL queries

If you have used dctm-rest 21.x, you might have come across this error when doing something like select * from dm_job:

E_INPUT_ILLEGAL_ARGUMENTS: There are illegal arguments provided. Failed to instantiate class class com.emc.documentum.rest.view.impl.QueryResultItemView with arguments..

You might wonder if you did something wrong when deploying dctm-rest or if there’s something missing on your environment. Well, the answer is no. If you change the DQL to something like:

select *,r_object_id as method_id from dm_job

Magic! It works 🙂

Well, the “issue” is on the com.emc.documentum.rest.view.impl.JobView class, where someone at some point decided that it was a good idea to require a non-existing attribute (method_id) in dm_job view class:

protected void addMethodsLink()
{
String methodId = (String)((JobObject)getDataInternal()).getMandatoryAttribute("method_id");
makeLinkIf(!methodId.equals("0000000000000000"), CoreLinkRelation.METHOD.rel(), idUriBuilder("method", methodId).build());
}

Also, if you want a more “permanent” solution you can override this method with something like:

protected void addMethodsLink()
{
String methodId = (String)((JobObject)getDataInternal()).getMandatoryAttribute("method_id");
if (methodId!=null){
makeLinkIf(!methodId.equals("0000000000000000"), CoreLinkRelation.METHOD.rel(), idUriBuilder("method", methodId).build());
}
}

And you’ll be good to go.

dqMan configuration with Documentum 21.2 and OpenJDK 11 or newer

A while ago you probably saw a statement from fme group saying that dqMan was not compatible with newer Documentum versions:

fmedqman

So, considering that the only “issue” here is using an openJDK x86 / 32bit instead of the x64 (which is the only official one being distributed), these are the steps to get dqMan working with Documentum 21.2 and openJDK 11.

Let’s start

  1. Install Java:
    • You need to download an unofficial openJDK x86/32bit build, you can use for example the ones provided by AdoptOpenJDK here. I suggest you to unzip this on dqMan’s folder
    • Remember that for the native connection to work, you need to remove anon from jdk.tls.disabledAlgorithms entry on the java.security file.
  2. Install DFC
    • I don’t think you need much help for this 🙂 You can also just copy dctm.jar and dfc folder from CS.
  3. Install dqman
  4. Copy dmcl.dll from a previous Documentum version to dqman’s folder. Be aware that there’s actually two different dcml.dll version (I think one is 32bit and another 64bit). As far as I know, the one that works is the smaller one (~150KB)
  5. Create a java.ini file on dqMan’s main folder with the following contents:

java_library_path=”<PATH_TO_DQMAN>\jdk-11.0.11+9-jre\bin\client\jvm.dll”
java_classpath=<PATH_TO_DFC_FOLDER>\config;<PATH_TO_DFC_FOLDER>\dctm.jar
java_options = ” -Djava.net.preferIPv4Stack=true -Djava.locale.provider=COMPAT,SPI”
java_tool_options = ” -Djava.locale.provider=COMPAT,SPI”

If you did everything correctly you should see the following on the about window:

dqman212

And this is all you have to do to keep working with dqMan and Documentum 20.x/21.x.

Experimental Documentum Workflow Manager 21.2 Install guide

Opentext has released an experimental new Workflow Manager for Documentum that uses an interface similar to Smartview (and that can be integrated with D2).

This is a step-by-step guide to install the Workflow Manager 21.2.

Environment

Same as used in Opentext Documentum 21.2 PostgreSQL Install Guide

Get the installer files

If you go to the download page, you’ll see that only the Windows version of Process Engine is available, although the install guide mentions a Linux distribution. The workaround for this is to download process engine 21.2 from XCP 🙂

Install Process Engine

  • Just un-tar the file and run the installer (with JMS stoppped), you’ll get an error at the end, but this is due to the installer trying to start Wildfly (not everything is yet updated for Tomcat):

dmadmin@dctm212:/opt/documentum/sw/pe$ tar xvf process_engine_linux.tar
dmadmin@dctm212:/opt/documentum/sw/pe$ chmod u+x peSetup.bin
dmadmin@dctm212:/opt/documentum/sw/pe$ source /opt/documentum/product/21.2/bin/dm_set_server_env.sh
dmadmin@dctm212:/opt/documentum/sw/pe$ ./peSetup.bin

Start JMS and you can check if BPM is running in the following URLs:

Worflow Manager Application deployment

  • Deploy war file with an updated dfc.properties file and modify the deployment.properties file:

dmadmin@dctm212:/opt/tomcat/webapps/designer-webapp/WEB-INF/classes$ vi deployment.properties
xcp.repository.name=dctm212
xcp.csrf.enabled=true
xcp.workspace.root=”/System/Applications/XCP Application Templates”
xcp.temp.dir=/opt/tomcat/temp

  • Also update rest-api-runtime.properties uncommenting the following line:

dmadmin@dctm212:/opt/tomcat/webapps/designer-webapp/WEB-INF/classes$ vi rest-api-runtime.properties
xcp.security.logon.secured=false

Now you can check the application on http://dctm212:8080/designer-webapp/signin.html.

We have a kind of familiar view, which should not be strange for those that have worked with PB or XCP:

As it happens with all the new applications from Opentext, properties popups have been replaced by the right side bar:

5

Just remember that this is not production ready and it is provided as a “beta” application to be tested (similar to Documentum Search)

Opentext Documentum 21.2 PostgreSQL Install Guide

Opentext has released a new version of Documentum. Probably the most noticeable new features are:

  • Tomcat is now (again) the application server used for JMS
  • This change has decrease the size of the download and the docker images
  • New experimental worflow manager
  • D2 available without installer

This is a step-by-step guide to install Documentum 21.2 in an Ubuntu Linux environment with PostgreSQL 12.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 16

Guest:
Ubuntu Server 20.04 LTS x64 25GB HD 4GB RAM 2 cores
PostgreSQL 12
Documentum 21.2

VM Creation

Mount the Ubuntu Server DVD image, boot the machine and follow the steps. You can choose to let EasyInstall do the work for you. I used minimal package install to save resources, named the machine dctm212, configured the network and created a dmadmin user. You can use the installer to install docker and/or PostgreSQL too.

OS Configuration

  • Install required packages:

dmadmin@dctm212:/opt/documentum/sw$ sudo apt install net-tools tcl rng-tools expect xterm

PostgreSQL Configuration

  • Install required packages:

dmadmin@dctm212:~$ sudo apt -y install postgresql postgresql-contrib

  • Enable and start the PostgreSQL service:

dmadmin@dctm212:~$ systemctl start postgresql
dmadmin@dctm212:~$ sudo systemctl enable postgresql

  • Configure the postgres user:

dmadmin@dctm212:~$ sudo passwd postgres
New password:
Retype new password:
passwd: password updated successfully

dmadmin@dctm212:~$ sudo -u postgres psql postgres
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
Type “help” for help.

postgres=# password postgres
Enter new password:
Enter it again:
postgres=# exit

  • Configure PostgreSQL:

dmadmin@dctm212:~$ sudo vi /etc/postgresql/12/main/postgresql.conf
listen_addresses = ‘*’
port = 5432

dmadmin@dctm212:~$ sudo vi /etc/postgresql/12/main/pg_hba.conf
host all all 127.0.0.1/32 md5
host all all ::/128 md5
host all all dctm212 md5

  • Restart PostgreSQL service to apply the changes:

dmadmin@dctm212:~$ sudo systemctl restart postgresql

phpPgAdmin Configuration

  • Install required packages:

dmadmin@dctm212:~$ sudo apt install -y phppgadmin

  • Configure phpPgAdmin:

dmadmin@dctm212:~$ sudo vi /etc/apache2/conf-available/phppgadmin.conf
#Require local

dmadmin@dctm212:~$ sudo vi /etc/phppgadmin/config.inc.php
$conf[‘extra_login_security’] = false;

  • Restart httpd service to apply the changes:

dmadmin@dctm212:~$ sudo /etc/init.d/apache2 restart

Now you should be able to login to the console from http://dctm212/phppgadmin/.

ODBC Configuration

  • Install required packages:

dmadmin@dctm212:~$ sudo apt install unixodbc unixodbc-dev odbc-postgresql

  • Configure .ini files:

dmadmin@dctm212:~$ sudo vi /etc/odbc.ini
[MyPostgres]
Description=PostgreSQL
Driver=PostgreSQL
Database=postgres
Servername=dctm212
UserName=postgres
Password=dmadmin
Port=5432
Protocol=12
ReadOnly=No
RowVersioning=No
ShowSystemTables=No
ShowOidColumn=No
FakeOidIndex=No
UpdateableCursors=Yes
DEBUG=Yes

dmadmin@dctm212:~$ sudo vi /etc/odbcinst.ini
[PostgreSQL]
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Driver64 = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup64 = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
FileUsage = 1

  • Test the connection:

dmadmin@dctm212:~$ isql -v MyPostgres
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>

Documentum server

  • Create folders:

dmadmin@dctm212:~$ sudo mkdir -p /opt/documentum/sw && mkdir -p /opt/documentum/product/21.2
dmadmin@dctm212:~$ sudo chown -R dmadmin.dmadmin /opt/documentum

  • Install openJDK 11.0.10 (remember to remove “anon” from the list of disabled algorithms or the installer will fail to connect to the repository)

[dmadmin@dctm212cs]$ wget https://github.com/AdoptOpenJDK/openjdk11-upstream-binaries/releases/download/jdk-11.0.10%2B9/OpenJDK11U-jdk_x64_linux_11.0.10_9.tar.gz
[dmadmin@dctm212cs]$ tar xvf OpenJDK11U-jdk_x64_linux_11.0.10_9.tar.gz && mv openjdk-11.0.10_9/ /opt/documentum/

  • Set up environment variables:

dmadmin@dctm212:/opt/documentum$ vi ~/.bash_profile
DOCUMENTUM=/opt/documentum
export DOCUMENTUM

DOCUMENTUM_SHARED=$DOCUMENTUM
export DOCUMENTUM_SHARED

DM_HOME=$DOCUMENTUM/product/21.2
export DM_HOME

DM_JMS_HOME=$DOCUMENTUM/tomcat9.0.43
export DM_JMS_HOME

POSTGRESQL_HOME=/usr/lib/postgresql/12
export POSTGRESQL_HOME

JAVA_HOME=/opt/documentum/openjdk-11.0.10_9
export JAVA_HOME

JAVA_TOOL_OPTIONS=”-Djava.locale.providers=COMPAT,SPI”
export JAVA_TOOL_OPTIONS

PATH=$PATH:$DM_HOME/bin:$POSTGRESQL_HOME/bin:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
export PATH

LC_ALL=C
export LC_ALL

LD_LIBRARY_PATH=$POSTGRESQL_HOME/lib:$DM_HOME/bin:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

  • Reserve ports for services:

dmadmin@dctm212:~$ sudo vi /etc/services
dctm212 50000/tcp # dctm 21.2 repo
dctm212_s 50001/tcp # dctm 21.2 repo

  • Configure limits.conf:

dmadmin@dctm212:~$ sudo vi /etc/security/limits.conf
dmadmin – core -1

  • Run the installer:

dmadmin@dctm212:/opt/documentum/sw$ chmod 777 serverSetup.bin
dmadmin@dctm212:/opt/documentum/sw$ ./serverSetup.bin

Docbroker and repository

  • Create the tablespace file for the repository (dctm212):

dmadmin@dctm212:/opt/documentum/sw$ su –
root@dctm212:~# su – postgres
-bash-4.2$ mkdir /var/lib/postgresql/12/main/db_dctm212_dat.dat
-bash-4.2$ exit
root@dctm212:~# exit

  • Run the configurator:

dmadmin@dctm212:/opt/documentum/product/21.2/install$ ./dm_launch_server_config_program.sh

And after the install, you can check the “new” JMS:

D2/Webtop Brava Enterprise vs. Linux

For some time Opentext has been offering Brava viewer as part of their product portfolio. This viewer allows to view/mark/annotate/etc documents from D2 or Webtop.

Originally, this software was developed for Windows, so for the components (Brava Server, Job Processor) that needed to access the same data, the decision taken was using a shared folder accessible from both Windows servers. And this is configured on the brava.properties file with the displaylist.cache.root and local.displaylist.cache.root parameters. These parameters should point to an unc path (\\server_name\shared_folder).

Now, there’s a Linux version for Brava that includes Job Publisher, which is the Linux-equivalent for Job Processor (but with less features). If you’re using these components, those variables should point to a local folder on the Linux server that has both the Brava server and Publisher (or a common mounted drive on both Linux servers)

Question here is, can we use the Job Processor on Windows with Brava Server on Linux? The (official) answer is no, but why?

What happens when Brava server receives a request to open a file? Brava server downloads locally the file and it places a request on a queue that is checked by Job Processor/Publisher. This message in the queue contains the (local) location of the file that needs to be processed by the “external” component (Processor/Publisher). And this value is the one specified on those parameters.

So for a “Brava on Windows” setup, the message would indicate the file is on \\server_name\shared_folder\xxxxx, and on Linux it would be a local path: /opt/opentext/brava/dlcache/xxxxx. This means that a Windows/Linux situation configuration won’t work, as the windows server would read a message stating that the file is on /opt/opentext/brava/dlcache and this is not possible on Windows.

So how complex is to “improve” this situation? Well, actually is quite simple. Brava uses a class (com.igc.be.cache.filesystem.FsPublishRequestHandler) to create the requests that will be queued. In this class you can find two methods that fill those paths by doing something like dir.getPath(), which returns the absolute path for the “cached” file.

So, if you’re on Linux, you can use cifs-utils to mount a Windows shared drive as a folder in Linux (/mnt/dlcache), specify that folder on the server.properties file so Brava server can write the files there and then override the FsPublishRequestHandler class replacing the values returned by these dir.getPath() methofs replacing “/” with “\” (for Windows paths) and the local Linux path (/mnt/dlcache) with the shared Windows folder (\\server_name\shared_folder or even the local drive for the Windows server). With this change, the message on the queue will be pointing to a local Windows drive, will be processed by the Job Processor and the result will be accesible by the Brava server on Linux.

Even though this is a quite “simple” approach, it would be best to simply add two additional “remote” parameters to server.propeties and use the same value on the 4 of them if you’re on Windows, or the appropiate ones if using a Windows/Linux combination, so Brava server would use the local ones, and the Processor would use the remote ones.

Hopefully Opentext will implement this some day, as looks like there’s no real technical impediment to provide a parity of features between the Windows/Linux versions (as long as you can deploy at least one Windows server for Job Processor).

D2 Video Preview Widget

A while ago I did this for webtop (Video streaming from Webtop) which was later published by EMC as a white paper. This is a similar attempt using an external widget on D2.

In this case, I’ve used video.js, a free Javascript video player. The widget itself is quite straightforward, just create a normal external widget, register the D2_EVENT_SELECT_OBJECT and configure the external widget sending via parameter the user name, the repository and the session ticket. Once this is done, you just have to get the r_object_id of the selected document, set that value on the video object via JS, and just enjoy.

You can check the full on code on GitHub.

Opentext Documentum 20.4 PostgreSQL Install Guide [Ubuntu]

As you might know, IBM has decided to shift CentOS to Stream, which means CentOS won’t be a “stable” OS anymore (so it might not be the best choice to use as a dev environment). So, let’s install latest DCTM on Ubuntu Server 20.04 (LTS). In this guide will also be using PostgreSQL 12, instead of 11. Note that this setup is not supported (only Ubuntu 18+PostgreSQL 12 is supported) but we don’t care much 🙂

This is a step-by-step guide to install Documentum 20.4 in an Ubuntu Linux environment with PostgreSQL 12.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
Ubuntu Server 20.04 LTS x64 25GB HD 4GB RAM 2 cores
PostgreSQL 12
Documentum 20.4

VM Creation

Mount the Ubuntu Server DVD image, boot the machine and follow the steps. You can choose to let EasyInstall do the work for you. I used minimal package install to save resources, named the machine dctm204ubuntu, configured the network and created a dmadmin user. You can use the installer to install docker and/or PostgreSQL too.

OS Configuration

  • Install required packages:

dmadmin@dctm204ubuntu:/opt/documentum/sw$ sudo apt install net-tools tcl rng-tools expect xterm

PostgreSQL Configuration

  • Install required packages:

dmadmin@dctm204ubuntu:~$ sudo apt -y install postgresql postgresql-contrib

  • Enable and start the PostgreSQL service:

dmadmin@dctm204ubuntu:~$ systemctl start postgresql
dmadmin@dctm204ubuntu:~$ sudo systemctl enable postgresql

  • Configure the postgres user:

dmadmin@dctm204ubuntu:~$ sudo passwd postgres
New password:
Retype new password:
passwd: password updated successfully

dmadmin@dctm204ubuntu:~$ sudo -u postgres psql postgres
psql (12.5 (Ubuntu 12.5-0ubuntu0.20.04.1))
Type “help” for help.

postgres=# \password postgres
Enter new password:
Enter it again:
postgres=# exit

  • Configure PostgreSQL:

dmadmin@dctm204ubuntu:~$ sudo vi /etc/postgresql/12/main/postgresql.conf
listen_addresses = ‘*’
port = 5432

dmadmin@dctm204ubuntu:~$ sudo vi /etc/postgresql/12/main/pg_hba.conf
host all all 127.0.0.1/32 md5
host all all ::/128 md5
host all all dctm204ubuntu md5

  • Restart PostgreSQL service to apply the changes:

dmadmin@dctm204ubuntu:~$ sudo systemctl restart postgresql

phpPgAdmin Configuration

  • Install required packages:

dmadmin@dctm204ubuntu:~$ sudo apt install -y phppgadmin

  • Configure phpPgAdmin:
dmadmin@dctm204ubuntu:~$ sudo vi /etc/apache2/conf-available/phppgadmin.conf
#Require local

dmadmin@dctm204ubuntu:~$ sudo vi /etc/phppgadmin/config.inc.php
$conf[‘extra_login_security’] = false;
  • Restart httpd service to apply the changes:

dmadmin@dctm204ubuntu:~$ sudo /etc/init.d/apache2 restart

Now you should be able to login to the console from http://dctm204/phppgadmin/.

ODBC Configuration

  • Install required packages:

dmadmin@dctm204ubuntu:~$ sudo apt install unixodbc unixodbc-dev odbc-postgresql

  • Configure .ini files:

dmadmin@dctm204ubuntu:~$ sudo vi /etc/odbc.ini
[MyPostgres]
Description=PostgreSQL
Driver=PostgreSQL
Database=postgres
Servername=dctm204ubuntu
UserName=postgres
Password=dmadmin
Port=5432
Protocol=12
ReadOnly=No
RowVersioning=No
ShowSystemTables=No
ShowOidColumn=No
FakeOidIndex=No
UpdateableCursors=Yes
DEBUG=Yes

dmadmin@dctm204ubuntu:~$ sudo vi /etc/odbcinst.ini
[PostgreSQL]
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Driver64 = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
Setup64 = /usr/lib/x86_64-linux-gnu/odbc/libodbcpsqlS.so
FileUsage = 1

  • Test the connection:

dmadmin@dctm204ubuntu:~$ isql -v MyPostgres
+—————————————+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+—————————————+
SQL>

Documentum server

  • Create folders:

dmadmin@dctm204ubuntu:~$ sudo mkdir -p /opt/documentum/sw && mkdir -p /opt/documentum/product/20.4
dmadmin@dctm204ubuntu:~$ sudo chown -R dmadmin.dmadmin /opt/documentum

  • Install openJDK 11.0.7 (remember to remove “anon” from the list of disabled algorithms or the installer will fail to connect to the repository)

[dmadmin@dctm204 cs]$ wget https://github.com/AdoptOpenJDK/openjdk11-upstream-binaries/releases/download/jdk-11.0.7%2B10/OpenJDK11U-jdk_x64_linux_11.0.7_10.tar.gz
[dmadmin@dctm204 cs]$ tar xvf OpenJDK11U-jdk_x64_linux_11.0.7_10.tar.gz && mv openjdk-11.0.7+10/ /opt/documentum/

  • Set up environment variables:

dmadmin@dctm204ubuntu:/opt/documentum$ vi ~/.bash_profile
DOCUMENTUM=/opt/documentum
export DOCUMENTUM

DM_HOME=$DOCUMENTUM/product/20.4
export DM_HOME

POSTGRESQL_HOME=/usr/lib/postgresql/12
export POSTGRESQL_HOME

JAVA_HOME=/opt/documentum/openjdk-11.0.7+10
export JAVA_HOME

JAVA_TOOL_OPTIONS=”-Djava.locale.providers=COMPAT,SPI”
export JAVA_TOOL_OPTIONS

PATH=$PATH:$DM_HOME/bin:$POSTGRESQL_HOME/bin:$HOME/.local/bin:$HOME/bin:$JAVA_HOME/bin
export PATH

LC_ALL=C
export LC_ALL

LD_LIBRARY_PATH=$POSTGRESQL_HOME/lib:$DM_HOME/bin:$LD_LIBRARY_PATH
export LD_LIBRARY_PATH

  • Reserve ports for services:

dmadmin@dctm204ubuntu:~$ sudo vi /etc/services
dctm204 50000/tcp # dctm 20.4 repo
dctm204_s 50001/tcp # dctm 20.4 repo

  • Configure limits.conf:

dmadmin@dctm204ubuntu:~$ sudo vi /etc/security/limits.conf
dmadmin – core -1

  • Run the installer:

dmadmin@dctm204ubuntu:/opt/documentum/sw$ chmod 777 serverSetup.bin
dmadmin@dctm204ubuntu:/opt/documentum/sw$ ./serverSetup.bin

Docbroker and repository

  • Create the tablespace file for the repository (dctm204):

dmadmin@dctm204ubuntu:/opt/documentum/sw$ su –
root@dctm204ubuntu:~# su – postgres
-bash-4.2$ mkdir /var/lib/postgresql/12/main/db_dctm204_dat.dat
-bash-4.2$ exit
root@dctm204ubuntu:~# exit

  • Run the configurator:

dmadmin@dctm204ubuntu:/opt/documentum/product/20.4/install$ ./dm_launch_server_config_program.sh

And you should know the rest 🙂

Documentum Search 20.4 Docker install guide

Opentext has released with the 20.4 release a new search engine that will replace xPlore, and that currently is supported in “testing” mode.

Documentation for Documentum Search is better than previous documentations (parameters are finally “properly” explained), and you can also find a full .yaml file to use as template. However, as we could have expected, that didn’t work, so some changes are required.

Environment

Host:
Windows 10 x64 8GB RAM
VMware Workstation Player 15

Guest:
CentOS 7.7 x64 25GB HD 4GB RAM 2 cores
PostgreSQL 11
Documentum 20.4

VM Creation

Just follow the Documentum 20.4 PostgreSQL post as I’ve used that VM.

Install Docker

Refer to Documentum 20.2 Docker install guide if you need help

Documentum Search 20.4

  • Get the images from the Opentext registry:

[dmadmin@dctm204 opt]$ docker login registry.opentext.com
[dmadmin@dctm204 opt]$ docker pull registry.opentext.com/dctm-search-agent:20.4.0
[dmadmin@dctm204 opt]$ docker pull registry.opentext.com/dctm-search-admin:20.4.0
[dmadmin@dctm204 opt]$ docker pull registry.opentext.com/dctm-search-cps:20.4.0
[dmadmin@dctm204 opt]$ docker pull registry.opentext.com/dctm-search-lunr:20.4.0
[dmadmin@dctm204 opt]$ docker pull registry.opentext.com/dctm-search-solr:20.4.0

  • Create folder structure. This is the one I’ve used:

[dmadmin@dctm204 opt]$ tree search
search/
|– admin
| `– logs
|– agent
| `– logs
|– cps
| `– logs
|– cps2
| `– logs
|– dfc.properties
|– lunr
| `– logs
|– search.yaml
|– solr
| |– base
| | |– log4j2.xml
| | `– logs
| |– logs
|– solr2
| |– base
| | |– log4j2.xml
| | `– logs
| |– logs
|– zoo
| |– data
| |– datalog
| `– logs
`– zoo.cfg

  • Create configuration files:

[dmadmin@dctm204 search]$ cp ../documentum/config/dfc.properties .
[dmadmin@dctm204 search] vi zoo.cfg
dataDir=/data
dataLogDir=/datalog
clientPort=2181
tickTime=2000
initLimit=5
syncLimit=2
autopurge.snapRetainCount=3
autopurge.purgeInterval=0
maxClientCnxns=60
standaloneEnabled=true
admin.enableServer=true
4lw.commands.whitelist=mntr,conf,ruok
[dmadmin@dctm204 search] vi solr/base/log4j2.xml
<extract this file from the solr container>

  • Create search.yaml:

[dmadmin@dctm204 search]$ sudo vi search.yaml
<copy the template from the documentation>

At this point, I had several issues with the solr image. First, the container could not write into the mounted folder. In order to fix this, I had to force the uid in the yaml file by adding the following:

user: ‘1000:1000’

After this, Java could not allocate memory for large memory pages. In the end I create a custom image based on the the one from OT (follow the steps detailed on the Reducing Opentext Documentum 20.2 Docker image size post:

[dmadmin@dctm204 search]$ docker run -u 0 –privileged -it –entrypoint /bin/bash registry.opentext.com/dctm-search-solr:20.4.0
echo 22960 &gt; /proc/sys/vm/nr_hugepages
echo 1000 &gt; /proc/sys/vm/hugetlb_shm_group
echo “* soft memlock 626688” &gt;&gt; /etc/security/limits.conf
echo “* hard memlock 626688” &gt;&gt; /etc/security/limits.conf

  • Now if you’ve adjusted the values correctly on the yaml file (stick to 2 “replicas” or the container will also fail) you should be able to run

[dmadmin@dctm204 search]$ docker-compose -f search.yaml up

After a while, you should be able to login into the Documentum Search admin page (http://your-host:8800/):

search_consoleAnd if you log in Documentum Administrator:

index_agent

However, if you run a search, you’ll see that there’s an error and the search is not perfomed. If you watched the Opentext World breakout session for Documentum Search, you’ll probably notice the extra settings used on server.ini to configure the fulltext engine. I’ve tried those without luck, so I just took another approach, to $DOCUMENTUM/product/20.4/bin and do the following:

[dmadmin@dctm204 bin]$ mv libDsearchQueryPlugin.so libDsearchQueryPlugin.bak
[dmadmin@dctm204 bin]$ cp libsolrplugin.so libDsearchQueryPlugin.so

UPDATE: The “nice way” is doing this by editing the dmfulltext.ini file located in $DOCUMENTUM/fulltext.

Then restart the repository and searches should be working on the new search engine:

CMIS REST interface slow performance with multiple repositories

When using the REST interface provided by CMIS, if you have multiple repositories on your docbroker, you may have noticed a slight delay in the response to your queries. I came across this issue in an environment with multiple repositories (+10), where additionally, every dmadmin user has different password, so not only we had this delay on the responses, we also had a log full of authentication errors.

If the delay was slighty concerning, the errors thrown on the log pointed to something more serious (and most likely a known issue in D2).

With a little bit of debugging and decompiling, we found out the culprit on opencmis-dctm-connector-XXX.jar, in the com.emc.documentum.fs.cmis.impl.cmisoperations.impl.GetRepositoryInfosOperationHandler class. This (surprise surprise) is the same situation that we saw with D2. Check the getRepositoryInfoList method:

private List getRepositoryInfoList(CallContext context, GetRepositoryInfosOperationInputBean inputBean, List repositoryEntries)
   {
     List repositoryInfoList = new ArrayList();
     for (CmisRepositoryEntryType repositoryEntry : repositoryEntries)
     {
       String repositoryId = repositoryEntry.getRepositoryId();
       if (CmisAuthenticationManager.INSTANCE.authenticate(context, repositoryId)) {
         repositoryInfoList.add(getRepositoryInfo(context, inputBean, repositoryEntry));
       }
     }
     return repositoryInfoList;
   }

Yes, they’ve done it again. The code tries to authenticate with the provided credentials in evey single repository known to the docbroker. Luckily for us, this method has the requested repository (i.e.: http//cmis…/resources/RepositoryName/…) in the context variable, so you can just do a comparison there and “magically” improve the perfomance (or wait until Opentext releases a “fix”).

Note that this happens in every version I could test from 16.4 to 20.4 😦