jeudi 10 mars 2011

[Jython] List all Queue Connection Factory on Cell

Problem:
  • How to know All  Queue Connection Factory "QCF" on Cell.
  • Show all custom properties if exit
  • Add new custom property for all QCF (option)
Class util: Logging class (see post below)

Output example:
clustername     |qcfName |jndiName    |Cache|MisTr|ConUs|Manager |host    |port|channel          |trTp  |msg  |Quies|poll|rInt|ConPol|namResProp  |type             |value   |desc                   |requi|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CLUSTER1        |None    |None        |None |None |None |None    |None    |None|None             |None  |None |None |None|None|None  |None        |None             |None    |None                   |None |
CLUSTER2        |MQD1     |jms/MQD1      |false|true |false|MQD1     |MQD1      |2828|titi.SVRCONN     |CLIENT|true |true |5000|5000|true  |None        |None             |None    |None                   |None |
CLUSTER3        |MQD2     |jms/MQD2    |false|true |false|MQD2     |MQD2      |2828|toto.SVRCONN      |CLIENT|true |true |5000|5000|true  |test        |java.lang.String |test    |Just for test          |false|

Shell Code:(with mail option)
#! /bin/ksh
webSphereProfilesPath="/usr/IBM/WebSphere/AppServer/profiles"
#profil=$1
PROG_NAME=$(basename $0)
serverName=`uname -n`
logFile="none"
logLevel="3"
custom="none"
save="none"

function help
 {
    lstProfiles=`df | grep profiles | awk '{printf $7"\n"}' | awk -F/ '{printf $NF" "}'`
    printf  "\nUsage: ${PROG_NAME} [ -m \"user1@probtp.com,user2@probtp.com,etc\"-f logfile_name -l logLevel -p profileName]\n"
    printf  "\t-m Option to send mail to user\n"
    printf  "\t-f enable log in file\n"
    printf  "\t-l log level {0 = Debug, 3=Error}\n"
    printf  "\t-p {profileName} = one of ${lstProfiles}\n"
    printf  "\t-c Add new Custom property: \"nameCustom,typeCustom,valueCustom,descCustom,ReqCustom\n\""
    printf  "\t\t example : \"MAPNAMESTYLE,java.lang.String,STANDARD,MAPNAMESTYLE_is_set_to_false_to_have_the_standard_JMS_format,false\"\n"

 }


while getopts c:p:f:l:m:h OPTION
do
    case ${OPTION} in
        f)     logFile=${OPTARG};;
        l)    logLevel=${OPTARG};;
        m)     sendMail=${OPTARG};;
        p)  profil=${OPTARG};;
        c)    custom=${OPTARG};;
        s)    save="true";;
        h)     help
            exit 2;;
    esac
done

if [ -e "/tmp/mail.tmp" ]; then
    printf "with options:\n\tlog File=>${logFile}\n \tlog Level=>${logLevel}\n \tcustom property=> ${custom}\n\tand save option => ${save} \n \n" > /tmp/mail.tmp
fi

 if [[ "$profil" == ""  ]];then 
    help | tee -a /tmp/mail.tmp
    profil=`df | grep profiles | awk '{printf $7"\n"}' | awk -F/ '{printf $NF" "}' | awk '{printf $1}'`
    #http://pueblo.sourceforge.net/doc/manual/ansi_color_codes.html
    # write in Red:
    echo "\033[31mLaunch by default whith option -p ${profil}\033[m" 
    printf "Launch by default whith option -p ${profil}\n\n"  >> /tmp/mail.tmp
 fi

if [ -e "${logFile}" ]; then
    echo "Starting ....."  > ${logFile}
fi
cd ${webSphereProfilesPath}/${profil}/bin/
./wsadmin.sh -lang jython -f /probtp_outils/was/jython/ListeQueueConnectionFactory.jy ${logFile} ${logLevel} ${custom} ${save}| grep -v "WASX7" | grep -v "sys-package-mgr" | tee -a /tmp/mail.tmp

