# %I% %W% %G% %U%
# ************************************************************************

import os.path;

print " "
print "*** Beginning of Script main"
#-------------------------------------------------------------------------
if len(sys.argv) != 1:
    print "Usage: wsadmin -lang jython -f WebSphereScript.py PARAMFILE"
    print "    PARAMFILE is a file containing 'name = value' assignments for"
    print "        configuration variables like 'FIPER_HOME'."
    sys.exit(1)

# Read param file into dictionary 'param'
# Note that leading/trailing white space on key and value are ignored completely.
# There is no quoting convention - fortunately, no parameter has significant
# leading/trailing white space (yet).
param = {}
f = open(sys.argv[0])
while 1:
    line = f.readline()
    if line is None or line == '': break
    line = line.strip()
    if len(line) == 0 or line.startswith('#'): continue
    (key, value) = line.split('=', 1)
    key=key.strip()
    value=value.strip()
    param[key] = value
    #print key + ' = ' + value + ';'

f.close()

# Assign parameters to global variables.
# The following will throw KeyError if one of the required names is missing.

fiperHome  = param['FIPER_HOME']
fiperConf  = param['FIPER_CONF']
bsfRoot    = param['BSF_ROOT']
dbAdminId  = param['DB_USER']
dbAdminPw  = param['DB_USER_PW']
adminId    = param['SEE_USER']
adminPw    = param['SEE_USER_PW']
hostName   = param['WAS_HOST']
if param['SERVER_NAME']=="":
    instanceName = ""
else:
    instanceName = "-" + param['SERVER_NAME']
dbType     = param['DB_TYPE']
oracleSid  = param['ORACLE_SID']
oracleHost = param['ORACLE_HOST']
oraclePort = param['ORACLE_PORT']
oracleHome = param['ORACLE_HOME']


#---------------------------------------------------------------------
#  Database Config Parameters
#---------------------------------------------------------------------

adminAuthAlias = "fiperAdminAuth"
oracleAuthAlias = "fiperOracleAuth"

# Configuration for Oracle database. 
oracleDbName = oracleSid
oracleXAJdbcProvider = "FiperXAOracleProvider"
oracleXATemplate = "Oracle JDBC Driver (XA"
oracleXAName = "Oracle XA Data source"
#oracleXAJndiName = "fiper/jdbc/oracleXADataSource"
oracleXAJndiName = "fiper/jdbc/XADataSource"

oracleNonXAJdbcProvider = "FiperNonXAOracleProvider"
oracleNonXATemplate = "Oracle JDBC Driver("
oracleNonXAName = "Oracle non XA Data source"
#oracleNonXAJndiName = "fiper/jdbc/oraclenonXADataSource"
oracleNonXAJndiName = "fiper/jdbc/nonXADataSource"

#---------------------------------------------------------------------
#  JMS (Messaging) Config Parameters
#---------------------------------------------------------------------
busName = "FiperBus"

reliability          = "EXPRESS_NONPERSISTENT"
deliveryMode         = "NonPersistent"

# Queue/Topic Names
fiperJMSCF     =  "FIPER_CF"
fiperCFJndiName = "fiper/jms/connectionfactory"


# ************************************************************************
# ************************************************************************
# ********** Start of Configuration Steps *********************************
# ************************************************************************
# ************************************************************************

#----------------------------------------
# Use the Connected Node
#----------------------------------------
print ""
print "*** Node configuration"
global baseNode
baseNode = AdminControl.getNode()        # Get the one and only connected node
print "base Node "+ baseNode
wasServerName = "server1"
cell = AdminControl.getCell()
print "cell " + cell

#----------------------------------------
# Set scope - id of scope (cell, node, or server)
#----------------------------------------
nodeScope = AdminConfig.getid("/Node:"+baseNode+"/")
print "nodeScope: " + nodeScope
serverScope = AdminConfig.getid("/Node:"+baseNode+"/Server:"+wasServerName)
print "serverScope: " + serverScope
cellScope = AdminConfig.getid("/Cell:" + cell)
print "cellScope: " + cellScope

