def getServers(client, username, enterprise, gatewayOSH, siteOSH, Framework, OSHVResult):
	#serverListing = srvrmgr.sendCommand('list servers')
	serverListing = client.executeCmd('list servers show SBLSRVR_NAME, HOST_NAME, INSTALL_DIR, SBLMGR_PID, SV_DISP_STATE, SBLSRVR_STATE, START_TIME, END_TIME, SBLSRVR_STATUS, SV_SRVRID')#@@CMD_PERMISION siebel protocol execution
	serverTbl = siebel_common.makeTable(serverListing)
	# sample output
	#SBLSRVR_NAME  HOST_NAME  INSTALL_DIR         SBLMGR_PID  SV_DISP_STATE  SBLSRVR_STATE  START_TIME           END_TIME  SBLSRVR_STATUS
	#------------  ---------  ------------------  ----------  -------------  -------------  -------------------  --------  --------------------------------
	#sblapp1_AS    sblapp1    d:\sea752\siebsrvr  1904        Running        Running        2004-08-10 15:43:46            7.5.3.3 [16172] LANG_INDEPENDENT
	#sblapp2       sblapp2    d:\sea752\siebsrvr  1336        Running        Running        2004-08-01 03:29:42            7.5.3.3 [16172] LANG_INDEPENDENT
	#sblapp1       sblapp1    d:\sea752\siebsrvr              LIBMsg: No strings available for this language setting
	#
	#3 rows returned.

	svrcount = 0
	for serverEntry in serverTbl:
		try:
			# jython doesn't have out parameters, so this is a bypass with
			# and ArrayList return value that has 2 items.
			serverObj = serverEntry[0]
			serverDataRow = serverEntry[1]
			serverOSH = makeAppServer(client, username, enterprise, serverObj, serverDataRow, siteOSH, Framework, OSHVResult)
			if serverOSH != None:
				OSHVResult.add(modeling.createLinkOSH('depend', serverOSH,gatewayOSH))
				OSHVResult.add(modeling.createLinkOSH('member', siteOSH,serverOSH))
				svrcount += 1
		except:
			logger.errorException('Failed to get server')
	logger.debug('parsed ', str(svrcount), 'app servers')
def makeComponentGroups(client, appServerOSH, ip, OSHVResult, enterprise, siteOSH):
	mapGroupNameToOSH = HashMap()

	compgrpListing = client.executeCmd('list compgrps')#@@CMD_PERMISION siebel protocol execution
	cgTbl = siebel_common.makeTable(compgrpListing)
	# sample output
	# CG_NAME                                  CG_ALIAS    CG_DESC_TEXT                                        CG_DISP_ENABLE_ST  CG_NUM_COMP  SV_NAME  CA_RUN_STATE
	# ---------------------------------------  ----------  --------------------------------------------------  -----------------  -----------  -------  ------------
	# Assignment Management                    AsgnMgmt    Assignment Management Components                    Enabled            2            sblapp2  Online
	# Communications Management                CommMgmt    Communications Management Components                Enabled            7            sblapp2  Online
	# Content Center                           ContCtr     Content Center Components                           Enabled            2            sblapp2  Online
	# Enterprise Application Integration       EAI         Enterprise Application Integration Components       Enabled            10           sblapp2  Online
	# Field Service                            FieldSvc    Field Service Components                            Enabled            13           sblapp2  Online
	# <... more>
	# n rows returned.

	cgcount = 0
	for cgEntry in cgTbl:
		cgObj = cgEntry[0]
		logger.debug(' cgEntry[0]:',  cgEntry[0])
		cgDataRow = cgEntry[1]
		cgOSH = makeCompGrp(cgObj, cgDataRow, appServerOSH)
		cgcount += 1
		# in older versions, the component contains cg name
		# in later versions, the component contains cg alias
		cgName = cgObj[0]
		cgAlias = cgObj[1]
		cgOSH.setContainer(appServerOSH)
		OSHVResult.add(cgOSH)
		mapGroupNameToOSH.put(cgName,cgOSH)
		mapGroupNameToOSH.put(cgAlias,cgOSH)

	getGroupComponents(client, mapGroupNameToOSH, ip, OSHVResult, enterprise, siteOSH)
	logger.debug('parsed ', str(cgcount), ' component groups')