if [[ "$sendMail" != ""  ]];then 
    if [[ "$logFile" != "none"  ]];then 
        zip -T ${logFile}.zip ${logFile} 
        uuencode ${logFile}.zip ${logFile}.joint.zip > ${logFile}.joint.zip
        echo "\n" >> /tmp/mail.tmp
        cat ${logFile}.joint.zip >> /tmp/mail.tmp
        rm -f ${logFile}.zip
        rm -f ${logFile}.joint.zip
    fi
    mailx -r "${serverName}" -s "[${serverName}] ${PROG_NAME} DMGR:${profil} " "${sendMail}" < /tmp/mail.tmp
fi


Jython Code :

# extrait le séparateur de ligne 
# /usr/IBM/WebSphere/AppServer/profiles/node01Val/bin # ./wsadmin.sh -lang jython -f /probtp_outils/was/jython/ListeQueueConnectionFactory.jy

import time
sys.path.append("/probtp_outils/was/jython/")
#import tools
#import java.lang.System  as  sys
execfile('/probtp_outils/was/jython/tools.py')

lineSeparator = java.lang.System.getProperty('line.separator')
scriptname = "ListeDataSource.jy"

if len(sys.argv) != 4:
 log = Logging()
 log.print(log.ERROR,"Missing 3 arguments")
 log.print(log.ERROR," - first: logPathName (must be none")
 log.print(log.ERROR," - second: log level " + log.VALUELEVEL)
 log.print(log.ERROR," - third ->: custom properties like 'MAPNAMESTYLE' 'java.lang.String' 'STANDARD' 'MAPNAMESTYLE is set to false to have the standard JMS format' 'false'")
 log.print(log.ERROR,"example:" + scriptname + " \"\" 3")
 sys.exit(0)
else:
 pathLog = sys.argv[0]
 levelLog = sys.argv[1]
 
 #Logging For Debug
 log = Logging(pathLog,levelLog)
 log.setLevel(levelLog)
 log.setFileName(pathLog)
 log.setClassname2Log("[ListQCF]")
 
 custom = sys.argv[2]
 if custom != "none":
  log.print(log.DEBUG,"custom: " + str(custom))
  custom = custom.split(",")
  log.print(log.DEBUG,"lcustom: " + str(custom))
  nameCustom = custom[0]
  typeCustom = custom[1]
  typeValue = custom[2]
  descCustom = custom[3]
  reqCustom = custom[4] 
 else:
  nameCustom = "none"
  typeCustom = "none"
  typeValue = "none"
  descCustom = "none"
  reqCustom = "none" 
 save = sys.argv[3]

 log.print(log.INFO,"logs Path Option: " + pathLog)
 log.print(log.INFO,"logs level: " + levelLog)
 log.print(log.INFO,"name Custom: " + nameCustom)
 log.print(log.INFO,"type Custom: " + typeCustom)
 log.print(log.INFO,"type Value: " + typeValue)
 log.print(log.INFO,"desc Custom: " + descCustom)
 log.print(log.INFO,"reqCustom: " + reqCustom)
 
log.print(log.DEBUG,"Get Cells List:")
log.print(log.DEBUG,"cells = AdminConfig.list('Cell').split(lineSeparator)")


def getobjectCustomProperties(object):
 logGetobjectCustomProperties = copy.deepcopy(log)
 logGetobjectCustomProperties.setClassname2Log("[getobjectCustomProperties]")
 
 logGetobjectCustomProperties.print(logGetobjectCustomProperties.DEBUG,"AdminConfig.showAttribute('" + object +"','propertySet')")
 return AdminConfig.showAttribute(object,"propertySet")
 

