Add new iptables handle task
authorNeutron Soutmun <neo.neutron@gmail.com>
Mon, 20 Apr 2009 07:21:34 +0000 (14:21 +0700)
committerNeutron Soutmun <neo.neutron@gmail.com>
Mon, 20 Apr 2009 07:21:34 +0000 (14:21 +0700)
2009-04-20  Neutron Soutmun <neo.neutron@gmail.com>

* +src/rh-task-iptables.{h,c}:
  Add new iptables handle, preparing for configuration reloading.
* src/Makefile.am: Changed accordingly, iptables handle.
* src/rh-config.{h,c}: Add more config fields.
* src/rh-task-{bandwidth,dbset,ipset,memset}.c, src/rh-task.{h,c}:
  Change the {start,stop}service API and use them to do the task only when
  the service is start or stop.
* src/rahunasd.c, src/rh-server.c: Changed accordingly, {start,stop}service.
* tools/firewall.sh.in: Adapted to the new iptables handle.

15 files changed:
ChangeLog
src/Makefile.am
src/rahunasd.c
src/rh-config.c
src/rh-config.h
src/rh-server.c
src/rh-task-bandwidth.c
src/rh-task-dbset.c
src/rh-task-ipset.c
src/rh-task-iptables.c [new file with mode: 0644]
src/rh-task-iptables.h [new file with mode: 0644]
src/rh-task-memset.c
src/rh-task.c
src/rh-task.h
tools/firewall.sh.in

index 8cd8903..467f503 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2009-04-20  Neutron Soutmun <neo.neutron@gmail.com>
+
+       * +src/rh-task-iptables.{h,c}: 
+         Add new iptables handle, preparing for configuration reloading.
+       * src/Makefile.am: Changed accordingly, iptables handle.
+       * src/rh-config.{h,c}: Add more config fields.
+       * src/rh-task-{bandwidth,dbset,ipset,memset}.c, src/rh-task.{h,c}:
+         Change the {start,stop}service API and use them to do the task only when
+         the service is start or stop.
+       * src/rahunasd.c, src/rh-server.c: Changed accordingly, {start,stop}service.
+       * tools/firewall.sh.in: Adapted to the new iptables handle.
+
 2009-04-18  Neutron Soutmun <neo.neutron@gmail.com>
 
        * example/{rahunas,rahunas-vserver}.conf.in, tools/firewall.sh.in:
index 502da69..5387f41 100644 (file)
@@ -30,6 +30,8 @@ rahunasd_SOURCES = \
        rh-utils.h \
        rh-task.c \
        rh-task.h \
+       rh-task-iptables.c \
+       rh-task-iptables.h \
        rh-task-memset.c \
        rh-task-memset.h \
        rh-task-ipset.c \