def getGroupComponents(client, mapGroupNameToOSH, ip, OSHVResult, enterprise, siteOSH):
	compsListing = client.executeCmd('list comps')#@@CMD_PERMISION siebel protocol execution
	compsTbl = siebel_common.makeTable(compsListing)
	# sample output
	# SV_NAME  CC_ALIAS   CC_NAME             CT_ALIAS  CG_ALIAS  CC_RUNMODE  CP_DISP_RUN_STATE  CP_NUM_RUN_  CP_MAX_TASK  CP_ACTV_MTS  CP_MAX_MTS_  CP_START_TIME        CP_END_TIME  CP_STATUS  CC_INCARN_NO  CC_DESC_TEXT
	# -------  ---------  ------------------  --------  --------  ----------  -----------------  -----------  -----------  -----------  -----------  -------------------  -----------  ---------  ------------  ------------
	# sblapp2  AsgnSrvr   Assignment Manager            AsgnMgmt  Batch       Online             0            20           1            1            2004-08-01 03:29:42
	# sblapp2  AsgnBatch  Batch Assignment              AsgnMgmt  Batch       Online             0            20                                     2004-08-01 03:29:42
	#
	# 2 rows returned.

	cCount = 0
	#compsOSHV = ObjectStateHolderVector()

	for compEntry in compsTbl:
		try:
			compObj = compEntry[0]
			compDataRow = compEntry[1]
			attrNum = len(compObj)
			appOSH = None
			if attrNum > 3:
				compName = compObj[2]
				endIndex = compName.find(' Object Manager')
				if endIndex > 0:
					appName = compName[0:endIndex]
					appOSH = ObjectStateHolder('siebel_application')
					appOSH.setAttribute('data_name', appName)
					appOSH.setContainer(siteOSH)
					OSHVResult.add(appOSH)
			if attrNum > 4:
				# get Name or Alias
				cgName = compObj[4]
				groupOSH = mapGroupNameToOSH.get(cgName)
				if groupOSH != None:
					(compOSH, paramsFileOSH) = makeComponent(client, compObj, compDataRow, ip, enterprise)
					compOSH.setContainer(groupOSH)
					OSHVResult.add(compOSH)
					OSHVResult.add(paramsFileOSH)
					cCount += 1
					if appOSH != None and compOSH != None:
						OSHVResult.add(modeling.createLinkOSH('contains',appOSH, compOSH))
				else:
					logger.warn('Group is not found for component [', cgName, ']')
		except:
			logger.warnException('failed making component:', compDataRow)

	logger.debug('parsed ', str(cCount), ' components')
def makeSiebelgatewayOSH(client, username, enterprise, srvrmgrPath, credentialsId, ip, port, Framework):
	# container host of siebel app
	containerHostOSH = modeling.createHostOSH(ip)

	# siebel gateway application
	gatewayOSH = modeling.createApplicationOSH('siebel_gateway', ip, containerHostOSH, 'Enterprise App', 'oracle_corp')
	gatewayOSH.setAttribute('site', enterprise)
	gatewayOSH.setAttribute('application_ip', ip)
	gatewayOSH.setAttribute('application_username', username)
	gatewayOSH.setAttribute('srvrmgr_path', srvrmgrPath)
	gatewayOSH.setAttribute('credentials_id',credentialsId)
	if port:
		gatewayOSH.setIntegerAttribute('application_port', port)

	#9.0 workaround
	versionAsDouble = logger.Version().getVersion(Framework)
	if versionAsDouble >= 9:
		gatewayOSH.removeAttribute('data_name')
		gatewayOSH.setAttribute('name', ip)
		modeling.setApplicationProductName(gatewayOSH, 'Siebel Gateway Name Server')

	# get DB (Data Source) Attributes
	cmd = 'list parameter DSConnectString for named subsystem GatewayDataSrc'
	gtwydsconnstrTblTxt = client.executeCmd(cmd)#@@CMD_PERMISION siebel protocol execution
	gtwydsconnstrTbl = siebel_common.makeTable(gtwydsconnstrTblTxt)
	if gtwydsconnstrTbl == None:
		raise 'Failed to execute command: %s ;result %s ' % (cmd,gtwydsconnstrTblTxt)
	gtwydsconnstr = gtwydsconnstrTbl[0][0][1]
	gatewayOSH.setAttribute('gtwy_ds_conn_str', gtwydsconnstr)
	logger.debug('DSConnectString:', gtwydsconnstr)

	cmd = 'list parameters DSSQLStyle for named subsystem GatewayDataSrc'
	gtwydstype = getDataSourceType(client, cmd, gatewayOSH)
	if gtwydstype == None:
		cmd = 'list parameters DSSQLStyle for named subsystem ServerDataSrc'
		gtwydstype = getDataSourceType(client, cmd, gatewayOSH)
	if gtwydstype == None:
		cmd = 'list advanced params DSSQLStyle for named subsystem ServerDataSrc'
		gtwydstype = getDataSourceType(client, cmd, gatewayOSH)
	if gtwydstype == None:
		errorMSG = 'Failed to check gateway database type'
		logger.debugException(errorMSG)
		Framework.reportWarning(errorMSG)
	return gatewayOSH
