Add vipmap to rahunas config
authorNeutron Soutmun <neo.neutron@gmail.com>
Tue, 11 May 2010 10:46:20 +0000 (17:46 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Tue, 11 May 2010 10:46:20 +0000 (17:46 +0700)
  * Add vipmap to rahunas config.
  * firwall script now setup the vipmap properly.

src/rahunasd.c
src/rh-config.c
src/rh-config.h
src/rh-task-iptables.c
tools/rahunas-firewall.in

index ec6b229..a648f39 100644 (file)
@@ -26,8 +26,6 @@
 const char *termstring = '\0';
 pid_t pid, sid;
 
-int getline(int fd, char *buf, size_t size);
-
 struct main_server rh_main_server_instance = {
   .vserver_list = NULL,
   .task_list = NULL,
@@ -63,29 +61,6 @@ void rh_sighandler(int sig)
   return;
 }
 
-int getline(int fd, char *buf, size_t size)
-{
-  char cbuf;
-  char *current;
-
-  if (!buf || fd < 0)
-    return 0;
-
-  current = buf;
-
-  while (read(fd, &cbuf, 1) > 0) {
-    *current = cbuf;
-    if (cbuf == '\n') {
-      *current = '\0';
-      break;
-    } else if ((current - buf) < (size - 1)) {
-      current++;
-    }
-  }
-
-  return (current - buf);
-}
-
 size_t expired_check(void *data)
 {
   struct processing_set *process = (struct processing_set *) data;
index 8810ed9..f17657d 100755 (executable)
@@ -214,6 +214,25 @@ enum lcfg_status rahunas_visitor(const char *key, void *data, size_t size,
         if (config->rh_vserver.nas_weblogin_template != NULL)
           free(config->rh_vserver.nas_weblogin_template);
         config->rh_vserver.nas_weblogin_template = strdup(value);
+      } else if (strncmp(sub_key, "vipmap_attribute",
+                 strlen("vipmap_attribute")) == 0) {
+        if (config->rh_vserver.vipmap_attribute != NULL)
+          free(config->rh_vserver.vipmap_attribute);
+        config->rh_vserver.vipmap_attribute = strdup(value);
+      } else if (strncmp(sub_key, "vipmap_network",
+                 strlen("vipmap_network")) == 0) {
+        if (config->rh_vserver.vipmap_network != NULL)
+          free(config->rh_vserver.vipmap_network);
+        config->rh_vserver.vipmap_network = strdup(value);
+      } else if (strncmp(sub_key, "vipmap_fake_arp",
+                 strlen("vipmap_fake_arp")) == 0) {
+        if (config->rh_vserver.vipmap_fake_arp != NULL)
+          free(config->rh_vserver.vipmap_fake_arp);
+        config->rh_vserver.vipmap_fake_arp = strdup(value);
+      } else if (strncmp(sub_key, "vipmap", strlen("vipmap")) == 0) {
+        if (config->rh_vserver.vipmap != NULL)
+          free(config->rh_vserver.vipmap);
+        config->rh_vserver.vipmap = strdup(value);
       }
       break;
   }
@@ -336,6 +355,10 @@ int cleanup_vserver_config(struct rahunas_vserver_config *config)
   rh_free(&(config->nas_default_redirect));
   rh_free(&(config->nas_default_language));
   rh_free(&(config->nas_weblogin_template));
+  rh_free(&(config->vipmap));
+  rh_free(&(config->vipmap_attribute));
+  rh_free(&(config->vipmap_network));
+  rh_free(&(config->vipmap_fake_arp));
 
   return 0;
 }
index f2fa4ef..ce8541b 100644 (file)
@@ -80,6 +80,10 @@ struct rahunas_vserver_config {
   char *nas_default_redirect;
   char *nas_default_language;
   char *nas_weblogin_template;
+  char *vipmap;
+  char *vipmap_attribute;
+  char *vipmap_network;
+  char *vipmap_fake_arp;
 };
 
 union rahunas_config {
index 876bfd5..3920c48 100644 (file)
@@ -27,7 +27,7 @@ int iptables_exec(struct vserver *vs, char *const args[])
   int ret = 0;
   int fd = 0;
   int i = 0;
-  char *env[22];
+  char *env[25];
 
   env[0]  = g_strdup("ENV_OVERRIDE=yes");
   env[1]  = g_strdup_printf("SETNAME=%s", vs->vserver_config->vserver_name);
@@ -52,12 +52,18 @@ int iptables_exec(struct vserver *vs, char *const args[])
                             vs->vserver_config->vserver_ports_allow);
   env[19] = g_strdup_printf("VSERVER_PORTS_INTERCEPT=%s", 
                             vs->vserver_config->vserver_ports_intercept);
-  env[20] = g_strdup_printf("KEEP_SET=%s", 
+  env[20] = g_strdup_printf("VIPMAP=%s",
+                            vs->vserver_config->vipmap);
+  env[21] = g_strdup_printf("VIPMAP_NETWORK=%s",
+                            vs->vserver_config->vipmap_network);
+  env[22] = g_strdup_printf("VIPMAP_FAKE_ARP=%s",
+                            vs->vserver_config->vipmap_fake_arp);
+  env[23] = g_strdup_printf("KEEP_SET=%s",
                             vs->vserver_config->init_flag == VS_RELOAD ?
                             "yes" : "no");
-  env[21] = (char *) 0;
+  env[24] = (char *) 0;
 
-  for (i = 0; i < 21; i++) {
+  for (i = 0; i < 23; i++) {
     if (env[i] != NULL) 
       DP("%s", env[i]);
   }
@@ -97,7 +103,7 @@ int iptables_exec(struct vserver *vs, char *const args[])
   close(exec_pipe[1]);
 
  
-  for (i = 0; i < 21; i++) {
+  for (i = 0; i < 24; i++) {
     g_free(env[i]);
   } 
   
index 08ee79e..6ada185 100755 (executable)
@@ -745,12 +745,12 @@ rules () {
   if [ "$VIPMAP" = "yes" ]; then
     $IPTABLES -t nat -A $CHAIN_NAT_VIP_PREROUTING -j RETURN
     $IPTABLES -t nat -A $CHAIN_NAT_VIP_POSTROUTING -j RETURN
-  fi
 
-  if [ "$VIPMAP" = "yes" ] -a [ "$VIPMAP_FAKE_ARP" = "yes" ]; then
-    for dev in $DEV_EXTERNAL_LIST; do
-      $FARPD -i $dev $VIPMAP_NETWORK
-    done
+    if [ "$VIPMAP_FAKE_ARP" = "yes" ]; then
+      for dev in $DEV_EXTERNAL_LIST; do
+        $FARPD -i $dev $VIPMAP_NETWORK
+      done
+    fi
   fi
 }