index 60a8de5..41cd826 100644 (file)
@@ -149,8 +149,8 @@ gboolean polling(gpointer data) {
 
 void rh_exit()
 {
-  walk_through_vserver(&rh_task_stopservice, rh_main_server);
   walk_through_vserver(&rh_task_cleanup, rh_main_server);
+  rh_task_stopservice(rh_main_server);
   rh_task_unregister(rh_main_server);
   rh_closelog(rh_main_server->main_config->log_file);
 }
@@ -266,10 +266,11 @@ int main(int argc, char **argv)
   char line[256];
 
   union rahunas_config rh_main_config = {
-    .rh_main.polling_interval = POLLING,
-    .rh_main.bandwidth_shape = BANDWIDTH_SHAPE,
     .rh_main.conf_dir = NULL,
     .rh_main.log_file = NULL,
+    .rh_main.dhcp = NULL,
+    .rh_main.polling_interval = POLLING,
+    .rh_main.bandwidth_shape = BANDWIDTH_SHAPE,
   };
 
   GNetXmlRpcServer *server = NULL;
@@ -312,6 +313,8 @@ int main(int argc, char **argv)
   logmsg(RH_LOG_NORMAL, version);
 
   rh_task_register(rh_main_server);
+  rh_task_startservice(rh_main_server);
+
   walk_through_vserver(&rh_task_init, rh_main_server);
 
   gnet_init();
@@ -346,8 +349,8 @@ int main(int argc, char **argv)
   g_timeout_add_seconds (rh_main_server->main_config->polling_interval, 
                          polling, rh_main_server);
 
-  walk_through_vserver(&rh_task_startservice, rh_main_server);
 
+  logmsg(RH_LOG_NORMAL, "Ready to serve...");
   g_main_loop_run(main_loop);
 
   exit(EXIT_SUCCESS);
index cc43d8c..ed99f0e 100755 (executable)
@@ -52,29 +52,165 @@ enum lcfg_status rahunas_visitor(const char *key, void *data, size_t size,
         if (config->rh_main.conf_dir != NULL)
           free(config->rh_main.conf_dir);
         config->rh_main.conf_dir = strdup(value);
+      } else if (strncmp(sub_key, "log_file", 8) == 0) {
+        if (config->rh_main.log_file != NULL)
+          free(config->rh_main.log_file);
+        config->rh_main.log_file = strdup(value); 
+      } else if (strncmp(sub_key, "dhcp", 4) == 0) {
+        if (config->rh_main.dhcp != NULL)
+          free(config->rh_main.dhcp);
+        config->rh_main.dhcp = strdup(value);
       } else if (strncmp(sub_key, "bandwidth_shape", 15) == 0) {
         if (strncmp(value, "yes", 3) == 0)
           config->rh_main.bandwidth_shape = 1; 
         else
           config->rh_main.bandwidth_shape = 0;
+      } else if (strncmp(sub_key, "bittorrent_download_max", 23) == 0) {
+        config->rh_main.bittorrent_download_max = atoi(value); 
+      } else if (strncmp(sub_key, "bittorrent_upload_max", 21) == 0) {
+        config->rh_main.bittorrent_upload_max = atoi(value); 
       } else if (strncmp(sub_key, "polling_interval", 16) == 0) {
         config->rh_main.polling_interval = atoi(value);
-      } else if (strncmp(sub_key, "log_file", 8) == 0) {
-        if (config->rh_main.log_file != NULL)
-          free(config->rh_main.log_file);
-        config->rh_main.log_file = strdup(value); 
-      }
+      }      
       break;
 
     case VSERVER:
       if (strncmp(sub_key, "vserver_id", 10) == 0) {
         config->rh_vserver.vserver_id = atoi(value);
+      } else if (strncmp(sub_key, "dev_external", 12) == 0) {
+        if (config->rh_vserver.dev_external != NULL)
+          free(config->rh_vserver.dev_external);
+        config->rh_vserver.dev_external = strdup(value);
+      } else if (strncmp(sub_key, "dev_internal", 12) == 0) {
+        if (config->rh_vserver.dev_internal != NULL)
+          free(config->rh_vserver.dev_internal);
+        config->rh_vserver.dev_internal = strdup(value);
+      } else if (strncmp(sub_key, "vlan", 4) == 0) {
+        if (config->rh_vserver.vlan != NULL)
+          free(config->rh_vserver.vlan);
+        config->rh_vserver.vlan = strdup(value);
+      } else if (strncmp(sub_key, "vlan_raw_dev_external", 21) == 0) {
+        if (config->rh_vserver.vlan_raw_dev_external != NULL)
+          free(config->rh_vserver.vlan_raw_dev_external);
+        config->rh_vserver.vlan_raw_dev_external = strdup(value);
+       } else if (strncmp(sub_key, "vlan_raw_dev_internal", 21) == 0) {
+        if (config->rh_vserver.vlan_raw_dev_internal != NULL)
+          free(config->rh_vserver.vlan_raw_dev_internal);
+        config->rh_vserver.vlan_raw_dev_internal = strdup(value);
+      } else if (strncmp(sub_key, "bridge", 6) == 0) {
+        if (config->rh_vserver.bridge != NULL)
+          free(config->rh_vserver.bridge);
+        config->rh_vserver.bridge = strdup(value);
+      } else if (strncmp(sub_key, "masquerade", 10) == 0) {
+        if (config->rh_vserver.masquerade != NULL)
+          free(config->rh_vserver.masquerade);
+        config->rh_vserver.masquerade = strdup(value);
+      } else if (strncmp(sub_key, "ignore_mac", 10) == 0) {
+        if (config->rh_vserver.ignore_mac != NULL)
+          free(config->rh_vserver.ignore_mac);
+        config->rh_vserver.ignore_mac = strdup(value);
       } else if (strncmp(sub_key, "vserver_ip", 10) == 0) {
         if (config->rh_vserver.vserver_ip != NULL)
           free(config->rh_vserver.vserver_ip);
         config->rh_vserver.vserver_ip = strdup(value); 
+      } else if (strncmp(sub_key, "vserver_fqdn", 12) == 0) {
+        if (config->rh_vserver.vserver_fqdn != NULL)
+          free(config->rh_vserver.vserver_fqdn);
+        config->rh_vserver.vserver_fqdn = strdup(value);
+      } else if (strncmp(sub_key, "vserver_ports_allow", 19) == 0) {
+        if (config->rh_vserver.vserver_ports_allow != NULL)
+          free(config->rh_vserver.vserver_ports_allow);
+        config->rh_vserver.vserver_ports_allow = strdup(value);
+      } else if (strncmp(sub_key, "vserver_ports_intercept", 23) == 0) {
+        if (config->rh_vserver.vserver_ports_intercept != NULL)
+          free(config->rh_vserver.vserver_ports_intercept);
+        config->rh_vserver.vserver_ports_intercept = strdup(value);
+      } else if (strncmp(sub_key, "clients", 7) == 0) {
+        if (config->rh_vserver.clients != NULL)
+          free(config->rh_vserver.clients);
+        config->rh_vserver.clients = strdup(value);
+      } else if (strncmp(sub_key, "excluded", 8) == 0) {
+        if (config->rh_vserver.excluded != NULL)
+          free(config->rh_vserver.excluded);
+        config->rh_vserver.excluded = strdup(value);
       } else if (strncmp(sub_key, "idle_timeout", 12) == 0) {
         config->rh_vserver.idle_timeout = atoi(value);
+      } else if (strncmp(sub_key, "dns", 3) == 0) {
+        if (config->rh_vserver.dns != NULL)
+          free(config->rh_vserver.dns);
+        config->rh_vserver.dns = strdup(value);
+      } else if (strncmp(sub_key, "ssh", 3) == 0) {
+        if (config->rh_vserver.ssh != NULL)
+          free(config->rh_vserver.ssh);
+        config->rh_vserver.ssh = strdup(value);
+      } else if (strncmp(sub_key, "proxy", 5) == 0) {
+        if (strncmp(sub_key, "proxy_host", 10) == 0) {
+          if (config->rh_vserver.proxy_host != NULL)
+            free(config->rh_vserver.proxy_host);
+          config->rh_vserver.proxy_host = strdup(value);
+        } else if (strncmp(sub_key, "proxy_port", 10) == 0) {
+          if (config->rh_vserver.proxy_port != NULL)
+            free(config->rh_vserver.proxy_port);
+          config->rh_vserver.proxy_port = strdup(value);
+        } else {
+          if (config->rh_vserver.proxy != NULL)
+            free(config->rh_vserver.proxy);
+          config->rh_vserver.proxy = strdup(value);
+        }
+      } else if (strncmp(sub_key, "bittorrent", 10) == 0) {
+        if (strncmp(sub_key, "bittorrent_allow", 16) == 0) {
+          if (config->rh_vserver.bittorrent_allow != NULL)
+            free(config->rh_vserver.bittorrent_allow);
+          config->rh_vserver.bittorrent_allow = strdup(value);
+        } else {
+          if (config->rh_vserver.bittorrent != NULL)
+            free(config->rh_vserver.bittorrent);
+          config->rh_vserver.bittorrent = strdup(value);
+        }
+      } else if (strncmp(sub_key, "radius_host", 11) == 0) {
+        if (config->rh_vserver.radius_host != NULL)
+          free(config->rh_vserver.radius_host);
+        config->rh_vserver.radius_host = strdup(value);
+      } else if (strncmp(sub_key, "radius_secret", 13) == 0) {
+        if (config->rh_vserver.radius_secret != NULL)
+          free(config->rh_vserver.radius_secret);
+        config->rh_vserver.radius_secret = strdup(value);
+      } else if (strncmp(sub_key, "radius_encrypt", 14) == 0) {
+        if (config->rh_vserver.radius_encrypt != NULL)
+          free(config->rh_vserver.radius_encrypt);
+        config->rh_vserver.radius_encrypt = strdup(value);
+      } else if (strncmp(sub_key, "radius_auth_port", 16) == 0) {
+        if (config->rh_vserver.radius_auth_port != NULL)
+          free(config->rh_vserver.radius_auth_port);
+        config->rh_vserver.radius_auth_port = strdup(value);
+      } else if (strncmp(sub_key, "radius_account_port", 19) == 0) {
+        if (config->rh_vserver.radius_account_port != NULL)
+          free(config->rh_vserver.radius_account_port);
+        config->rh_vserver.radius_account_port = strdup(value);
+      } else if (strncmp(sub_key, "nas_identifier", 14) == 0) {
+        if (config->rh_vserver.nas_identifier != NULL)
+          free(config->rh_vserver.nas_identifier);
+        config->rh_vserver.nas_identifier = strdup(value);
+      } else if (strncmp(sub_key, "nas_port", 8) == 0) {
+        if (config->rh_vserver.nas_port != NULL)
+          free(config->rh_vserver.nas_port);
+        config->rh_vserver.nas_port = strdup(value);
+      } else if (strncmp(sub_key, "nas_login_title", 15) == 0) {
+        if (config->rh_vserver.nas_login_title != NULL)
+          free(config->rh_vserver.nas_login_title);
+        config->rh_vserver.nas_login_title = strdup(value);
+      } else if (strncmp(sub_key, "nas_default_redirect", 20) == 0) {
+        if (config->rh_vserver.nas_default_redirect != NULL)
+          free(config->rh_vserver.nas_default_redirect);
+        config->rh_vserver.nas_default_redirect = strdup(value);
+      } else if (strncmp(sub_key, "nas_default_language", 20) == 0) {
+        if (config->rh_vserver.nas_default_language != NULL)
+          free(config->rh_vserver.nas_default_language);
+        config->rh_vserver.nas_default_language = strdup(value);
+      } else if (strncmp(sub_key, "nas_weblogin_template", 21) == 0) {
+        if (config->rh_vserver.nas_weblogin_template != NULL)
+          free(config->rh_vserver.nas_weblogin_template);
+        config->rh_vserver.nas_weblogin_template = strdup(value);
       }
       break;
   }
