[DRBD-cvs] svn commit by phil - r3072 - branches/drbd-8.2/user -
Added preliminary support for drbd-proxy to drbdadm.
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Wed Sep 26 13:48:15 CEST 2007
Author: phil
Date: 2007-09-26 13:48:13 +0200 (Wed, 26 Sep 2007)
New Revision: 3072
Modified:
branches/drbd-8.2/user/drbdadm.h
branches/drbd-8.2/user/drbdadm_main.c
branches/drbd-8.2/user/drbdadm_parser.c
branches/drbd-8.2/user/drbdadm_parser.h
branches/drbd-8.2/user/drbdadm_scanner.fl
Log:
Added preliminary support for drbd-proxy to drbdadm.
Modified: branches/drbd-8.2/user/drbdadm.h
===================================================================
--- branches/drbd-8.2/user/drbdadm.h 2007-09-24 15:44:09 UTC (rev 3071)
+++ branches/drbd-8.2/user/drbdadm.h 2007-09-26 11:48:13 UTC (rev 3072)
@@ -63,6 +63,15 @@
struct ifi_info *ifi_next; /* next ifi_info structure */
};
+struct d_proxy_info
+{
+ char* name;
+ char* inside_addr;
+ char* inside_port;
+ char* outside_addr;
+ char* outside_port;
+};
+
struct d_host_info
{
char* name;
@@ -74,6 +83,7 @@
int meta_major;
int meta_minor;
char* meta_index;
+ struct d_proxy_info *proxy;
};
struct d_option
Modified: branches/drbd-8.2/user/drbdadm_main.c
===================================================================
--- branches/drbd-8.2/user/drbdadm_main.c 2007-09-24 15:44:09 UTC (rev 3071)
+++ branches/drbd-8.2/user/drbdadm_main.c 2007-09-26 11:48:13 UTC (rev 3072)
@@ -97,6 +97,7 @@
static int adm_dump_xml(struct d_resource* ,const char* );
static int adm_wait_c(struct d_resource* ,const char* );
static int adm_wait_ci(struct d_resource* ,const char* );
+static int adm_proxy_up(struct d_resource* ,const char* );
static int sh_nop(struct d_resource* ,const char* );
static int sh_resources(struct d_resource* ,const char* );
static int sh_mod_parms(struct d_resource* ,const char* );
@@ -130,6 +131,7 @@
int do_verify_ips;
char* drbdsetup;
char* drbdmeta;
+char* drbd_proxy_ctl;
char* setup_opts[10];
int soi=0;
volatile int alarm_raised;
@@ -189,6 +191,7 @@
{ "config-file", required_argument,0, 'c' },
{ "drbdsetup", required_argument,0, 's' },
{ "drbdmeta", required_argument,0, 'm' },
+ { "drbd-proxy-ctl",required_argument,0,'p' },
{ 0, 0, 0, 0 }
};
@@ -222,6 +225,7 @@
{ "dump-md", admm_generic, 1,1,0 },
{ "wait-con-int", adm_wait_ci, 1,0,1 },
{ "hidden-commands", hidden_cmds, 1,0,0 },
+ { "proxy-up", adm_proxy_up, 2,1,0 },
{ "sh-nop", sh_nop, 2,0,0 },
{ "sh-resources", sh_resources, 2,0,0 },
{ "sh-mod-parms", sh_mod_parms, 2,0,0 },
@@ -358,6 +362,14 @@
--indent; printf("}\n\n");
}
+static void dump_proxy_info(struct d_proxy_info* pi)
+{
+ printI("proxy on %s {\n",esc(pi->name)); ++indent;
+ printI(IPFMT,"inside", pi->inside_addr, pi->inside_port);
+ printI(IPFMT,"outside", pi->outside_addr, pi->outside_port);
+ --indent; printI("}\n");
+}
+
static void dump_host_info(struct d_host_info* hi)
{
if(!hi) {
@@ -375,6 +387,7 @@
printA("meta-disk", "internal");
else
printI(MDISK,"meta-disk", esc(hi->meta_disk), hi->meta_index);
+ if(hi->proxy) dump_proxy_info(hi->proxy);
--indent; printI("}\n");
}
@@ -671,7 +684,7 @@
if(dry_run || verbose) {
while(*cmdline) {
- fprintf(stdout,"%s ",*cmdline++);
+ fprintf(stdout,"%s ",esc(*cmdline++));
}
fprintf(stdout,"\n");
if (dry_run) return 0;
@@ -732,7 +745,7 @@
if(rv >= 10 && !(flags & (DONT_REPORT_FAILED|SUPRESS_STDERR))) {
fprintf(stderr,"Command '");
while(*argv) {
- fprintf(stderr,"%s",*argv++);
+ fprintf(stderr,"%s",esc(*argv++));
if (*argv) fputc(' ',stderr);
}
fprintf(stderr,"' terminated with exit code %d\n",rv);
@@ -940,7 +953,11 @@
argv[NA(argc)]=res->me->device;
argv[NA(argc)]="net";
ssprintf(argv[NA(argc)],"%s:%s",res->me->address,res->me->port);
- ssprintf(argv[NA(argc)],"%s:%s",res->peer->address,res->peer->port);
+ if(res->me->proxy) {
+ ssprintf(argv[NA(argc)],"%s:%s",res->me->proxy->inside_addr,res->me->proxy->inside_port);
+ } else {
+ ssprintf(argv[NA(argc)],"%s:%s",res->peer->address,res->peer->port);
+ }
argv[NA(argc)]=res->protocol;
argv[NA(argc)]="--set-defaults";
@@ -974,6 +991,26 @@
}
}
+static int adm_proxy_up(struct d_resource* res, const char* unused __attribute((unused)))
+{
+ char* argv[MAX_ARGS];
+ int argc=0;
+
+ argv[NA(argc)]=drbd_proxy_ctl;
+ argv[NA(argc)]="-c";
+ ssprintf(argv[NA(argc)],
+ "add connection %s-%s-%s %s:%s %s:%s %s:%s %s:%s",
+ res->me->name, res->name, res->peer->name,
+ res->me->proxy->inside_addr, res->me->proxy->inside_port,
+ res->peer->proxy->outside_addr, res->peer->proxy->outside_port,
+ res->me->proxy->outside_addr, res->me->proxy->outside_port,
+ res->me->address, res->me->port);
+ argv[NA(argc)]=0;
+
+ return m_system(argv,SLEEPS_SHORT);
+}
+
+
int adm_syncer(struct d_resource* res,const char* unused __attribute((unused)))
{
char* argv[MAX_ARGS];
@@ -1652,6 +1689,7 @@
progname=argv[0];
drbdsetup = strdup("drbdsetup");
drbdmeta = strdup("drbdmeta");
+ drbd_proxy_ctl = strdup("drbd-proxy-ctl");
} else {
size_t len = strlen(argv[0]) + 1;
++progname;
@@ -1670,12 +1708,19 @@
strcpy(drbdmeta + (progname - argv[0]), "drbdmeta");
}
+ len += strlen("drbd-proxy-ctl") - strlen(progname);
+ drbd_proxy_ctl = malloc(len);
+ if (drbd_proxy_ctl) {
+ strncpy(drbd_proxy_ctl, argv[0], (progname - argv[0]));
+ strcpy(drbd_proxy_ctl + (progname - argv[0]), "drbd-proxy-ctl");
+ }
+
argv[0] = progname;
}
if(argc == 1) print_usage_and_exit("missing arguments"); // arguments missing.
- if (drbdsetup == NULL || drbdmeta == NULL) {
+ if (drbdsetup == NULL || drbdmeta == NULL || drbd_proxy_ctl == NULL) {
fprintf(stderr,"could not strdup argv[0].\n");
exit(E_exec_error);
}
@@ -1725,6 +1770,14 @@
find_drbdcmd(&drbdmeta,pathes);
}
break;
+ case 'p':
+ {
+ char* pathes[2];
+ pathes[0]=optarg;
+ pathes[1]=0;
+ find_drbdcmd(&drbd_proxy_ctl,pathes);
+ }
+ break;
case '?':
// commented out, since opterr=1
//fprintf(stderr,"Unknown option %s\n",argv[optind-1]);
@@ -1870,7 +1923,7 @@
}
for_each_resource(res,tmp,config) {
if( (rv |= cmd->function(res,cmd->name)) >= 10 ) {
- fprintf(stderr,"drbdsetup exited with code %d\n",rv);
+ fprintf(stderr,"command exited with code %d\n",rv);
exit(E_exec_error);
}
}
@@ -1893,7 +1946,7 @@
}
} else { // Commands which do not need a resource name
if( (rv=cmd->function(config,cmd->name)) >= 10) {
- fprintf(stderr,"drbdsetup exited with code %d\n",rv);
+ fprintf(stderr,"command exited with code %d\n",rv);
exit(E_exec_error);
}
}
Modified: branches/drbd-8.2/user/drbdadm_parser.c
===================================================================
--- branches/drbd-8.2/user/drbdadm_parser.c 2007-09-24 15:44:09 UTC (rev 3071)
+++ branches/drbd-8.2/user/drbdadm_parser.c 2007-09-26 11:48:13 UTC (rev 3072)
@@ -325,6 +325,58 @@
}
}
+static void parse_proxy_section(struct d_resource* res, struct d_host_info *host)
+{
+ struct d_proxy_info *proxy;
+ struct d_host_info *tmp;
+
+ proxy=calloc(1,sizeof(struct d_proxy_info));
+ host->proxy = proxy;
+
+ EXP(TK_ON);
+ EXP(TK_STRING);
+ proxy->name = yylval.txt;
+
+ /* TODO: This needs to get improved! This works now only for trivial two
+ node cases! */
+ if(strcmp(proxy->name, nodeinfo.nodename) == 0 && host == res->peer) {
+ tmp = res->me;
+ res->me = res->peer;
+ res->peer = tmp;
+ }
+
+ EXP('{');
+ while (1) {
+ switch (yylex()) {
+ case TK_INSIDE:
+ EXP(TK_IPADDR);
+ proxy->inside_addr = yylval.txt;
+ EXP(':');
+ EXP(TK_INTEGER);
+ proxy->inside_port = yylval.txt;
+ EXP(';');
+ break;
+ case TK_OUTSIDE:
+ EXP(TK_IPADDR);
+ proxy->outside_addr = yylval.txt;
+ EXP(':');
+ EXP(TK_INTEGER);
+ proxy->outside_port = yylval.txt;
+ EXP(';');
+ break;
+ case '}':
+ goto break_loop;
+ default:
+ pe_expected("inside | outside");
+
+ }
+ }
+
+ break_loop:
+ return;
+}
+
+
static void parse_host_body(struct d_host_info *host,
struct d_resource *res, int require_all)
{
@@ -398,6 +450,9 @@
break;
}
break;
+ case TK_PROXY:
+ parse_proxy_section(res,host);
+ break;
case '}':
goto break_loop;
default:
Modified: branches/drbd-8.2/user/drbdadm_parser.h
===================================================================
--- branches/drbd-8.2/user/drbdadm_parser.h 2007-09-24 15:44:09 UTC (rev 3071)
+++ branches/drbd-8.2/user/drbdadm_parser.h 2007-09-26 11:48:13 UTC (rev 3072)
@@ -88,7 +88,10 @@
TK__MAJOR,
TK__MINOR,
TK__THIS_HOST,
- TK__REMOTE_HOST
+ TK__REMOTE_HOST,
+ TK_PROXY,
+ TK_INSIDE,
+ TK_OUTSIDE,
};
typedef struct YYSTYPE {
Modified: branches/drbd-8.2/user/drbdadm_scanner.fl
===================================================================
--- branches/drbd-8.2/user/drbdadm_scanner.fl 2007-09-24 15:44:09 UTC (rev 3071)
+++ branches/drbd-8.2/user/drbdadm_scanner.fl 2007-09-26 11:48:13 UTC (rev 3072)
@@ -46,10 +46,13 @@
ask { DP; return TK_ASK; }
skip { DP; return TK_SKIP; }
disk { DP; return TK_DISK; }
+proxy { DP; return TK_PROXY; }
+inside { DP; return TK_INSIDE; }
syncer { DP; return TK_SYNCER; }
device { DP; return TK_DEVICE; }
global { DP; return TK_GLOBAL; }
common { DP; return TK_COMMON; }
+outside { DP; return TK_OUTSIDE; }
address { DP; return TK_ADDRESS; }
startup { DP; return TK_STARTUP; }
handlers { DP; return TK_HANDLER; }
More information about the drbd-cvs
mailing list