print ""
print "*** Configuring WebSphere Variables"
replaceVariableMapEntry(baseNode, 'fiperinstall', fiperHome)
replaceVariableMapEntry(baseNode, 'fiperconfig', fiperConf)
if bsfRoot != '':
    # Needed in shared class loader for BSF-only JAR files
    replaceVariableMapEntry(baseNode, 'bsf', bsfRoot)

print ""
print "** Setting up provider end point - searching for SIB_ENDPOINT_ADDRESS"
pps = AdminConfig.list('NamedEndPoint').split()
epi = None
for p in pps:
    if AdminConfig.showAttribute(p, 'endPointName') == 'SIB_ENDPOINT_ADDRESS':
        epi = AdminConfig.showAttribute(p, 'endPoint')
if epi is None:
    print "ERROR: Unable to get SIB_ENDPOINT_ADDRESS"
    print "ERROR: Using default port 7276"
    port = 7276
else:
    port = AdminConfig.showAttribute(epi, 'port')

providerEndPoint     = hostName + ":" + str(port) +":BootstrapBasicMessaging"
print "Provider End Point is '" + providerEndPoint + "'"

print ""
print "*** Configuring Database Resources"
createJAASDataAuth(adminAuthAlias, adminId, adminPw, "Auth Alias for Fiper Application")
createJAASDataAuth(oracleAuthAlias, dbAdminId, dbAdminPw, "Auth Alias for Oracle Database")

if dbType == 'ORACLE':
    replaceVariableMapEntry(baseNode, 'ORACLE_JDBC_DRIVER_PATH', oracleHome + "/jdbc/lib")
#end if

if dbType == 'ORACLE':
    # Configure Oracle data source
    def action():
        oracleURL = "jdbc:oracle:thin:@" + oracleHost + ":" + oraclePort + ":" + oracleDbName
        createJDBCProviderDataSource(baseNode, oracleXATemplate,    oracleXAJdbcProvider,    oracleXAJndiName,    
                oracleXAName,    oracleURL, "", "", oracleAuthAlias, 'true')
        createJDBCProviderDataSource(baseNode, oracleNonXATemplate, oracleNonXAJdbcProvider, oracleNonXAJndiName, 
                oracleNonXAName, oracleURL, "", "", oracleAuthAlias, 'false')
        try:
            myds3 = AdminConfig.getid('/DataSource:' + oracleXAName + '/')
            AdminConfig.modify(myds3, '[[connectionPool [[connectionTimeout 300] [minConnections 50] [maxConnections 100]] ]]')
            print "  Set connection pool3 done"
            myds4 = AdminConfig.getid('/DataSource:' + oracleNonXAName + '/')
            AdminConfig.modify(myds4, '[[connectionPool [[connectionTimeout 300] [minConnections 25] [maxConnections 100]] ]]')
            print "  Set connection pool4 done"
        except:
            print "Configure Oracle connection pools: EXCEPTION: ", sys.exc_type, sys.exc_value

    print "Configure Oracle data source."
    action()
# end if DB_TYPE

print ""
print "------------------------------------------------"
print "*** Configuring JMS Resources"
print "------------------------------------------------"

target = [baseNode, wasServerName]
SIBusName = createSIBus(busName , "")
busMemberName = addSIBusMember(SIBusName, "true", "dummy", target)

print "   SIBus = " + SIBusName
print "SIMember = " + busMemberName

def action():

    print ""
    print "*** Create Bus Destinations"
    createSIBDestination(busName, "job",            "Queue", target)
    createSIBDestination(busName, "log",            "Queue", target)
    createSIBDestination(busName, "task",           "Queue", target)
    createSIBDestination(busName, "workflow",       "Queue", target)
    createSIBDestination(busName, "workitem",       "Queue", target)
    createSIBDestination(busName, "stationrequest", "Queue", target)
action()