@@ -164,8 +300,40 @@ int get_vservers_config(const char *conf_dir, struct main_server *server)
 
 int cleanup_vserver_config(struct rahunas_vserver_config *config)
 {
-  rh_free(&(config->vserver_ip));
   rh_free(&(config->vserver_name));  
+  rh_free(&(config->dev_external));
+  rh_free(&(config->dev_internal));
+  rh_free(&(config->vlan));
+  rh_free(&(config->vlan_raw_dev_external));
+  rh_free(&(config->vlan_raw_dev_internal));
+  rh_free(&(config->bridge));
+  rh_free(&(config->masquerade));
+  rh_free(&(config->ignore_mac));
+  rh_free(&(config->vserver_ip));
+  rh_free(&(config->vserver_fqdn));
+  rh_free(&(config->vserver_ports_allow));
+  rh_free(&(config->vserver_ports_intercept));
+  rh_free(&(config->clients));
+  rh_free(&(config->excluded));
+  rh_free(&(config->dns));
+  rh_free(&(config->ssh));
+  rh_free(&(config->proxy));
+  rh_free(&(config->proxy_host));
+  rh_free(&(config->proxy_port));
+  rh_free(&(config->bittorrent));
+  rh_free(&(config->bittorrent_allow));
+  rh_free(&(config->radius_host));
+  rh_free(&(config->radius_secret));
+  rh_free(&(config->radius_encrypt));
+  rh_free(&(config->radius_auth_port));
+  rh_free(&(config->radius_account_port));
+  rh_free(&(config->nas_identifier));
+  rh_free(&(config->nas_port));
+  rh_free(&(config->nas_login_title));
+  rh_free(&(config->nas_default_redirect));
+  rh_free(&(config->nas_default_language));
+  rh_free(&(config->nas_weblogin_template));
+
   return 0;
 }
 
@@ -173,5 +341,7 @@ int cleanup_mainserver_config(struct rahunas_main_config *config)
 {
   rh_free(&(config->conf_dir));  
   rh_free(&(config->log_file));
+  rh_free(&(config->dhcp));
+
   return 0;
 }
