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

📄 adminmain.c

📁 在LINUX下实现HA的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: adminmain.c,v 1.11.2.2 2004/09/11 06:36:30 msoffen Exp $ *//*  * Copyright (C) 2004 Andrew Beekhof <andrew@beekhof.net> *  * 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 <crm/crm.h>#include <stdio.h>#include <sys/types.h>#include <unistd.h>#include <stdlib.h>#include <errno.h>#include <fcntl.h>#include <hb_api.h>#include <apphb.h>#include <clplumbing/ipc.h>#include <clplumbing/Gmain_timeout.h>#include <clplumbing/cl_log.h>#include <clplumbing/cl_signal.h>#include <clplumbing/lsb_exitcodes.h>#include <clplumbing/uids.h>#include <clplumbing/realtime.h>#include <clplumbing/GSource.h>#include <clplumbing/cl_poll.h>#include <crm/common/crmutils.h>#include <crm/common/msgutils.h>#include <crm/common/ipcutils.h>#include <crm/common/xmlutils.h>#include <crm/msg_xml.h>#include <crm/cib.h>#define OPTARGS	"V?i:o:D:C:S:HA:U:M:I:EWRFt:m:a:d:w:c:r:p:s:"#include <getopt.h>#include <crm/dmalloc_wrapper.h>GMainLoop *mainloop = NULL;const char *crm_system_name = "crmadmin";IPC_Channel *crmd_channel = NULL;char *admin_uuid = NULL;void usage(const char *cmd, int exit_status);ll_cluster_t *do_init(void);int do_work(ll_cluster_t * hb_cluster);gboolean decodeNVpair(const char *srcstring, char separator,		      char **name, char **value);gboolean admin_msg_callback(IPC_Channel * source_data, void *private_data);char *pluralSection(const char *a_section);xmlNodePtr handleCibMod(void);gboolean DO_DAEMON  = FALSE;gboolean BE_VERBOSE = FALSE;int expected_responses = 1;gboolean DO_HEALTH       = FALSE;gboolean DO_ELECT_DC     = FALSE;gboolean DO_WHOIS_DC     = FALSE;gboolean DO_RECALC_TREE  = FALSE;gboolean DO_FLUSH_RECALC = FALSE;const char *cib_action = NULL;xmlNodePtr msg_options = NULL;typedef struct str_list_s{		int num_items;		char *value;		struct str_list_s *next;} str_list_t;const char *verbose = "false";char *id = NULL;char *this_msg_reference = NULL;char *obj_type = NULL;char *clear = NULL;char *status = NULL;char *disconnect = NULL;char *unload_ha = NULL;char *migrate_from = NULL;char *migrate_res = NULL;char *subtype = NULL;char *reset = NULL;int operation_status = 0;const char *sys_to = NULL;;intmain(int argc, char **argv){	int argerr = 0;	int flag;	ll_cluster_t *hb_cluster = NULL;	cl_log_set_entity(crm_system_name);	cl_log_enable_stderr(TRUE);	cl_log_set_facility(LOG_USER);	while (1) {		int option_index = 0;		static struct option long_options[] = {			/*  Top-level Options */			{"daemon", 0, 0, 0},			{CRM_OPERATION_ERASE, 0, 0, 0},			{CRM_OPERATION_QUERY, 0, 0, 0},			{CRM_OPERATION_CREATE, 0, 0, 0},			{CRM_OPERATION_REPLACE, 0, 0, 0},			{CRM_OPERATION_STORE, 0, 0, 0},			{CRM_OPERATION_UPDATE, 0, 0, 0},			{CRM_OPERATION_DELETE, 0, 0, 0},			{"verbose", 0, 0, 'V'},			{"help", 0, 0, '?'},			{"reference", 1, 0, 0},			/*  common options */			{"id", 1, 0, 'i'},			{"obj_type", 1, 0, 'o'},			/*  daemon options */			{"reset", 1, 0, 'C'},			{"status", 1, 0, 'S'},			{"health", 0, 0, 'H'},			{"disconnect", 1, 0, 'A'},			{"unload_ha", 1, 0, 'U'},			{"migrate_from", 1, 0, 'M'},			{"migrate_res", 1, 0, 'I'},			{"elect_dc", 0, 0, 'E'},			{"whois_dc", 0, 0, 'W'},			{"recalc_tree", 0, 0, 'R'},			{"flush_recalc_tree", 0, 0, 'F'},			{0, 0, 0, 0}		};		flag = getopt_long(argc, argv, OPTARGS,				   long_options, &option_index);		if (flag == -1)			break;		switch(flag) {			case 0:				printf("option %s", long_options[option_index].name);				if (optarg)					printf(" with arg %s", optarg);				printf("\n");							if (strcmp("daemon", long_options[option_index].name) == 0)					DO_DAEMON = TRUE;				else if (strcmp(CRM_OPERATION_ERASE,						long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_CREATE,						   long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_UPDATE,						   long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_DELETE,						   long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_REPLACE,						   long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_STORE,						   long_options[option_index].name) == 0					 || strcmp(CRM_OPERATION_QUERY,						   long_options[option_index].name) == 0){										cib_action = cl_strdup(long_options[option_index].name);				} else if (strcmp("reference",						  long_options[option_index].name) == 0) {					this_msg_reference =						cl_strdup(optarg);				} else {					printf( "?? Long option (--%s) is not yet properly supported ??\n",						long_options[option_index].name);					++argerr;				}				break;			/* a sample test for multiple instance   if (digit_optind != 0 && digit_optind != this_option_optind)   printf ("digits occur in two different argv-elements.\n");   digit_optind = this_option_optind;   printf ("option %c\n", c);*/						case 'V':				BE_VERBOSE = TRUE;				verbose = "true";				break;			case '?':				usage(crm_system_name, LSB_EXIT_OK);				break;			case 'i':				CRM_DEBUG3("Option %c => %s", flag, optarg);				id = cl_strdup(optarg);				break;			case 'o':				CRM_DEBUG3("Option %c => %s", flag, optarg);				obj_type = cl_strdup(optarg);				break;			case 'C':				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'S':				DO_HEALTH = TRUE;				status = cl_strdup(optarg);				break;			case 'H':				DO_HEALTH = TRUE;				break;			case 'A':				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'U':				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'M':				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'I':				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'E':				DO_ELECT_DC = TRUE;				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'W':				DO_WHOIS_DC = TRUE;				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'R':				DO_RECALC_TREE = TRUE;				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			case 'F':				DO_FLUSH_RECALC = TRUE;				printf("Option %c is not yet supported\n", flag);				++argerr;				break;			default:				printf("?? getopt returned character code 0%o ??\n", flag);				++argerr;				break;		}	}	if (optind < argc) {		printf("non-option ARGV-elements: ");		while (optind < argc)			printf("%s ", argv[optind++]);		printf("\n");	}	if (optind > argc) {		++argerr;	}	if (argerr) {		usage(crm_system_name, LSB_EXIT_GENERIC);	}	hb_cluster = do_init();	if (hb_cluster != NULL) {		if (do_work(hb_cluster) > 0) {			/* wait for the reply by creating a mainloop and running it until			 * the callbacks are invoked...			 */			mainloop = g_main_new(FALSE);			cl_log(LOG_INFO,			       "%s waiting for reply from the local CRM",			       crm_system_name);			g_main_run(mainloop);			return_to_orig_privs();		} else {			cl_log(LOG_ERR, "No message to send");			operation_status = -1;		}	} else {		cl_log(LOG_ERR,		       "Init failed, could not perform requested operations");		operation_status = -2;	}	cl_log(LOG_DEBUG, "%s exiting normally", crm_system_name);	return operation_status;}xmlNodePtrhandleCibMod(void)

⌨️ 快捷键说明

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