Browse Source

distro/redhat: Update to support CentOS/RHEL/Fedora, upstart/init/systemd

* redhat/quagga.spec.in: Update to support CentOS, RHEL and Fedora, and
  support the various init systems across different versions of these
  distros, e.g.  upstart/init/systemd.

  Clean up various warnings from rpmlint.

  Remove configure options that are gone.

A few edits and commit message by:
Paul Jakma <paul.jakma@hpe.com> / <paul@jakma.org>
Martin Winter 4 years ago
parent
commit
a5efdb6090
3 changed files with 424 additions and 145 deletions
  1. 3 1
      redhat/Makefile.am
  2. 128 0
      redhat/README.rpm_build.md
  3. 293 144
      redhat/quagga.spec.in

+ 3 - 1
redhat/Makefile.am

@@ -3,4 +3,6 @@ EXTRA_DIST = bgpd.init bgpd.service isisd.init \
 	isisd.service ospf6d.init ospf6d.service ospfd.init ospfd.service \
 	quagga.logrotate quagga.pam quagga.spec \
 	quagga.sysconfig ripd.init ripd.service ripngd.init ripngd.service \
-	watchquagga.init pimd.init pimd.service zebra.init zebra.service
+	watchquagga.init pimd.init pimd.service zebra.init zebra.service \
+	README.rpm_build.md
+

+ 128 - 0
redhat/README.rpm_build.md

