📄 lrmadmin.c
字号:
/* 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, ¶ms_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, ¶ms_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, ¶ms_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 + -