⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lrmadmin.c

📁 在LINUX下实现HA的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				/* Return value: HA_OK = 1 Or  HA_FAIL = 0 */				if ( call_id == 0 ) {					cl_log(LOG_ERR, "Monitor settting "\					"Failed." );					ret_value = -3;					ASYN_OPS = FALSE;				} else { 					ASYN_OPS = TRUE;				}			}			break;		case MONITOR_GET: 			lrm_rsc = get_lrm_rsc(lrmd, rscid_arg_tmp);			if (!(lrm_rsc)) {				ret_value = -3;			} else { 				GList* monitor_list = NULL;				monitor_list = 					lrm_rsc->ops->get_monitors(lrm_rsc);				if ( monitor_list == NULL) {					printf("No monitor on this resource.\n");				} else {					printf("Monitors on this resource:\n");					g_list_foreach(monitor_list, 						g_print_monitor, NULL);					g_list_free(monitor_list);				}			}						ASYN_OPS = FALSE;			break;		case MONITOR_CLS: 			lrm_rsc = get_lrm_rsc(lrmd, rscid_arg_tmp);			if (!(lrm_rsc)) {				ret_value = -3;			} else { 				lrm_mon_t mon_ops;				mon_ops.mode = LRM_MONITOR_CLEAR;				if (lrm_rsc->ops->set_monitor(lrm_rsc, &mon_ops)					== 1 ) { /* HA_OK */					printf("Be trying to clearing all "\						"monitors on this resource.\n");					ASYN_OPS = TRUE;				} else {					fprintf(stderr, "Failed to clear all "\						"monitors on this resource.\n");					ret_value = -1;					ASYN_OPS = FALSE;				}			}						break;		default:			fprintf(stderr, "This option is not supported yet.\n");			ret_value = -1;			ASYN_OPS = FALSE;			break;		}	if (ASYN_OPS) {		lrmd->lrm_ops->set_lrm_callback(lrmd, lrm_op_done_callback, 			lrm_monitor_callback);		mainloop = g_main_new(FALSE);		cl_log(LOG_DEBUG, "%s waiting for calling result from the lrmd.",			 lrmadmin_name);		g_idle_add(post_query_call_result, lrmd);		g_main_run(mainloop);	}	lrmd->lrm_ops->signoff(lrmd);	return ret_value;}static voidlrm_op_done_callback(lrm_op_t* op){	char * tmp = NULL;	if (!op) {		cl_log(LOG_ERR, "In callback function, op is NULL pointer.");		return;	}	printf("Operation result: %s\n", status_msg[op->status-LRM_OP_DONE]);	printf("Operation type: %s\n", op->op_type);	tmp = params_hashtable_to_str(op->rsc->ra_type, op->params);	printf("Opration parameters: %s\n", tmp);	g_free(tmp);	printf("\nThe corresponding resource description as below\n");	print_rsc_inf(op->rsc);	/* Don't need ? 	 * g_free(op->rsc);  	 * g_free(op);	 */}static voidlrm_monitor_callback(lrm_mon_t* mon){	if (mon) {		g_print_monitor(mon, NULL);	}}static gbooleanpost_query_call_result(gpointer data){	ll_lrm_t * lrmd = (ll_lrm_t *) data;	if  (!(lrmd->lrm_ops->msgready(lrmd)) )  {		return TRUE;	}	if (0 > lrmd->lrm_ops->rcvmsg(lrmd, TRUE)) {		cl_log(LOG_ERR, "Error when post query calling result.");	}	g_main_quit(mainloop);	return FALSE;}static int resource_operation(ll_lrm_t * lrmd, int argc, int optind, char * argv[]){	int call_id;	rsc_id_t rsc_id;	GHashTable * params_ht = NULL;	lrm_op_t op;	lrm_rsc_t * lrm_rsc;		if ((argc - optind) < 3) {		cl_log(LOG_ERR,"No enough parameters.");		return -2;	}		uuid_parse(argv[optind], rsc_id);	lrm_rsc = lrmd->lrm_ops->get_rsc(lrmd, rsc_id);		if (!lrm_rsc) {		return -1;	}	op.op_type = argv[optind+1];	op.timeout = atoi(argv[optind+2]);	if ((argc - optind) > 3) {		if (0 > transfer_cmd_params(argc, optind+3, argv, 				lrm_rsc->ra_type, &params_ht) ) {			return -2;		}	}	op.params = params_ht;	call_id = lrm_rsc->ops->perform_op(lrm_rsc, &op);	/* g_free(lrm_rsc);   don't need to free it ? */	if (params_ht) {		g_hash_table_foreach(params_ht, free_stritem_of_hashtable, NULL);		g_hash_table_destroy(params_ht);	}	return call_id;}static int add_resource(ll_lrm_t * lrmd, int argc, int optind, char * argv[]){	rsc_id_t rsc_id;	const char * ra_type = NULL;	const char * ra_name = NULL;	GHashTable * params_ht = NULL;	int tmp_ret = NULL;	if ((argc - optind) < 3) {		cl_log(LOG_ERR,"No enough parameters.");		return -2;	}	ra_type = argv[optind+1];	ra_name = argv[optind+2];	uuid_parse(argv[optind], rsc_id);	/* delete Hashtable */	if ((argc - optind) > 3) {		if ( 0 > transfer_cmd_params(argc, optind+3, argv, ra_type,					&params_ht) ) {			return -1;		}	}	tmp_ret = lrmd->lrm_ops->add_rsc(lrmd, rsc_id, ra_type, 						ra_name, params_ht);	/*delete params_ht*/	if (params_ht) {		g_hash_table_foreach(params_ht, free_stritem_of_hashtable, NULL);		g_hash_table_destroy(params_ht);	}	return (tmp_ret ? 0 : -1); /* tmp_ret is HA_OK=1 or HA_FAIL=0 */}static inttransfer_cmd_params(int amount, int start, char * argv[], const char * ra_type, GHashTable ** params_ht){	if (amount < start) {		return -1;	}	if (strncmp("ocf", ra_type, 4)==0) {		int i;		char * delimit, * key, * value;		*params_ht = g_hash_table_new(g_str_hash, g_str_equal);		for (i=start; i<amount; i++) {			int len_tmp;			delimit = strchr(argv[i], '=');			if (!delimit) {				cl_log(LOG_ERR, "parameter %s is invalid for " \					"OCF standard.", argv[i]);				goto error_return; /* Have to */			}			/* lack error handling for g_new. Exception ? */			len_tmp = strnlen(delimit+1, 80) + 1;			value = g_new(gchar, len_tmp);			strncpy(value, delimit+1, len_tmp);			len_tmp = strnlen(argv[i], 80) - strnlen(delimit, 80);			key = g_new(gchar, len_tmp+1);			key[len_tmp] = '\0';			strncpy(key, argv[i], len_tmp);						g_hash_table_insert(*params_ht, key, value);		}	} else if ( strncmp("lsb", ra_type, 4) == 0 || 		    strncmp("heartbeat", ra_type, 10) == 0 ) {		int i;		char buffer[21];		/* Pay attention: for parameter ordring issue */		*params_ht = g_hash_table_new(g_str_hash, g_str_equal);		buffer[20] = '\0';		for (i=start; i<amount; i++) {			snprintf(buffer, 20, "%d", i-start+1);			g_hash_table_insert( *params_ht, g_strdup(buffer), g_strdup(argv[i]));			/*printf("index: %d  value: %s \n", i-start+1, argv[i]); */		}	} else {		fprintf(stderr, "Not supported resource agency type.\n");		return -1;	}	return 0;error_return:	if (*params_ht) {		g_hash_table_foreach(*params_ht, free_stritem_of_hashtable, NULL);		g_hash_table_destroy(*params_ht);		*params_ht = NULL;	}	return -1;}static char * params_hashtable_to_str(const char * ra_type, GHashTable * ht){	gchar * params_str = NULL;	GString * gstr_tmp;	if (!ht) {		 return NULL;	}	if (strncmp("ocf", ra_type, 4)==0) {		gstr_tmp = g_string_new("");		g_hash_table_foreach(ht, ocf_params_hash_to_str, &gstr_tmp);		params_str = g_new(gchar, gstr_tmp->len+1);				strncpy(params_str, gstr_tmp->str, gstr_tmp->len+1);		g_string_free(gstr_tmp, TRUE);	} else if ( strncmp("lsb", ra_type, 4) == 0 || 		    strncmp("heartbeat", ra_type, 10) == 0 ) {		int i;		int ht_size = g_hash_table_size(ht);		gchar * tmp_str = g_new(gchar, ht_size*ARGVI_MAX_LEN); 			memset(tmp_str, '\0', ht_size*ARGVI_MAX_LEN);		g_hash_table_foreach(ht, normal_params_hash_to_str, &tmp_str);		gstr_tmp = g_string_new("");		for (i=0; i< ht_size; i++) {			g_string_append(gstr_tmp, tmp_str + i*ARGVI_MAX_LEN );		}		params_str = g_new(gchar, gstr_tmp->len+1);				strncpy(params_str, gstr_tmp->str, gstr_tmp->len+1);		g_string_free(gstr_tmp, TRUE);	} else {		fprintf(stderr, "Not supported resource agency type.\n");	}	return params_str;}static voidg_ratype_supported(gpointer data, gpointer user_data){	printf("%s\n", (char*)data);	g_free(data);  /*  ?  */}static voidg_print_ops(gpointer data, gpointer user_data){	printf("%s  ", (char*)data);	g_free(data);  /*  ?  */}static voidg_get_rsc_description(gpointer data, gpointer user_data){	ll_lrm_t* lrmd = NULL;	lrm_rsc_t * lrm_rsc;	rsc_id_t rsc_id_tmp;	if (!(user_data)) {		return;	}	lrmd = (ll_lrm_t *)user_data;		memset(rsc_id_tmp, '\0', sizeof(rsc_id_t));	strncpy(rsc_id_tmp, data, sizeof(rsc_id_t));	lrm_rsc = lrmd->lrm_ops->get_rsc(lrmd, rsc_id_tmp);	if (lrm_rsc) {		print_rsc_inf(lrm_rsc);		g_free(lrm_rsc);   /* ? */	} else		cl_log(LOG_ERR, "There is a invalid resource id %s.", 			rsc_id_tmp);		g_free(data); /* ? */}static voidprint_rsc_inf(lrm_rsc_t * lrm_rsc){	char rscid_str_tmp[40];	char * tmp = NULL;	if (!lrm_rsc) {		return;	}	uuid_unparse(lrm_rsc->id, rscid_str_tmp);	printf("Resource ID:                %s\n", rscid_str_tmp);	printf("Resource agency name:       %s\n", lrm_rsc->name);	printf("Resource agency type:       %s\n", lrm_rsc->ra_type);	if (lrm_rsc->params) {		tmp = params_hashtable_to_str(lrm_rsc->ra_type, 				lrm_rsc->params);	}	printf("Resource agency parameters: %s\n", tmp);	g_free(tmp);}static voidfree_stritem_of_hashtable(gpointer key, gpointer value, gpointer user_data){	/*printf("key=%s   value=%s\n", (char *)key, (char *)value);*/	g_free(key);	g_free(value);}static voidocf_params_hash_to_str(gpointer key, gpointer value, gpointer user_data){	GString * gstr_tmp = *(GString **)user_data;	g_string_append(gstr_tmp, (char*)key);	g_string_append(gstr_tmp, "=");	g_string_append(gstr_tmp, (char *)value);	g_string_append(gstr_tmp, "\n");}static voidnormal_params_hash_to_str(gpointer key, gpointer value, gpointer user_data){	gchar * str_tmp = *(gchar **) user_data;	if (str_tmp == NULL ) {		return;	}	strncpy(str_tmp + *(gint *)key * ARGVI_MAX_LEN, (char*)value,		ARGVI_MAX_LEN - 1);}static lrm_rsc_t * get_lrm_rsc(ll_lrm_t * lrmd, rsc_id_t rscid){	char uuid_str_tmp[40];	lrm_rsc_t * lrm_rsc;	lrm_rsc = lrmd->lrm_ops->get_rsc(lrmd, rscid);	if (!(lrm_rsc)) {		uuid_unparse(rscid, uuid_str_tmp);		cl_log(LOG_ERR,"No this resource %s.", uuid_str_tmp);	}	return lrm_rsc;}static voidg_print_monitor(gpointer data, gpointer user_data){	/* Don't need to free it */	lrm_mon_t * lrm_mon = (lrm_mon_t *) data;	if (lrm_mon) {		char * tmp;		printf("MONITOR:\n");		printf("Mode: %d\n", lrm_mon->mode);		printf("Interval: %d\n", lrm_mon->interval);		printf("Target: %d\n", lrm_mon->target);		printf("Operation type: %s\n", lrm_mon->op_type);		printf("Timeout: %d\n", lrm_mon->timeout);		tmp = params_hashtable_to_str(lrm_mon->rsc->ra_type, 						lrm_mon->params);		printf("Parameters: %s\n", tmp);		g_free(tmp);		/* Other fields ? */	}}static int set_monitor(ll_lrm_t * lrmd, int argc, int optind, char * argv[]){	int call_id;	rsc_id_t rsc_id;	GHashTable * params_ht = NULL;	lrm_mon_t mon;	lrm_rsc_t * lrm_rsc;	if ((argc - optind) < 4) {		cl_log(LOG_ERR,"No enough parameters.");		return -2;	}		uuid_parse(argv[optind], rsc_id);	lrm_rsc = lrmd->lrm_ops->get_rsc(lrmd, rsc_id);		if (!lrm_rsc) {		return -1;	}	mon.mode = LRM_MONITOR_SET;	mon.op_type = argv[optind+1];	mon.timeout = atoi(argv[optind+2]);	mon.interval = atoi(argv[optind+3]);	if ((argc - optind) > 4) {		if ( 0 > transfer_cmd_params(argc, optind+4, argv, 				lrm_rsc->ra_type, &params_ht) ) {			return -1;		}	}	mon.params = params_ht;	call_id = lrm_rsc->ops->set_monitor(lrm_rsc, &mon);	/* g_free(lrm_rsc);  Don't need to free it? */	if (params_ht) {		g_hash_table_foreach(params_ht, free_stritem_of_hashtable, NULL);		g_hash_table_destroy(params_ht);	}	return call_id;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -