From c2d4786ba3eb76f9056e331d3111bac39e959fd4 Mon Sep 17 00:00:00 2001
From: Jan David Mol <mol@astron.nl>
Date: Mon, 15 Apr 2019 18:11:07 +0000
Subject: [PATCH] SW-685: Propagate database port/user/password from
 jOTDBserver command line to OTDB wrapper. Draw credentials from dbcredentials
 in OTB server startup script.

---
 LCS/PyCommon/dbcredentials.py                 | 15 +++++++++++++--
 SAS/OTB/OTB/dist-src/OTB                      | 11 +++++------
 .../lofar/sas/otb/jotdb3/jOTDBaccess.java     | 11 ++++++++---
 .../lofar/sas/otb/jotdb3/jOTDBconnection.java |  8 ++++----
 .../lofar/sas/otb/jotdb3/jOTDBserver.java     | 19 +++++++++++++++++--
 ...on_lofar_sas_otb_jotdb3_jOTDBconnection.cc |  6 ++++--
 SubSystems/CCU_MAC/CMakeLists.txt             |  3 ++-
 7 files changed, 53 insertions(+), 20 deletions(-)

diff --git a/LCS/PyCommon/dbcredentials.py b/LCS/PyCommon/dbcredentials.py
index 3aa88c3112f..55e79a73cbc 100644
--- a/LCS/PyCommon/dbcredentials.py
+++ b/LCS/PyCommon/dbcredentials.py
@@ -285,7 +285,9 @@ if __name__ == "__main__":
 
   parser = OptionParser("%prog [options]")
   parser.add_option("-D", "--database", dest="database", type="string", default="",
-                    help="Name of the database")
+                    help="Print credentials of a specific database")
+  parser.add_option("-S", "--shell", dest="shell", action="store_true", default=False,
+                    help="Use machine-readable output for use in shell scripts")
   parser.add_option("-L", "--list", dest="list", action="store_true", default=False,
                     help="List known databases")
   parser.add_option("-F", "--files", dest="files", action="store_true", default=False,
@@ -313,5 +315,14 @@ if __name__ == "__main__":
     sys.exit(0)
 
   """ Print credentials of a specific database. """
-  print(str(dbc.get(options.database)))
+  creds = dbc.get(options.database)
+
+  if options.shell:
+    print("DBUSER=%s" % (creds.user,))
+    print("DBPASSWORD=%s" % (creds.password,))
+    print("DBDATABASE=%s" % (creds.database,))
+    print("DBHOST=%s" % (creds.host,))
+    print("DBPORT=%s" % (creds.port,))
+  else:
+    print(str(creds))
 
diff --git a/SAS/OTB/OTB/dist-src/OTB b/SAS/OTB/OTB/dist-src/OTB
index 0db62fb307c..19e84c2ed5f 100755
--- a/SAS/OTB/OTB/dist-src/OTB
+++ b/SAS/OTB/OTB/dist-src/OTB
@@ -161,12 +161,11 @@ echo "Logging serverlogs to file $logfile"
 serverpid=0
 ps -ef | grep -v grep | grep java | grep server | grep $port1 2>&1 1>/dev/null
 if [ $? -ne 0 ]; then
-    if [ "$LOFARENV" == "TEST" ]; then 
-      dbhost=sasdbtest
-    else
-      dbhost=sasdb
-    fi
-    $JAVA_HOME/bin/java -cp $CLASSPATH nl.astron.lofar.sas.otb.jotdb3.jOTDBserver -s `hostname` -d $dbhost -p $port1 -o $port2 2>&1 1>&$logfile &
+    # use dbcredentials.py to extract OTDB credentials in shell form
+    source /opt/lofar/lofarinit.sh
+    declare `python3 -m lofar.common.dbcredentials -D OTDB -S`
+
+    $JAVA_HOME/bin/java -cp $CLASSPATH nl.astron.lofar.sas.otb.jotdb3.jOTDBserver -s `hostname` -d $DBHOST -P $DBPORT -p $port1 -o $port2 -U $DBUSER -W "$DBPASSWORD" 2>&1 1>&$logfile &
     serverpid=$!
     echo Started server with PID: $serverpid
 else
diff --git a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBaccess.java b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBaccess.java
index 60f661d3a1b..2b04cf3123a 100644
--- a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBaccess.java
+++ b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBaccess.java
@@ -40,9 +40,11 @@ public class jOTDBaccess implements jOTDBaccessInterface
     private Logger logger = Logger.getLogger(jOTDBaccess.class);
     private static int seqNr = 0;
     private String itsDBname="";
-    private String itsDBpwd="";
+    private String itsDBuser="";
+    private String itsDBpassword="";
     private String itsDB="";
     private String itsDBhost="";
+    private String itsDBport=0;
     private String itsRMIhost="";
     private int itsRMIobjectPort=0;
     private int itsRMIport = 0;
@@ -59,9 +61,12 @@ public class jOTDBaccess implements jOTDBaccessInterface
 
     
 
-   public jOTDBaccess( String aDBhost, String anRMIhost,int anRMIport, int anRMIobjectPort,Registry aLocalRegistry) throws RemoteException
+   public jOTDBaccess( String aDBhost, String aDBport, String aDBuser, String aDBpassword, String anRMIhost,int anRMIport, int anRMIobjectPort,Registry aLocalRegistry) throws RemoteException
    {
        itsDBhost=aDBhost;
+       itsDBport=aDBport;
+       itsDBuser=aDBuser;
+       itsDBpassword=aDBpassword;
        itsRMIhost=anRMIhost;
        itsRMIport=anRMIport;
        itsRMIobjectPort=anRMIobjectPort;
@@ -185,7 +190,7 @@ public class jOTDBaccess implements jOTDBaccessInterface
 
         try {
             // Export jOTDBconnection
-            jOTDBconnection aC = new jOTDBconnection("paulus", "boskabouter", dbName,itsDBhost,ext);
+            jOTDBconnection aC = new jOTDBconnection(itsDBuser, itsDBpassword, dbName, itsDBhost, itsDBport, ext);
             connection.put(serviceName,aC);
 
             //A custom port was specified, export the object using the port specified
diff --git a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBconnection.java b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBconnection.java
index b7bcc71d5c3..a029df31b1f 100644
--- a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBconnection.java
+++ b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBconnection.java
@@ -38,11 +38,11 @@ public class jOTDBconnection implements jOTDBinterface
     }
 
     // Just creates an object and registers the connection parameters.
-    public jOTDBconnection (String username, String passwd, String database, String hostname, String ext)
+    public jOTDBconnection (String username, String passwd, String database, String hostname, String port, String ext)
     {
         try {
             itsName=ext;
-            initOTDBconnection (username, passwd, database, hostname);
+            initOTDBconnection (username, passwd, database, hostname, port);
         } catch (Exception ex) {
             System.out.println("Error during connection init :" + ex);
         }
@@ -52,7 +52,7 @@ public class jOTDBconnection implements jOTDBinterface
      {
         try {
             itsName="_test_1";
-            initOTDBconnection("paulus", "boskabouter", "otdbtest" , "dop50.astron.nl");
+            initOTDBconnection("paulus", "boskabouter", "otdbtest" , "dop50.astron.nl", 5432);
         } catch (Exception ex) {
             System.out.println("Error during connection init :" + ex);
         }
@@ -61,7 +61,7 @@ public class jOTDBconnection implements jOTDBinterface
 
    
     // Create a OTDBconnection instance
-    private native void initOTDBconnection (String username, String passwd, String database, String hostname) throws Exception;
+    private native void initOTDBconnection (String username, String passwd, String database, String hostname, int port) throws Exception;
 
     // To test if we are (still) connected.
     @Override
diff --git a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBserver.java b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBserver.java
index c2aec3fdf85..16d53906f9b 100644
--- a/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBserver.java
+++ b/SAS/OTB/jOTDB3/src/nl/astron/lofar/sas/otb/jotdb3/jOTDBserver.java
@@ -118,6 +118,9 @@ public class jOTDBserver {
 
             
             String dbHostName     = "";
+            String dbPort         = 5432;
+            String dbUser         = "postgres";
+            String dbPassword     = "";
             String serverHostName = "";
             int rmiPort           = 0;
             int rmiObjectPort     = 0;
@@ -128,6 +131,9 @@ public class jOTDBserver {
             GetOptDesc options[] = {
                 new GetOptDesc('s', "serverHostName", true),
                 new GetOptDesc('d', "dbHostName", true),
+                new GetOptDesc('P', "dbPort", true),
+                new GetOptDesc('U', "dbUser", true),
+                new GetOptDesc('W', "dbPassword", true),
                 new GetOptDesc('p', "rmiPort", true),
                 new GetOptDesc('o', "rmiObjectPort", true),
                 new GetOptDesc('h', "help", false)
@@ -146,6 +152,15 @@ public class jOTDBserver {
                     case 'd':
                         dbHostName = (String)optionsFound.get(key);
                         break;
+                    case 'P':
+                        dbPort = (String)optionsFound.get(key);
+                        break;
+                    case 'U':
+                        dbUser = (String)optionsFound.get(key);
+                        break;
+                    case 'W':
+                        dbPassword = (String)optionsFound.get(key);
+                        break;
                     case 'p':
                         rmiPort = Integer.parseInt((String)optionsFound.get(key));
                         break;
@@ -161,7 +176,7 @@ public class jOTDBserver {
                 }
             }
             if (errs) {
-                System.out.println("Usage: java -jar jOTDBnewServer.jar  -p rmiPort -o rmiObjectPort [-s server] [-d database server]  [-h]");
+                System.out.println("Usage: java -jar jOTDBnewServer.jar  -p rmiPort -o rmiObjectPort [-s server] [-d database server] [-P database port] [-U database user] [-W database password] [-h]");
                 System.out.println("");
                 System.out.println("       The rmi port is needed for rmi traffic and must be unique fior each server");
                 System.out.println("       The rmiObjectPort is needed for firewall/tunneling java objects and must be unique for each server");
@@ -203,7 +218,7 @@ public class jOTDBserver {
             }
             logger.info("jOTDBserver setting up RMI server objects on port "+rmiObjectPort+" ...");
 
-            access = new jOTDBaccess(dbHostName, serverHostName, rmiPort, rmiObjectPort, registry);
+            access = new jOTDBaccess(dbHostName, dbPort, dbUser, dbPassword, serverHostName, rmiPort, rmiObjectPort, registry);
             jOTDBaccessInterface stub =
                 (jOTDBaccessInterface) UnicastRemoteObject.exportObject(access, rmiObjectPort);
 
diff --git a/SAS/OTB/jOTDB3/src/nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection.cc b/SAS/OTB/jOTDB3/src/nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection.cc
index 54f6c30acf5..bd3ca98d780 100644
--- a/SAS/OTB/jOTDB3/src/nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection.cc
+++ b/SAS/OTB/jOTDB3/src/nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection.cc
@@ -51,20 +51,22 @@ using namespace std;
  * Method:    initOTDBconnection
  * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;);
  */
-JNIEXPORT void JNICALL Java_nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection_initOTDBconnection(JNIEnv *env, jobject jOTDBconnection, jstring username, jstring passwd, jstring database, jstring hostname) {
+JNIEXPORT void JNICALL Java_nl_astron_lofar_sas_otb_jotdb3_jOTDBconnection_initOTDBconnection(JNIEnv *env, jobject jOTDBconnection, jstring username, jstring passwd, jstring database, jstring hostname, jstring port) {
   const char* user = env->GetStringUTFChars(username, 0);
   const char* pass = env->GetStringUTFChars(passwd, 0);
   const char* db = env->GetStringUTFChars(database, 0);
   const char* hn = env->GetStringUTFChars(hostname, 0);
+  const char* pt = env->GetStringUTFChars(port, 0);
   const string u (user);
   const string p (pass);
   const string d (db);
   const string h (hn);
+  const string prt (pt);
   const char* n(0);
   jstring str(0);
 
   try {
-    OTDBconnection* aPtr = new OTDBconnection(u, p, d, h);
+    OTDBconnection* aPtr = new OTDBconnection(u, p, d, h, prt);
     if ( !aPtr) {
       env->ThrowNew(env->FindClass("java/lang/Exception"),"Error creating OTDBconnection");
       return;
diff --git a/SubSystems/CCU_MAC/CMakeLists.txt b/SubSystems/CCU_MAC/CMakeLists.txt
index e8ddd38992d..c5b0a47f02b 100644
--- a/SubSystems/CCU_MAC/CMakeLists.txt
+++ b/SubSystems/CCU_MAC/CMakeLists.txt
@@ -1,5 +1,6 @@
 # $Id$
 
+# PyCommon is needed for OTB, which uses dbcredentials. OTB is installed in parallel to this subsystem.
 lofar_package(CCU_MAC 
-  DEPENDS CEPCU CUDaemons CURTDBDaemons StaticMetaData MessageDaemons)
+  DEPENDS CEPCU CUDaemons CURTDBDaemons StaticMetaData MessageDaemons PyCommon)
 
-- 
GitLab