index ee7ace0..b3083fe 100644 (file)
 struct rahunas_main_config {
   char *conf_dir;
   char *log_file;
-  int  polling_interval;
+  char *dhcp;
   int  bandwidth_shape;
+  int  bittorrent_download_max;
+  int  bittorrent_upload_max;
+  int  polling_interval;
 };
 
 struct rahunas_vserver_config {
-  int  vserver_id;
   char *vserver_name;
-  int  idle_timeout;
+  int  vserver_id;
+  char *dev_external;
+  char *dev_internal;
+  char *vlan;
+  char *vlan_raw_dev_external;
+  char *vlan_raw_dev_internal;
+  char *bridge;
+  char *masquerade;
+  char *ignore_mac;
   char *vserver_ip;
+  char *vserver_fqdn;
+  char *vserver_ports_allow;
+  char *vserver_ports_intercept;
+  char *clients;
+  char *excluded;
+  int  idle_timeout;
+  char *dns;
+  char *ssh;
+  char *proxy;
+  char *proxy_host;
+  char *proxy_port;
+  char *bittorrent;
+  char *bittorrent_allow;
+  char *radius_host;
+  char *radius_secret;
+  char *radius_encrypt;
+  char *radius_auth_port;
+  char *radius_account_port;
+  char *nas_identifier;
+  char *nas_port;
+  char *nas_login_title;
+  char *nas_default_redirect;
+  char *nas_default_language;
+  char *nas_weblogin_template;
 };
 
 union rahunas_config {
index 0ad273c..636ed6a 100644 (file)
@@ -85,10 +85,41 @@ int register_vserver(struct main_server *ms, const char *vserver_cfg_file)
   struct vserver *new_vserver = NULL;
 
   union rahunas_config config = {
+    .rh_vserver.vserver_name = NULL,
     .rh_vserver.vserver_id = VSERVER_ID,
+    .rh_vserver.dev_external = NULL,
+    .rh_vserver.dev_internal = NULL,
+    .rh_vserver.vlan = NULL,
+    .rh_vserver.vlan_raw_dev_external = NULL,
+    .rh_vserver.vlan_raw_dev_internal = NULL,
+    .rh_vserver.bridge = NULL,
+    .rh_vserver.masquerade = NULL,
+    .rh_vserver.ignore_mac = NULL,
     .rh_vserver.vserver_ip = NULL, 
-    .rh_vserver.vserver_name = NULL,
+    .rh_vserver.vserver_fqdn = NULL,
+    .rh_vserver.vserver_ports_allow = NULL,
+    .rh_vserver.vserver_ports_intercept = NULL,
+    .rh_vserver.clients = NULL,
+    .rh_vserver.excluded = NULL,
     .rh_vserver.idle_timeout = IDLE_TIMEOUT,
+    .rh_vserver.dns = NULL,
+    .rh_vserver.ssh = NULL,
+    .rh_vserver.proxy = NULL,
+    .rh_vserver.proxy_host = NULL,
+    .rh_vserver.proxy_port = NULL,
+    .rh_vserver.bittorrent = NULL,
+    .rh_vserver.bittorrent_allow = NULL,
+    .rh_vserver.radius_host = NULL,
+    .rh_vserver.radius_secret = NULL,
+    .rh_vserver.radius_encrypt = NULL,
+    .rh_vserver.radius_auth_port = NULL,
+    .rh_vserver.radius_account_port = NULL,
+    .rh_vserver.nas_identifier = NULL,
+    .rh_vserver.nas_port = NULL,
+    .rh_vserver.nas_login_title = NULL,
+    .rh_vserver.nas_default_redirect = NULL,
+    .rh_vserver.nas_default_language = NULL,
+    .rh_vserver.nas_weblogin_template = NULL,
   };
 
   cfg_file = fopen(vserver_cfg_file, "r");
index 0744f3f..5de9ccb 100644 (file)
@@ -24,7 +24,6 @@
 
 static unsigned short slot_flags[MAX_SLOT_PAGE] = {1};
 static unsigned short slot_count = 0;
-static int bw_service = 0;
 
 unsigned short _get_slot_id()
 {
@@ -136,7 +135,7 @@ int bandwidth_exec(struct vserver *vs, char *const args[])
   return ret;
 }
 
-int bandwidth_start()
+int bandwidth_start(void)
 {
   char *args[3];
 
@@ -149,7 +148,7 @@ int bandwidth_start()
   return bandwidth_exec(NULL, args);
 }
 
-int bandwidth_stop()
+int bandwidth_stop(void)
 {
   char *args[3];
 
@@ -194,36 +193,28 @@ int bandwidth_del(struct vserver *vs, struct bandwidth_req *bw_req)
   return bandwidth_exec(vs, args);
 }
 
-/* Initialize */
-static void init (struct vserver *vs)
+/* Start service task */
+static int startservice (void)
 {
-  logmsg(RH_LOG_NORMAL, "[%s] Task BANDWIDTH init..", 
-         vs->vserver_config->vserver_name);  
+  return bandwidth_start();
 }
 
-/* Cleanup */
-static int cleanup (struct vserver *vs)
+/* Stop service task */
+static int stopservice (void)
 {
-  logmsg(RH_LOG_NORMAL, "[%s] Task BANDWIDTH cleanup..",
-         vs->vserver_config->vserver_name);  
+  return bandwidth_stop();
 }
 
-/* Start service task */
-static int startservice (struct vserver *vs)
+/* Initialize */
+static void init (struct vserver *vs)
 {
-  if (!(bw_service++))
-    return bandwidth_start();
-
-  return 0;
+  /* Do nothing */
 }
 
-/* Stop service task */
-static int stopservice  (struct vserver *vs)
+/* Cleanup */
+static int cleanup (struct vserver *vs)
 {
-  if ((--bw_service) == 0)
-    return bandwidth_stop();
-  
-  return 0;
+  /* Do nothing */
 }
 
 /* Start session task */
index 8980aca..bb59568 100644 (file)
@@ -27,8 +27,6 @@ struct dbset_row {
   long bandwidth_max_up;
 };
 
-static db_init = 0;
-
 gboolean get_errors (GdaConnection * connection)
 {
   GList *list;
@@ -246,40 +244,36 @@ gboolean restore_set(GList **data_list, struct vserver *vs)
   return TRUE;
 }
 
-/* Initialize */
-static void init (struct vserver *vs)
+/* Start service task */
+static int startservice ()
 {
   char ds_name[] = PROGRAM;
   char ds_provider[] = "SQLite";
   char ds_cnc_string[] = "DB_DIR=" RAHUNAS_CONF_DIR ";DB_NAME=" DB_NAME; 
   char ds_desc[] = "RahuNAS DB Set";
 
-  if (!(db_init++)) {
-    logmsg(RH_LOG_NORMAL, "Task DBSET init..");
-    
-    gda_init(ds_name, RAHUNAS_VERSION, NULL, NULL);
+  logmsg(RH_LOG_NORMAL, "Task DBSET start..");
+   
+  gda_init(ds_name, RAHUNAS_VERSION, NULL, NULL);
     
-    gda_config_save_data_source(ds_name, ds_provider, 
-                                ds_cnc_string, ds_desc,
-                                NULL, NULL, FALSE);
+  gda_config_save_data_source(ds_name, ds_provider, 
+                              ds_cnc_string, ds_desc,
+                              NULL, NULL, FALSE);
    
-    list_datasource();
-  }
+  list_datasource();
+
+  return 0;
 }
 
-/* Cleanup */
-static void cleanup (struct vserver *vs)
+/* Stop service task */
+static int stopservice  ()
 {
-  if ((--db_init) == 0) {
-    logmsg(RH_LOG_NORMAL, "Task DBSET cleanup..");  
-  
-    gda_config_remove_data_source (PROGRAM);
-  }
+  gda_config_remove_data_source (PROGRAM);
+  return 0;
 }
 
-
-/* Start service task */
-static int startservice (struct vserver *vs)
+/* Initialize */
+static void init (struct vserver *vs)
 {
   GdaClient *client;
   GdaConnection *connection;
@@ -288,7 +282,7 @@ static int startservice (struct vserver *vs)
   struct dbset_row *row;
   char select_cmd[256];
 
-  logmsg(RH_LOG_NORMAL, "[%s] Task DBSET start..",
+  logmsg(RH_LOG_NORMAL, "[%s] Task DBSET initialize..",
          vs->vserver_config->vserver_name);  
 
   client = gda_client_new ();
@@ -310,16 +304,12 @@ static int startservice (struct vserver *vs)
   gda_client_close_all_connections (client);
 
   g_object_unref(G_OBJECT(client));
-
-  return 0;
 }
 
-/* Stop service task */
-static int stopservice  (struct vserver *vs)
+/* Cleanup */
+static void cleanup (struct vserver *vs)
 {
-  /* Do nothing or need to implement */
-  logmsg(RH_LOG_NORMAL, "[%s] Task DBSET stop..",
-         vs->vserver_config->vserver_name);  
+  /* Do nothing */
 }
 
 /* Start session task */
index e82af36..79279a6 100644 (file)
@@ -12,7 +12,7 @@
 #include "rh-task.h"
 #include "rh-xmlrpc-cmd.h"
 
-size_t nas_stopservice(void *data)
+size_t set_cleanup(void *data)
 {
   struct processing_set *process = (struct processing_set *) data;
   struct ip_set_list *setlist = (struct ip_set_list *) process->list;
@@ -46,16 +46,31 @@ size_t nas_stopservice(void *data)
   }
 }
 
+/* Start service task */
+static int startservice ()
+{
+  return 0;
+}
+
+/* Stop service task */
+static int stopservice  ()
+{
+  return 0;
+}
+
 /* Initialize */
 static void init (struct vserver *vs)
 {
   vs->v_set = set_adt_get(vs->vserver_config->vserver_name);
-  logmsg(RH_LOG_NORMAL, "[%s] Task IPSET init..",
+  logmsg(RH_LOG_NORMAL, "[%s] Task IPSET initialize..",
          vs->vserver_config->vserver_name);  
 
   DP("getsetname: %s", vs->v_set->name);
   DP("getsetid: %d", vs->v_set->id);
   DP("getsetindex: %d", vs->v_set->index);
+
+  /* Ensure the set is empty */
+  set_flush(vs->vserver_config->vserver_name);
 }
 
 /* Cleanup */
@@ -63,26 +78,11 @@ static void cleanup (struct vserver *vs)
 {
   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET cleanup..",
          vs->vserver_config->vserver_name);  
-  set_flush(vs->vserver_config->vserver_name);
 
-  rh_free(&(vs->v_set));
-}
+  walk_through_set(&set_cleanup, vs);
 
-/* Start service task */
-static int startservice (struct vserver *vs)
-{
-  /* Ensure the set is empty */
   set_flush(vs->vserver_config->vserver_name);
-}
-
-/* Stop service task */
-static int stopservice  (struct vserver *vs)
-{
-  logmsg(RH_LOG_NORMAL, "[%s] Task IPSET stop..",
-         vs->vserver_config->vserver_name);  
-  walk_through_set(&nas_stopservice, vs);
-
-  return 0;
+  rh_free(&(vs->v_set));
 }
 
 /* Start session task */
diff --git a/src/rh-task-iptables.c b/src/rh-task-iptables.c
new file mode 100644 (file)
index 0000000..adaaf28
--- /dev/null
@@ -0,0 +1,216 @@
+/**
+ * RahuNAS task bandwidth implementation 
+ * Author: Neutron Soutmun <neo.neutron@gmail.com>
+ * Date:   2008-11-20
+ */
+
+#include <stdlib.h>
+#include <syslog.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include "rahunasd.h"
+#include "rh-task.h"
+#include "rh-utils.h"
+
+#define IPTABLES_WRAPPER "/etc/rahunas/firewall.sh"
+
+int iptables_exec(struct vserver *vs, char *const args[])
+{
+  pid_t ws;
+  pid_t pid;
+  int status;
+  int exec_pipe[2];
+  char buffer[150];
+  char *endline = NULL;
+  int ret = 0;
+  int fd = 0;
+  int i = 0;
+  char *env[21];
+
+  env[0]  = g_strdup("ENV_OVERRIDE=yes");
+  env[1]  = g_strdup_printf("SETNAME=%s", vs->vserver_config->vserver_name);
+  env[2]  = g_strdup_printf("VSERVER_ID=%d", vs->vserver_config->vserver_id);
+  env[3]  = g_strdup_printf("DEV_EXTERNAL=%s",vs->vserver_config->dev_external);
+  env[4]  = g_strdup_printf("DEV_INTERNAL=%s",vs->vserver_config->dev_internal);
+  env[5]  = g_strdup_printf("BRIDGE=%s", vs->vserver_config->bridge);
+  env[6]  = g_strdup_printf("MASQUERADE=%s", vs->vserver_config->masquerade);
+  env[7]  = g_strdup_printf("IGNORE_MAC=%s", vs->vserver_config->ignore_mac);
+  env[8]  = g_strdup_printf("VSERVER_IP=%s", vs->vserver_config->vserver_ip);
+  env[9]  = g_strdup_printf("CLIENTS=%s", vs->vserver_config->clients);
+  env[10] = g_strdup_printf("EXCLUDED=%s", vs->vserver_config->excluded);
+  env[11] = g_strdup_printf("DNS=%s", vs->vserver_config->dns);
+  env[12] = g_strdup_printf("SSH=%s", vs->vserver_config->ssh);
+  env[13] = g_strdup_printf("PROXY=%s", vs->vserver_config->proxy);
+  env[14] = g_strdup_printf("PROXY_HOST=%s", vs->vserver_config->proxy_host);
+  env[15] = g_strdup_printf("PROXY_PORT=%s", vs->vserver_config->proxy_port);
+  env[16] = g_strdup_printf("BITTORRENT=%s", vs->vserver_config->bittorrent);
+  env[17] = g_strdup_printf("BITTORRENT_ALLOW=%s", 
+                            vs->vserver_config->bittorrent_allow);
+  env[18] = g_strdup_printf("VSERVER_PORTS_ALLOW=%s", 
+                            vs->vserver_config->vserver_ports_allow);
+  env[19] = g_strdup_printf("VSERVER_PORTS_INTERCEPT=%s", 
+                            vs->vserver_config->vserver_ports_intercept);
+  env[20] = (char *) 0;
+
+  for (i = 0; i < 21; i++) {
+    if (env[i] != NULL) 
+      DP("%s", env[i]);
+  }
+  
+  memset(buffer, '\0', sizeof(buffer));
+
+  if (pipe(exec_pipe) == -1) {
+    logmsg(RH_LOG_ERROR, "Error: pipe()");
+    return -1;
+  }
+  DP("pipe0=%d,pipe1=%d", exec_pipe[0], exec_pipe[1]);
+
+  pid = vfork();
+  dup2(exec_pipe[1], STDOUT_FILENO);
+
+  if (pid == 0) {
+    // Child
+    execve(IPTABLES_WRAPPER, args, env);
+  } else if (pid < 0) {
+    // Fork error
+    logmsg(RH_LOG_ERROR, "Error: vfork()"); 
+    ret = -1;
+  } else {
+    // Parent
+    ws = waitpid(pid, &status, 0);
+
+    DP("IPTables: Return (%d)", WEXITSTATUS(status));
+
+    if (WIFEXITED(status)) {
+      ret = WEXITSTATUS(status);
+    } else {
+      ret = -1;
+    } 
+  }
+
+  close(exec_pipe[0]);
+  close(exec_pipe[1]);
+
+  for (i = 0; i < 21; i++) {
+    g_free(env[i]);
+  } 
+  
+  return ret;
+}
+
+int iptables_start(struct vserver *vs)
+{
+  char *args[3];
+
+  DP("IPTables: start");
+
+  args[0] = IPTABLES_WRAPPER;
+  args[1] = "start-config";
+  args[2] = (char *) 0;
+
+  return iptables_exec(vs, args);
+}
+
+int iptables_stop(struct vserver *vs)
+{
+  char *args[3];
+
+  DP("IPTables: stop");
+
+  args[0] = IPTABLES_WRAPPER;
+  args[1] = "stop-config";
+  args[2] = (char *) 0;
+
+  return iptables_exec(vs, args);
+}
+
+/* Start service task */
+static int startservice ()
+{
+  return 0;
+}
+
+/* Stop service task */
+static int stopservice  ()
+{
+  return 0;
+}
+
+/* Initialize */
+static void init (struct vserver *vs)
+{
+  logmsg(RH_LOG_NORMAL, "[%s] Task IPTABLES initialize..", 
+         vs->vserver_config->vserver_name);  
+
+  iptables_start(vs);
+}
+
+/* Cleanup */
+static int cleanup (struct vserver *vs)
+{
+  logmsg(RH_LOG_NORMAL, "[%s] Task IPTABLES cleanup..",
+         vs->vserver_config->vserver_name);  
+  iptables_stop(vs);
+}
+
+/* Start session task */
+static int startsess (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing */
+  return 0;
+}
+
+/* Stop session task */
+static int stopsess  (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing */
+  return 0; 
+}
+
+/* Commit start session task */
+static int commitstartsess (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing or need to implement */
+}
+
+/* Commit stop session task */
+static int commitstopsess  (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing or need to implement */
+}
+
+/* Rollback start session task */
+static int rollbackstartsess (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing or need to implement */
+}
+
+/* Rollback stop session task */
+static int rollbackstopsess  (struct vserver *vs, struct task_req *req)
+{
+  /* Do nothing or need to implement */
+}
+
+static struct task taskiptables = {
+  .taskname = "IPTABLES",
+  .taskprio = 50,
+  .init = &init,
+  .cleanup = &cleanup,
+  .startservice = &startservice,
+  .stopservice = &stopservice,
+  .startsess = &startsess,
+  .stopsess = &stopsess,
+  .commitstartsess = &commitstartsess,
+  .commitstopsess = &commitstopsess,
+  .rollbackstartsess = &rollbackstartsess,
+  .rollbackstopsess = &rollbackstopsess,
+};
+
+void rh_task_iptables_reg(struct main_server *ms) {
+  task_register(ms, &taskiptables);
+}
diff --git a/src/rh-task-iptables.h b/src/rh-task-iptables.h
new file mode 100644 (file)
index 0000000..6af9fe5
--- /dev/null
@@ -0,0 +1,11 @@
+/**
+ * RahuNAS task iptables implementation 
+ * Author: Neutron Soutmun <neo.neutron@gmail.com>
+ * Date:   2009-04-18
+ */
+#ifndef __RH_TASK_IPTABLES_H
+#define __RH_TASK_IPTABLES_H
+
+extern void rh_task_iptables_reg(struct main_server *ms);
+
+#endif // __RH_TASK_BANDWIDTH_H
index 0ed8bfe..f2ea60a 100644 (file)
@@ -37,12 +37,26 @@ gint idcmp(struct rahunas_member *a, struct rahunas_member *b)
   return -1;
 }
 
