Can't see the forest for the trees - when reading file, only processing first line

matt at vazor.com matt at vazor.com
Thu Apr 13 13:33:51 EDT 2006


Suggest keeping it simple:

def use_file():
  return open(options.filename).readlines()

m

News wrote:
> Hi Everyone,
>
>
> The attached code creates client connections to websphere queue managers
> and then processes an inquiry against them.
>
> The program functions when it gets options from the command line.
>
> It also works when pulling the options from a file.
>
> My issue is that it only processes the first line of the file.
>
> Does anyone know why this might be the case?
>
> The use_file() function should be returning each file line.
>
> Any help you can provide on this would be greatly appreciated.
>
> Thanks
>
>
> #!/usr/bin/python
> #
> # Programmer: Andrew Robert
> #
> # Function: Generic method to extract information from a queue manager
> #           This script is intended to be run from the command line to
> return values
> #           based on supplied keys
> #
> #           Depending on whether the -d command switch is used or not,
> the output of this script
> #           will go to the screen or be e-mailed
> #
> #           The e-mailer function included in this program is set use
> the generic smtp library
> #           instead of sendmail or procmail.
> #
> #           This is a design decision since the program is intended
> primarily to run
> #           on a Windows platform.
> #
> #
>
>
> #
> #
> #
> #
> def usage():
> 	print
> """
> usage: test_orig.py [options]
>
> options:
>   -h, --help            show this help message and exit
>   -mQMANAGER, --qmanager=QMANAGER
>                                         Queue Manager to inquire against
>   -sHOST, --server=HOST
>                                         Host the que manager resides on
>   -cCHECK, --check=CHECK
>                                         Test object if it is
> less/equal/greater
>   -pPORT, --port=PORT                   Port queue manager listens on
>   -oOBJECT, --object=OBJECT
>                                         Queue object being inquired on
>   -kKEY, --key=KEY                      object attribute to be inquired
> about
>   -tMTO, --to=MTO                       e-mail address the report will go to
>   -q, --quiet                           optional - just returns the value
>   -fFILE, --file=FILE   Pull command strings from FILE
>   -d, --display                         optional - use sends output to
> e-mail
>  """
>
>
> #
> # Trap signal interrupts if they occur
> #
> def signal_handler(signal, frame):
>         print 'Signal trapped %s' % signal
>         sys.exit(0)
>
>
> #
> # Read a file into a list
> #
> def use_file():
> 	myfile = open(options.filename)
> 	while True:
> 		line=myfile.readline()
> 		print line
> 		if len(line) == 0:
> 	                myfile.close()
> 			break
> 		else:
> 			return line
> 	myfile.close()
>
>
>
> def check_params():
>     if options.report is not None:
> 	    if options.mto is None:
> 		    print "\nAsked to send via e-mail but no destination address supplied"
> 		    usage()
> 		    sys.exit(1)
>     if options.key is None:
> 	    print"\n\nPlease enter a valid key to inquire upon.\n\nPlease check
> your options and try again"
> 	    usage()
> 	    sys.exit(1)
>
>     if ( options.port <="1414" ) or ( options.port >="1419" ):
> 	    print "\n\nAn invalid port number was used. \nValid port numbers
> are 1415,1416,1417, and 1418."
> 	    print "\nPlease check the port number and try again"
> 	    usage()
> 	    sys.exit(1)
>
> #
> #
> # Test return value
> #
> def testval(inc,value):
> 	vallen = int(value)
> 	if vallen > inc :
>                 return "\nless than test value\n"
> 	elif vallen < inc :
> 		return "\nexceeds test value\n"
> 	else:
> 		return "\nequal to test value\n"
>
>
> # Validate e-mail addresses based on lexical rules set forth in RFC 822
> # Ported from Recipe 3.9 in Secure Programming Cookbook for C and C++ by
> # John Viega and Matt Messier (O'Reilly 2003)
> #
> # If the supplied email address is syntactically valid, isAddressValid()
> # will return 1; otherwise, it will return 0.
> #
> def isAddressValid(addr):
> 	#
>         # First we validate the name portion (name at domain)
>         #
>         c = 0
>         while c < len(addr):
>             if addr[c] == '"' and (not c or addr[c - 1] == '.' or addr[c
> - 1] == '"'):
>                 c = c + 1
>                 while c < len(addr):
>                     if addr[c] == '"': break
>                     if addr[c] == '\\' and addr[c + 1] == ' ':
>                         c = c + 2
>                         continue
>                     if ord(addr[c]) < 32 or ord(addr[c]) >= 127: return 0
>                     c = c + 1
>                 else: return 0
>                 if addr[c] == '@': break
>                 if addr[c] != '.': return 0
>                 c = c + 1
>                 continue
>             if addr[c] == '@': break
>             if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return 0
>             if addr[c] in rfc822_specials: return 0
>             c = c + 1
>         if not c or addr[c - 1] == '.': return 0
>
>         # Next we validate the domain portion (name at domain)
>         domain = c = c + 1
>         if domain >= len(addr): return 0
>         count = 0
>         while c < len(addr):
>             if addr[c] == '.':
>                 if c == domain or addr[c - 1] == '.': return 0
>                 count = count + 1
>             if ord(addr[c]) <= 32 or ord(addr[c]) >= 127: return 0
>             if addr[c] in rfc822_specials: return 0
>             c = c + 1
>
>         return count >= 1
>
> #
> # Test user supplied keys to ensure they are valid
> #
> def test_valid_keys(key):
>     if valid_keys.has_key(key):
> 	    return
>     else:
> 	    print '\n\t\t\tInvalid key',key,'\n\n\n'
> 	    usage()
> 	    sys.exit(1)
>
> #
> # Test user supplied keys to ensure they are numeric
> #
> def test_numeric(key):
>     if numeric_keys.has_key(key):
> 	    return
>     else:
> 	    print '\n\t\t\tString values cannot be numerically tested',key,'\n\n\n'
> 	    usage()
> 	    sys.exit(1)
>
> #
> # SMTP mailer function
> #
> def mail(serverURL=None, sender='', to='', subject='', text=''):
>     import smtplib
>
>     """
>     Usage:
>     mail('my.mailserver.com', 'sourceaddress at wherever.com',
> 'targetaddress at wherever.com', 'test', 'This is a test')
>     """
>
>     headers = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (sender, to,
> subject)
>     message = headers + text
>     mailServer = smtplib.SMTP(serverURL)
>     check_valid=isAddressValid(to)
>     if check_valid==1 :
> 	    mailServer.sendmail(sender, to, message)
> 	    mailServer.quit()
>     else:
> 	    print "\n\nDestination e-mail address %s is invalid. \n\n\tPlease
> check and run again" % to
> 	    usage()
> 	    sys.exit(1)
>
>
> def lookup( qmgr=' ', command='', object=''):
>         import pymqi, pymqe, CMQC
> 	#
> 	# Connect to remote queue manager via client connection
>         #
> 	m        = pymqi.QueueManager(None)
> 	try:
> 		m.connectTCPClient(qmgr,pymqi.cd(),"SYSTEM.ADMIN.SVRCONN",command)
>         except pymqi.MQMIError, a:
> 		print '\n\nScript error detected:\n', a
> 		sys.exit(1)
>
>         #
>         # Inquire about the passed queue object and return value
>         #
>         q   = pymqi.Queue(m, object)
>         try:
>                 arg = 'q.inquire(CMQC.'+valid_keys[vt[count]]+')'
> 		return eval(arg)
>         except pymqi.MQMIError, a:
> 		print '\n\nScript error detected:\n', a
> 		sys.exit(1)
>
>
> if __name__ == '__main__':
>
>     import sys, string, exceptions, signal
>     from optparse import OptionParser
>
>     #
>     # Mail gateway and rfc 822 variables
>     #
>     mserver  = 'harrier.mfs.com'
>     mfrom    = 'dlmqsupport at mfs.com'
>     rfc822_specials = '()<>@,;:\\"[]'
>     count    =0
>     text     =""
>
>     #
>     # Setup signal handlers to detect if program is
>     # aborted, terminated, or Ctrl-C'ed out of
>     #
>     signal.signal(signal.SIGABRT,signal_handler)
>     signal.signal(signal.SIGINT, signal_handler)
>     signal.signal(signal.SIGTERM,signal_handler)
>
>     #
>     # Parse command line options and automatically build help/usage display
>     #
>     parser = OptionParser()
>     parser.add_option("-m","--qmanager", dest="qmanager",
>                     help="\t\tQueue Manager to inquire against"),
>     parser.add_option("-s","--server", dest="host",
>                     help="\t\tHost the que manager resides on"),
>     parser.add_option("-c","--check",  dest="check",
>                     help="\t\tTest object if it is less/equal/greater"),
>     parser.add_option("-p","--port", type="string", dest="port",
>                     help="\t\tPort queue manager listens on"),
>     parser.add_option("-o","--object", dest="object",
>                     help="\t\tQueue object being inquired on"),
>     parser.add_option("-k", "--key",dest="key",
>                     help="\t\tobject attribute to be inquired about"),
>     parser.add_option("-t","--to", type="string",dest="mto",
>                     help="\t\te-mail address the report will go to"),
>     parser.add_option("-q","--quiet", action="store_false",dest="quiet",
>                     help="\t\toptional - just returns the value"),
>     parser.add_option("-f", "--file",
>                     action="store", type="string", dest="filename",
>                     help="Pull command strings from FILE", metavar="FILE")
>     parser.add_option("-d","--display", action="store_false",dest="report",
>                     help="\t\toptional - use sends output to e-mail")
>     (options, args) = parser.parse_args()
>
>     if options.filename is not None:
> 	    line = use_file()
> 	    (options,args) = parser.parse_args(line.split())
> 	    check_params()
>     else:
> 	    check_params()
>
>     #
>     # Key dictionary
>     #
>     valid_keys={'AlterationDate':'MQCA_ALTERATION_DATE',
>     'AlterationTime':'MQCA_ALTERATION_TIME',
>     'BackoutRequeueName':'MQCA_BACKOUT_REQ_Q_NAME',
>     'BackoutThreshold':'MQIA_BACKOUT_THRESHOLD',
>     'BaseQName':'MQCA_BASE_Q_NAME',
>     'ClusterDate':'MQCA_CLUSTER_DATE',
>     'ClusterName':'MQCA_CLUSTER_NAME',
>     'ClusterNamelist':'MQCA_CLUSTER_NAMELIST',
>     'ClusterQType':'MQIA_CLUSTER_Q_TYPE',
>     'ClusterTime':'MQCA_CLUSTER_TIME',
>     'CreationDate':'MQCA_CREATION_DATE',
>     'CreationTime':'MQCA_CREATION_TIME',
>     'CurrentQDepth':'MQIA_CURRENT_Q_DEPTH',
>     'DefBind':'MQIA_DEF_BIND',
>     'DefInputOpenOption':'MQIA_DEF_INPUT_OPEN_OPTION',
>     'DefPersistence':'MQIA_DEF_PERSISTENCE',
>     'DefPriority':'MQIA_DEF_PRIORITY',
>     'DefinitionType':'MQIA_DEFINITION_TYPE',
>     'DistLists':'MQIA_DIST_LISTS',
>     'HardenGetBackout':'MQIA_HARDEN_GET_BACKOUT',
>     'HighQDepth':'MQIA_HIGH_Q_DEPTH',
>     'InhibitGet':'MQIA_INHIBIT_GET',
>     'InhibitPut':'MQIA_INHIBIT_PUT',
>     'InitiationQName':'MQCA_INITIATION_Q_NAME',
>     'MaxMsgLength':'MQIA_MAX_MSG_LENGTH',
>     'MaxQDepth':'MQIA_MAX_Q_DEPTH',
>     'MsgDeliverySequence':'MQIA_MSG_DELIVERY_SEQUENCE',
>     'MsgDeqCount':'MQIA_MSG_DEQ_COUNT',
>     'MsgEnqCount':'MQIA_MSG_ENQ_COUNT',
>     'OpenInputCount':'MQIA_OPEN_INPUT_COUNT',
>     'OpenOutputCount':'MQIA_OPEN_OUTPUT_COUNT',
>     'ProcessName':'MQCA_PROCESS_NAME',
>     'QDepthHighEvent':'MQIA_Q_DEPTH_HIGH_EVENT',
>     'QDepthHighLimit':'MQIA_Q_DEPTH_HIGH_LIMIT',
>     'QDepthLowEvent':'MQIA_Q_DEPTH_LOW_EVENT',
>     'QDepthLowLimit':'MQIA_Q_DEPTH_LOW_LIMIT',
>     'QDepthMaxEvent':'MQIA_Q_DEPTH_MAX_EVENT',
>     'QDesc':'MQCA_Q_DESC',
>     'QMgrIdentifier':'MQCA_Q_MGR_IDENTIFIER',
>     'QMgrName':'MQCA_CLUSTER_Q_MGR_NAME',
>     'QName':'MQCA_Q_NAME',
>     'QNames':'MQCACF_Q_NAMES',
>     'QServiceInterval':'MQIA_Q_SERVICE_INTERVAL',
>     'QServiceIntervalEvent':'MQIA_Q_SERVICE_INTERVAL_EVENT',
>     'QType':'MQIA_Q_TYPE',
>     'RemoteQMgrName':'MQCA_REMOTE_Q_MGR_NAME',
>     'RemoteQName':'MQCA_REMOTE_Q_NAME',
>     'RetentionInterval':'MQIA_RETENTION_INTERVAL',
>     'Scope':'MQIA_SCOPE',
>     'Shareability':'MQIA_SHAREABILITY',
>     'TimeSinceReset':'MQIA_TIME_SINCE_RESET',
>     'TriggerControl':'MQIA_TRIGGER_CONTROL',
>     'TriggerData':'MQCA_TRIGGER_DATA',
>     'TriggerDepth':'MQIA_TRIGGER_DEPTH',
>     'TriggerMsgPriority':'MQIA_TRIGGER_MSG_PRIORITY',
>     'TriggerType':'MQIA_TRIGGER_TYPE',
>     'Usage':'MQIA_USAGE',
>     'XmitQName':'MQCA_XMIT_Q_NAME'}
>
>     #
>     # Keys that can be numerically compared against
>     #
>     numeric_keys={'AlterationDate':'MQCA_ALTERATION_DATE',
>     'AlterationTime':'MQCA_ALTERATION_TIME',
>     'BackoutThreshold':'MQIA_BACKOUT_THRESHOLD',
>     'DefPriority':'MQIA_DEF_PRIORITY',
>     'ClusterDate':'MQCA_CLUSTER_DATE',
>     'ClusterTime':'MQCA_CLUSTER_TIME',
>     'CreationDate':'MQCA_CREATION_DATE',
>     'CreationTime':'MQCA_CREATION_TIME',
>     'CurrentQDepth':'MQIA_CURRENT_Q_DEPTH',
>     'HighQDepth':'MQIA_HIGH_Q_DEPTH',
>     'MaxMsgLength':'MQIA_MAX_MSG_LENGTH',
>     'MaxQDepth':'MQIA_MAX_Q_DEPTH',
>     'MsgDeliverySequence':'MQIA_MSG_DELIVERY_SEQUENCE',
>     'MsgDeqCount':'MQIA_MSG_DEQ_COUNT',
>     'MsgEnqCount':'MQIA_MSG_ENQ_COUNT',
>     'OpenInputCount':'MQIA_OPEN_INPUT_COUNT',
>     'OpenOutputCount':'MQIA_OPEN_OUTPUT_COUNT',
>     'QDepthHighEvent':'MQIA_Q_DEPTH_HIGH_EVENT',
>     'QDepthHighLimit':'MQIA_Q_DEPTH_HIGH_LIMIT',
>     'QMgrIdentifier':'MQCA_Q_MGR_IDENTIFIER',
>     'QServiceInterval':'MQIA_Q_SERVICE_INTERVAL',
>     'TriggerDepth':'MQIA_TRIGGER_DEPTH',
>     'TriggerMsgPriority':'MQIA_TRIGGER_MSG_PRIORITY'}
>
>
>     host_port  = "%s(%s)" % (options.host.lower(), options.port)
>     vt = options.key.split(',')
>
>     for i in vt:
> 	    test_valid_keys(vt[count])
> 	    inq = lookup( options.qmanager.upper(), host_port, options.object)
> 	    if options.quiet is False:
> 		    text=text+str(inq)
> 	    else:
> 		    text = text+"\n%s for %s object %s is %s" % ( vt[count],
> options.qmanager.upper(), options.object,inq)
>
>             if options.check is not None:
> 		    ct = options.check.split(",")
> 		    test_numeric(vt[count])
> 		    value_test=testval(inq,ct[count])
> 		    text=text+" "+value_test
> 	    count=count+1
>
>
>     if   options.report is None:
> 	    print text
> 	    sys.exit(0)
>     else:
> 	    subject = "Report for queue manager %s on server %s " % (
> options.qmanager.upper() , options.host.lower() )
> 	    mail( mserver, mfrom, options.mto, subject, text )
> 	    sys.exit(0)




More information about the Python-list mailing list