def getDataSourceType(client, query, gatewayOSH):
	gtwydstype = None
	try:
		gtwydstypeTblTxt = client.executeCmd(query)#@@CMD_PERMISION siebel protocol execution
		gtwydstypeTbl = siebel_common.makeTable(gtwydstypeTblTxt)
		if gtwydstypeTbl == None:
			return gtwydstype

		if len(gtwydstypeTbl) > 0:
			gtwydstype = gtwydstypeTbl[0][0][1]
			if (gtwydstype != None) and (len(gtwydstype) > 0):
				gatewayOSH.setAttribute('gtwy_ds_type', gtwydstype)
				logger.debug('DSSQLStyle:', gtwydstype)
			else:
				gtwydstype = None
		else:
			return gtwydstype
	except:
		logger.debugException('Failed to parse siebel data type')
		gtwydstype = None
	return gtwydstype
def makeAppServer(client, username, enterprise, serverObj, serverDataRow, siteOSH, Framework, OSHVResult):
	# init return value

	logger.debug('server:', string.join(serverObj), ' dataRow:', serverDataRow)
	datalist = serverObj
	sblsvrName = datalist[0]
	logger.debug('sblsvrName:', sblsvrName)
	hostName = datalist[1]
	installDir = datalist[2]
	sblmgrPID = datalist[3]
	serverID = datalist[9]
	# if no PID, server is not running. send an event on it
	# the message of the event will be everything that follows
	# the PID field
	if string.strip(sblmgrPID) == '':
		logger.debug('problem server:', serverDataRow)
		runningServer = 0
		logger.debug('app server', sblsvrName, ' is not Running')
	else:
		runningServer = 1
		# called status, but actually version details
		status = datalist[8]
		logger.debug('status:', status)
		versionTokens = status.split()
		version = versionTokens[0]
		build = versionTokens[1]
		lang = versionTokens[2]

	# host
	logger.debug('building host:', hostName)
	try:
		ip = netutils.getHostAddress(hostName)
		logger.debug('found ip:', ip, ' for hostName:', hostName)
		if ip == None:
			return None
		if netutils.isLocalIp(ip):
			logger.debug('got loopback ip, probably error.')
			return None
		appServerHostOSH = modeling.createHostOSH(ip)
	except:
		logger.errorException('failed to convert host name:', hostName, ' to IP')
		return None

	# siebel application server
	appServerOSH = modeling.createApplicationOSH('siebel_app_server', sblsvrName, appServerHostOSH, 'Enterprise App', 'oracle_corp')
	appServerOSH.setAttribute('application_ip', ip)
	appServerOSH.setAttribute('application_username', username)
	appServerOSH.setAttribute('install_dir', installDir)
	appServerOSH.setAttribute('svr_id',serverID)

	modeling.setAppServerType(appServerOSH)

	#9.0 workaround
	versionAsDouble = logger.Version().getVersion(Framework)
	if versionAsDouble >= 9:
		appServerOSH.removeAttribute('data_name')
		appServerOSH.setAttribute('name', sblsvrName)
		modeling.setApplicationProductName(appServerOSH, 'Siebel Server')

	OSHVResult.add(appServerHostOSH)
	OSHVResult.add(appServerOSH)

	if runningServer:
		appServerOSH.setAttribute('version', version)
		appServerOSH.setAttribute('application_version', version)
		appServerOSH.setAttribute('build', build)
		appServerOSH.setAttribute('lang', lang)

		# NOTE: setting the current app server so that all info will be only
		# for it
		prompt = client.executeCmd(string.join(['set server ', sblsvrName]), 5000)#@@CMD_PERMISION siebel protocol execution
		logger.debug(prompt)

		# get component groups (and components for each group) for this server
		# NOTE: as far as we know there can't be components that are not under a group
		# if such a situation can exist we won't find such 'leaf' components
		# with the current code

		#
		#
		makeComponentGroups(client, appServerOSH, ip, OSHVResult, enterprise, siteOSH)

		if version[0] == '7' or version[0] == '8':
			# get DB (Data Source) Attributes
			# table[0][0][1] means:
			# [0] - first row (should be only one, we are inside a server context)
			# [0] - first column: the parsed fields (second column is original row for error purposes)
			# [1] - second value in the parsed fields
			try:
				svrdsconnstrTblTxt = client.executeCmd('list parameter DSConnectString for named subsystem ServerDataSrc')#@@CMD_PERMISION siebel protocol execution
				svrdsconnstrTbl = siebel_common.makeTable(svrdsconnstrTblTxt)
				svrdsconnstr = string.upper(svrdsconnstrTbl[0][0][1])
				logger.debug('svrdsconnstr:', svrdsconnstr)
				appServerOSH.setAttribute('srv_ds_conn_str', svrdsconnstr)
			except:
				error_message = 'failed to get DSConnectString (to set attribute srv_ds_conn_str) on server'
				logger.debug(error_message)
				Framework.reportWarning(error_message)
			try:
				svrdstypeTblTxt = client.executeCmd('list parameters DSSQLStyle for named subsystem ServerDataSrc')#@@CMD_PERMISION siebel protocol execution
				svrdstypeTbl = siebel_common.makeTable(svrdstypeTblTxt)
				if svrdstypeTbl:
					svrdstype = svrdstypeTbl[0][0][1]
				else:
					svrdstypeTblTxt = client.executeCmd('list parameters DSDLLName for named subsystem ServerDataSrc')#@@CMD_PERMISION siebel protocol execution
					svrdstypeTbl = siebel_common.makeTable(svrdstypeTblTxt)
					svrdstype = DLL_TO_SQL_TYPE_MAP[svrdstypeTbl[0][0][1]]

				logger.debug('svrdstype:', svrdstype)
				appServerOSH.setAttribute('svr_ds_type', svrdstype)
			except:
				error_message = 'failed to get DSSQLStyle (to set attribute svr_ds_type) on server'
				logger.debugException(error_message)
				Framework.reportWarning(error_message)


			serverType = getSiebelServerType(client)
			if serverType:
				appServerOSH.setStringAttribute('data_description', serverType)
			else:
				logger.warn("Cannot determine the type of server '%s', no required components were found" % sblsvrName)

		if version[0] == '6':
			# in Siebel 2000 (tested with 6.3), we can't obtain some of the parameters using command line API
			# get missing attributes from configuration file
			logger.info('Datasource parameters are not supported in version ', version)
			logger.info('Please run SIEBEL_DIS_APP_SERVER_CONFIG pattern to get server datasource attributes')

		try:
			odbcDSNTblTxt = client.executeCmd('list param connect')#@@CMD_PERMISION siebel protocol execution
			odbcDSNTbl = siebel_common.makeTable(odbcDSNTblTxt)
			odbcDSN = odbcDSNTbl[0][0][1]
			logger.debug('odbcDSN:', odbcDSN)
			appServerOSH.setAttribute('odbc_dsn', odbcDSN)
		except:
			error_message = 'failed to get ODBC DSN (connect param (to set attribute odbc_dsn) on server'
			logger.debug(error_message)
			Framework.reportWarning(error_message)

		# NOTE: unsetting the current app server
		prompt = client.executeCmd('unset server', 3000)#@@CMD_PERMISION siebel protocol execution
		logger.debug(prompt)

	return appServerOSH