+/* Start service task */
+static int startservice ()
+{
+  /* Do nothing or need to implement */
+  return 0;
+}
+
+/* Stop service task */
+static int stopservice  ()
+{
+  /* Do nothing or need to implement */
+  return 0;
+}
+
 /* Initialize */
 static void init (struct vserver *vs)
 {
   int size;
 
-  logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET init..",
+  logmsg(RH_LOG_NORMAL, "[%s] Task MEMSET initialize..",
          vs->vserver_config->vserver_name);  
 
   vs->v_map = (struct rahunas_map *)(rh_malloc(sizeof(struct rahunas_map)));
@@ -95,19 +109,6 @@ static void cleanup (struct vserver *vs)
   return 0;
 }
 
-
-/* Start service task */
-static int startservice (struct vserver *vs)
-{
-  /* Do nothing or need to implement */
-}
-
-/* Stop service task */
-static int stopservice  (struct vserver *vs)
-{
-  /* Do nothing or need to implement */
-}
-
 /* Start session task */
 static int startsess (struct vserver *vs, struct task_req *req)
 {
index fdc18bc..37fb06a 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <syslog.h>
 #include "rh-task.h"
+#include "rh-task-iptables.h"
 #include "rh-task-memset.h"
 #include "rh-task-ipset.h"
 #include "rh-task-dbset.h"
@@ -44,26 +45,13 @@ void task_register(struct main_server *ms, struct task *task)
   ms->task_list = g_list_insert_before(ms->task_list, node, task);
 }
 
