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

📄 ipvsadm.c

📁 实现了集群的实现 完成了资源负载平衡等问题
💻 C
📖 第 1 页 / 共 4 页
字号:
				     "address[:port] specified");			break;		case 'f':			set_option(options, OPT_SERVICE);			/*			 * Set protocol to a sane values, even			 * though it is not used			 */			ce->svc.protocol = IPPROTO_TCP;			ce->svc.fwmark = parse_fwmark(optarg);			break;		case 's':			set_option(options, OPT_SCHEDULER);			strncpy(ce->svc.sched_name,				optarg, IP_VS_SCHEDNAME_MAXLEN);			break;		case 'p':			set_option(options, OPT_PERSISTENT);			ce->svc.flags = IP_VS_SVC_F_PERSISTENT;			ce->svc.timeout =				parse_timeout(optarg, 1, MAX_TIMEOUT);			break;		case 'M':			set_option(options, OPT_NETMASK);			parse = parse_netmask(optarg, &ce->svc.netmask);			if (parse != 1)				fail(2, "illegal virtual server "				     "persistent mask specified");			break;		case 'r':			set_option(options, OPT_SERVER);			parse = parse_service(optarg,					      ce->svc.protocol,					      &ce->dest.addr,					      &ce->dest.port);			if (!(parse & SERVICE_ADDR))				fail(2, "illegal real server "				     "address[:port] specified");			/* copy vport to dport if not specified */			if (parse == 1)				ce->dest.port = ce->svc.port;			break;		case 'i':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_TUNNEL;			break;		case 'g':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_DROUTE;			break;		case 'm':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_MASQ;			break;		case 'w':			set_option(options, OPT_WEIGHT);			if ((ce->dest.weight =			     string_to_number(optarg, 0, 65535)) == -1)				fail(2, "illegal weight specified");			break;		case 'x':			set_option(options, OPT_UTHRESHOLD);			if ((ce->dest.u_threshold =			     string_to_number(optarg, 0, INT_MAX)) == -1)				fail(2, "illegal u_threshold specified");			break;		case 'y':			set_option(options, OPT_LTHRESHOLD);			if ((ce->dest.l_threshold =			     string_to_number(optarg, 0, INT_MAX)) == -1)				fail(2, "illegal l_threshold specified");			break;		case 'c':			set_option(options, OPT_CONNECTION);			break;		case 'n':			set_option(options, OPT_NUMERIC);			*format |= FMT_NUMERIC;			break;		case '3':			set_option(options, OPT_MCAST);			strncpy(ce->daemon.mcast_ifn,				optarg, IP_VS_IFNAME_MAXLEN);			break;		case 'I':			set_option(options, OPT_SYNCID);			if ((ce->daemon.syncid =			     string_to_number(optarg, 0, 255)) == -1)				fail(2, "illegal syncid specified");			break;		case '5':			set_option(options, OPT_TIMEOUT);			break;		case '6':			set_option(options, OPT_DAEMON);			break;		case '7':			set_option(options, OPT_STATS);			*format |= FMT_STATS;			break;		case '8':			set_option(options, OPT_RATE);			*format |= FMT_RATE;			break;		case '9':			set_option(options, OPT_THRESHOLDS);			*format |= FMT_THRESHOLDS;			break;		case 'P':			set_option(options, OPT_PERSISTENTCONN);			*format |= FMT_PERSISTENTCONN;			break;		case '0':			set_option(options, OPT_SORT);			*format |= FMT_SORT;			break;		case 'X':			set_option(options, OPT_EXACT);			*format |= FMT_EXACT;			break;		default:			fail(2, "invalid option `%s'",			     poptBadOption(context, POPT_BADOPTION_NOALIAS));		}	}	if (c < -1) {		/* an error occurred during option processing */		fprintf(stderr, "%s: %s\n",			poptBadOption(context, POPT_BADOPTION_NOALIAS),			poptStrerror(c));		poptFreeContext(context);		return -1;	}	if (ce->cmd == CMD_TIMEOUT) {		char *optarg1, *optarg2;		if ((optarg=(char *)poptGetArg(context))		    && (optarg1=(char *)poptGetArg(context))		    && (optarg2=(char *)poptGetArg(context))) {			ce->timeout.tcp_timeout =				parse_timeout(optarg, 0, MAX_TIMEOUT);			ce->timeout.tcp_fin_timeout =				parse_timeout(optarg1, 0, MAX_TIMEOUT);			ce->timeout.udp_timeout =				parse_timeout(optarg2, 0, MAX_TIMEOUT);		} else			fail(2, "--set option requires 3 timeout values");	}	if ((optarg=(char *)poptGetArg(context)))		fail(2, "unexpected argument %s", optarg);	poptFreeContext(context);	return 0;}#else /* HAVE_POPT */static intparse_options(int argc, char **argv, struct ipvs_command_entry *ce,	      unsigned int *options, unsigned int *format){	int c, parse;	const char *optstring = "AEDCZSRaedlLhvt:u:f:s:M:p::r:gmiw:x:y:cnX";	const struct option long_options[] = {		{"add-service", 0, 0, 'A'},		{"edit-service", 0, 0, 'E'},		{"delete-service", 0, 0, 'D'},		{"clear", 0, 0, 'C'},		{"list", 0, 0, 'L'},		{"zero", 0, 0, 'Z'},		{"add-server", 0, 0, 'a'},		{"edit-server", 0, 0, 'e'},		{"delete-server", 0, 0, 'd'},		{"help", 0, 0, 'h'},		{"version", 0, 0, 'v'},		{"save", 0, 0, 'S'},		{"restore", 0, 0, 'R'},		{"set", 1, 0, '4'},		{"start-daemon", 1, 0, '1'},		{"stop-daemon", 1, 0, '2'},		{"tcp-service", 1, 0, 't'},		{"udp-service", 1, 0, 'u'},		{"fwmark-service", 1, 0, 'f'},		{"scheduler", 1, 0, 's'},		{"persistent", 2, 0, 'p'},		{"real-server", 1, 0, 'r'},		{"masquerading", 0, 0, 'm'},		{"netmask", 1, 0, 'M'},		{"ipip", 0, 0, 'i'},		{"gatewaying", 0, 0, 'g'},		{"weight", 1, 0, 'w'},		{"u-threshold", 1, 0, 'x'},		{"l-threshold", 1, 0, 'y'},		{"numeric", 0, 0, 'n'},		{"connection", 0, 0, 'c'},		{"mcast-interface", 1, 0, '3'},		{"syncid", 1, 0, 'I'},		{"timeout", 0, 0, '5'},		{"daemon", 0, 0, '6'},		{"stats", 0, 0, '7'},		{"rate", 0, 0, '8'},		{"thresholds", 0, 0, '9'},		{"persistent-conn", 0, 0, 'P'},		{"sort", 0, 0, '0'},		{"exact", 0, 0, 'X'},		{"help", 0, 0, 'h'},		{0, 0, 0, 0}	};	extern char *optarg;	extern int optind;	extern int opterr;	extern int optopt;	optind = 1;	if ((c = getopt_long(argc, argv, optstring,			     long_options, NULL)) == EOF)		tryhelp_exit(argv[0], -1);	switch (c) {	case 'A':		set_command(&ce->cmd, CMD_ADD);		break;	case 'E':		set_command(&ce->cmd, CMD_EDIT);		break;	case 'D':		set_command(&ce->cmd, CMD_DEL);		break;	case 'a':		set_command(&ce->cmd, CMD_ADDDEST);		break;	case 'e':		set_command(&ce->cmd, CMD_EDITDEST);		break;	case 'd':		set_command(&ce->cmd, CMD_DELDEST);		break;	case 'C':		set_command(&ce->cmd, CMD_FLUSH);		break;	case 'L':	case 'l':		set_command(&ce->cmd, CMD_LIST);		break;	case 'Z':		set_command(&ce->cmd, CMD_ZERO);		break;	case '4':		set_command(&ce->cmd, CMD_TIMEOUT);		if (optind + 1 < argc		    && argv[optind][0] != '!'		    && argv[optind][0] != '-'		    && argv[optind+1][0] != '!'		    && argv[optind+1][0] != '-') {			ce->timeout.tcp_timeout =				parse_timeout(optarg, 0, MAX_TIMEOUT);			ce->timeout.tcp_fin_timeout =				parse_timeout(argv[optind++], 0, MAX_TIMEOUT);			ce->timeout.udp_timeout =				parse_timeout(argv[optind++], 0, MAX_TIMEOUT);		} else			fail(2, "-s option requires 3 timeout values");		break;	case 'R':		set_command(&ce->cmd, CMD_RESTORE);		break;	case 'S':		set_command(&ce->cmd, CMD_SAVE);		break;	case '1':		set_command(&ce->cmd, CMD_STARTDAEMON);		if (!strcmp(optarg, "master"))			ce->daemon.state = IP_VS_STATE_MASTER;		else if (!strcmp(optarg, "backup"))			ce->daemon.state = IP_VS_STATE_BACKUP;		else fail(2, "illegal start_daemon specified");		break;	case '2':		set_command(&ce->cmd, CMD_STOPDAEMON);		if (!strcmp(optarg, "master"))			ce->daemon.state = IP_VS_STATE_MASTER;		else if (!strcmp(optarg, "backup"))			ce->daemon.state = IP_VS_STATE_BACKUP;		else fail(2, "illegal start_daemon specified");		break;	case 'h':		usage_exit(argv[0], 0);		break;	case 'v':		version_exit(0);		break;	default:		tryhelp_exit(argv[0], -1);	}	while ((c=getopt_long(argc, argv, optstring,			      long_options, NULL)) != EOF) {		switch (c) {		case 't':		case 'u':			set_option(options, OPT_SERVICE);			ce->svc.protocol =				(c=='t' ? IPPROTO_TCP : IPPROTO_UDP);			parse = parse_service(optarg,					      ce->svc.protocol,					      &ce->svc.addr,					      &ce->svc.port);			if (!(parse & SERVICE_ADDR ))				fail(2, "illegal virtual server "				     "address[:port] specified");			break;		case 'f':			set_option(options, OPT_SERVICE);			/*			 * Set protocol to a sane values, even			 * though it is not used			 */			ce->svc.protocol = IPPROTO_TCP;			ce->svc.fwmark = parse_fwmark(optarg);			break;		case 's':			set_option(options, OPT_SCHEDULER);			strncpy(ce->svc.sched_name,				optarg, IP_VS_SCHEDNAME_MAXLEN);			break;		case 'p':			set_option(options, OPT_PERSISTENT);			ce->svc.flags = IP_VS_SVC_F_PERSISTENT;			if (!optarg && optind < argc && argv[optind][0] != '-'			    && argv[optind][0] != '!')				optarg = argv[optind++];			ce->svc.timeout =				parse_timeout(optarg, 1, MAX_TIMEOUT);			break;		case 'M':			set_option(options, OPT_NETMASK);			parse = parse_netmask(optarg, &ce->svc.netmask);			if (parse != 1)				fail(2, "illegal virtual server "				     "persistent mask specified");			break;		case 'r':			set_option(options, OPT_SERVER);			parse = parse_service(optarg,					      ce->svc.protocol,					      &ce->dest.addr,					      &ce->dest.port);			if (!(parse & SERVICE_ADDR))				fail(2, "illegal real server "				     "address[:port] specified");			/* copy vport to dport if not specified */			if (parse == 1)				ce->dest.port = ce->svc.port;			break;		case 'i':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_TUNNEL;			break;		case 'g':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_DROUTE;			break;		case 'm':			set_option(options, OPT_FORWARD);			ce->dest.conn_flags = IP_VS_CONN_F_MASQ;			break;		case 'w':			set_option(options, OPT_WEIGHT);			if ((ce->dest.weight =			     string_to_number(optarg, 0, 65535)) == -1)				fail(2, "illegal weight specified");			break;		case 'x':			set_option(options, OPT_UTHRESHOLD);			if ((ce->dest.u_threshold =			     string_to_number(optarg, 0, INT_MAX)) == -1)				fail(2, "illegal u_threshold specified");			break;		case 'y':			set_option(options, OPT_LTHRESHOLD);			if ((ce->dest.l_threshold =			     string_to_number(optarg, 0, INT_MAX)) == -1)				fail(2, "illegal l_threshold specified");			break;		case 'c':			set_option(options, OPT_CONNECTION);			break;		case 'n':			set_option(options, OPT_NUMERIC);			*format |= FMT_NUMERIC;			break;		case '3':			set_option(options, OPT_MCAST);			strncpy(ce->daemon.mcast_ifn,				optarg, IP_VS_IFNAME_MAXLEN);			break;		case 'I':			set_option(options, OPT_SYNCID);			if ((ce->daemon.syncid =			     string_to_number(optarg, 0, 255)) == -1)				fail(2, "illegal syncid specified");			break;		case '5':			set_option(options, OPT_TIMEOUT);			break;		case '6':			set_option(options, OPT_DAEMON);			break;		case '7':			set_option(options, OPT_STATS);			*format |= FMT_STATS;			break;		case '8':			set_option(options, OPT_RATE);			*format |= FMT_RATE;			break;		case '9':			set_option(options, OPT_THRESHOLDS);			*format |= FMT_THRESHOLDS;			break;		case 'P':			set_option(options, OPT_PERSISTENTCONN);			*format |= FMT_PERSISTENTCONN;			break;		case '0':			set_option(options, OPT_SORT);			*format |= FMT_SORT;			break;		case 'X':			set_option(options, OPT_EXACT);			*format |= FMT_EXACT;			break;		default:			fail(2, "invalid option `%s'", argv[optind-1]);		}	}	if (optind < argc)		fail(2, "unexpected argument %s", argv[optind]);	return 0;}#endif /* HAVE_POPT */static int restore_table(int argc, char **argv, int reading_stdin){	int result = 0;	dynamic_array_t *a;	/* avoid infinite loop */	if (reading_stdin != 0)		tryhelp_exit(argv[0], -1);	while ((a = config_stream_read(stdin, argv[0])) != NULL) {		int i;		if ((i = (int)dynamic_array_get_count(a)) > 1) {			char **strv = dynamic_array_get_vector(a);			result = process_options(i, strv, 1);		}		dynamic_array_destroy(a, DESTROY_STR);	}	return result;}static int process_options(int argc, char **argv, int reading_stdin){	struct ipvs_command_entry ce;	unsigned int options = OPT_NONE;	unsigned int format = FMT_NONE;	int result = 0;	memset(&ce, 0, sizeof(struct ipvs_command_entry));	ce.cmd = CMD_NONE;	/* Set the default weight 1 */

⌨️ 快捷键说明

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