ports/149727: [MAINTAINER] net/ifstated: support multiple profiles

Jim Riggs ports at christianserving.org
Tue Aug 17 02:00:09 UTC 2010


>Number:         149727
>Category:       ports
>Synopsis:       [MAINTAINER] net/ifstated: support multiple profiles
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-ports-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          maintainer-update
>Submitter-Id:   current-users
>Arrival-Date:   Tue Aug 17 02:00:08 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     Jim Riggs
>Release:        FreeBSD 6.3-RELEASE-p2 amd64
>Organization:
>Environment:
System: FreeBSD zion.christianserving.org 6.3-RELEASE-p2 FreeBSD 6.3-RELEASE-p2 #3: Mon May  5 21:27:22 CDT
>Description:
- support multiple profiles (instances) much like apache22
- add `-p pidfile' option to support multiple profiles

Added file(s):
- files/patch-ifstated.8

Generated with FreeBSD Port Tools 0.77
>How-To-Repeat:
>Fix:

--- ifstated-4.7_2,1.patch begins here ---
diff -ruN --exclude=CVS /usr/ports/net/ifstated/Makefile /usr/home/jhriggs/ifstated/Makefile
--- /usr/ports/net/ifstated/Makefile	2010-07-15 16:25:48.000000000 -0500
+++ /usr/home/jhriggs/ifstated/Makefile	2010-07-30 15:59:02.000000000 -0500
@@ -7,7 +7,7 @@
 
 PORTNAME=	ifstated
 PORTVERSION=	4.7
-PORTREVISION=	1
+PORTREVISION=	2
 PORTEPOCH=	1
 CATEGORIES=	net
 MASTER_SITES=	http://christianserving.org/ports/net/ifstated/
@@ -28,7 +28,7 @@
 
 post-patch:
 	@${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|g' ${WRKSRC}/Makefile
-	@${REINPLACE_CMD} -e 's|/etc/|${PREFIX}/etc/|g' ${WRKSRC}/ifstated.c ${WRKSRC}/ifstated.8 ${WRKSRC}/ifstated.conf.5
+	@${REINPLACE_CMD} -e 's|/etc/|${PREFIX}/etc/|g' ${WRKSRC}/ifstated.conf.5
 
 do-install:
 	${INSTALL_PROGRAM} ${WRKSRC}/ifstated ${PREFIX}/sbin
diff -ruN --exclude=CVS /usr/ports/net/ifstated/files/ifstated.in /usr/home/jhriggs/ifstated/files/ifstated.in
--- /usr/ports/net/ifstated/files/ifstated.in	2010-03-26 19:13:45.000000000 -0500
+++ /usr/home/jhriggs/ifstated/files/ifstated.in	2010-08-16 20:26:27.000000000 -0500
@@ -10,22 +10,95 @@
 
 #
 # Add the following lines to /etc/rc.conf to enable ifstated:
-# ifstated_enable (bool):     Set to "NO" by default.
-#                             Set it to "YES" to enable ifstated
-# ifstated_flags (str):       Set to "-f %%PREFIX%%/etc/ifstated.conf" by default.
-#                             Extra flags passed to start command
 #
+# ifstated_enable (bool):        Set to "NO" by default.
+#                                Set it to "YES" to enable ifstated.
+# ifstated_flags (str):          Set to "" by default.
+#                                Extra flags passed to start command.
+#
+# With no profiles defined, the default configuration file will be
+# used (%%PREFIX%%/etc/ifstated.conf).
+#
+# For profiles (separate ifstated intances):
+#
+# ifstated_profiles (str):       Set to "" by default.
+#                                Define profile names (e.g. "dns
+#                                http ssh").
+# ifstated_<name>_configfile (str):
+#                                [Required] Path to the configuration
+#                                file for profile <name>.
+# ifstated_<name>_enable (bool): Set to ${ifstated_enable} by default.
+#                                Set it to "YES" or "NO" to
+#                                independently enable or disable
+#                                profile <name>.
+# ifstated_<name>_flags (str):   Set to ${ifstated_flags} by default.
+#                                Extra flags passed to start command
+#                                for profile <name>.
+#
+
 . /etc/rc.subr
 
 name="ifstated"
 rcvar=`set_rcvar`
 
 command="%%PREFIX%%/sbin/ifstated"
-
-[ -z "$ifstated_enable" ]       && ifstated_enable="NO"
-[ -z "$ifstated_flags" ]        && ifstated_flags="-f %%PREFIX%%/etc/ifstated.conf"
+pidfile="/var/run/${name}.pid"
+command_args="-p \"${pidfile}\""
 
 load_rc_config $name
 
-run_rc_command "$1"
+: ${ifstated_enable:="NO"}
+: ${ifstated_flags:=""}
+: ${ifstated_profiles:=""}
+
+if [ -n "$2" ]
+then
+  profile="$2"
+
+  if [ "x${ifstated_profiles}" != "x" ]
+  then
+    pidfile="/var/run/${name}.${profile}.pid"
+    eval ifstated_configfile="\${ifstated_${profile}_configfile:-}"
+
+    if [ "x${ifstated_configfile}" = "x" ]
+    then
+      echo "You must define a configuration file (ifstated_${profile}_configile)." >&2
+      exit 1
+    fi
+
+    required_files="${ifstated_configfile}"
+    command_args="-f \"${ifstated_configfile}\" -p \"${pidfile}\""
+    eval ifstated_enable="\${ifstated_${profile}_enable:=${ifstated_enable}}"
+    eval ifstated_flags="\${ifstated_${profile}_flags:=${ifstated_flags}}"
+  else
+    echo "$0: extra argument ignored." >&2
+  fi
+else
+  if [ "x${ifstated_profiles}" != "x" -a "x$1" != "x" ]
+  then
+    for profile in ${ifstated_profiles}
+    do
+      eval ifstated_enable_tmp="\${ifstated_${profile}_enable:=${ifstated_enable}}"
+
+      case "x${ifstated_enable_tmp}"
+      in
+        x|x[Nn][Oo])
+          continue
+          ;;
+        x[Yy][Ee][Ss])
+          ;;
+        *)
+          echo "Bad value \"${ifstated_enable_tmp}\" for ifstated_${profile}_enable. Profile ${profile} skipped." >&2
+          continue
+          ;;
+      esac
+
+      echo "===> ifstated profile: ${profile}"
+      '%%PREFIX%%/etc/rc.d/ifstated' "$1" "${profile}"
+    done
+
+    exit 0
+  fi
+fi
 
+run_rc_command "$1"
diff -ruN --exclude=CVS /usr/ports/net/ifstated/files/patch-ifstated.8 /usr/home/jhriggs/ifstated/files/patch-ifstated.8
--- /usr/ports/net/ifstated/files/patch-ifstated.8	1969-12-31 18:00:00.000000000 -0600
+++ /usr/home/jhriggs/ifstated/files/patch-ifstated.8	2010-07-30 22:16:52.000000000 -0500
@@ -0,0 +1,32 @@
+--- ifstated.8.orig	2010-06-11 12:20:08.000000000 -0500
++++ ifstated.8	2010-07-30 22:15:08.518460671 -0500
+@@ -29,6 +29,7 @@
+ .Ar macro Ns = Ns Ar value Oc
+ .Xc
+ .Op Fl f Ar file
++.Op Fl p Ar pidfile
+ .Ek
+ .Sh DESCRIPTION
+ The
+@@ -61,6 +62,10 @@
+ Specify an alternate location,
+ .Ar file ,
+ for the configuration file.
++.It Fl p Ar pidfile
++Specify the location,
++.Ar pidfile ,
++for the PID file.
+ .It Fl h
+ Print help message.
+ .It Fl i
+@@ -78,8 +83,8 @@
+ .Nm
+ reloads the configuration file.
+ .Sh FILES
+-.Bl -tag -width "/etc/ifstated.conf" -compact
+-.It Pa /etc/ifstated.conf
++.Bl -tag -width "/usr/local/etc/ifstated.conf" -compact
++.It Pa /usr/local/etc/ifstated.conf
+ .Nm
+ configuration file.
+ .El
diff -ruN --exclude=CVS /usr/ports/net/ifstated/files/patch-ifstated.c /usr/home/jhriggs/ifstated/files/patch-ifstated.c
--- /usr/ports/net/ifstated/files/patch-ifstated.c	2010-07-13 16:31:33.000000000 -0500
+++ /usr/home/jhriggs/ifstated/files/patch-ifstated.c	2010-07-30 21:58:59.000000000 -0500
@@ -1,5 +1,5 @@
 --- ifstated.c.orig	2010-06-11 12:20:08.000000000 -0500
-+++ ifstated.c	2010-06-15 13:49:50.785704080 -0500
++++ ifstated.c	2010-07-30 21:55:03.045444649 -0500
 @@ -26,9 +26,11 @@
  #include <sys/time.h>
  #include <sys/ioctl.h>
@@ -12,7 +12,17 @@
  #include <net/route.h>
  #include <netinet/in.h>
  
-@@ -61,6 +63,8 @@
+@@ -47,7 +49,8 @@
+ 
+ int	 opts = 0;
+ int	 opt_inhibit = 0;
+-char	*configfile = "/etc/ifstated.conf";
++char	*configfile = "/usr/local/etc/ifstated.conf";
++char	*pidfile = NULL;
+ struct event	rt_msg_ev, sighup_ev, startup_ev, sigchld_ev;
+ 
+ void	startup_handler(int, short, void *);
+@@ -61,6 +64,8 @@
  void	external_evtimer_setup(struct ifsd_state *, int);
  void	scan_ifstate(int, int, int);
  int	scan_ifstate_single(int, int, struct ifsd_state *);
@@ -21,7 +31,42 @@
  void	fetch_state(void);
  void	usage(void);
  void	adjust_expressions(struct ifsd_expression_list *, int);
-@@ -159,7 +163,6 @@
+@@ -70,13 +75,14 @@
+ void	do_action(struct ifsd_action *);
+ void	remove_action(struct ifsd_action *, struct ifsd_state *);
+ void	remove_expression(struct ifsd_expression *, struct ifsd_state *);
++void	remove_pidfile(int);
+ 
+ void
+ usage(void)
+ {
+ 	extern char *__progname;
+ 
+-	fprintf(stderr, "usage: %s [-dhinv] [-D macro=value] [-f file]\n",
++	fprintf(stderr, "usage: %s [-dhinv] [-D macro=value] [-f file] [-p pidfile]\n",
+ 	    __progname);
+ 	exit(1);
+ }
+@@ -90,7 +96,7 @@
+ 
+ 	log_init(1);
+ 
+-	while ((ch = getopt(argc, argv, "dD:f:hniv")) != -1) {
++	while ((ch = getopt(argc, argv, "dD:f:p:hniv")) != -1) {
+ 		switch (ch) {
+ 		case 'd':
+ 			debug = 1;
+@@ -112,6 +118,9 @@
+ 		case 'i':
+ 			opt_inhibit = 1;
+ 			break;
++		case 'p':
++			pidfile = optarg;
++			break;
+ 		case 'v':
+ 			if (opts & IFSD_OPT_VERBOSE)
+ 				opts |= IFSD_OPT_VERBOSE2;
+@@ -159,7 +168,6 @@
  startup_handler(int fd, short event, void *arg)
  {
  	int rt_fd;
@@ -29,7 +74,7 @@
  
  	if ((rt_fd = socket(PF_ROUTE, SOCK_RAW, 0)) < 0)
  		err(1, "no routing socket");
-@@ -169,11 +172,6 @@
+@@ -169,11 +177,24 @@
  		exit(1);
  	}
  
@@ -38,10 +83,28 @@
 -	    &rtfilter, sizeof(rtfilter)) == -1)         /* not fatal */
 -		log_warn("startup_handler: setsockopt");
 -	
++	if (pidfile != NULL) {
++		FILE* file = fopen(pidfile, "w");
++
++		if (file == NULL) {
++			log_warnx("unable to open pidfile");
++		}
++		else {
++			fprintf(file, "%ld\n", (long)getpid());
++			fclose(file);
++			log_debug("wrote pidfile %s", pidfile);
++
++			signal(SIGINT, remove_pidfile);
++			signal(SIGQUIT, remove_pidfile);
++			signal(SIGABRT, remove_pidfile);
++			signal(SIGTERM, remove_pidfile);
++		}
++	}
++
  	event_set(&rt_msg_ev, rt_fd, EV_READ|EV_PERSIST, rt_msg_handler, NULL);
  	event_add(&rt_msg_ev, NULL);
  
-@@ -406,6 +404,8 @@
+@@ -406,6 +427,8 @@
  	}
  }
  
@@ -50,7 +113,7 @@
  #define	LINK_STATE_IS_DOWN(_s)						\
  	(!LINK_STATE_IS_UP((_s)) && (_s) != LINK_STATE_UNKNOWN)
  
-@@ -584,6 +584,44 @@
+@@ -584,6 +607,44 @@
  	}
  }
  
@@ -95,7 +158,7 @@
  /*
   * Fetch the current link states.
   */
-@@ -593,26 +631,31 @@
+@@ -593,26 +654,31 @@
  	struct ifaddrs *ifap, *ifa;
  	char *oname = NULL;
  	int sock = socket(AF_INET, SOCK_DGRAM, 0);
@@ -135,3 +198,17 @@
  	}
  	freeifaddrs(ifap);
  	close(sock);
+@@ -707,3 +773,13 @@
+ 	}
+ 	free(expression);
+ }
++
++void
++remove_pidfile(int code)
++{
++	if ((pidfile != NULL) && unlink(pidfile)) {
++		log_warnx("could not remove pidfile");
++	}
++
++	exit(code);
++}
diff -ruN --exclude=CVS /usr/ports/net/ifstated/files/pkg-message.in /usr/home/jhriggs/ifstated/files/pkg-message.in
--- /usr/ports/net/ifstated/files/pkg-message.in	2010-07-13 16:31:33.000000000 -0500
+++ /usr/home/jhriggs/ifstated/files/pkg-message.in	2010-08-16 20:33:52.000000000 -0500
@@ -1,16 +1,7 @@
 
-*** ATTENTION ***
-
-You must create a %%PREFIX%%/etc/ifstated.conf file (a sample is
-provided).  To run ifstated from startup, add the following to /etc/rc.conf:
-
-ifstated_enable="YES"
-
-
-Available variables you can set in /etc/rc.conf:
-
-- ifstated_enable (bool):      Set to "NO" by default.
-                               Set it to "YES" to enable ifstated.
-- ifstated_flags (str):        Set to "-f %%PREFIX%%/etc/ifstated.conf" by default.
-                               Extra flags passed to start command.
+To use ifstated, you must create one or more configration files (a
+sample is provided).  This version of ifstated allows for multiple
+"profiles" or instances, each with its own configuration.  Please see
+the comments in %%PREFIX%%/etc/rc.d/ifstated for the variables to set
+in /etc/rc.conf.
 
diff -ruN --exclude=CVS /usr/ports/net/ifstated/pkg-descr /usr/home/jhriggs/ifstated/pkg-descr
--- /usr/ports/net/ifstated/pkg-descr	2007-04-14 09:03:19.000000000 -0500
+++ /usr/home/jhriggs/ifstated/pkg-descr	2010-08-16 17:03:53.000000000 -0500
@@ -1,15 +1,6 @@
-
-This is a port of ifstated(8) from OpenBSD by Matthew George.
-
-From the manpage:
-
-***
-The ifstated daemon runs commands in response to network state changes,
-which it determines by monitoring interface link state or running exter-
-nal tests.  For example, it can be used with carp(4) to change running
-services or to ensure that carp(4) interfaces stay in sync, or with pf(4)
-to test server or link availability and modify translation or routing
-rules.
-***
-
-It has been modified to use FreeBSD's kqueue/kevent mechanism and sysctl.
+The ifstated daemon runs commands in response to network state
+changes, which it determines by monitoring interface link state or
+running external tests.  For example, it can be used with carp(4) to
+change running services or to ensure that carp(4) interfaces stay in
+sync, or with pf(4) to test server or link availability and modify
+translation or routing rules.
--- ifstated-4.7_2,1.patch ends here ---

>Release-Note:
>Audit-Trail:
>Unformatted:



More information about the freebsd-ports-bugs mailing list