On 28/08/17 09:57, Florian Eckert wrote:
Add -e option for fw3 start|stop|flush|reload|restart events.
If option is set, then common hotplug events are executed in dir
'/etc/hotplug.d/firewall'

Hi,

this should be made into a generic feature inside procd. there is already hotplug trigger support and service/instance up/down ubus notifications.

    John


Signed-off-by: Florian Eckert <f...@dev.tdt.de>
---
  main.c  | 13 +++++++++++--
  utils.c | 33 +++++++++++++++++++++++++++++++++
  utils.h |  5 ++++-
  3 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/main.c b/main.c
index c4b8228..9a7b6dd 100644
--- a/main.c
+++ b/main.c
@@ -504,7 +504,7 @@ static int
  usage(void)
  {
        fprintf(stderr, "fw3 [-4] [-6] [-q] print\n");
-       fprintf(stderr, "fw3 [-q] {start|stop|flush|reload|restart}\n");
+       fprintf(stderr, "fw3 [-q] [-e] {start|stop|flush|reload|restart}\n");
        fprintf(stderr, "fw3 [-q] network {net}\n");
        fprintf(stderr, "fw3 [-q] device {dev}\n");
        fprintf(stderr, "fw3 [-q] zone {zone} [dev]\n");
@@ -519,7 +519,7 @@ int main(int argc, char **argv)
        enum fw3_family family = FW3_FAMILY_ANY;
        struct fw3_defaults *defs = NULL;
- while ((ch = getopt(argc, argv, "46dqh")) != -1)
+       while ((ch = getopt(argc, argv, "46dqhe")) != -1)
        {
                switch (ch)
                {
@@ -539,6 +539,10 @@ int main(int argc, char **argv)
                        if (freopen("/dev/null", "w", stderr)) {}
                        break;
+ case 'e':
+                       fw3_do_hotplug = true;
+                       break;
+
                case 'h':
                        rv = usage();
                        goto out;
@@ -589,6 +593,7 @@ int main(int argc, char **argv)
                {
                        build_state(true);
                        rv = start();
+                       fw3_hotplug("start");
                        fw3_unlock();
                }
        }
@@ -598,6 +603,7 @@ int main(int argc, char **argv)
                {
                        build_state(true);
                        rv = stop(false);
+                       fw3_hotplug("stop");
                        fw3_unlock();
                }
        }
@@ -607,6 +613,7 @@ int main(int argc, char **argv)
                {
                        build_state(true);
                        rv = stop(true);
+                       fw3_hotplug("flush");
                        fw3_unlock();
                }
        }
@@ -617,6 +624,7 @@ int main(int argc, char **argv)
                        build_state(true);
                        stop(true);
                        rv = start();
+                       fw3_hotplug("restart");
                        fw3_unlock();
                }
        }
@@ -626,6 +634,7 @@ int main(int argc, char **argv)
                {
                        build_state(true);
                        rv = reload();
+                       fw3_hotplug("reload");
                        fw3_unlock();
                }
        }
diff --git a/utils.c b/utils.c
index f855840..29c3e46 100644
--- a/utils.c
+++ b/utils.c
@@ -29,6 +29,7 @@ static pid_t pipe_pid = -1;
  static FILE *pipe_fd = NULL;
bool fw3_pr_debug = false;
+bool fw3_do_hotplug = false;
static void
@@ -749,6 +750,38 @@ fw3_hotplug_zone(bool add, void *zone, void *device)
        return false;
  }
+bool
+fw3_hotplug(const char *event)
+{
+       if(!fw3_do_hotplug)
+               return false;
+
+       switch (fork())
+       {
+       case -1:
+               warn("Unable to fork(): %s\n", strerror(errno));
+               return false;
+
+       case 0:
+               break;
+
+       default:
+               return true;
+       }
+
+       close(0);
+       close(1);
+       close(2);
+       if (chdir("/")) {};
+
+       clearenv();
+       setenv("ACTION", event, 1);
+       execl(FW3_HOTPLUG, FW3_HOTPLUG, "firewall", NULL);
+
+       /* unreached */
+       return false;
+}
+
  int
  fw3_netmask2bitlen(int family, void *mask)
  {
diff --git a/utils.h b/utils.h
index 9ad7b91..08453c1 100644
--- a/utils.h
+++ b/utils.h
@@ -38,9 +38,10 @@
#define FW3_STATEFILE "/var/run/fw3.state"
  #define FW3_LOCKFILE  "/var/run/fw3.lock"
-#define FW3_HOTPLUG     "/sbin/hotplug-call"
+#define FW3_HOTPLUG    "/sbin/hotplug-call"
extern bool fw3_pr_debug;
+extern bool fw3_do_hotplug;
void warn_elem(struct uci_element *e, const char *format, ...);
  void warn(const char *format, ...);
@@ -108,6 +109,8 @@ void fw3_free_list(struct list_head *head);
bool fw3_hotplug_zone(bool add, void *zone, void *device); +bool fw3_hotplug(const char *event);
+
  int fw3_netmask2bitlen(int family, void *mask);
bool fw3_bitlen2netmask(int family, int bits, void *mask);


_______________________________________________
Lede-dev mailing list
Lede-dev@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/lede-dev

Reply via email to