@@ -0,0 +1,128 @@
+Building your own Quagga RPM
+============================
+(Tested on CentOS 6, CentOS 7 and Fedora 22.)
+
+1. Install the following packages to build the RPMs:
+
+		yum install git autoconf automake libtool make gawk readline-devel \
+		texinfo dejagnu net-snmp-devel groff rpm-build net-snmp-devel \
+		libcap-devel texi2html
+
+	(use `dnf install` on new Fedora instead of `yum install	`)
+	
+2. Checkout Quagga under a **unpriviledged** user account
+
+		git clone git://git.savannah.nongnu.org/quagga.git quagga
+
+3. Run Bootstrap and make distribution tar.gz
+
+		cd quagga
+		./bootstrap.sh
+		./configure --with-pkg-extra-version=-MyRPMVersion
+		make dist
+			
+	Note: configure parameters are not important for the RPM building - except the
+	`with-pkg-extra-version` if you want to give the RPM a specific name to
+	mark your own unoffical build
+
+4. Create RPM directory structure and populate with sources
+
+		mkdir rpmbuild
+		mkdir rpmbuild/SOURCES
+		mkdir rpmbuild/SPECS
+		cp redhat/*.spec rpmbuild/SPECS/
+		cp quagga*.tar.gz rpmbuild/SOURCES/
+
+5. Edit rpm/SPECS/quagga.spec with configuration as needed
+	Look at the beginning of the file and adjust the following parameters to enable
+	or disable features as required:
+	
+		################# Quagga configure options ####################
+		# with-feature options
+        %{!?with_snmp:         %global  with_snmp       1 }
+        %{!?with_vtysh:        %global  with_vtysh      1 }
+        %{!?with_ospf_te:      %global  with_ospf_te    1 }
+		%{!?with_opaque_lsa:   %global  with_opaque_lsa 1 }
+		%{!?with_tcp_zebra:	   %global  with_tcp_zebra  0 }
+		%{!?with_vtysh:        %global  with_vtysh      1 }
+		%{!?with_pam:          %global  with_pam        1 }
+        %{!?with_ospfclient:   %global  with_ospfclient 1 }
+		%{!?with_ospfapi:      %global  with_ospfapi    1 }
+		%{!?with_irdp:         %global  with_irdp       1 }
+		%{!?with_rtadv:        %global  with_rtadv      1 }
+		%{!?with_isisd:        %global  with_isisd      1 }
+		%{!?with_pimd:         %global  with_pimd       1 }
+		%{!?with_shared:       %global  with_shared     1 }
+		%{!?with_multipath:    %global  with_multipath  64 }
+		%{!?quagga_user:       %global  quagga_user     quagga }
+		%{!?vty_group:         %global  vty_group       quaggavt }
+		%{!?with_fpm:          %global  with_fpm        0 }
+		%{!?with_watchquagga:  %global  with_watchquagga 1 }
+
+6. Build the RPM
+
+		rpmbuild --define "_topdir `pwd`/rpmbuild" -ba rpmbuild/SPECS/quagga.spec
+
+DONE.
+
+If all works correctly, then you should end up with the RPMs under `rpmbuild/RPMS`
+and the Source RPM under `rpmbuild/SRPMS`
+
+
+Enabling daemons after installation of the package:
+---------------------------------------------------
+
+### init.d based systems (ie CentOS 6):
+
+1. Enable the daemons as needed to run after boot (Zebra is mandatory)
+	
+		chkconfig zebra on
+		chkconfig ospfd on
+		chkconfig ospf6d on
+		chkconfig bgpd on
+		... etc
+
+2. If you want to run `watchquagga`, then configure `/etc/sysconfig/quagga` 
+   and uncomment the line with the daemons for `watchquagga` to monitor,
+   then enable watchquagga
+
+		chkconfig watchquagga on
+
+3. Check your firewall / IPtables to make sure the routing protocols are
+allowed.
+		
+4. Start the daemons (or reboot)
+
+		service zebra start
+		service bgpd start
+		service ospfd start
+		... etc
+			
+Configuration is stored in `/etc/quagga/*.conf` files.
+
+
+### systemd based systems (ie CentOS 7, Fedora 22)
+
+1. Enable the daemons as needed to run after boot (Zebra is mandatory)
+	
+		systemctl enable zebra
+		systemctl enable ospfd
+		systemctl enable ospf6d
+		systemctl enable bgpd
+		... etc
+
+	Note: There is no watchquagga on systemd based systems. Systemd contains
+	the functionality of monitoring and restarting daemons.
+
+2. Check your firewall / IPtables to make sure the routing protocols are
+allowed.
+		
+3. Start the daemons (or reboot)
+
+		systemctl start zebra
+		systemctl start bgpd
+		systemctl start ospfd
+		... etc
+			
+Configuration is stored in `/etc/quagga/*.conf` files.
+

+ 293 - 144
redhat/quagga.spec.in

@@ -2,6 +2,7 @@
 #
 # Some can be overriden on rpmbuild commandline with:
 # rpmbuild --define 'variable value'
+#   (use any value, ie 1 for flag "with_XXXX" definitions)
 #
 # E.g. rpmbuild --define 'release_rev 02' may be useful if building
 # rpms again and again on the same day, so the newer rpms can be installed.
@@ -9,107 +10,141 @@
 
 ####################### Quagga configure options #########################
 # with-feature options
-%{!?with_snmp:		%define with_snmp	1 }
-%{!?with_vtysh:		%define	with_vtysh	1 }
-%{!?with_ospf_te:	%define	with_ospf_te	1 }
-%{!?with_nssa:		%define	with_nssa	1 }
-%{!?with_opaque_lsa:	%define	with_opaque_lsa 1 }
-%{!?with_tcp_zebra:	%define	with_tcp_zebra	0 }
-%{!?with_vtysh:		%define	with_vtysh	1 }
-%{!?with_pam:		%define	with_pam	1 }
-%{!?with_ospfclient:	%define	with_ospfclient 1 }
-%{!?with_ospfapi:	%define	with_ospfapi	1 }
-%{!?with_irdp:		%define	with_irdp	1 }
-%{!?with_rtadv:		%define	with_rtadv	1 }
-%{!?with_isisd:		%define	with_isisd	1 }
-%{!?with_pimd:		%define	with_pimd	1 }
-%{!?with_shared:	%define	with_shared	1 }
-%{!?with_multipath:	%define	with_multipath	64 }
-%{!?quagga_user:	%define	quagga_user	quagga }
-%{!?vty_group:		%define	vty_group	quaggavty }
+%{!?with_snmp:			%global with_snmp		1 }
+%{!?with_vtysh:			%global	with_vtysh		1 }
+%{!?with_tcp_zebra:		%global	with_tcp_zebra		0 }
+%{!?with_vtysh:			%global	with_vtysh		1 }
+%{!?with_pam:			%global	with_pam		1 }
+%{!?with_ospfclient:		%global	with_ospfclient 	1 }
+%{!?with_ospfapi:		%global	with_ospfapi		1 }
+%{!?with_irdp:			%global	with_irdp		1 }
+%{!?with_rtadv:			%global	with_rtadv		1 }
+%{!?with_isisd:			%global	with_isisd		1 }
+%{!?with_pimd:			%global	with_pimd		1 }
+%{!?with_shared:		%global	with_shared		1 }
+%{!?with_multipath:		%global	with_multipath		64 }
+%{!?quagga_user:		%global	quagga_user		quagga }
+%{!?vty_group:			%global	vty_group		quaggavt }
+%{!?with_fpm:			%global	with_fpm 		0 }
+%{!?with_watchquagga:		%global	with_watchquagga 	1 }
 
 # path defines
 %define		_sysconfdir	/etc/quagga
-%define		zeb_src		%{_builddir}/%{name}-%{version}
+%define		zeb_src		%{_builddir}/%{name}-%{quaggaversion}
 %define		zeb_rh_src	%{zeb_src}/redhat
 %define		zeb_docs	%{zeb_src}/doc
 
 # defines for configure
-%define		_libexecdir	%{_exec_prefix}/libexec/quagga
-%define		_libdir		%{_exec_prefix}/%{_lib}/quagga
-%define		_includedir	%{_prefix}/include
 %define		_localstatedir	/var/run/quagga
 ############################################################################
 
-####################### distro specific tweaks #############################
-# default distro. Override with rpmbuild -D "dist XXX" 
-%{expand: %%define default_dist %(rpm -q --qf 'fc%%{VERSION}' fedora-release | grep -v 'not installed')}
-%{!?dist:		%define		dist	%{default_dist}}
+#### Version String tweak
+# Remove invalid characters form version string and replace with _
+%{expand: %%define rpmversion %(echo '@VERSION@' | tr [:blank:]- _ )}
+%define         quaggaversion   @VERSION@
 
-# as distros change packages we depend on, our Requires have to change, sadly.
-%define quagga_buildreqs texi2html texinfo autoconf pam-devel
-%define quagga_buildreqs %{expand:%{quagga_buildreqs}} patch libcap-devel
+#### Check version of texi2html 
+# Old versions don't support "--number-footnotes" option.
+%{expand: %%global texi2htmlversion %(rpm -q --qf '%%{VERSION}' texi2html | cut -d. -f1 )}
 
-# FC4 and 5 split texi2html out of tetex package.
-%define quagga_buildreqs %{expand:%{quagga_buildreqs}} texi2html
-
-# man page probably needs groff for groff_ms macros
-%define  quagga_buildreqs %{expand:%{quagga_buildreqs}} groff
+#### Check for systemd or init.d (upstart)
+# Check for init.d (upstart) as used in CentOS 6 or systemd (ie CentOS 7)
+%{expand: %%global initsystem %(if [[ `/sbin/init --version 2> /dev/null` =~ upstart ]]; then echo upstart; elif [[ `systemctl` =~ -\.mount ]]; then echo systemd; fi)}
+#
+# If init system is systemd, then always disable watchquagga
+#
+%if "%{initsystem}" == "systemd"
+	# Note: For systems with systemd, watchquagga will NOT be built. Systemd
+	# takes over the role of restarting crashed processes. Value will
+	# be overwritten with 0 below for systemd independent on the setting here
+	%global	with_watchquagga 0
+%endif
 
-############################################################################
+# if FPM is enabled, then enable tcp_zebra as well
+#
+%if %{with_fpm}
+	%global	with_tcp_zebra	1
+%endif
 
 # misc internal defines
 %{!?quagga_uid:		%define         quagga_uid      92 }
 %{!?quagga_gid:		%define         quagga_gid      92 }
+%{!?vty_gid:		%define		vty_gid		85 }
+
 %define		daemon_list	zebra ripd ospfd bgpd
 
 %define		daemonv6_list	ripngd ospf6d
 
 %if %{with_isisd}
-%define		daemon_other	isisd
+%define		daemon_isisd	isisd
 %else
-%define		daemon_other	""
+%define		daemon_isisd	""
 %endif
 
-%define		all_daemons	%{daemon_list} %{daemonv6_list} %{daemon_other} watchquagga
+%if %{with_pimd}
+%define         daemon_pimd	pimd
+%else
+%define		daemon_pimd	""
+%endif
+
+%if %{with_watchquagga}
+%define         daemon_watchquagga	watchquagga
+%else
+%define		daemon_watchquagga	""
+%endif
+
+%define		all_daemons	%{daemon_list} %{daemonv6_list} %{daemon_isisd} %{daemon_pimd} %{daemon_watchquagga}
 
 # allow build dir to be kept
-%{!?keep_build:		%define		keep_build	0 }
+%{!?keep_build:		%global		keep_build	0 }
 
 #release sub-revision (the two digits after the CONFDATE)
 %{!?release_rev:	%define		release_rev	01 }
 
 Summary: Routing daemon
-Name:		quagga
-Version:	@VERSION@
-Release:	@CONFDATE@%{release_rev}
-License:	GPL
-Group: System Environment/Daemons
-Source0:	http://www.quagga.net/snapshots/cvs/%{name}-%{version}.tar.gz
-URL:		http://www.quagga.net
+Name:			quagga
+Version:		%{rpmversion}
+Release:		@CONFDATE@%{release_rev}%{?dist}
+License:		GPLv2+
+Group:			System Environment/Daemons
+Source0:		http://download.savannah.gnu.org/releases/quagga/%{name}-%{quaggaversion}.tar.gz
+URL:			http://www.quagga.net
+Requires:		ncurses
+Requires(pre):	/sbin/install-info
+Requires(preun): /sbin/install-info
+Requires(post):	/sbin/install-info
+BuildRequires:	texi2html texinfo autoconf patch libcap-devel groff
 %if %{with_snmp}
 BuildRequires:	net-snmp-devel
-Requires(pre):		net-snmp
+Requires:		net-snmp
 %endif
 %if %{with_vtysh}
 BuildRequires:	readline readline-devel ncurses ncurses-devel
-Requires(pre):		ncurses
+Requires:		ncurses
 %endif
-BuildRequires:	%{quagga_buildreqs}
+%if %{with_pam}
+BuildRequires:	pam-devel
+Requires:		pam
+%endif
+%if "%{initsystem}" == "systemd"
+BuildRequires:		systemd
+Requires(post):		systemd
+Requires(preun):	systemd
+Requires(postun):	systemd
+%else
 # Initscripts > 5.60 is required for IPv6 support
 Requires(pre):		initscripts >= 5.60
-Requires(pre):		ncurses pam
-Requires(pre):		/sbin/install-info
-Provides:	routingdaemon
-BuildRoot:	%{_tmppath}/%{name}-%{version}-root
-Obsoletes:	bird gated mrt zebra
+%endif
+Provides:			routingdaemon = %{version}-%{release}
+BuildRoot:			%{_tmppath}/%{name}-%{version}-root
+Obsoletes:			bird gated mrt zebra quagga-sysvinit
 
 %description
 Quagga is a free software that manages TCP/IP based routing
 protocol. It takes multi-server and multi-thread approach to resolve
 the current complexity of the Internet.
 
-Quagga supports BGP4, BGP4+, OSPFv2, OSPFv3, RIPv1, RIPv2, and RIPng.
+Quagga supports BGP4, OSPFv2, OSPFv3, ISIS, RIP, RIPng and PIM.
 
 Quagga is intended to be used as a Route Server and a Route Reflector. It is
 not a toolkit, it provides full routing power under a new architecture.
@@ -127,13 +162,14 @@ Contributed/3rd party tools which may be of use with quagga.
 %package devel
 Summary: Header and object files for quagga development
 Group: System Environment/Daemons
+Requires: %{name} = %{version}-%{release}
 
 %description devel
 The quagga-devel package contains the header and object files neccessary for
 developing OSPF-API and quagga applications.
 
 %prep
-%setup  -q
+%setup  -q -n quagga-%{quaggaversion}
 
 %build
 
@@ -148,6 +184,11 @@ developing OSPF-API and quagga applications.
 #CFLAGS="${CFLAGS} -Wpacked -Wpadded"
 
 %configure \
+    --sysconfdir=%{_sysconfdir} \
+    --libdir=%{_libdir} \
+    --libexecdir=%{_libexecdir} \
+    --localstatedir=%{_localstatedir} \
+	--disable-werror \
 %if !%{with_shared}
 	--disable-shared \
 %endif
@@ -160,15 +201,6 @@ developing OSPF-API and quagga applications.
 %if %{with_tcp_zebra}
 	--enable-tcp-zebra \
 %endif
-%if %{with_nssa}
-	--enable-nssa \
-%endif
-%if %{with_opaque_lsa}
-	--enable-opaque-lsa \
-%endif
-%if %{with_ospf_te}
-	--enable-ospf-te \
-%endif
 %if %{with_vtysh}
 	--enable-vtysh \
 %endif
@@ -200,57 +232,79 @@ developing OSPF-API and quagga applications.
 %if %{with_pam}
 	--with-libpam \
 %endif
-%if %quagga_user
+%if 0%{?quagga_user:1}
 	--enable-user=%quagga_user \
 	--enable-group=%quagga_user \
 %endif
-%if %vty_group
+%if 0%{?vty_group:1}
 	--enable-vty-group=%vty_group \
 %endif
---enable-netlink --enable-gcc-rdynamic
+%if %{with_fpm}
+	--enable-fpm \
+%else
+	--disable-fpm \
+%endif
+%if %{with_watchquagga}
+	--enable-watchquagga \
+%else
+	--disable-watchquagga \
+%endif
+	--enable-gcc-rdynamic
 
 make %{?_smp_mflags} MAKEINFO="makeinfo --no-split"
 
 pushd doc
+%if %{texi2htmlversion} < 5
+texi2html --number-sections quagga.texi
+%else
 texi2html --number-footnotes  --number-sections quagga.texi
+%endif
 popd
 
 %install
-rm -rf $RPM_BUILD_ROOT
-
-install -d $RPM_BUILD_ROOT/etc/{rc.d/init.d,sysconfig,logrotate.d,pam.d} \
-	$RPM_BUILD_ROOT/var/log/quagga $RPM_BUILD_ROOT%{_infodir}
-
-make install \
-	DESTDIR=$RPM_BUILD_ROOT
+mkdir -p %{buildroot}/etc/{quagga,sysconfig,logrotate.d,pam.d} \
+         %{buildroot}/var/log/quagga %{buildroot}%{_infodir}
+make DESTDIR=%{buildroot} INSTALL="install -p" CP="cp -p" install
 
 # Remove this file, as it is uninstalled and causes errors when building on RH9
-rm -rf $RPM_BUILD_ROOT/usr/share/info/dir
+rm -rf %{buildroot}/usr/share/info/dir
 
-# install etc sources
+# install /etc sources
+%if "%{initsystem}" == "systemd"
+mkdir -p %{buildroot}%{_unitdir}
+for daemon in %{all_daemons} ; do
+	if [ x"${daemon}" != x"" ] ; then
+		install %{zeb_rh_src}/${daemon}.service \
+			%{buildroot}%{_unitdir}/${daemon}.service
+	fi
+done
+%else
+mkdir -p %{buildroot}/etc/rc.d/init.d
 for daemon in %{all_daemons} ; do
 	if [ x"${daemon}" != x"" ] ; then
 		install %{zeb_rh_src}/${daemon}.init \
-			$RPM_BUILD_ROOT/etc/rc.d/init.d/${daemon}
+			%{buildroot}/etc/rc.d/init.d/${daemon}
 	fi
 done
+%endif
+
 install -m644 %{zeb_rh_src}/quagga.pam \
-	$RPM_BUILD_ROOT/etc/pam.d/quagga
+	%{buildroot}/etc/pam.d/quagga
 install -m644 %{zeb_rh_src}/quagga.logrotate \
-	$RPM_BUILD_ROOT/etc/logrotate.d/quagga
+	%{buildroot}/etc/logrotate.d/quagga
 install -m644 %{zeb_rh_src}/quagga.sysconfig \
-	$RPM_BUILD_ROOT/etc/sysconfig/quagga
-install -d -m750  $RPM_BUILD_ROOT/var/run/quagga
+	%{buildroot}/etc/sysconfig/quagga
+install -d -m750  %{buildroot}/var/run/quagga
 
 %pre
 # add vty_group
-%if %vty_group
+%if 0%{?vty_group:1}
 if getent group %vty_group > /dev/null ; then : ; else \
- /usr/sbin/groupadd -r %vty_group > /dev/null || : ; fi
+ /usr/sbin/groupadd -r -g %vty_gid %vty_group > /dev/null || : ; fi
 %endif
 
 # add quagga user and group
-%if %quagga_user
+%if 0%{?quagga_user:1}
 # Ensure that quagga_gid gets correctly allocated
 if getent group %quagga_user >/dev/null; then : ; else \
  /usr/sbin/groupadd -g %quagga_gid %quagga_user > /dev/null || : ; \
@@ -292,77 +346,145 @@ zebra_spec_add_service isisd    2608/tcp "ISISd vty"
 zebra_spec_add_service pimd     2611/tcp "PIMd vty"
 %endif
 
-for daemon in %daemon_list ; do
+%if "%{initsystem}" == "systemd"
+for daemon in %all_daemons ; do
+	%systemd_post ${daemon}.service
+done
+%else
+for daemon in %all_daemons ; do
 	/sbin/chkconfig --add ${daemon}
 done
+%endif
 
 /sbin/install-info %{_infodir}/quagga.info.gz %{_infodir}/dir
 
 # Create dummy files if they don't exist so basic functions can be used.
 if [ ! -e %{_sysconfdir}/zebra.conf ]; then
 	echo "hostname `hostname`" > %{_sysconfdir}/zebra.conf
-%if %{quagga_user}
-	chown %quagga_user:%quagga_user %{_sysconfdir}/zebra.conf
+%if 0%{?quagga_user:1}
+	chown %quagga_user:%quagga_user %{_sysconfdir}/zebra.conf*
 %endif
 	chmod 640 %{_sysconfdir}/zebra.conf
 fi
+for daemon in %{all_daemons} ; do
+	if [ ! -e %{_sysconfdir}/${daemon}.conf ]; then
+		touch %{_sysconfdir}/${daemon}.conf
+		%if 0%{?quagga_user:1}
+			chown %quagga_user:%quagga_user %{_sysconfdir}/${daemon}.conf*
+		%endif
+	fi
+done
+%if %{with_watchquagga}
+	# No config for watchquagga - this is part of /etc/sysconfig/quagga
+	rm -f %{_sysconfdir}/watchquagga.*
+%endif
+
 if [ ! -e %{_sysconfdir}/vtysh.conf ]; then
 	touch %{_sysconfdir}/vtysh.conf
 	chmod 640 %{_sysconfdir}/vtysh.conf
+%if 0%{?vty_group:1}
+    chown quagga:%{vty_group} %{_sysconfdir}/vtysh.conf*
+%endif
 fi
 
 %postun
 if [ "$1" -ge 1 ]; then
 	# Find out which daemons need to be restarted.
 	for daemon in %all_daemons ; do
-		if [ -f /var/lock/subsys/$daemon ]; then
-			eval restart_$daemon=yes
+		if [ -f /var/lock/subsys/${daemon} ]; then
+			eval restart_${daemon}=yes
 		else
-			eval restart_$daemon=no
+			eval restart_${daemon}=no
 		fi
 	done
 	# Rename restart flags for daemons handled specially.
 	running_zebra="$restart_zebra"
 	restart_zebra=no
-	running_watchquagga="$restart_watchquagga"
-	restart_watchquagga=no
-	# Stop watchquagga first.
-	[ "$running_watchquagga" = yes ] && \
-		/etc/rc.d/init.d/watchquagga stop >/dev/null 2>&1
-	# Stop all daemons other than zebra and watchquagga.
-	for daemon in %all_daemons ; do
-		eval restart=\$restart_${daemon}
-		[ "$restart" = yes ] && \
-			/etc/rc.d/init.d/$daemon stop >/dev/null 2>&1
-	done
-	# Restart zebra.
-	[ "$running_zebra" = yes ] && \
-		/etc/rc.d/init.d/zebra restart >/dev/null 2>&1
-	# Start all daemons other than zebra and watchquagga.
-	for daemon in %all_daemons ; do
-		eval restart=\$restart_${daemon}
-		[ "$restart" = yes ] && \
-			/etc/rc.d/init.d/$daemon start >/dev/null 2>&1
-	done
-	# Start watchquagga last.
-	# Avoid postun scriptlet error if watchquagga is not running. 
-	[ "$running_watchquagga" = yes ] && \
-		/etc/rc.d/init.d/watchquagga start >/dev/null 2>&1 || :
+	%if %{with_watchquagga}
+		running_watchquagga="$restart_watchquagga"
+		restart_watchquagga=no
+	%endif
+	
+	%if "%{initsystem}" == "systemd"
+		##
+		## Systemd Version
+		##
+		# No watchquagga for systemd version
+		#
+		# Stop all daemons other than zebra.
+		for daemon in %all_daemons ; do
+			eval restart=\$restart_${daemon}
+			[ "$restart" = yes ] && \
+				%systemd_postun ${daemon}.service
+		done
+		# Restart zebra.
+		[ "$running_zebra" = yes ] && \
+			%systemd_postun_with_restart $daemon.service
+		# Start all daemons other than zebra.
+		for daemon in %all_daemons ; do
+			eval restart=\$restart_${daemon}
+			[ "$restart" = yes ] && \
+				%systemd_post ${daemon}.service
+		done
+	%else
+		##
+		## init.d Version
+		##
+		%if %{with_watchquagga}
+			# Stop watchquagga first.
+			[ "$running_watchquagga" = yes ] && \
+				/etc/rc.d/init.d/watchquagga stop >/dev/null 2>&1
+		%endif
+		# Stop all daemons other than zebra and watchquagga.
+		for daemon in %all_daemons ; do
+			eval restart=\$restart_${daemon}
+			[ "$restart" = yes ] && \
+				/etc/rc.d/init.d/${daemon} stop >/dev/null 2>&1
+		done
+		# Restart zebra.
+		[ "$running_zebra" = yes ] && \
+			/etc/rc.d/init.d/zebra restart >/dev/null 2>&1
+		# Start all daemons other than zebra and watchquagga.
+		for daemon in %all_daemons ; do
+			eval restart=\$restart_${daemon}
+			[ "$restart" = yes ] && \
+				/etc/rc.d/init.d/${daemon} start >/dev/null 2>&1
+		done
+		%if %{with_watchquagga}
+			# Start watchquagga last.
+			# Avoid postun scriptlet error if watchquagga is not running. 
+			[ "$running_watchquagga" = yes ] && \
+				/etc/rc.d/init.d/watchquagga start >/dev/null 2>&1 || :
+		%endif	
+	%endif
 fi
-/sbin/install-info --delete %{_infodir}/quagga.info.gz %{_infodir}/dir
 
 %preun
-if [ "$1" = "0" ]; then
-	for daemon in %all_daemons ; do
-		/etc/rc.d/init.d/${daemon} stop  >/dev/null 2>&1
-		/sbin/chkconfig --del ${daemon}
-	done
-	/sbin/install-info --delete %{_infodir}/quagga.info.gz %{_infodir}/dir
-fi
+%if "%{initsystem}" == "systemd"
+	##
+	## Systemd Version
+	##
+	if [ "$1" = "0" ]; then
+		for daemon in %all_daemons ; do
+			%systemd_preun ${daemon}.service
+		done
+	fi
+%else
+	##
+	## init.d Version
+	##
+	if [ "$1" = "0" ]; then
+		for daemon in %all_daemons ; do
+			/etc/rc.d/init.d/${daemon} stop  >/dev/null 2>&1
+			/sbin/chkconfig --del ${daemon}
+		done
+	fi
+%endif
+/sbin/install-info --delete %{_infodir}/quagga.info.gz %{_infodir}/dir
 
 %clean
-%if !%{keep_build}
-rm -rf $RPM_BUILD_ROOT
+%if !0%{?keep_build:1}
+rm -rf %{buildroot}
 %endif
 
 %files
@@ -371,26 +493,27 @@ rm -rf $RPM_BUILD_ROOT
 %doc doc/quagga.html
 %doc doc/mpls
 %doc ChangeLog INSTALL NEWS README REPORTING-BUGS SERVICES TODO
-%if %{quagga_user}
+%if 0%{?quagga_user:1}
 %dir %attr(751,%quagga_user,%quagga_user) %{_sysconfdir}
 %dir %attr(750,%quagga_user,%quagga_user) /var/log/quagga 
 %dir %attr(751,%quagga_user,%quagga_user) /var/run/quagga
 %else
 %dir %attr(750,root,root) %{_sysconfdir}
 %dir %attr(750,root,root) /var/log/quagga
-%dir %attr(755,root,root) /usr/share/info
 %dir %attr(750,root,root) /var/run/quagga
 %endif
-%if %{vty_group}
+%if 0%{?vty_group:1}
 %attr(750,%quagga_user,%vty_group) %{_sysconfdir}/vtysh.conf.sample
 %endif
-%{_infodir}/*info*
+%{_infodir}/quagga.info.gz
 %{_mandir}/man*/*
 %{_sbindir}/zebra
 %{_sbindir}/ospfd
 %{_sbindir}/ripd
 %{_sbindir}/bgpd
