📄 lrmadmin.c
字号:
/* $Id: lrmadmin.c,v 1.25 2004/12/09 07:16:58 sunjd Exp $ *//* File: lrmadmin.c * Description: A adminstration tool for Local Resource Manager * * Author: Sun Jiang Dong <sunjd@cn.ibm.com> * Copyright (c) 2004 International Business Machines * * Todo: security verification * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */#include <portability.h>#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#ifndef __USE_GNU#define __USE_GNU/* For strnlen protype */ #include <string.h>#undef __USE_GNU#else#include <string.h>#endif#include <errno.h>#ifdef HAVE_GETOPT_H#include <getopt.h>#endif /* HAVE_GETOPT_H */#include <clplumbing/cl_log.h>#include <lrm/lrm_api.h>#include <lrm/raexec.h>#include <clplumbing/lsb_exitcodes.h>const char * optstring = "AD:dEF:d:sg:M:P:c:S:LI:CT:h";static struct option long_options[] = { {"daemon", 0, 0, 'd'}, {"executera", 1, 0, 'E'}, {"flush",1,0,'F'}, {"monitor",0,0,'M'}, {"status",1,0,'S'}, {"listall",0,0,'L'}, {"information",1,0,'I'}, {"add",1,0,'A'}, {"delete",1,0,'D'}, {"raclass_supported",1,0,'C'}, {"ratype_supported",1,0,'T'}, {"metadata",1,0,'M'}, {"provider",1,0,'P'}, {"help",0,0,'h'}, {0,0,0,0}};GMainLoop *mainloop = NULL;const char * lrmadmin_name = "lrmadmin";/* 20 is the length limit for a argv[x] */const int ARGVI_MAX_LEN = 20;typedef enum { ERROR_OPTION = -1, NULL_OP, DAEMON_OP, EXECUTE_RA, FLUSH, RSC_STATE, LIST_ALLRSC, INF_RSC, ADD_RSC, DEL_RSC, RACLASS_SUPPORTED, RATYPE_SUPPORTED, RA_METADATA, RA_PROVIDER, HELP} lrmadmin_cmd_t;static const char * status_msg[5] = { "succeed", /* LRM_OP_DONE */ "cancelled", /* LRM_OP_CANCELLED */ "timeout", /* LRM_OP_TIMEOUT */ "not Supported", /* LRM_OP_NOTSUPPORTED */ "failed due to an error" /* LRM_OP_ERROR */};static gboolean QUIT_GETOPT = FALSE;static lrmadmin_cmd_t lrmadmin_cmd = NULL_OP;static gboolean ASYN_OPS = FALSE; static int call_id = 0;const char * simple_help_screen ="lrmadmin {-d|--deamon}\n"" {-A|--add} <rscid> <raclass> <ratype> <provider|NULL> [<rsc_params_list>]\n"" {-D|--delete} <rscid>\n"" {-F|--flush} <rscid>\n"" {-E|--execute} <rscid> <operator> <timeout> <interval> <target_rc|EVERYTIME|CHANGED> [<operator_parameters_list>]\n"" {-S|--state} <rscid>\n"" {-L|--listall}\n"" {-I|--information} <rsc_id>\n"" {-C|--raclass_supported}\n"" {-T|--ratype_supported} <raclss>\n"" {-M|--metadata} <raclss> <ratype> <provider|NULL>\n"" {-P|--provider} <raclss> <ratype>\n"" {-h|--help}\n";#define OPTION_OBSCURE_CHECK \ if ( lrmadmin_cmd != NULL_OP ) { \ cl_log(LOG_ERR,"Obscure options."); \ return -1; \ }/* the begin of the internal used function list */static int resource_operation(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);static int add_resource(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);static int transfer_cmd_params(int amount, int start, char * argv[], const char * class, GHashTable ** params_ht);static void g_print_stringitem(gpointer data, gpointer user_data);static void g_print_rainfo_item(gpointer data, gpointer user_data);static void g_print_ops(gpointer data, gpointer user_data);static void g_get_rsc_description(gpointer data, gpointer user_data);static void print_rsc_inf(lrm_rsc_t * lrmrsc);static char * params_hashtable_to_str(const char * class, GHashTable * ht);static void free_stritem_of_hashtable(gpointer key, gpointer value, gpointer user_data);static void ocf_params_hash_to_str(gpointer key, gpointer value, gpointer user_data);static void normal_params_hash_to_str(gpointer key, gpointer value, gpointer user_data);static lrm_rsc_t * get_lrm_rsc(ll_lrm_t * lrmd, char * rscid);static int ra_metadata(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);static int ra_provider(ll_lrm_t * lrmd, int argc, int optind, char * argv[]);/* the end of the internal used function list */static void lrm_op_done_callback(lrm_op_t* op);int main(int argc, char **argv){ int option_char; char rscid_arg_tmp[RID_LEN]; int ret_value = 0; ll_lrm_t* lrmd; lrm_rsc_t * lrm_rsc; GList *raclass_list = 0, *ratype_list = 0, *rscid_list; char raclass[20]; /* Prevent getopt_long to print error message on stderr isself */ /*opterr = 0; */ if (argc == 1) { printf("%s",simple_help_screen); return 0; } cl_log_set_entity(lrmadmin_name); cl_log_enable_stderr(FALSE); cl_log_set_facility(LOG_USER); memset(rscid_arg_tmp, '\0', RID_LEN); memset(raclass, '\0', 20); do { option_char = getopt_long (argc, argv, optstring, long_options, NULL); if (option_char == -1) { break; } switch (option_char) { case 'd': OPTION_OBSCURE_CHECK lrmadmin_cmd = DAEMON_OP; QUIT_GETOPT = TRUE; break; case 'A': OPTION_OBSCURE_CHECK lrmadmin_cmd = ADD_RSC; break; case 'D': OPTION_OBSCURE_CHECK lrmadmin_cmd = DEL_RSC; if (optarg) { strncpy(rscid_arg_tmp, optarg, RID_LEN-1); } break; case 'C': OPTION_OBSCURE_CHECK lrmadmin_cmd = RACLASS_SUPPORTED; break; case 'T': OPTION_OBSCURE_CHECK lrmadmin_cmd = RATYPE_SUPPORTED; if (optarg) { strncpy(raclass, optarg, 19); } break; case 'F': OPTION_OBSCURE_CHECK lrmadmin_cmd = FLUSH; if (optarg) { strncpy(rscid_arg_tmp, optarg, RID_LEN-1); } break; case 'E': OPTION_OBSCURE_CHECK lrmadmin_cmd = EXECUTE_RA; break; case 'M': OPTION_OBSCURE_CHECK lrmadmin_cmd = RA_METADATA; break; case 'P': OPTION_OBSCURE_CHECK lrmadmin_cmd = RA_PROVIDER; break; case 'S': OPTION_OBSCURE_CHECK lrmadmin_cmd = RSC_STATE; if (optarg) { strncpy(rscid_arg_tmp, optarg, RID_LEN-1); } break; case 'L': OPTION_OBSCURE_CHECK lrmadmin_cmd = LIST_ALLRSC; break; case 'I': OPTION_OBSCURE_CHECK if (optarg) { strncpy(rscid_arg_tmp, optarg, RID_LEN-1); } lrmadmin_cmd = INF_RSC; break; case 'h': OPTION_OBSCURE_CHECK /* print detailed help screen? */ printf("%s",simple_help_screen); return 0; case '?': /* cl_log(LOG_ERR,"There is a unrecognized option %s", optarg); */ printf("%s", simple_help_screen); return -1; default: cl_log(LOG_ERR,"Error:getopt returned character" " code %c.", option_char); return -1; } } while (!QUIT_GETOPT); lrmd = ll_lrm_new("lrm"); if (NULL == lrmd) { cl_log(LOG_ERR,"ll_lrn_new return null."); return -2; } lrmd->lrm_ops->set_lrm_callback(lrmd, lrm_op_done_callback); if (lrmd->lrm_ops->signon(lrmd, lrmadmin_name) != 1) { /* != HA_OK */ printf("lrmd daemon is not running.\n"); if (lrmadmin_cmd == DAEMON_OP) { return LSB_STATUS_STOPPED; } else { cl_log(LOG_ERR,"Can't connect to lrmd, quit!"); return -2; } } if (lrmadmin_cmd == DAEMON_OP) { printf("lrmd daemon is running.\n"); lrmd->lrm_ops->signoff(lrmd); return 0; } switch (lrmadmin_cmd) { case EXECUTE_RA: call_id = resource_operation(lrmd, argc, optind, argv); if (call_id < 0) { if ( call_id == -2 ) { cl_log(LOG_ERR, "Failed to operate " "resource %s due to parameter error." , argv[optind]); ret_value = -3; } if ( call_id == -1 ) { cl_log(LOG_ERR, "Failed! no this " "resource %s.", argv[optind]); ret_value = -2; } cl_log(LOG_ERR, "Failed to operate " "resource %s due to unknown error." , argv[optind]); ret_value = -3; ASYN_OPS = FALSE; } else { /* Return value: HA_OK = 1 Or HA_FAIL = 0 */ if ( call_id == 0 ) { cl_log(LOG_ERR, "Resource operation " "Failed." ); ret_value = -3; ASYN_OPS = FALSE; } else { ASYN_OPS = TRUE; } } break; case RA_METADATA: ra_metadata(lrmd, argc, optind, argv); ASYN_OPS = FALSE; break; case RA_PROVIDER: ra_provider(lrmd, argc, optind, argv); ASYN_OPS = FALSE; break; case ADD_RSC: if (add_resource(lrmd, argc, optind, argv) == 0) { printf("Succeeded in adding this resource.\n"); } else { printf("Failed to add this resource.\n"); ret_value = -3; } ASYN_OPS = FALSE; break; case DEL_RSC: /* Return value: HA_OK = 1 Or HA_FAIL = 0 */ if (lrmd->lrm_ops->delete_rsc(lrmd, rscid_arg_tmp)==1) { printf("Succeeded in delete this resource.\n"); } else { printf("Failed to delete this resource.\n"); ret_value = -3; } ASYN_OPS = FALSE; break; case FLUSH: lrm_rsc = get_lrm_rsc(lrmd, rscid_arg_tmp); if (!(lrm_rsc)) { ret_value = -3; } else { /* Return value: HA_OK = 1 Or HA_FAIL = 0 */ if (lrm_rsc->ops->flush_ops(lrm_rsc) == 1 ) { printf("Succeeded in flushing.\n"); } else { printf("Failed to flush.\n"); ret_value = -3; } } ASYN_OPS = FALSE; break; case RACLASS_SUPPORTED: raclass_list = lrmd->lrm_ops-> get_rsc_class_supported(lrmd); printf("Support %d RA classes\n", g_list_length(raclass_list)); if (raclass_list) { g_list_foreach(raclass_list, g_print_stringitem, NULL); g_list_free(raclass_list); ret_value = LSB_EXIT_OK; } else { printf("No any RA class is supported\n"); ret_value = -3; } ASYN_OPS = FALSE; break; case RATYPE_SUPPORTED: ratype_list = lrmd->lrm_ops-> get_rsc_type_supported(lrmd, raclass); printf("List size: %d\n", g_list_length(ratype_list)); if (ratype_list) { g_list_foreach(ratype_list, g_print_rainfo_item, NULL); /* g_list_free(ratype_list); */ } else { printf("For this RA class, no any RA type is " "supported\n"); } ASYN_OPS = FALSE; break; case LIST_ALLRSC: rscid_list = lrmd->lrm_ops->get_all_rscs(lrmd); if (rscid_list) { g_list_foreach(rscid_list, g_get_rsc_description , lrmd); g_list_free(rscid_list); } else printf("Currently no resource is managed by " "LRM.\n"); ASYN_OPS = FALSE; break; case INF_RSC: lrm_rsc = get_lrm_rsc(lrmd, rscid_arg_tmp); if (!(lrm_rsc)) { ret_value = -3; } else { print_rsc_inf(lrm_rsc); g_free(lrm_rsc); } ASYN_OPS = FALSE; break; case RSC_STATE: lrm_rsc = get_lrm_rsc(lrmd, rscid_arg_tmp); if (!(lrm_rsc)) { ret_value = -3; } else { state_flag_t cur_state = LRM_RSC_IDLE; GList * ops_queue; ops_queue = lrm_rsc->ops->get_cur_state(lrm_rsc, &cur_state); printf("resource state:%s\n", cur_state==LRM_RSC_IDLE? "LRM_RSC_IDLE":"LRM_RSC_BUSY"); if (ops_queue) { g_list_foreach(ops_queue, g_print_ops, NULL); g_list_free(ops_queue); } } ASYN_OPS = FALSE; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -