Name

global.ProxyModule

Description

Process the Proxy load balancer information collected by the probe.

Script

// Discovery

var ProxyModule = Class.create();

ProxyModule.prototype = Object.extendsObject (LBModule, {
  
  initialize: function(inputServers) {
  	this.servers = inputServers; 
  	this.type = 'mod_proxy';
  },
  
  // Populate proxy information 
  populateProxyInfo: function() {
  	var msg = '';
  	var proxyLbGr = '';
  	var proxyBalancing = false;
  	
  	// Create a record in cmdb_ci_lb for mod_proxy load balancer. 
  	if (!gs.nil(this.servers[0].serverName))
  		proxyLbGr = this.updateLbTable(this.servers[0].serverName, this.servers[0].ip, 'cmdb_ci_lb_modproxy');
  	else
  		proxyLbGr = this.updateLbTable(this.servers[0].ip, this.servers[0].ip, 'cmdb_ci_lb_modproxy');
  	
  	for (var i = 0; i< this.servers.length; i++) {
  		var serverIndex = i; 
  		
  		for (var j = 0; j< this.servers[i].proxyPasses.length;j++) {
  			
  			var proxyPass = this.servers[i].proxyPasses[j]; 
  			var serviceGrList = this.populateServiceInfo(serverIndex, j, proxyLbGr); 
  			var curProxyBalancer = this.servers[serverIndex].proxyBalancers[proxyPass.lbName];
  	
  			for (var k = 0; k < serviceGrList.length; k++) {
  				var serviceGr = serviceGrList[k];
  				// populate pool information
  				var poolGr = this.updatePoolTable(proxyPass.lbName, curProxyBalancer.method, proxyLbGr, serviceGr);
  				
  				// populate pool members information 
  				if (!gs.nil(poolGr)) { 
  					for (var p = 0; p < curProxyBalancer.lbMembers.length; p++) {
  						proxyBalancing = true;
  						var lbMember = this.setLBMember(proxyPass, curProxyBalancer.lbMembers[p], proxyLbGr);
  						this.updatePoolMemberTable (lbMember, poolGr); 
  					}
  					
  				} else if (gs.nil(poolGr)) {
  					msg = 'No load balancer pool found for ' + proxyPass.lbName; 
  					DiscoveryLogger.warn (msg, 'Apache - Get Proxy Module', this.getEccQueueId(),null);
  						
  				}
  					
  			}
  		}
  	}
  	// Create Relationship 'provides:: provided by' between the apache web server and the load_balancer
  	if (proxyBalancing) {
  		var cmdbGr = g_device.getCmdbCi();
  		var discoFunctions = new DiscoveryFunctions();
  		discoFunctions.createRelationshipIfNotExists(cmdbGr, proxyLbGr.sys_id+'', 'Provides::Provided by');
  		
  	}
  	
  	this.reconcile(proxyLbGr.getValue('sys_id'));
  },
  
  // @param lbMem: a string containing information for balancerMember
  //		proxy: the proxy corresponding to the lbMem
  setLBMember: function(proxy,lbMem,lbGr) {
  	var member = {};
  	member.name = 'LBMember@'+proxy.lbName;
  	member.service_port = '';
  	member.load_balancer = lbGr.getValue('sys_id')+'';
  	
  	if (lbMem.indexOf('http://') == 0 || lbMem.indexOf('ajp://') == 0 ) {
  		var value = lbMem.split('//')[1];
  		member.ip_address = value.split(':')[0];
  		member.service_port = value.split(':')[1];
  	} else {
  		var msg = 'BalancerMember ' + lbMem + ' is not defined in the format: http(ajp)://ip.address:port';
  		DiscoveryLogger.warn (msg,'Apache - Get Proxy Module', this.getEccQueueId(), null);
  	}
  	
  	return member;
  },
  
  // populate proxy information in cmdb_ci_lb_service table
  populateServiceInfo: function(serverIndex, proxyPassIndex, lbGr) {
  	var serviceList = []; 
  	
  	for (var i = 0; i< this.servers[serverIndex].port.length; i++) {
  		
  		var service = {};
  		var sName = this.servers[serverIndex].serverName;
  		if (gs.nil(sName))
  			sName =  this.servers[0].serverName
  				
  		service.name = 'ProxyModule@'+ sName +':'+this.servers[serverIndex].port[i];
  		service.port = this.servers[serverIndex].port[i];
  		service.ip_address =  this.servers[serverIndex].ip;
  		service.input_url = this.setUrl(this.servers[serverIndex].proxyPasses[proxyPassIndex].url, this.servers[serverIndex].serverName);
  
  		if (gs.nil(service.ip_address))
  			service.ip_address = this.servers[0].ip; 
  		service.load_balancer = lbGr.sys_id +'';
  		
  		serviceList.push(this.updateServiceTable(service));
  	}
  
  	return serviceList;
  	
  },
  
  // Add the server name at the begining of the url to make it complete path
  // if url is a regular expression, it will be populated by regExpr: at the begining 
  setUrl: function(url, sName) {
  	if (url.indexOf('regExpr:') == 0)
  		return url;
  	else {
  		var urlParts = url.split('/');
  		var prefix = sName;
  	
  		if (urlParts[0] != prefix)
  			return prefix+url;
  	
  		return url;
  	}
  },
  
  type: 'ProxyModule'
});

Sys ID

57de6c5ad7c221002f04ee5b5e6103ba

Offical Documentation

Official Docs: