[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