Esempio n. 1
0
int bartlby_extension_startup(void * shm_addr, void * dataLoaderHandle, char * configfile) {
	_log(LH_MOD, B_LOG_INFO, "extlogger: %s", configfile);
	/*
	extlogger_type=
	extlogger_host=
	extlogger_user=
	extlogger_password=
	extlogger_db=
	*/
	cType  = getConfigValue("extlogger_type", configfile);
	cHost = getConfigValue("extlogger_host", configfile);
	cUser = getConfigValue("extlogger_user", configfile);
	cPassword = getConfigValue("extlogger_password", configfile);
	cDB = getConfigValue("extlogger_db", configfile);
	
	if(cType == NULL || cHost == NULL || cUser  == NULL || cPassword == NULL || cDB == NULL) {
		_log(LH_MOD, B_LOG_CRIT, "extlogger: configuration failed 'extlogger_type', 'extlogger_host', 'extlogger_user', 'extlogger_password', 'extlogger_db'");
	}
	
	
	
	gHdr=bartlby_SHM_GetHDR(shm_addr);
	gDataLoaderHandle=dataLoaderHandle;
	gCFG=configfile;
	_log(LH_MOD, B_LOG_INFO, "Extlogger initiated");
	
	return EXTENSION_OK;
}
Esempio n. 2
0
void sched_write_back_all(char * cfgfile, void * shm_addr, void * SOHandle) {
	int x;
	
	struct service * services;
	
	int (*doUpdate)(struct service *,char *);
	


	//int (*doUpdateTrap)(struct trap *, char *);
	
	char * dlmsg;
	
	gshm_hdr=bartlby_SHM_GetHDR(shm_addr); //just to be sure ;)
	services=bartlby_SHM_ServiceMap(shm_addr);
	
	
	LOAD_SYMBOL(doUpdate,SOHandle, "doUpdate");
	

	for(x=0; x<gshm_hdr->svccount; x++) {
		//Do not writeback services that came in via an orch-node
		if(bartlby_orchestra_belongs_to_orch(&services[x], cfgfile) < 0) {
			continue;
		}
		if(doUpdate(&services[x], cfgfile) != 1) {
			_log(LH_SCHED, B_LOG_CRIT, "doUpdate() failed in sched_writeback_all() '%s` for service id: %d", strerror(errno), services[x].service_id);		
		}
	}	
	_log(LH_SCHED, B_LOG_DEBUG,"wrote back %d services!", x);
	
	/*
	for(x=0; x<gshm_hdr->trapcount; x++) {
		//Do not writeback services that came in via an orch-node
		if(bartlby_orchestra_trap_belongs_to_orch(&traps[x], cfgfile) < 0) {
			continue;
		}
		if(doUpdateTrap(&traps[x], cfgfile) != 1) {
			_log(LH_SCHED, B_LOG_CRIT, "doUpdateTrap() failed in sched_writeback_all() '%s` for trap id: %d", strerror(errno), traps[x].trap_id);		
		}
	}	
	_log(LH_SCHED, B_LOG_DEBUG,"wrote back %d traps!", x);
	*/


	/*
	for(x=0; x<gshm_hdr->srvcount; x++) {
		doUpdateServer(&servers[x], cfgfile);
	}
	_log("wrote back %d servers!", x);
	*/
	
	
	
	
}
Esempio n. 3
0
int bartlby_extension_startup(void * shm_addr, void * dataLoaderHandle, char * configfile) {
	_log(LH_MOD, B_LOG_INFO, "distributive: %s", configfile);
	
	distr_command  = getConfigValue("distributive_command", configfile);
	
	
	if(distr_command == NULL) {
		_log(LH_MOD, B_LOG_CRIT, "distributive: configuration failed 'distributive_command'");
	}
	
	
	
	gHdr=bartlby_SHM_GetHDR(shm_addr);
	gDataLoaderHandle=dataLoaderHandle;
	gCFG=configfile;
	_log(LH_MOD, B_LOG_INFO, "distributive initiated");
	
	return EXTENSION_OK;
}
Esempio n. 4
0
int bartlby_extension_startup(void * shm_addr, void * dataLoaderHandle, char * configfile) {
	int x;
	struct service * svcmap;
	unsigned char new_hash_bin[SHA_DIGEST_LENGTH];
	char new_hash_str[40];
	
	
	_log("statehistory: %s", configfile);
	
	cfg_statehistory_dir = getConfigValue("statehistory_logdir", configfile);
	
	
	gHdr=bartlby_SHM_GetHDR(shm_addr);
	gDataLoaderHandle=dataLoaderHandle;
	gCFG=configfile;
	svcmap=bartlby_SHM_ServiceMap(shm_addr);
	
	
	if(cfg_statehistory_dir == NULL) {
		_log("statehistory you have to set 'statehistory_logdir'");
	}
	
	_log("statehistory: servicescount->%ld", gHdr->svccount);
	
	state_hash_map = malloc(sizeof(struct service_hash_map)*(gHdr->svccount+1));
	
	//initial hashing
	for(x=0; x<gHdr->svccount; x++) {
				state_hash_map[x].service_id=svcmap[x].service_id;
				SHA1(svcmap[x].new_server_text, strlen(svcmap[x].new_server_text), new_hash_bin);
				convertSHA1BinaryToCharStr(new_hash_bin, new_hash_str);				
				sprintf(state_hash_map[x].sha1_hash, "%s", new_hash_str);
				state_hash_map[x].last_write = time(NULL);
	}
	
	
	return EXTENSION_OK;
}
Esempio n. 5
0
/// TEST FUNCTIONS
void test_trap_lib(void *data) {
	(void)data;
	void * SOHandle;
	void * bartlby_address;


	struct trap modified_object;
	struct trap returned_object;


	struct trap * srvmap;
	
	srvmap=NULL;
	long (*AddTrap)(struct trap *, char *);
	int (*UpdateTrap)(struct trap *, char *);
	int (*DeleteTrap)(long trap_id, char *);
	int (*GetTrapById)(long, struct trap *, char * );
	long (*TrapChangeId)(long, long, char*);
	int (*GetTrapMap)(struct trap*, char*, int);
	


	int rtc=-1;
	long object_id=-1;
	long lrtc=-1;
	long NN=-1;
	int x;
	struct shm_header * shm_hdr;

	
	bartlby_address=NULL;
	SOHandle=NULL;
	SKIP_IF_NOT_RUNNING(CONFIG);

	SOHandle = bartlby_get_sohandle(CONFIG);
	bartlby_address=bartlby_get_shm(CONFIG);

	
	tt_ptr_op(bartlby_address, !=, NULL);
	tt_ptr_op(SOHandle, !=, NULL);
	
	shm_hdr = bartlby_SHM_GetHDR(bartlby_address);

	
	LOAD_SYMBOL_TEST(AddTrap,SOHandle, "AddTrap");
	LOAD_SYMBOL_TEST(DeleteTrap,SOHandle, "DeleteTrap");
	LOAD_SYMBOL_TEST(UpdateTrap,SOHandle, "UpdateTrap");	
	LOAD_SYMBOL_TEST(GetTrapById,SOHandle, "GetTrapById");	
	LOAD_SYMBOL_TEST(TrapChangeId,SOHandle, "TrapChangeId");	
	LOAD_SYMBOL_TEST(GetTrapMap,SOHandle, "GetTrapMap");	
	
	


	/******* ADD TRAP ****/
	lrtc=AddTrap(&dummy_trap, CONFIG);
	object_id=lrtc;
	tt_int_op(lrtc, >, 0);
	TT_DECLARE("INFO",("... Added Trap id: %ld", object_id));
	/******* ADD TRAP ****/


	/******* MODIFY TRAP ****/
	dummy_trap.trap_id=object_id;
	memcpy(&modified_object,&dummy_trap, sizeof(struct trap));
	memcpy(&returned_object,&dummy_trap, sizeof(struct trap));
	snprintf(modified_object.trap_catcher,2048, "modified-unit-test");
	rtc=UpdateTrap(&modified_object, CONFIG);
	tt_int_op(rtc, ==, 1);
	TT_DECLARE("INFO",("... Modified Trap, changed name"));
	/******* MODIFY TRAP ****/

	/******* GETTRAPBYID ****/
	rtc=GetTrapById(object_id, &returned_object, CONFIG);
	tt_int_op(rtc, ==, 0);
	tt_str_op(returned_object.trap_catcher, ==, modified_object.trap_catcher);
	TT_DECLARE("INFO",("... get trap by id  %ld", object_id));
	/******* GETTRAPBYID ****/

	/******* TRAPCHANGEID ****/
	NN=lrtc+999;
	object_id=TrapChangeId(lrtc, NN, CONFIG);
	tt_int_op(object_id, ==, NN);
	TT_DECLARE("INFO",("... Changed trap id from %ld to %ld ",lrtc, object_id));
	/******* TRAPCHANGEID ****/


	


	/*** TRAPMAP **/
	srvmap = malloc(sizeof(struct trap)*(shm_hdr->trapcount+2));
	rtc=GetTrapMap(srvmap, CONFIG, TEST_ORCH_ID);
	tt_int_op(rtc, >, 0);
	lrtc=-1;
	for(x=0; x<rtc; x++) {
		if(srvmap[x].trap_id==object_id) {
			lrtc = 1;
		}
	}
	tt_int_op(lrtc, ==, 1);
	TT_DECLARE("INFO",("... Created TrapMap and found  %ld ", object_id));
	/*** TRAPMAP **/






	/*** DELETETRAP **/
	rtc=DeleteTrap(object_id, CONFIG);
	tt_int_op(rtc, ==, 1);
	TT_DECLARE("INFO",("... Delete Trap  %ld ", object_id));
	/*** DELETETRAP **/
	




	end:
		if(srvmap != NULL) free(srvmap);
		if(SOHandle != NULL) dlclose(SOHandle);
		if(bartlby_address != NULL) shmdt(bartlby_address);
	
	;


}
Esempio n. 6
0
void test_trap_running(void *data) {
	(void)data;
	void * SOHandle;
	void * bartlby_address;
	struct shm_header * shm_hdr;
	struct trap * map;
	int x;
	int res;
	
	int (*AddTrap)(struct trap *, char *);
	int (*DeleteTrap)(long trap_id, char *);
		

	int rtc=-1;
	long lrtc=-1;
	long object_id=-1;

	bartlby_address=NULL;
	SOHandle=NULL;
	SKIP_IF_NOT_RUNNING(CONFIG);

	SOHandle = bartlby_get_sohandle(CONFIG);
	bartlby_address=bartlby_get_shm(CONFIG);

	
	tt_ptr_op(bartlby_address, !=, NULL);
	tt_ptr_op(SOHandle, !=, NULL);
	
	
	/// ADD trap

	LOAD_SYMBOL_TEST(AddTrap,SOHandle, "AddTrap");
	LOAD_SYMBOL_TEST(DeleteTrap,SOHandle, "DeleteTrap");


	lrtc=AddTrap(&dummy_trap, CONFIG);
	object_id=lrtc;
	tt_int_op(lrtc, >, 0);
	
	TT_DECLARE("INFO",("... Added Trap id: %ld", object_id));

	dummy_trap.trap_id=object_id;
	
	//Reload - and detach/reattach to shm
	shm_hdr=bartlby_SHM_GetHDR(bartlby_address);
	shm_hdr->do_reload=1;
	shmdt(bartlby_address);
	sleep(2);
	

	bartlby_address=bartlby_get_shm(CONFIG);

	shm_hdr=bartlby_SHM_GetHDR(bartlby_address);

	TT_DECLARE("INFO", ("Reloaded SHM"));
	tt_int_op(shm_hdr->do_reload, ==, 0);

	map = bartlby_SHM_TrapMap(bartlby_address);

	res = -1;
	for(x=0; x<shm_hdr->trapcount; x++) {
		
		if(map[x].trap_id == object_id) {
			res = 1;
			break;
		}
	}


	rtc=DeleteTrap(object_id, CONFIG);
	tt_int_op(rtc, ==, 1);

	TT_DECLARE("INFO",("... Delete Trap  ", object_id));



	tt_int_op(res, ==, 1);
	TT_DECLARE("INFO",("... SHM Trap found  ", object_id));



	end:
		if(SOHandle != NULL) dlclose(SOHandle);
		if(bartlby_address != NULL) shmdt(bartlby_address);
	;


}
Esempio n. 7
0
int schedule_loop(char * cfgfile, void * shm_addr, void * SOHandle) {

	
	
	int x;
	int cfg_max_parallel=0;
	
	
	
	int round_start, round_visitors;
	char * cfg_sched_pause;
	char * cfg_g_micros_before_after_check;
	char * cfg_sched_mode;
	char * cfg_sched_worker_count;
	
	int sched_pause;
	
	struct timeval  stat_round_start, stat_round_end, run_c_start, run_c_end;
	
	
	char * cfg_mps;
		

	struct service * services;
	struct service_sort * ssort;
	 
	 
	int cfg_max_load;
	double current_load[3];
	
	char  * cfg_load_max;
	char * cfg_notification_aggregation;
	int notification_aggregate_interval;
	
	
	int ct, expt;

	int worker_slot=0;
	
	sched_pid=getpid();
	
	gshm_addr=shm_addr;
	gSOHandle=SOHandle;
	gConfig=cfgfile;
	
	


	
	gshm_hdr=bartlby_SHM_GetHDR(shm_addr);
	ssort  = malloc(sizeof(struct service_sort)*gshm_hdr->svccount);
	
	
	_log(LH_SCHED, B_LOG_INFO,"Scheduler working on %ld Services", gshm_hdr->svccount);
	
	cfg_notification_aggregation=getConfigValue("notification_aggregation_interval", cfgfile);

	if(cfg_notification_aggregation == NULL) {
		notification_aggregate_interval=0;
	} else {
		notification_aggregate_interval=atoi(cfg_notification_aggregation);
		free(cfg_notification_aggregation);
	}

	cfg_mps=getConfigValue("max_concurent_checks", cfgfile);
	if(cfg_mps == NULL) {
		_log(LH_SCHED, B_LOG_WARN,"<Warn>Defaulting max_concurent_checks to '20'");
		cfg_max_parallel=20;
	} else {
		cfg_max_parallel=atoi(cfg_mps);
		free(cfg_mps);	
	}
	cfg_load_max=getConfigValue("max_load", cfgfile);
	
	if(cfg_load_max == NULL) {
		cfg_max_load=0;
		
	} else {
		cfg_max_load=atoi(cfg_load_max);
		free(cfg_load_max);
	}
	
	signal(SIGINT, catch_signal);
	signal(SIGUSR1, catch_signal);
	signal(SIGUSR2, catch_signal);
	signal(SIGTERM, catch_signal);
	signal(SIGKILL, catch_signal);
	
	
	services=bartlby_SHM_ServiceMap(shm_addr);
	gservices=services;
	
	gshm_hdr->do_reload=0;
	
	cfg_sched_pause = getConfigValue("sched_round_pause", cfgfile);
	if(cfg_sched_pause == NULL) {
		sched_pause=100;	
		_log(LH_SCHED, B_LOG_INFO,"info: sched_pause defaulted to: %d milli-seconds (set sched_round_pause to modify)", sched_pause);
	} else {
		sched_pause=atoi(cfg_sched_pause);
		free(cfg_sched_pause);
		if(sched_pause <= 0) {
			sched_pause=1;
			_log(LH_SCHED, B_LOG_WARN,"info: sched_pause really low should'nt be less than 1 milliseconds defaulting to it: %d", sched_pause);
		}
	}
	cfg_g_micros_before_after_check = getConfigValue("sched_micros_before_after_check", cfgfile);
	if(cfg_g_micros_before_after_check == NULL) {
		_log(LH_SCHED, B_LOG_INFO,"HINT: to tune performance see 'sched_micros_before_after_check' defaults to 700");	
	} else {
		g_micros_before_after_check=atoi(cfg_g_micros_before_after_check);
		_log(LH_SCHED, B_LOG_DEBUG,"micros_before_after=%d", g_micros_before_after_check);
		free(cfg_g_micros_before_after_check);
	}
	
	long local_svc_count=0;
	long local_idx=0;
	//Make a second sortable array
	for(x=0; x<gshm_hdr->svccount; x++) {
			if(bartlby_orchestra_belongs_to_orch(&services[x], cfgfile) < 0) {
				continue; 		//Kick from sched circle if service never would be checked
			}
			ssort[local_idx].svc=&services[x];	
			local_idx++;
			local_svc_count++;
	}
	_log(LH_SCHED, B_LOG_DEBUG,"Scheduler working on %ld Services after kick: %ld", gshm_hdr->svccount, local_idx);
	
	cfg_sched_mode = getConfigValue("sched_mode", cfgfile);
	

	if(cfg_sched_mode == NULL) {
		sched_mode=SCHED_MODE_FORK;
		_log(LH_SCHED, B_LOG_DEBUG,"Defaulting sched mode to SCHED_MODE_FORK");
	} else {
		sched_mode=atoi(cfg_sched_mode);
		_log(LH_SCHED, B_LOG_DEBUG,"Set sched_mode to:%d", sched_mode);
		free(cfg_sched_mode);
		sched_worker_count=0;
		if(sched_mode == SCHED_MODE_WORKER) {
			cfg_sched_worker_count = getConfigValue("sched_worker_count", cfgfile);			
			if(cfg_sched_worker_count == NULL) {
				sched_worker_count=5;
				_log(LH_SCHED, B_LOG_INFO,"Defaulting sched_worker_count to 5");
			} else {
				sched_worker_count=atoi(cfg_sched_worker_count);
				_log(LH_SCHED, B_LOG_INFO,"Using %d workers", sched_worker_count);
				free(cfg_sched_worker_count);
			}
			_log(LH_SCHED, B_LOG_DEBUG,"USING WORKER MODE");
		}
		if(sched_mode == SCHED_MODE_FORK) {
			_log(LH_SCHED, B_LOG_DEBUG,"using FORK MODE");
		}
		if(sched_mode == SCHED_MODE_PROFILE) {
			_log(LH_SCHED, B_LOG_DEBUG, "using profile mode");
		}

	}


	

	// Check if we should use worker or per check-fork

	sched_init_workers();
	
	while(1) {
		
		if(gshm_hdr->do_reload == 1 || gshm_hdr->do_reload == 2) {
			_log(LH_SCHED, B_LOG_INFO,"queuing Reload");	
			sched_wait_open(1, 0);
			signal(SIGCHLD, SIG_IGN);
			free(ssort);
			return -2;
		}
		if(do_shutdown == 1) {
			_log(LH_SCHED, B_LOG_INFO,"Exit recieved");	
			sched_wait_open(1,0);
			signal(SIGCHLD, SIG_IGN);
			free(ssort);
			break;
		}
		
		if(gshm_hdr->sirene_mode == 1) {
			//We are in Sirene Mode dont check anything just notifie workers that something b ad is going on
			bartlby_check_sirene(cfgfile,shm_addr);
			continue;	
		}
		
		
		round_start=time(NULL);
		gettimeofday(&stat_round_start,NULL);
		round_visitors=0;	
		
		
		
		
		
		//Sort ascending on delay time so most delayed service will be checked rapidly ;)
		if(local_svc_count>0) {
			qsort(ssort, local_svc_count-1, sizeof(struct service_sort), cmpservice);
		}
		
		
		shortest_intervall=10;
		getloadavg(current_load, 3);
		sched_definitiv_running();
		for(x=0; x<local_svc_count; x++) {
			
			
			if(do_shutdown == 1 || gshm_hdr->do_reload == 1 || gshm_hdr->do_reload == 2) {
				break;	
			}
			
			
			
			if(gshm_hdr->current_running < cfg_max_parallel || (int)current_load[0] < cfg_max_load) { 
				if(sched_check_waiting(shm_addr, ssort[x].svc, cfgfile, SOHandle, sched_pause) == 1) {
										
					if(sched_mode == SCHED_MODE_WORKER) {
						worker_slot=sched_find_open_worker();						
						if(worker_slot < 0) {
							sched_check_for_dead_workers();
							continue;
						}
					}

					gettimeofday(&run_c_start,NULL);
					round_visitors++;
					ct = time(NULL);			
					expt = (ssort[x].svc->last_check+ssort[x].svc->check_interval);
					if(ct > expt && ssort[x].svc->service_type != SVC_TYPE_PASSIVE) {
						// service check has delayed
						ssort[x].svc->delay_time.sum += ct - expt;
					}
					ssort[x].svc->delay_time.counter++;
					//WTF?
					if(ssort[x].svc->service_type != SVC_TYPE_PASSIVE) {
						ssort[x].svc->last_check=time(NULL);
					} 
					bartlby_callback(EXTENSION_CALLBACK_CHECK_WILL_RUN, ssort[x].svc);
			 		sched_reschedule(ssort[x].svc);
			 		sched_run_check(ssort[x].svc, cfgfile, shm_addr, SOHandle, worker_slot);
			 		usleep(g_micros_before_after_check);
			 		gettimeofday(&run_c_end,NULL);
			 		
			 		
				}				
			} else {
				
				sched_wait_for_childs();
				sched_wait_open(60,cfg_max_parallel-1);	
				
			}
			
		}
		
		
		if(time(NULL)-round_start > sched_pause*3 && sched_pause > 0) {
			_log(LH_SCHED, B_LOG_INFO,"Done %d Services in %ld Seconds", round_visitors, time(NULL)-round_start);				
		}
		
		//Log Round End
		gettimeofday(&stat_round_end,NULL);
		bartlby_core_perf_track(gshm_hdr, &services[x], PERF_TYPE_ROUND_TIME, bartlby_milli_timediff(stat_round_end,stat_round_start));
				
		sched_wait_for_childs();

		usleep(sched_pause);
		if(shortest_intervall > 1) {
			usleep((shortest_intervall-1)*1000);
			
		}

		if(notification_aggregate_interval > 0 && time(NULL)-gshm_hdr->notification_log_aggregate_last_run >= notification_aggregate_interval) {
			_log(LH_SCHED, B_LOG_DEBUG,"AGGREGATION RUN");
			bartlby_notification_log_aggregate(gshm_hdr, cfgfile);
		} 
		bartlby_orchestra_check_timeouts(services, gshm_hdr, cfgfile, shm_addr, SOHandle);
		
		
	}
	
	return 1;
	
	
	
}