def action():
    print ""
    print "*** Create JMS Queues"
    createJMSQueue(busName, "fiperjob",            "fiper/jms/job",            "job",            "Application", cellScope)
    createJMSQueue(busName, "fiperlog",            "fiper/jms/log",            "log",            "Application", cellScope)
    createJMSQueue(busName, "fipertask",           "fiper/jms/task",           "task",           "Application", cellScope)
    createJMSQueue(busName, "fiperworkitem",       "fiper/jms/workitem",       "workitem",       "Application", cellScope)
    createJMSQueue(busName, "fiperworkflow",       "fiper/jms/workflow",       "workflow",       "Application", cellScope)
    createJMSQueue(busName, "fiperstationrequest", "fiper/jms/stationrequest", "stationrequest", "Application", cellScope)

    # Create the JMS Topics.
    createJMSTopic("fiperstation", "station", "fiper/jms/station", busName, cellScope, 1)
    # Added V5.5 - SCR BZ41644
    createJMSTopic("fiperjobmonitor", "jobmonitor", "fiper/jms/jobmonitor", busName, cellScope, 0)

    # Set persistence state of default topic space
    ts = AdminConfig.list('SIBTopicSpace')
    print ""
    print "Setting persistence on topic space " + ts
    #print AdminConfig.show(ts)
    AdminConfig.modify(ts, '[[reliability EXPRESS_NONPERSISTENT] [maxReliability ASSURED_PERSISTENT]]')
    #print "After change:"
    #print AdminConfig.show(ts)

    # Set persistence on all Queues
    queueList = AdminConfig.list('SIBQueue').split((java.lang.System.getProperty('line.separator')))
    for queue in queueList:
        print "Setting Persistence on queue " + queue
        AdminConfig.modify(queue, '[[reliability EXPRESS_NONPERSISTENT] [maxReliability ASSURED_PERSISTENT]]')

action()

def action():
    print ""
    print "*** CreateJMSConnection  busMemberName=" + busMemberName + ";"
    createJMSConnectionFactory(SIBusName, fiperJMSCF, "", fiperCFJndiName, adminAuthAlias, cellScope, providerEndPoint, busMemberName)

    print ""
    print "*** Create Message Driven Bean Activation Specifications"
    createMDBActivationSpec("job",                 "fiper/act/job",          busName, "fiper/jms/job",      "Queue", 10, cellScope, adminAuthAlias)
    createMDBActivationSpec("log",                 "fiper/act/log",          busName, "fiper/jms/log",      "Queue", 10, cellScope, adminAuthAlias)
    createMDBActivationSpec("task",                "fiper/act/task",         busName, "fiper/jms/task",     "Queue",  1, cellScope, adminAuthAlias)
    createMDBActivationSpec("task2",               "fiper/act/task2",        busName, "fiper/jms/task",     "Queue",  1, cellScope, adminAuthAlias)
    createMDBActivationSpec("task3",               "fiper/act/task3",        busName, "fiper/jms/task",     "Queue",  1, cellScope, adminAuthAlias)
    createMDBActivationSpec("workflow",            "fiper/act/workflow",     busName, "fiper/jms/workflow", "Queue", 10, cellScope, adminAuthAlias)
    createMDBActivationSpec("workflowlarge",       "fiper/act/workflowlarge",busName, "fiper/jms/workflow", "Queue",  2, cellScope, adminAuthAlias)
    createMDBActivationSpec("workitem",            "fiper/act/workitem",     busName, "fiper/jms/workitem", "Queue", 10, cellScope, adminAuthAlias)
    createMDBActivationSpec("workitemlarge",       "fiper/act/workitemlarge",busName, "fiper/jms/workitem", "Queue",  2, cellScope, adminAuthAlias)
    createMDBActivationSpec("stationrequest",      "fiper/act/stationrequest",      busName, "fiper/jms/stationrequest",  "Queue", 10, cellScope, adminAuthAlias)
    createMDBActivationSpec("stationrequestlarge", "fiper/act/stationrequestlarge", busName, "fiper/jms/stationrequest",  "Queue",  2, cellScope, adminAuthAlias)
    # Added V5.5 - SCR BZ41644
    createMDBActivationSpec("jobmonitor",          "fiper/act/jobmonitor",   busName, "fiper/jms/jobmonitor", "Topic", 10, cellScope, adminAuthAlias)