-%{_sbindir}/watchquagga
+%if %{with_watchquagga}
+	%{_sbindir}/watchquagga
+%endif
 %{_sbindir}/ripngd
 %{_sbindir}/ospf6d
 %if %{with_pimd}
@@ -399,17 +522,33 @@ rm -rf $RPM_BUILD_ROOT
 %if %{with_isisd}
 %{_sbindir}/isisd
 %endif
-%dir %attr(755,root,root) %{_libdir}
 %if %{with_shared}
-%dir %{_libdir}
-%{_libdir}/lib*.so
-%{_libdir}/lib*.so.*
+%attr(755,root,root) %{_libdir}/lib*.so
+%attr(755,root,root) %{_libdir}/lib*.so.*
 %endif
 %if %{with_vtysh}
 %{_bindir}/*
 %endif
 %config /etc/quagga/[!v]*
-%config /etc/rc.d/init.d/*
+%if "%{initsystem}" == "systemd"
+	%config %{_unitdir}/*.service
+%else
+	%config /etc/rc.d/init.d/zebra
+	%if %{with_watchquagga}
+		%config /etc/rc.d/init.d/watchquagga
+	%endif
+	%config /etc/rc.d/init.d/ripd
+	%config /etc/rc.d/init.d/ospfd
+	%config /etc/rc.d/init.d/bgpd
+	%config /etc/rc.d/init.d/ripngd
+	%config /etc/rc.d/init.d/ospf6d
+	%if %{with_isisd}
+		%config /etc/rc.d/init.d/isisd
+	%endif
+	%if %{with_pimd}
+		%config /etc/rc.d/init.d/pimd
+	%endif
+%endif
 %config(noreplace) /etc/sysconfig/quagga
 %config(noreplace) /etc/pam.d/quagga
 %config(noreplace) %attr(640,root,root) /etc/logrotate.d/*
@@ -435,17 +574,27 @@ rm -rf $RPM_BUILD_ROOT
 %endif
 
 %changelog
-* Fri Sep 4 2015 Paul Jakma <paul@jakma.org> - %{version}
-- package the pimd binary
+* Thu Feb 11 2016 Paul Jakma <paul@jakma.org> - %{version}
 - remove with_ipv6 conditionals, always build v6
 - Fix UTF-8 char in spec changelog
 - remove quagga.pam.stack, long deprecated.
 
-* Fri Sep 4 2015 Paul Jakma <paul@jakma.org> - %{version}
+* Thu Oct 22 2015 Martin Winter <mwinter@opensourcerouting.org>
+- Cleanup configure: remove --enable-ipv6 (default now), --enable-nssa,
+    --enable-netlink
+- Remove support for old fedora 4/5
+- Fix for package nameing
+- Fix Weekdays of previous changelogs (bogus dates)
+- Add conditional logic to only build tex footnotes with supported texi2html 
+- Added pimd to files section and fix double listing of /var/lib*/quagga
+- Numerous fixes to unify upstart/systemd startup into same spec file
+- Only allow use of watchquagga for non-systemd systems. no need with systemd
+
+* Fri Sep  4 2015 Paul Jakma <paul@jakma.org>
 - buildreq updates
 - add a default define for with_pimd
 
