[LEDE-DEV] [PATCH 2/2] main: add start|stop|flush|reload|restart event handling

John Crispin john at phrozen.org
Wed Aug 30 02:19:41 PDT 2017



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 <fe at 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);




More information about the Lede-dev mailing list