action()

print ""
print "------------------------------------------------"
print " Modify Server settings"
print "------------------------------------------------"


print "************* Set log attributes **************"
outLog = AdminConfig.showAttribute(serverScope, 'outputStreamRedirect')
errLog = AdminConfig.showAttribute(serverScope, 'errorStreamRedirect')
AdminConfig.modify(outLog, [['rolloverSize', 10]])
AdminConfig.modify(outLog, [['maxNumberOfBackupFiles', 20]])
AdminConfig.modify(errLog, [['rolloverSize', 10]])
AdminConfig.modify(errLog, [['maxNumberOfBackupFiles', 20]]) 

print "************** jvm settings ************"
jvm = AdminConfig.list("JavaVirtualMachine", serverScope)
#print AdminConfig.showall(jvm)
AdminConfig.modify(jvm, [['initialHeapSize', 256 ], ['maximumHeapSize', 1400 ]])

print "************** Transaction Service Settings ***************"
ts = AdminConfig.list("TransactionService", serverScope);
AdminConfig.modify(ts, [['totalTranLifetimeTimeout', 300]])
#print AdminConfig.showall(ts);

print "************** ORB Service Settings ***************"
orb = AdminConfig.list("ObjectRequestBroker", serverScope);
AdminConfig.modify(orb, [['noLocalCopies', 'true']])
#print AdminConfig.showall(orb);

print "************** Enable startup beans service **********"
startBeanSvc = AdminConfig.list("StartupBeansService", serverScope);
AdminConfig.modify(startBeanSvc , [['enable', 'true']])

# figure out where lib directory is based on platform.
if java.lang.System.getProperty('os.name') == 'Linux':
    osDir = "Linux_7.3_x86"
else:
    osDir = "win32"

print "************** New jvm settings ****************"
#print AdminConfig.showall(jvm)
print "************************************************"
print " Adding custom properties "
print "************************************************"
encOverrideProp = [["name", "client.encoding.override"], ["required", "false"], ["value", "UTF-8"]]
#javaLibPathProp = [["name", "java.library.path"], ["required", "false"], ["value", "${fiperinstall}/lib/" + osDir]]
fiperParmfile1 = [["name", "fiper.system.configfile"], ["required", "false"], 
                  ["value", "acs" + instanceName + ".properties"]]
fiperParmfile2 = [["name", "fiper.webtop.parmfile"], ["required", "false"],
                  ["value", "webtop" + instanceName + ".properties"]]
fiperParmfile3 = [["name", "fiper.webdashboard.parmfile"], ["required", "false"],
                  ["value", "webdashboard" + instanceName + ".properties"]]
fiperParmfile4 = [["name", "fiper.system.installpath"], ["required", "false"], 
                  ["value", "${fiperinstall}"]]
fiperParmfile5 = [["name", "fiper.system.configpath"], ["required", "false"], 
                  ["value", "${fiperconfig}"]]
heapDumpProp = [["name", "IBM_HEAPDUMP_OUTOFMEMORY"], ["required", "false"], ["value", "false"]]
javaDumpProp = [["name", "IBM_JAVADUMP_OUTOFMEMORY"], ["required", "false"], ["value", "false"]]
oracleAutoCommitProp = [["name", "oracle.jdbc.autoCommitSpecCompliant"], ["required", "false"], ["value", "false"]]
newprops = []
newprops.append(encOverrideProp)
#newprops.append(javaLibPathProp)
newprops.append(fiperParmfile1)
newprops.append(fiperParmfile2)
newprops.append(fiperParmfile3)
newprops.append(fiperParmfile4)
newprops.append(fiperParmfile5)
newprops.append(heapDumpProp)
newprops.append(javaDumpProp)
newprops.append(oracleAutoCommitProp)
AdminConfig.modify(jvm, [["systemProperties", newprops]])
#print "JVM settings after changes"
#print AdminConfig.showall(jvm)