def getCustomProperties(object):
 logGetCustomProperties = copy.deepcopy(log)
 logGetCustomProperties.setClassname2Log("[getCustomProperties]")
 
 propertiesName = {}
 # propertiesSet1 = getobjectCustomProperties(object)
 # log.print(log.DEBUG,"AdminConfig.showAttribute('" + object +"','propertySet')")
 # if propertiesSet1 is not None:
 propertiesSet = object.split(lineSeparator)
 for propertySet in propertiesSet:
  logGetCustomProperties.print(logGetCustomProperties.DEBUG,"CQF Ressource property: " + propertySet)
  logGetCustomProperties.print(logGetCustomProperties.DEBUG,"AdminConfig.showAttribute('" + propertySet +"','resourceProperties').split()")
  resProperties = AdminConfig.showAttribute(propertySet,"resourceProperties").split()
  for resProperty in resProperties:
   valueproperty={}
   strResProperty = resProperty.replace('[','').replace(']','')
   logGetCustomProperties.print(logGetCustomProperties.DEBUG,"resProperty.replace=" + strResProperty)
   nameResProperty = AdminConfig.showAttribute(strResProperty,"name")
   valueproperty['name'] = nameResProperty
   type = AdminConfig.showAttribute(strResProperty,"type")
   valueproperty['type'] = type
   value = AdminConfig.showAttribute(strResProperty,"value")
   valueproperty['value'] = value
   description = AdminConfig.showAttribute(strResProperty,"description")
   if description is not None:
    description = description[:20] + "..."
   valueproperty['description'] = description
   required = AdminConfig.showAttribute(strResProperty,"required")
   valueproperty['required'] = required
   logGetCustomProperties.print(logGetCustomProperties.DEBUG,"CQF Ressource property: " + nameResProperty)
   propertiesName[nameResProperty] = valueproperty
 return propertiesName

def printQcf(object):
 
 logPrintQcf = copy.deepcopy(log)
 logPrintQcf.setClassname2Log("[printQcf]")
 
 qcfName = object["qcfName"]
 jndiName = object["jndiName"]
 manageCachedHandles = object["manageCachedHandles"]
 logMissingTransactionContext = object["logMissingTransactionContext"]
 diagnoseConnectionUsage = object["diagnoseConnectionUsage"]
 XAEnabled = object["XAEnabled"]
 queueManager = object["queueManager"]
 host = object["host"]
 port = object["port"]
 channel = object["channel"]
 transportType = object["transportType"]
 msgRetention = object["msgRetention"]
 failIfQuiesce = object["failIfQuiesce"]
 pollingInterval = object["pollingInterval"]
 rescanInterval = object["rescanInterval"]
 useConnectionPooling = object["useConnectionPooling"] 
 customProperties = object["propertiesName"]
 logPrintQcf.print(logPrintQcf.DEBUG,"customProperties= object[\"propertiesName\"]=" + str(customProperties))
 if customProperties == "None":
  nameResProperty = "None"
  type = "None"
  value = "None"
  description = "None"
  required = "None"
  print "%-16s|%-8s|%-12s|%-5s|%-5s|%-5s|%-8s|%-8s|%-4s|%-17s|%-6s|%-5s|%-5s|%-4s|%-4s|%-6s|%-12s|%-17s|%-8s|%-23s|%-5s|" % (clustername,qcfName,jndiName,manageCachedHandles,logMissingTransactionContext,diagnoseConnectionUsage,queueManager,host,port,channel,transportType,msgRetention,failIfQuiesce,pollingInterval,rescanInterval,useConnectionPooling,nameResProperty,type,value,description,required)
 else:
  for keyCustomProperty in customProperties.keys():
   nameResProperty = customProperties[keyCustomProperty]["name"]
   type = customProperties[keyCustomProperty]["type"]
   value = customProperties[keyCustomProperty]["value"]
   description = customProperties[keyCustomProperty]["description"]
   required = customProperties[keyCustomProperty]["required"]
   print "%-16s|%-8s|%-12s|%-5s|%-5s|%-5s|%-8s|%-8s|%-4s|%-17s|%-6s|%-5s|%-5s|%-4s|%-4s|%-6s|%-12s|%-17s|%-8s|%-23s|%-5s|" % (clustername,qcfName,jndiName,manageCachedHandles,logMissingTransactionContext,diagnoseConnectionUsage,queueManager,host,port,channel,transportType,msgRetention,failIfQuiesce,pollingInterval,rescanInterval,useConnectionPooling,nameResProperty,type,value,description,required)