-* Thu Sep 12 2005 Paul Jakma <paul@dishone.st>
+* Mon Sep 12 2005 Paul Jakma <paul@dishone.st>
 - Steal some changes from Fedora spec file:
 - Add with_rtadv variable
 - Test for groups/users with getent before group/user adding
@@ -498,7 +647,7 @@ rm -rf $RPM_BUILD_ROOT
 - add user with fixed UID/GID (RH)
 - create user with shell /sbin/nologin rather than /bin/false (RH)
 - stop daemons on uninstall (RH)
-- delete info file on %preun, not %postun to avoid deletion on upgrade. (RH)
+- delete info file on preun, not postun to avoid deletion on upgrade. (RH)
 - isisd added
 - cleanup tasks carried out for every daemon
 
@@ -510,10 +659,10 @@ rm -rf $RPM_BUILD_ROOT
 - Renamed to Quagga
 - Sync to Quagga release 0.96
 
-* Tue Mar 20 2003 Paul Jakma <paul@dishone.st>
+* Thu Mar 20 2003 Paul Jakma <paul@dishone.st>
 - zebra privileges support
 
-* Mon Mar 18 2003 Paul Jakma <paul@dishone.st>
+* Tue Mar 18 2003 Paul Jakma <paul@dishone.st>
 - Fix mem leak in 'show thread cpu'
 - Ralph Keller's OSPF-API
 - Amir: Fix configure.ac for net-snmp
@@ -537,7 +686,7 @@ rm -rf $RPM_BUILD_ROOT
 - Added conditionals for building with(out) IPv6, vtysh, RIP, BGP
 - Fixed up some build requirements (patch)
 - Added conditional build requirements for vtysh / snmp
-- Added conditional to %files for %_bindir depending on vtysh
+- Added conditional to files for _bindir depending on vtysh
 
 * Mon Nov 11 2002 Paul Jakma <paulj@alphyra.ie>
 - update to latest CVS
@@ -577,7 +726,7 @@ rm -rf $RPM_BUILD_ROOT
 * Thu Aug 09 2001 Elliot Lee <sopwith@redhat.com> 0.91a-6
 - Fix bug #51336
 
-* Wed Aug  1 2001 Trond Eivind Glomsrød  <teg@redhat.com> 0.91a-5
+* Wed Aug  1 2001 Trond Eivind Glomsrød <teg@redhat.com> 0.91a-5
 - Use generic initscript strings instead of initscript specific
   ( "Starting foo: " -> "Starting $prog:" )