-void rh_task_init (struct main_server *ms, struct vserver *vs)
-{
-  GList *runner = g_list_first(ms->task_list);
-  struct task *ltask = NULL;
-
-  DP("Initialize...");
-
-  while (runner != NULL) {
-    ltask = (struct task *)runner->data;
-    (*ltask->init)(vs);
-    runner = g_list_next(runner);
-  }
-}
-
 void rh_task_register(struct main_server *ms)
 {
   static int task_registered = 0;
 
   if (task_registered == 0) {
     /* Register all tasks */
+    rh_task_iptables_reg(ms);
     rh_task_memset_reg(ms);
     rh_task_ipset_reg(ms);
 
@@ -79,51 +67,66 @@ void rh_task_unregister(struct main_server *ms) {
   g_list_free(ms->task_list);
 }
 
-void rh_task_cleanup(struct main_server *ms, struct vserver *vs)
+int  rh_task_startservice(struct main_server *ms)
 {
+  GList *runner = g_list_first(ms->task_list);
+  struct task *ltask = NULL;
+
+  DP("Start service");
+
+  while (runner != NULL) {
+    ltask = (struct task *)runner->data;
+    (*ltask->startservice)();
+    runner = g_list_next(runner);
+  }
+
+  logmsg(RH_LOG_NORMAL, "Service started");
+  return 0;
+}
+
+int rh_task_stopservice(struct main_server *ms)
+{  
   GList *runner = g_list_last(ms->task_list);
   struct task *ltask = NULL;
 
-  DP("Task Cleanup");
+  DP("Stop service");
 
   while (runner != NULL) {
     ltask = (struct task *)runner->data;
-    (*ltask->cleanup)(vs);
+    (*ltask->stopservice)();
     runner = g_list_previous(runner);
-  }  
+  }
+
+  logmsg(RH_LOG_NORMAL, "Service stopped");
+  return 0;
 }
 
-int  rh_task_startservice(struct main_server *ms, struct vserver *vs)
+void rh_task_init (struct main_server *ms, struct vserver *vs)
 {
   GList *runner = g_list_first(ms->task_list);
   struct task *ltask = NULL;
 
-  DP("Start service");
+  DP("Initialize...");
 
   while (runner != NULL) {
     ltask = (struct task *)runner->data;
-    (*ltask->startservice)(vs);
+    (*ltask->init)(vs);
     runner = g_list_next(runner);
-  }  
-
-  logmsg(RH_LOG_NORMAL, "Service started");
-  return 0;
+  }
 }
 