def addProperty(oneQCF,propSet):
 
 logAddProperty = copy.deepcopy(log)
 logAddProperty.setClassname2Log("[addProperty]")
 
 #Création de la Proprieté manquante
 logAddProperty.print(logAddProperty.DEBUG,"AdminConfig.create('J2EEResourcePropertySet', "+ oneQCF+", []")
 if propSet is None:
  logAddProperty.print(logAddProperty.DEBUG,"J2EEResourcePropertySet creating ...")
  propSet = AdminConfig.create('J2EEResourcePropertySet', oneQCF, [])
 else:
  propSet=propSet.replace('[','').replace(']','')
  logAddProperty.print(logAddProperty.DEBUG,"J2EEResourcePropertySet exist: ")
  
 logAddProperty.print(logAddProperty.DEBUG,"\t" + str(propSet))
  
 lstPropValues=[['name',nameCustom],['type',typeCustom],['value',typeValue],['description',descCustom],['required',reqCustom]]
 #[['name', 'java.naming.security.principal'], ['value', jcapsUserID]]
 logAddProperty.print(logAddProperty.DEBUG,"AdminConfig.create('J2EEResourceProperty', '"+ str(propSet) + "', '" + str(lstPropValues) +"')")
 AdminConfig.create('J2EEResourceProperty', propSet, lstPropValues)
 if save != "none":
  logAddProperty.print(logAddProperty.INFO,"saving ...)")
  #AdminConfig.save()
 else:
  logAddProperty.print(logAddProperty.INFO," NOT SAVED !!!!!!")
 return propSet

cells = AdminConfig.list('Cell').split(lineSeparator)

for cell in cells:
 nameCell = AdminConfig.showAttribute(cell,"name")
 
 #Logging For Debug
 log.print(log.DEBUG,"Cell Name: " + nameCell)
 log.print(log.DEBUG,"Get Cluster List:")
 log.print(log.DEBUG,"lstClusters = AdminConfig.list('ServerCluster'," + cell + ").split(lineSeparator)")

 # En-têtes:
 print "\033[1m%-16s|%-8s|%-12s|%-5s|%-5s|%-5s|%-8s|%-8s|%-4s|%-17s|%-6s|%-5s|%-5s|%-4s|%-4s|%-6s|%-12s|%-17s|%-8s|%-23s|%-5s|\033[0;0m"  % ("clustername","qcfName","jndiName","Cache","MisTr","ConUs","Manager","host","port","channel","trTp","msg","Quies","poll","rInt","ConPol","namResProp","type","value","desc","requi")
 print "-" * 204
 lstClusters = AdminConfig.list('ServerCluster',cell).split(lineSeparator)
 for oneCluster in lstClusters:
  clustername = AdminConfig.showAttribute(oneCluster,"name")
  
  #Logging For Debug
  log.print(log.DEBUG,"Cluster Name: " + clustername)
  log.print(log.DEBUG,"Get QCF List:")
  log.print(log.DEBUG,"llstQCF = AdminConfig.list('MQQueueConnectionFactory'," + oneCluster + ")")
  
  lstQCF = AdminConfig.list('MQQueueConnectionFactory',oneCluster)
  if lstQCF != "":
   lstQCF = lstQCF.split(lineSeparator)
   for oneQCF in lstQCF:
    tabQcfValue={}
    #Inistaialisation du tableau de valeur de la QCF
    tabQcfValue["qcfName"] = AdminConfig.showAttribute(oneQCF,"name")
    #Logging For Debug
    log.print(log.DEBUG,"QCF: " + oneQCF)
    log.print(log.INFO,"CQF Name: " + tabQcfValue["qcfName"] + "; " + oneQCF)
    
    tabQcfValue["jndiName"] = AdminConfig.showAttribute(oneQCF,"jndiName")
    log.print(log.INFO,"jndiName: " + tabQcfValue["jndiName"] )
    
    tabQcfValue["manageCachedHandles"] = AdminConfig.showAttribute(oneQCF,"manageCachedHandles")
    tabQcfValue["logMissingTransactionContext"] = AdminConfig.showAttribute(oneQCF,"logMissingTransactionContext")
    tabQcfValue["diagnoseConnectionUsage"] = AdminConfig.showAttribute(oneQCF,"diagnoseConnectionUsage")
    tabQcfValue["XAEnabled"] = AdminConfig.showAttribute(oneQCF,"XAEnabled")
    tabQcfValue["queueManager"] = AdminConfig.showAttribute(oneQCF,"queueManager")
    tabQcfValue["host"] = AdminConfig.showAttribute(oneQCF,"host")
    tabQcfValue["port"] = AdminConfig.showAttribute(oneQCF,"port")
    tabQcfValue["channel"] = AdminConfig.showAttribute(oneQCF,"channel")
    tabQcfValue["transportType"] = AdminConfig.showAttribute(oneQCF,"transportType")
    tabQcfValue["msgRetention"] = AdminConfig.showAttribute(oneQCF,"msgRetention")
    tabQcfValue["failIfQuiesce"] = AdminConfig.showAttribute(oneQCF,"failIfQuiesce")
    tabQcfValue["pollingInterval"] = AdminConfig.showAttribute(oneQCF,"pollingInterval")
    tabQcfValue["rescanInterval"] = AdminConfig.showAttribute(oneQCF,"rescanInterval")
    tabQcfValue["useConnectionPooling"] = AdminConfig.showAttribute(oneQCF,"useConnectionPooling")
    
    #propertiesSet=printCustomProperties(oneQCF)
    propertiesSet=getobjectCustomProperties(oneQCF)
    log.print(log.DEBUG,"propertiesSet: " + str(propertiesSet))
    
    if  propertiesSet is None:
     if nameCustom != "none":
      newPropSet = addProperty(oneQCF,None)
      tabQcfValue["propertiesName"] = getCustomProperties(newPropSet)
     else:
      tabQcfValue["propertiesName"] = "None"
      
    else:
     propertiesName=getCustomProperties(propertiesSet)
     log.print(log.DEBUG,"propertiesName: " + str(propertiesName))
     if nameCustom != "none":
      if nameCustom in propertiesName.keys():
       log.print(log.INFO,"propertiesName Allready exist")
       tabQcfValue["propertiesName"] = propertiesName
      else:
       addProperty(oneQCF,propertiesSet) 
       tabQcfValue["propertiesName"] = getCustomProperties(propertiesSet)
     else:
      tabQcfValue["propertiesName"] = getCustomProperties(propertiesSet)
    printQcf(tabQcfValue)
  else:
   tabQcfValue={}
   tabQcfValue["qcfName"] = "None"
   tabQcfValue["jndiName"] = "None"
   tabQcfValue["manageCachedHandles"] = "None"
   tabQcfValue["logMissingTransactionContext"] = "None"
   tabQcfValue["diagnoseConnectionUsage"] = "None"
   tabQcfValue["XAEnabled"] = "None"
   tabQcfValue["queueManager"] = "None"
   tabQcfValue["host"] = "None"
   tabQcfValue["port"] = "None"
   tabQcfValue["channel"] = "None"
   tabQcfValue["transportType"] = "None"
   tabQcfValue["msgRetention"] = "None"
   tabQcfValue["failIfQuiesce"] = "None"
   tabQcfValue["pollingInterval"] = "None"
   tabQcfValue["rescanInterval"] = "None"
   tabQcfValue["useConnectionPooling"] = "None"
   tabQcfValue["propertiesName"] = "None"
   printQcf(tabQcfValue)