print "************** Java Process Definition settings"
jpd = AdminConfig.list("JavaProcessDef", serverScope)
#print AdminConfig.showall(jpd)
osname = os.path.basename(fiperHome)
if osname == '':
    osname = os.path.basename(os.path.dirname(fiperHome))
if osname == 'win_b64' or osname == 'intel_a':
    # Nothing to do
    print "**** Skipping environment setting for Windows ***"
    pass
else:
    if osname == 'aix_a64':
        ldvar = 'LIBPATH'
    else:
        ldvar = 'LD_LIBRARY_PATH'
    
    ldprop = [["name", ldvar], ["required", "false"], ["value", "${fiperinstall}/code/bin"]]
    newprops = [ ldprop ]
    AdminConfig.modify(jpd, [["environment", newprops ]])

print "*** Java Process Definition after updates ***"
print AdminConfig.showall(jpd)

# ***********************************************************
# Set the server thread pools
# ***********************************************************
# get the thread pool manager
tpm = AdminConfig.list('ThreadPoolManager', serverScope)
# get the list of thread pools
tps =  AdminConfig.showAttribute(tpm, 'threadPools')
# parse the list into an array, they are separated by a blank, also remove the brackets
tplist = tps.replace('[','').replace(']','').split(" ")
# find the threadpool named "Default" and modify its attributes
for tp in tplist:
  tpname = AdminConfig.showAttribute(tp, 'name')
  if (tpname == "Default"):
    AdminConfig.modify(tp, [['minimumSize', 25]])
    AdminConfig.modify(tp, [['maximumSize', 50]])
    AdminConfig.modify(tp, [['inactivityTimeout', 30000]])
    AdminConfig.modify(tp, [['isGrowable', 'true']])

# for testing, to view the new settings
#for tp in tplist:
#   print("ThreadPool is " + AdminConfig.showAttribute(tp, 'name'))
#   print("Attributes are " + AdminConfig.showall(tp))

#----------------------------------------
#  Create shared library
#----------------------------------------
print ""
print "*** Create Shared Library"
attrs = [ ["name", "fipercommon"], ["classPath", "${fiperinstall}/docs/java/SMAFIPutiljni.jar;${fiperinstall}/docs/javacommon/comfyj.jar;${fiperinstall}/docs/javacommon/jniwrap.jar;${fiperinstall}/docs/javacommon/winpack.jar;${fiperinstall}/docs/javacommon/slf4j-api.jar"], ["nativePath", "${fiperinstall}/code/bin/" ] ]
fipercommon = AdminConfig.create("Library", cellScope, attrs)

print "  Library " + fipercommon
#print "  Attributes: " + AdminConfig.showall(fipercommon)

# Class loader is parented on the ApplicationServer, note the Server
appServer = AdminConfig.list("ApplicationServer", serverScope)
classLoader = AdminConfig.create("Classloader", appServer, [ [ "mode", "PARENT_FIRST"] ])
libRef = AdminConfig.create("LibraryRef", classLoader, [ [ "libraryName", "fipercommon" ] ])

print "   ClassLoader " + classLoader
#print "       Attrs: " + AdminConfig.show(classLoader)
print "   LibRef " + libRef
#print "       Attrs: " + AdminConfig.show(libRef)

#----------------------------------------
# JPA Configuration
#----------------------------------------
svr = AdminConfig.getid("/Server:"+wasServerName+"/")
#print "server1: " + svr
AdminTask.modifyJPASpecLevel(svr, '[ -specLevel 2.0]')

#----------------------------------------
# IMPORTANT
# Save the configuration changes made
#----------------------------------------
saveConfiguration()