-int  rh_task_stopservice(struct main_server *ms, struct vserver *vs)
-{  
+void rh_task_cleanup(struct main_server *ms, struct vserver *vs)
+{
   GList *runner = g_list_last(ms->task_list);
   struct task *ltask = NULL;
 
-  DP("Stop service");
+  DP("Task Cleanup");
 
   while (runner != NULL) {
     ltask = (struct task *)runner->data;
-    (*ltask->stopservice)(vs);
+    (*ltask->cleanup)(vs);
     runner = g_list_previous(runner);
   }  
-
-  logmsg(RH_LOG_NORMAL, "Service stopped");
 }
 
 int  rh_task_startsess(struct vserver *vs, struct task_req *req)
index 0e90623..78f03eb 100644 (file)
@@ -30,17 +30,17 @@ struct task {
   char taskname[RH_TASK_MAXNAMELEN];
   unsigned int taskprio;
 
+  /* Start service task */
+  int (*startservice) (void);
+
+  /* Stop service task */
+  int (*stopservice) (void);
+
   /* Initialize */
   void (*init) (struct vserver *vs);
 
   /* Cleanup */
   void (*cleanup) (struct vserver *vs);
-  
-  /* Start service task */
-  int (*startservice) (struct vserver *vs);
-
-  /* Stop service task */
-  int (*stopservice) (struct vserver *vs);
 
   /* Start session task */
   int (*startsess) (struct vserver *vs, struct task_req *req);
@@ -65,10 +65,10 @@ extern void task_register(struct main_server *ms, struct task *task);
 
 void rh_task_register(struct main_server *ms);
 void rh_task_unregister(struct main_server *ms);
+int  rh_task_startservice(struct main_server *ms);
+int  rh_task_stopservice(struct main_server *ms);
 void rh_task_init(struct main_server *ms, struct vserver *vs);
 void rh_task_cleanup(struct main_server *ms, struct vserver *vs);
-int  rh_task_startservice(struct main_server *ms, struct vserver *vs);
-int  rh_task_stopservice(struct main_server *ms, struct vserver *vs);
 int  rh_task_startsess(struct vserver *vs, struct task_req *req);
 int  rh_task_stopsess(struct vserver *vs, struct task_req *req);
 int  rh_task_commitstartsess(struct vserver *vs, struct task_req *req);
index 8d9cb50..0baded9 100755 (executable)
@@ -49,28 +49,33 @@ MAIN_BITTORRENT_DOWNLOAD_MAX=`get_config_value main bittorrent_download_max $RAH
 MAIN_BITTORRENT_UPLOAD_MAX=`get_config_value main bittorrent_upload_max $RAHUNAS_CONFIG`
 MAIN_DHCP=`get_config_value main dhcp $RAHUNAS_CONFIG`
 
-# Virtual Server : config
-VSERVER_ID=
-DEV_EXTERNAL=
-DEV_INTERNAL=
-BRIDGE=
-MASQUERADE=
-IGNORE_MAC=
-VSERVER_IP=
-CLIENTS=
-EXCLUDED=
+if [ "$ENV_OVERRIDE" != "yes" ]; then
+  # Virtual Server : config
+  VSERVER_ID=
+  DEV_EXTERNAL=
+  DEV_INTERNAL=
+  BRIDGE=
+  MASQUERADE=
+  IGNORE_MAC=
+  VSERVER_IP=
+  CLIENTS=
+  EXCLUDED=
+  DNS=
+  SSH=
+  PROXY=
+  PROXY_HOST=
+  PROXY_PORT=
+  BITTORRENT=
+  BITTORRENT_ALLOW=
+  VSERVER_PORTS_ALLOW=
+  VSERVER_PORTS_INTERCEPT=
+  SETNAME=
+fi
+
 BANDWIDTH_SHAPE=
-DNS=
-SSH=
-PROXY=
-PROXY_HOST=
-PROXY_PORT=
-BITTORRENT=
-BITTORRENT_ALLOW=
 BITTORRENT_DOWNLOAD_MAX=
 BITTORRENT_UPLOAD_MAX=
-VSERVER_PORTS_ALLOW=
-VSERVER_PORTS_INTERCEPT=
+
 
 # Virtual Server : set and chains
 CHAIN_INPUT=
@@ -90,51 +95,53 @@ P2P_SET=
 P2P_ALLOW_SET=
 DEV_IN_PARAM=
 DEV_OUT_PARAM=
-SETNAME=
 
 get_config () {
   file=$1
   opt=$2
 
-  test -f $file || return 1
-
-  NAME=`get_section_name $file`
-
-  # Get configuration
-  VSERVER_ID=`get_config_value $NAME vserver_id $file`
-  test -n "$VSERVER_ID" || return 2
-
-  if [ "$opt" = "start" ]; then
-    hash="$VSERVER_ID:$NAME"
-    test1=`grep -w "$hash" $VSERVER_LIST` || true
-    test2=`grep -w "$NAME" $VSERVER_LIST` || true
+  if [ "$ENV_OVERRIDE" != "yes" ]; then
+    test -f $file || return 1
   
-    test -n "$test1" -o -n "$test2" && return 3 
-
-    echo "$hash:$file" >> $VSERVER_LIST
+    SETNAME=`get_section_name $file`
+  
+    # Get configuration
+    VSERVER_ID=`get_config_value $SETNAME vserver_id $file`
+    test -n "$VSERVER_ID" || return 2
+  
+    if [ "$opt" = "start" ]; then
+      hash="$VSERVER_ID:$SETNAME"
+      test1=`grep -w "$hash" $VSERVER_LIST` || true
+      test2=`grep -w "$SETNAME" $VSERVER_LIST` || true
+    
+      test -n "$test1" -o -n "$test2" && return 3 
+  
+      echo "$hash:$file" >> $VSERVER_LIST
+    fi
+  
+    DEV_EXTERNAL=`get_config_value $SETNAME dev_external $file`
+    DEV_INTERNAL=`get_config_value $SETNAME dev_internal $file`
+    BRIDGE=`get_config_value $SETNAME bridge $file`
+    MASQUERADE=`get_config_value $SETNAME masquerade $file`
+    IGNORE_MAC=`get_config_value $SETNAME ignore_mac $file`
+    VSERVER_IP=`get_config_value $SETNAME vserver_ip $file`
+    CLIENTS=`get_config_value $SETNAME clients $file`
+    EXCLUDED=`get_config_value $SETNAME excluded $file`
+    DNS=`get_config_value $SETNAME dns $file`
+    SSH=`get_config_value $SETNAME ssh $file`
+    PROXY=`get_config_value $SETNAME proxy $file`
+    PROXY_HOST=`get_config_value $SETNAME proxy_host $file`
+    PROXY_PORT=`get_config_value $SETNAME proxy_port $file`
+    BITTORRENT=`get_config_value $SETNAME bittorrent $file`
+    BITTORRENT_ALLOW=`get_config_value $SETNAME bittorrent_allow $file`
+    VSERVER_PORTS_ALLOW=`get_config_value $SETNAME vserver_ports_allow $file`
+    VSERVER_PORTS_INTERCEPT=`get_config_value $SETNAME vserver_ports_intercept $file`
   fi
-
-  DEV_EXTERNAL=`get_config_value $NAME dev_external $file`
-  DEV_INTERNAL=`get_config_value $NAME dev_internal $file`
-  BRIDGE=`get_config_value $NAME bridge $file`
-  MASQUERADE=`get_config_value $NAME masquerade $file`
-  IGNORE_MAC=`get_config_value $NAME ignore_mac $file`
-  VSERVER_IP=`get_config_value $NAME vserver_ip $file`
-  CLIENTS=`get_config_value $NAME clients $file`
-  EXCLUDED=`get_config_value $NAME excluded $file`
   BANDWIDTH_SHAPE=$MAIN_BANDWIDTH_SHAPE
-  DNS=`get_config_value $NAME dns $file`
-  SSH=`get_config_value $NAME ssh $file`
-  PROXY=`get_config_value $NAME proxy $file`
-  PROXY_HOST=`get_config_value $NAME proxy_host $file`
-  PROXY_PORT=`get_config_value $NAME proxy_port $file`
-  BITTORRENT=`get_config_value $NAME bittorrent $file`
-  BITTORRENT_ALLOW=`get_config_value $NAME bittorrent_allow $file`
   BITTORRENT_DOWNLOAD_MAX=$MAIN_BITTORRENT_DOWNLOAD_MAX
   BITTORRENT_UPLOAD_MAX=$MAIN_BITTORRENT_UPLOAD_MAX
-  VSERVER_PORTS_ALLOW=`get_config_value $NAME vserver_ports_allow $file`
-  VSERVER_PORTS_INTERCEPT=`get_config_value $NAME vserver_ports_intercept $file`
+
   # Bridge config
   if [ "$BRIDGE" = "yes" ]; then
     DEV_IN_PARAM="-m physdev --physdev-in"
@@ -144,27 +151,24 @@ get_config () {
     DEV_OUT_PARAM="-o"
   fi
   
-  # Set declaration
-  SETNAME="${NAME}"
-  
   # Chains declaration
-  CHAIN_INPUT="${NAME}_in"
-  CHAIN_INPUT_AUTH="${NAME}_in_auth"
-  CHAIN_FORWARD="${NAME}_fwd"
-  CHAIN_FORWARD_AUTH="${NAME}_fwd_auth"
-  CHAIN_MANGLE_PREROUTING="${NAME}_mg_pre"
-  CHAIN_MANGLE_FORWARD="${NAME}_mg_fwd"
-  CHAIN_MANGLE_POSTROUTING="${NAME}_mg_post"
-  CHAIN_NAT_PREROUTING="${NAME}_nat_pre"
-  CHAIN_NAT_POSTROUTING="${NAME}_nat_post"
-  CHAIN_NAT_AUTHEN="${NAME}_nat_authen"
+  CHAIN_INPUT="${SETNAME}_in"
+  CHAIN_INPUT_AUTH="${SETNAME}_in_auth"
+  CHAIN_FORWARD="${SETNAME}_fwd"
+  CHAIN_FORWARD_AUTH="${SETNAME}_fwd_auth"
+  CHAIN_MANGLE_PREROUTING="${SETNAME}_mg_pre"
+  CHAIN_MANGLE_FORWARD="${SETNAME}_mg_fwd"
+  CHAIN_MANGLE_POSTROUTING="${SETNAME}_mg_post"
+  CHAIN_NAT_PREROUTING="${SETNAME}_nat_pre"
+  CHAIN_NAT_POSTROUTING="${SETNAME}_nat_post"
+  CHAIN_NAT_AUTHEN="${SETNAME}_nat_authen"
   
   # P2P checking chains declaration
-  CHAIN_P2P_DETECT="${NAME}_p2p_detect"
-  CHAIN_P2P_RECHECK="${NAME}_p2p_rechk"
-  CHAIN_P2P_CHECK="${NAME}_p2p_chk"
-  P2P_SET="${NAME}_p2p"
-  P2P_ALLOW_SET="${NAME}_p2p_allow"
+  CHAIN_P2P_DETECT="${SETNAME}_p2p_detect"
+  CHAIN_P2P_RECHECK="${SETNAME}_p2p_rechk"
+  CHAIN_P2P_CHECK="${SETNAME}_p2p_chk"
+  P2P_SET="${SETNAME}_p2p"
+  P2P_ALLOW_SET="${SETNAME}_p2p_allow"
 }
 
 ##
@@ -626,41 +630,16 @@ start () {
     exit 1
   fi
 
-  for file in `find $MAIN_CONF_DIR -name '*.conf'`;
-  do
-    do_get_config $file start
-    if [ $? -gt 0 ]; then
-      continue
-    fi 
-
-    add_set
-    new_chains
-    policy 
-    rules  
-  done
+  policy 
 
   touch $RUN
 }
 
 stop () {
-  opt=$1
   test -f $RUN || return 0
-
-  for line in `cat $VSERVER_LIST`;
-  do
-    file=`echo $line | cut -d: -f3` 
-    test -n $file || continue;
-    do_get_config $file stop
-    if [ $? -gt 0 ]; then
-      continue
-    fi
-
-    cleanup
-    cleanup_policy
-    test "$opt" = "reload" || cleanup_set
-  done
-
    
+  cleanup_policy
+
   rm -f $RUN
   echo "" > $VSERVER_LIST
 }
@@ -670,9 +649,45 @@ restart() {
   start
 }
 
-reload() {
-  stop reload
-  start
+start_config() {
+  add_set
+  new_chains
+  rules
+}
+
+start_config_env() {
+  do_get_config "" start
+  start_config
+}
+
+start_config_file() {
+  file=$1
+  do_get_config $file start
+  if [ $? -gt 0 ]; then
+    return
+  fi 
+  
+  start_config
+}
+
+stop_config() {
+  cleanup
+  cleanup_set
+}
+
+stop_config_env() {
+  do_get_config "" stop
+  stop_config
+}
+
+stop_config_file() {
+  file=$1
+  do_get_config $file stop
+  if [ $? -gt 0 ]; then
+    return
+  fi 
+
+  stop_config
 }
 
 case "$1" in
@@ -685,12 +700,23 @@ case "$1" in
   restart)
     restart
     ;;
-  reload)
-    reload     
-    ;; 
+  start-config)
+    if [ "$ENV_OVERRIDE" = "yes" ]; then
+      start_config_env
+    elif [ -f "$2" ]; then
+      start_config_file $2
+    fi
+    ;;
+  stop-config)
+    if [ "$ENV_OVERRIDE" = "yes" ]; then
+      stop_config_env
+    elif [ -f "$2" ]; then
+      stop_config_file $2
+    fi
+    ;;
   *)
     N=@sysconfdir@/rahunas/firewall.sh
-    echo "Usage: $N {start|stop|restart|reload}"
+    echo "Usage: $N {start|stop|restart}"
     exit 3
     ;;
 esac