mercredi 9 mars 2011

Pratique :)

How to add enlight for code :

http://mlawire.blogspot.com/2009/07/blogger-syntax-highlighting.html

News logging Class

I have added methode to copy object on an other object .
You can use it like this :


class Toto: 
       def __init__(self,log):
              self.log = copy.deepcopy(log)
              self.log.setClassname2Log("[Properties]")
              self.log.print(self.log.DEBUG,"_init__")


new code:


import time

import copy

import pickle



class Logging:

    ERROR = 3

    WARNING = 2

    INFO = 1

    DEBUG = 0

    LEVEL = ['DEBUG  ', 'INFO   ', 'WARNING', 'ERROR  ']

    VALUELEVEL = "DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3"

    class2log =""

    

    filename = "none"

    bprint2screen = 0

    bprint2file = 1

    level = 3



    def __init__(self, filename = "none", levelbyDefault = 3):

        self.level = levelbyDefault

        if filename == "none":

            self.bprint2file = 0

            self.bprint2screen = 1

        else:

            if 1 >= self.level:

                self.filename = filename

                file = open(self.filename,'w')

                file.write('[' + time.asctime() + '][' + self.LEVEL[level] + ']' + self.class2log +'-------------------------------------------------------------------------------\n')

                file.write('[' + time.asctime() + '][' + self.LEVEL[level] + ']' + self.class2log + '-')

                file.write('Create Object loggin\n')

                file.close()



    #Permet la copie de l'objet

    #    - Avec reférence (pointeur sur l'objet)

    def __copy__(self):

        return self.__class__(self)

    #    - Sans reférence (vrai copie en mémoire)

    def __deepcopy__(self, memo={}):

        from copy import deepcopy

        result = self.__class__()

        result.setPrint2Screen(self.bprint2screen)

        result.setPrint2File(self.bprint2file)

        result.setLevel(self.level)

        result.setFileName(self.filename)

        result.setClassname2Log(self.class2log)

        return result



        

    def print(self,level, string):

        if int(level) >= int(self.level):

            if self.bprint2file == 1:

                file = open(self.filename,'a')

                file.write('[' + time.asctime() + '][' + self.LEVEL[level] +']' + self.class2log + ' - ') 

                file.write(string + '\n')

                file.close()

            if self.bprint2screen == 1:

                print '[' + time.asctime() + '][' + self.LEVEL[level] + ']' + self.class2log +' - ' + string

    

    def setPrint2Screen(self,bprint2screen):

        self.bprint2screen = bprint2screen

    

    def setPrint2File(self,bprint2file):

        self.bprint2file = bprint2file

        

    def setLevel(self,level):

        self.level = level

        

    def setClassname2Log(self,className):

        self.class2log = className

        

    def setFileName(self,filename):

        if filename != "none":

            self.filename = filename

            self.bprint2file = 1

            self.bprint2screen = 0

        



# -----------------------------------------

jeudi 24 février 2011

Jython And logging

For one of my jython development, i like to write traces in logging files.
So i have wrote a simple little jython class to log :

import time
import java.lang.System  as  sys

class Logging:
    ERROR = 3
    WARNING = 2
    INFO = 1
    DEBUG = 0
    LEVEL = ['DEBUG  ', 'INFO   ', 'WARNING', 'ERROR  ']
    VALUELEVEL = "DEBUG = 0, INFO = 1, WARNING = 2, ERROR = 3"
   
    filename = "none"
    bprint2screen = 0
    bprint2file = 1
    level = 3

    def __init__(self, filename = "none", levelbyDefault = 3):
        self.level = levelbyDefault
        if filename == "none":
            self.bprint2file = 0
            self.bprint2screen = 1
        else:
            if 1 >= self.level:
                self.filename = filename
                file = open(self.filename,'w')
                file.write('[' + time.asctime() + '][' + self.LEVEL[level] + ']-------------------------------------------------------------------------------\n')
                file.write('[' + time.asctime() + '][' + self.LEVEL[level] + ']-')
                file.write('Create Object loggin\n')
                file.close()
       
   
    def __del__(self):
        self('Destroy Object loggin')
       
    def print(self,level, string):
        if int(level) >= int(self.level):
            if self.bprint2file == 1:
                file = open(self.filename,'a')
                file.write('[' + time.asctime() + '][' + self.LEVEL[level] + ']-')
                file.write(string + '\n')
                file.close()
            if self.bprint2screen == 1:
                print '[' + time.asctime() + '][' + self.LEVEL[level] + '] - ' + string
   
    def setPrint2Screen(self,bprint2screen):
        self.bprint2screen = bprint2screen
   
    def setPrint2File(self,bprint2file):
        self.bprint2file = bprint2file
       
    def setLevel(self,level):
        self.level = level
   
    def setFileName(self,filename):
        if filename != "none":
            self.filename = filename
            self.bprint2file = 1
            self.bprint2screen = 0
       


sample to use it :

#add Script Jy Path to Systeme
sys.path.append("/probtp_outils/was/jython/")
#Import File where log class is defined
scriptname = "ListeDataSource.jy"


levelLog = 0 #DEBUG
pathLog = "/tmp/logs.log"

#Logging For Debug
log = classLogging.Logging()
log.setLevel(levelLog)
log.setFileName(pathLog)
 
log.print(log.INFO,"logs Information bla bla bla")
log.print(log.DEBUG,"Debug Informations, bla bla")

lundi 6 décembre 2010

Welcome !

 Hi,

Welcome to my new blog (an other again :-D ).
I will share my "martial technique" for WebSphere Portal (and maybe WebSphere Application Server,PHP , Linux,etc)

I am olso fan of photography (my portfolio) , mountain Bike , Aïkido and ubuntu.

Speak to you soon ,