diff mbox series

[3/3] package/frr: new package

Message ID 20200224172652.30932-4-vadim4j@gmail.com
State Changes Requested
Headers show
Series [1/3] package/libyang: enable LYD_PRIV option | expand

Commit Message

Vadym Kochan Feb. 24, 2020, 5:26 p.m. UTC
FRR is free software that implements and manages various IPv4 and IPv6
routing protocols. It runs on nearly all distributions of Linux and BSD
as well as Solaris and supports all modern CPU architectures.

FRR currently supports the following protocols:

    BGP
    OSPFv2
    OSPFv3
    RIPv1
    RIPv2
    RIPng
    IS-IS
    PIM-SM/MSDP
    LDP
    BFD
    Babel
    PBR
    OpenFabric
    VRRP
    EIGRP (alpha)
    NHRP (alpha)

Signed-off-by: Vadim Kochan <vadim4j@gmail.com>
---
 DEVELOPERS            |   1 +
 package/Config.in     |   1 +
 package/frr/Config.in |  23 +++++++++
 package/frr/S50frr    |  38 +++++++++++++++
 package/frr/frr.hash  |   2 +
 package/frr/frr.mk    | 105 ++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 170 insertions(+)
 create mode 100644 package/frr/Config.in
 create mode 100644 package/frr/S50frr
 create mode 100644 package/frr/frr.hash
 create mode 100644 package/frr/frr.mk

Comments

Thomas Petazzoni Feb. 24, 2020, 8:06 p.m. UTC | #1
Hello Vadim,

On Mon, 24 Feb 2020 19:26:52 +0200
Vadim Kochan <vadim4j@gmail.com> wrote:

> diff --git a/DEVELOPERS b/DEVELOPERS
> index e07236937b..ef6592afa0 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -2480,6 +2480,7 @@ F:	package/brcm-patchram-plus/
>  F:	package/gettext-tiny/
>  F:	package/tinyssh/
>  F:	package/rtrlib/
> +F:	package/frr/

Alphabetic ordering is not good here.

> diff --git a/package/frr/Config.in b/package/frr/Config.in
> new file mode 100644
> index 0000000000..01673eb837
> --- /dev/null
> +++ b/package/frr/Config.in
> @@ -0,0 +1,23 @@
> +config BR2_PACKAGE_FRR
> +	bool "frr"
> +	depends on BR2_USE_MMU # fork()
> +	depends on BR2_PACKAGE_BASH # init
> +	select BR2_PACKAGE_RTRLIB
> +	select BR2_PACKAGE_READLINE
> +	select BR2_PACKAGE_JSON_C
> +	select BR2_PACKAGE_LIBYANG
> +	select BR2_PACKAGE_LIBCAP
> +	select BR2_PACKAGE_LIBNL
> +	select BR2_PACKAGE_NCURSES
> +	select BR2_PACKAGE_NETSNMP
> +	select BR2_PACKAGE_C_ARES

That's a lot of packages that you select here, are you sure you
properly propagated the "depends on" of all those packages in this
Config.in ?

For example, rtrlib depends on threads and SSP, so these need to be
propagated here (of course, except if you get rid of the SSP dependency
in rtrlib, as suggested in my review of PATCH 2/3).

> +	help
> +	  The FRRouting Protocol Suite.
> +
> +	  FRR is free software that implements and manages various IPv4 and
> +	  IPv6 routing protocols.
> +
> +	  https://frrouting.org
> +
> +comment "frr requires BASH for init service"
> +	depends on !BR2_PACKAGE_BASH

So it's the frrinit.sh script that requires bash ?

This comment also need a BR2_USE_MMU dependency, so that it doesn't
show up on noMMU systems.

> diff --git a/package/frr/S50frr b/package/frr/S50frr
> new file mode 100644
> index 0000000000..dec7d82a88
> --- /dev/null
> +++ b/package/frr/S50frr
> @@ -0,0 +1,38 @@
> +#!/bin/sh
> +#
> +# Starts frr.
> +#
> +
> +start() {
> +	printf "Starting frr: "
> +	start-stop-daemon -S -q -b \
> +		--exec /usr/sbin/frrinit.sh -- start
> +	[ $? = 0 ] && echo "OK" || echo "FAIL"
> +}
> +stop() {
> +	printf "Stopping frr: "
> +	/usr/sbin/frrinit.sh stop
> +	start-stop-daemon -K -q -p /run/frr.pid

This looks odd. Why do you need to call frrinit.sh stop and then use
start-stop-daemon ?

Also, make sure to use package/busybox/S01sysklogd as a template for
your init scripts.


> diff --git a/package/frr/frr.mk b/package/frr/frr.mk
> new file mode 100644
> index 0000000000..c53e9bb4b0
> --- /dev/null
> +++ b/package/frr/frr.mk
> @@ -0,0 +1,105 @@
> +################################################################################
> +#
> +# frr
> +#
> +################################################################################
> +
> +FRR_VERSION = 7.3
> +FRR_SOURCE = frr-$(FRR_VERSION).tar.gz
> +FRR_SITE = https://github.com/FRRouting/frr/archive
> +FRR_LICENSE = GPL-2.0
> +FRR_LICENSE_FILES = COPYING
> +
> +FRR_DEPENDENCIES = rtrlib readline json-c libyang libcap libnl \
> +		   ncurses host-frr c-ares

Only one tab to indent the second line.

> +
> +HOST_FRR_DEPENDENCIES = host-flex host-bison host-python
> +
> +FRR_CONF_OPTS = --with-clippy=$(HOST_DIR)/bin/clippy \
> +		--sysconfdir=/etc/frr \
> +		--localstatedir=/var/run/frr \
> +		--with-moduledir=/usr/lib/frr/modules \
> +		--enable-configfile-mask=0640 \
> +		--enable-logfile-mask=0640 \
> +		--enable-multipath=256 \
> +		--disable-ospfclient \
> +		--enable-shell-access \
> +		--enable-user=frr \
> +		--enable-group=frr \
> +		--enable-vty-group=frrvty \
> +		--disable-exampledir \
> +		--enable-rpki \
> +		--enable-fpm

Ditto, only one tab to indent the continuation lines.

> +
> +HOST_FRR_CONF_OPTS = --enable-clippy-only
> +
> +define FRR_RUN_BOOTSTRAP
> +	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)
> +endef
> +FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP
> +HOST_FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP

This won't work as you don't have any guarantee that host-autoconf and
host-automake will be built before. Can you use FRR_AUTORECONF = YES,
as this is really the best solution ? If not, you need to keep your
hooks, but explicitly add host-autoconf and host-automake to the
package dependencies.

> +define HOST_FRR_INSTALL_CMDS
> +	$(INSTALL) -D -m 0755 $(@D)/lib/clippy $(HOST_DIR)/bin/clippy
> +endef
> +
> +
> +# for some reason the normal 'install' target fails

Why? Can it be fixed? At least reported to the upstream developers?

> +FRR_INSTALL_TARGET_OPTS = DESTDIR="$(TARGET_DIR)" libdir="/usr/lib" \
> +			  install-binPROGRAMS \
> +			  install-sbinPROGRAMS \
> +			  install-sbinSCRIPTS \
> +			  installdirs

Only one tab to indent the continuation lines.

> +
> +define FRR_INSTALL_CONFIG_FILES
> +	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)

Calling bootstrap.sh during the installation? Why?

> +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/log/frr
> +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/run/frr

I'm not sure this is going to work well, as /var/log and /var/run are
symlinks to /tmp by default, and a tmpfs is mounted to /tmp.

These directories need to be created at runtime.

> +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/frr

Not needed, as the -D option to the $(INSTALL) commands above will
create this folder.

> +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons $(TARGET_DIR)/etc/frr/daemons
> +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons.conf $(TARGET_DIR)/etc/frr/daemons.conf
> +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/frr.conf $(TARGET_DIR)/etc/frr/frr.conf
> +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/vtysh.conf $(TARGET_DIR)/etc/frr/vtysh.conf
> +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/support_bundle_commands.conf $(TARGET_DIR)/etc/frr/support_bundle_commands.conf

This probably calls for a for loop:

	$(foreach f,daemons daemons.conf frr.conf vtysh.conf support_bundle_commands.conf,\
		$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/$(f) \
			$(TARGET_DIR)/etc/frr/$(f)
	)

> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/zebra.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/bgpd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospfd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospf6d.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/isisd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripngd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/pimd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ldpd.conf
> +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/nhrpd.conf

Installing /dev/null ? Here is just creates an empty regular file. Does
it really makes sense? What are you trying to do here ?

> +endef
> +FRR_POST_INSTALL_TARGET_HOOKS += FRR_INSTALL_CONFIG_FILES
> +
> +define FRR_PERMISSIONS
> +	/var/log/frr d 755 frr frr - - - - -
> +	/var/run/frr d 755 frr frr - - - - -

This is not going to work, as explained above.

> +	/etc/frr/zebra.conf f 644 frr frr - - - - -
> +	/etc/frr/bgpd.conf f 644 frr frr - - - - -
> +	/etc/frr/ospfd.conf f 644 frr frr - - - - -
> +	/etc/frr/ospf6d.conf f 644 frr frr - - - - -
> +	/etc/frr/isisd.conf f 644 frr frr - - - - -
> +	/etc/frr/ripd.conf f 644 frr frr - - - - -
> +	/etc/frr/ripngd.conf f 644 frr frr - - - - -
> +	/etc/frr/pimd.conf f 644 frr frr - - - - -
> +	/etc/frr/ldpd.conf f 644 frr frr - - - - -
> +	/etc/frr/nhrpd.conf f 644 frr frr - - - - -

So all these empty files need to be writable ?

> +	/etc/frr/vtysh.conf f 644 frr frrvty - - - - -
> +endef
> +
> +define FRR_USERS
> +	frr -1 frr -1 * /var/run/frr - frrvty FRR user priv
> +endef
> +
> +define FRR_INSTALL_INIT_SYSV
> +	$(INSTALL) -D -m 755 $(FRR_PKGDIR)/S50frr \
> +		$(TARGET_DIR)/etc/init.d/S50frr
> +endef
> +
> +$(eval $(autotools-package))
> +$(eval $(host-autotools-package))

Thanks!

Thomas
Vadym Kochan Feb. 24, 2020, 9:14 p.m. UTC | #2
On Mon, Feb 24, 2020 at 09:06:01PM +0100, Thomas Petazzoni wrote:
> Hello Vadim,
> 
> On Mon, 24 Feb 2020 19:26:52 +0200
> Vadim Kochan <vadim4j@gmail.com> wrote:
> 
> > diff --git a/DEVELOPERS b/DEVELOPERS
> > index e07236937b..ef6592afa0 100644
> > --- a/DEVELOPERS
> > +++ b/DEVELOPERS
> > @@ -2480,6 +2480,7 @@ F:	package/brcm-patchram-plus/
> >  F:	package/gettext-tiny/
> >  F:	package/tinyssh/
> >  F:	package/rtrlib/
> > +F:	package/frr/
> 
> Alphabetic ordering is not good here.
OK

> 
> > diff --git a/package/frr/Config.in b/package/frr/Config.in
> > new file mode 100644
> > index 0000000000..01673eb837
> > --- /dev/null
> > +++ b/package/frr/Config.in
> > @@ -0,0 +1,23 @@
> > +config BR2_PACKAGE_FRR
> > +	bool "frr"
> > +	depends on BR2_USE_MMU # fork()
> > +	depends on BR2_PACKAGE_BASH # init
> > +	select BR2_PACKAGE_RTRLIB
> > +	select BR2_PACKAGE_READLINE
> > +	select BR2_PACKAGE_JSON_C
> > +	select BR2_PACKAGE_LIBYANG
> > +	select BR2_PACKAGE_LIBCAP
> > +	select BR2_PACKAGE_LIBNL
> > +	select BR2_PACKAGE_NCURSES
> > +	select BR2_PACKAGE_NETSNMP
> > +	select BR2_PACKAGE_C_ARES
> 
> That's a lot of packages that you select here, are you sure you
> properly propagated the "depends on" of all those packages in this
> Config.in ?
will try to check by disabling one by one.

> 
> For example, rtrlib depends on threads and SSP, so these need to be
> propagated here (of course, except if you get rid of the SSP dependency
> in rtrlib, as suggested in my review of PATCH 2/3).
> 
> > +	help
> > +	  The FRRouting Protocol Suite.
> > +
> > +	  FRR is free software that implements and manages various IPv4 and
> > +	  IPv6 routing protocols.
> > +
> > +	  https://frrouting.org
> > +
> > +comment "frr requires BASH for init service"
> > +	depends on !BR2_PACKAGE_BASH
> 
> So it's the frrinit.sh script that requires bash ?
Yes, this is runtime dependency.

> 
> This comment also need a BR2_USE_MMU dependency, so that it doesn't
> show up on noMMU systems.
> 
> > diff --git a/package/frr/S50frr b/package/frr/S50frr
> > new file mode 100644
> > index 0000000000..dec7d82a88
> > --- /dev/null
> > +++ b/package/frr/S50frr
> > @@ -0,0 +1,38 @@
> > +#!/bin/sh
> > +#
> > +# Starts frr.
> > +#
> > +
> > +start() {
> > +	printf "Starting frr: "
> > +	start-stop-daemon -S -q -b \
> > +		--exec /usr/sbin/frrinit.sh -- start
> > +	[ $? = 0 ] && echo "OK" || echo "FAIL"
> > +}
> > +stop() {
> > +	printf "Stopping frr: "
> > +	/usr/sbin/frrinit.sh stop
> > +	start-stop-daemon -K -q -p /run/frr.pid
> 
> This looks odd. Why do you need to call frrinit.sh stop and then use
> start-stop-daemon ?
Sorry, I thought to call 'frrinit.sh stop' to first stop all the daemons
executed by 'frrinit.sh start' and then stop the main daemon process.

> 
> Also, make sure to use package/busybox/S01sysklogd as a template for
> your init scripts.
OK

> 
> 
> > diff --git a/package/frr/frr.mk b/package/frr/frr.mk
> > new file mode 100644
> > index 0000000000..c53e9bb4b0
> > --- /dev/null
> > +++ b/package/frr/frr.mk
> > @@ -0,0 +1,105 @@
> > +################################################################################
> > +#
> > +# frr
> > +#
> > +################################################################################
> > +
> > +FRR_VERSION = 7.3
> > +FRR_SOURCE = frr-$(FRR_VERSION).tar.gz
> > +FRR_SITE = https://github.com/FRRouting/frr/archive
> > +FRR_LICENSE = GPL-2.0
> > +FRR_LICENSE_FILES = COPYING
> > +
> > +FRR_DEPENDENCIES = rtrlib readline json-c libyang libcap libnl \
> > +		   ncurses host-frr c-ares
> 
> Only one tab to indent the second line.
> 
> > +
> > +HOST_FRR_DEPENDENCIES = host-flex host-bison host-python
> > +
> > +FRR_CONF_OPTS = --with-clippy=$(HOST_DIR)/bin/clippy \
> > +		--sysconfdir=/etc/frr \
> > +		--localstatedir=/var/run/frr \
> > +		--with-moduledir=/usr/lib/frr/modules \
> > +		--enable-configfile-mask=0640 \
> > +		--enable-logfile-mask=0640 \
> > +		--enable-multipath=256 \
> > +		--disable-ospfclient \
> > +		--enable-shell-access \
> > +		--enable-user=frr \
> > +		--enable-group=frr \
> > +		--enable-vty-group=frrvty \
> > +		--disable-exampledir \
> > +		--enable-rpki \
> > +		--enable-fpm
> 
> Ditto, only one tab to indent the continuation lines.
OK

> 
> > +
> > +HOST_FRR_CONF_OPTS = --enable-clippy-only
> > +
> > +define FRR_RUN_BOOTSTRAP
> > +	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)
> > +endef
> > +FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP
> > +HOST_FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP
> 
> This won't work as you don't have any guarantee that host-autoconf and
> host-automake will be built before. Can you use FRR_AUTORECONF = YES,
> as this is really the best solution ? If not, you need to keep your
> hooks, but explicitly add host-autoconf and host-automake to the
> package dependencies.
Thanks, will check.

> 
> > +define HOST_FRR_INSTALL_CMDS
> > +	$(INSTALL) -D -m 0755 $(@D)/lib/clippy $(HOST_DIR)/bin/clippy
> > +endef
> > +
> > +
> > +# for some reason the normal 'install' target fails
> 
> Why? Can it be fixed? At least reported to the upstream developers?
Ohhh, so, there is some miss-behave in case of cross-compilation that:
1) for some frr daemon installation uses -L/usr/lib

2) install tries to install binaries (apps & libs) to $(TARGET)/$(O)
path which is invalid.

So, I just gave up and tried to do a bit manual way. Would be great if
can suggest some generic hint with $(TARGET)$(O) issue.

> 
> > +FRR_INSTALL_TARGET_OPTS = DESTDIR="$(TARGET_DIR)" libdir="/usr/lib" \
> > +			  install-binPROGRAMS \
> > +			  install-sbinPROGRAMS \
> > +			  install-sbinSCRIPTS \
> > +			  installdirs
> 
> Only one tab to indent the continuation lines.
OK

> 
> > +
> > +define FRR_INSTALL_CONFIG_FILES
> > +	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)
> 
> Calling bootstrap.sh during the installation? Why?
OK, might be some copy&paste issue.
> 
> > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/log/frr
> > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/run/frr
> 
> I'm not sure this is going to work well, as /var/log and /var/run are
> symlinks to /tmp by default, and a tmpfs is mounted to /tmp.
> 
> These directories need to be created at runtime.
So in case of systemd it can be handled by tmpfs file, but in
case of sysv is it OK to do it in init script ?

> 
> > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/frr
> 
> Not needed, as the -D option to the $(INSTALL) commands above will
> create this folder.
> 
> > +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons $(TARGET_DIR)/etc/frr/daemons
> > +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons.conf $(TARGET_DIR)/etc/frr/daemons.conf
> > +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/frr.conf $(TARGET_DIR)/etc/frr/frr.conf
> > +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/vtysh.conf $(TARGET_DIR)/etc/frr/vtysh.conf
> > +	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/support_bundle_commands.conf $(TARGET_DIR)/etc/frr/support_bundle_commands.conf
> 
> This probably calls for a for loop:
> 
> 	$(foreach f,daemons daemons.conf frr.conf vtysh.conf support_bundle_commands.conf,\
> 		$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/$(f) \
> 			$(TARGET_DIR)/etc/frr/$(f)
> 	)
Thanks, will use it.

> 
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/zebra.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/bgpd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospfd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospf6d.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/isisd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripngd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/pimd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ldpd.conf
> > +	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/nhrpd.conf
> 
> Installing /dev/null ? Here is just creates an empty regular file. Does
> it really makes sense? What are you trying to do here ?
> 
Will check if these files are needed, I followed of build instructions
for several distros on frr docs site.

> > +endef
> > +FRR_POST_INSTALL_TARGET_HOOKS += FRR_INSTALL_CONFIG_FILES
> > +
> > +define FRR_PERMISSIONS
> > +	/var/log/frr d 755 frr frr - - - - -
> > +	/var/run/frr d 755 frr frr - - - - -
> 
> This is not going to work, as explained above.
> 
> > +	/etc/frr/zebra.conf f 644 frr frr - - - - -
> > +	/etc/frr/bgpd.conf f 644 frr frr - - - - -
> > +	/etc/frr/ospfd.conf f 644 frr frr - - - - -
> > +	/etc/frr/ospf6d.conf f 644 frr frr - - - - -
> > +	/etc/frr/isisd.conf f 644 frr frr - - - - -
> > +	/etc/frr/ripd.conf f 644 frr frr - - - - -
> > +	/etc/frr/ripngd.conf f 644 frr frr - - - - -
> > +	/etc/frr/pimd.conf f 644 frr frr - - - - -
> > +	/etc/frr/ldpd.conf f 644 frr frr - - - - -
> > +	/etc/frr/nhrpd.conf f 644 frr frr - - - - -
> 
> So all these empty files need to be writable ?
> 
> > +	/etc/frr/vtysh.conf f 644 frr frrvty - - - - -
> > +endef
> > +
> > +define FRR_USERS
> > +	frr -1 frr -1 * /var/run/frr - frrvty FRR user priv
> > +endef
> > +
> > +define FRR_INSTALL_INIT_SYSV
> > +	$(INSTALL) -D -m 755 $(FRR_PKGDIR)/S50frr \
> > +		$(TARGET_DIR)/etc/init.d/S50frr
> > +endef
> > +
> > +$(eval $(autotools-package))
> > +$(eval $(host-autotools-package))
> 
> Thanks!
> 
> Thomas
> -- 
> Thomas Petazzoni, CTO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
Thomas Petazzoni Feb. 24, 2020, 9:32 p.m. UTC | #3
On Mon, 24 Feb 2020 23:14:27 +0200
vadim4j@gmail.com wrote:

> > > diff --git a/package/frr/Config.in b/package/frr/Config.in
> > > new file mode 100644
> > > index 0000000000..01673eb837
> > > --- /dev/null
> > > +++ b/package/frr/Config.in
> > > @@ -0,0 +1,23 @@
> > > +config BR2_PACKAGE_FRR
> > > +	bool "frr"
> > > +	depends on BR2_USE_MMU # fork()
> > > +	depends on BR2_PACKAGE_BASH # init
> > > +	select BR2_PACKAGE_RTRLIB
> > > +	select BR2_PACKAGE_READLINE
> > > +	select BR2_PACKAGE_JSON_C
> > > +	select BR2_PACKAGE_LIBYANG
> > > +	select BR2_PACKAGE_LIBCAP
> > > +	select BR2_PACKAGE_LIBNL
> > > +	select BR2_PACKAGE_NCURSES
> > > +	select BR2_PACKAGE_NETSNMP
> > > +	select BR2_PACKAGE_C_ARES  
> > 
> > That's a lot of packages that you select here, are you sure you
> > properly propagated the "depends on" of all those packages in this
> > Config.in ?  
> will try to check by disabling one by one.

Huh? That's not what I'm asking here. I'm just asking that you look at
the definition of each of those options, and if any of them has some
"depends on" dependency, you need to replicate them into the frr
package Config.in file.

Of course, you have to ensure that all these packages are really useful
for you.

BTW: the list should be sorted alphabetically.

> > > +	help
> > > +	  The FRRouting Protocol Suite.
> > > +
> > > +	  FRR is free software that implements and manages various IPv4 and
> > > +	  IPv6 routing protocols.
> > > +
> > > +	  https://frrouting.org
> > > +
> > > +comment "frr requires BASH for init service"
> > > +	depends on !BR2_PACKAGE_BASH  
> > 
> > So it's the frrinit.sh script that requires bash ?  
> Yes, this is runtime dependency.

And using this script is important?


> > > +# for some reason the normal 'install' target fails  
> > 
> > Why? Can it be fixed? At least reported to the upstream developers?  
> Ohhh, so, there is some miss-behave in case of cross-compilation that:
> 1) for some frr daemon installation uses -L/usr/lib
> 
> 2) install tries to install binaries (apps & libs) to $(TARGET)/$(O)
> path which is invalid.
> 
> So, I just gave up and tried to do a bit manual way. Would be great if
> can suggest some generic hint with $(TARGET)$(O) issue.

Would need to reproduce the issue and investigate to provide some
hints, I'm not sure I'll have the time soon. Maybe someone else can
help here, and provide some suggestions ?


> > > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/log/frr
> > > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/run/frr  
> > 
> > I'm not sure this is going to work well, as /var/log and /var/run are
> > symlinks to /tmp by default, and a tmpfs is mounted to /tmp.
> > 
> > These directories need to be created at runtime.  
> So in case of systemd it can be handled by tmpfs file, but in
> case of sysv is it OK to do it in init script ?

Yes, it is OK.

Best regards,

Thomas
Vadym Kochan Feb. 24, 2020, 9:36 p.m. UTC | #4
On Mon, Feb 24, 2020 at 10:32:46PM +0100, Thomas Petazzoni wrote:
> On Mon, 24 Feb 2020 23:14:27 +0200
> vadim4j@gmail.com wrote:
> 
> > > > diff --git a/package/frr/Config.in b/package/frr/Config.in
> > > > new file mode 100644
> > > > index 0000000000..01673eb837
> > > > --- /dev/null
> > > > +++ b/package/frr/Config.in
> > > > @@ -0,0 +1,23 @@
> > > > +config BR2_PACKAGE_FRR
> > > > +	bool "frr"
> > > > +	depends on BR2_USE_MMU # fork()
> > > > +	depends on BR2_PACKAGE_BASH # init
> > > > +	select BR2_PACKAGE_RTRLIB
> > > > +	select BR2_PACKAGE_READLINE
> > > > +	select BR2_PACKAGE_JSON_C
> > > > +	select BR2_PACKAGE_LIBYANG
> > > > +	select BR2_PACKAGE_LIBCAP
> > > > +	select BR2_PACKAGE_LIBNL
> > > > +	select BR2_PACKAGE_NCURSES
> > > > +	select BR2_PACKAGE_NETSNMP
> > > > +	select BR2_PACKAGE_C_ARES  
> > > 
> > > That's a lot of packages that you select here, are you sure you
> > > properly propagated the "depends on" of all those packages in this
> > > Config.in ?  
> > will try to check by disabling one by one.
> 
> Huh? That's not what I'm asking here. I'm just asking that you look at
> the definition of each of those options, and if any of them has some
> "depends on" dependency, you need to replicate them into the frr
> package Config.in file.
Hmmm, you mean to add here "depends on" from selected packages ?

> 
> Of course, you have to ensure that all these packages are really useful
> for you.
> 
> BTW: the list should be sorted alphabetically.
> 
> > > > +	help
> > > > +	  The FRRouting Protocol Suite.
> > > > +
> > > > +	  FRR is free software that implements and manages various IPv4 and
> > > > +	  IPv6 routing protocols.
> > > > +
> > > > +	  https://frrouting.org
> > > > +
> > > > +comment "frr requires BASH for init service"
> > > > +	depends on !BR2_PACKAGE_BASH  
> > > 
> > > So it's the frrinit.sh script that requires bash ?  
> > Yes, this is runtime dependency.
> 
> And using this script is important?
Well, it runs daemons on system init to handle routing
protocols.

> 
> 
> > > > +# for some reason the normal 'install' target fails  
> > > 
> > > Why? Can it be fixed? At least reported to the upstream developers?  
> > Ohhh, so, there is some miss-behave in case of cross-compilation that:
> > 1) for some frr daemon installation uses -L/usr/lib
> > 
> > 2) install tries to install binaries (apps & libs) to $(TARGET)/$(O)
> > path which is invalid.
> > 
> > So, I just gave up and tried to do a bit manual way. Would be great if
> > can suggest some generic hint with $(TARGET)$(O) issue.
> 
> Would need to reproduce the issue and investigate to provide some
> hints, I'm not sure I'll have the time soon. Maybe someone else can
> help here, and provide some suggestions ?
> 
> 
> > > > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/log/frr
> > > > +	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/run/frr  
> > > 
> > > I'm not sure this is going to work well, as /var/log and /var/run are
> > > symlinks to /tmp by default, and a tmpfs is mounted to /tmp.
> > > 
> > > These directories need to be created at runtime.  
> > So in case of systemd it can be handled by tmpfs file, but in
> > case of sysv is it OK to do it in init script ?
> 
> Yes, it is OK.
> 
> Best regards,
> 
> Thomas
> -- 
> Thomas Petazzoni, CTO, Bootlin
> Embedded Linux and Kernel engineering
> https://bootlin.com
Thomas Petazzoni Feb. 24, 2020, 10:07 p.m. UTC | #5
On Mon, 24 Feb 2020 23:36:54 +0200
vadim4j@gmail.com wrote:

> > Huh? That's not what I'm asking here. I'm just asking that you look at
> > the definition of each of those options, and if any of them has some
> > "depends on" dependency, you need to replicate them into the frr
> > package Config.in file.  
> Hmmm, you mean to add here "depends on" from selected packages ?

Yes, like we do in all other Buildroot packages.

See also section "17.2.3. Choosing depends on or select" in
https://buildroot.org/downloads/manual/manual.html.

> > > > So it's the frrinit.sh script that requires bash ?    
> > > Yes, this is runtime dependency.  
> > 
> > And using this script is important?  
> Well, it runs daemons on system init to handle routing
> protocols.

OK, but is it complicated? Can it be replaced by some simpler
Buildroot-compliant init script?

Thomas
Vadym Kochan Feb. 25, 2020, 1:28 a.m. UTC | #6
On Mon, Feb 24, 2020 at 11:07:06PM +0100, Thomas Petazzoni wrote:
> On Mon, 24 Feb 2020 23:36:54 +0200
> vadim4j@gmail.com wrote:
> 
> > > Huh? That's not what I'm asking here. I'm just asking that you look at
> > > the definition of each of those options, and if any of them has some
> > > "depends on" dependency, you need to replicate them into the frr
> > > package Config.in file.  
> > Hmmm, you mean to add here "depends on" from selected packages ?
> 
> Yes, like we do in all other Buildroot packages.
> 
> See also section "17.2.3. Choosing depends on or select" in
> https://buildroot.org/downloads/manual/manual.html.
> 
> > > > > So it's the frrinit.sh script that requires bash ?    
> > > > Yes, this is runtime dependency.  
> > > 
> > > And using this script is important?  
> > Well, it runs daemons on system init to handle routing
> > protocols.
> 
> OK, but is it complicated? Can it be replaced by some simpler
> Buildroot-compliant init script?
> 
So, I looked closer and actually frr init script does not need
start-stop-daemon tool, it is enough to just call /usr/sbin/frrinit.sh
{start|stop}. So I can pick S01syslogd as template but w/o using
start-stop-daemon and directly call frrinit.sh, because frr handles
starting/stopping of its daemons by itself.
diff mbox series

Patch

diff --git a/DEVELOPERS b/DEVELOPERS
index e07236937b..ef6592afa0 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2480,6 +2480,7 @@  F:	package/brcm-patchram-plus/
 F:	package/gettext-tiny/
 F:	package/tinyssh/
 F:	package/rtrlib/
+F:	package/frr/
 
 N:	Valentin Korenblit <valentinkorenblit@gmail.com>
 F:	package/clang/
diff --git a/package/Config.in b/package/Config.in
index 60bf9aac10..51dc3480f4 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -1999,6 +1999,7 @@  menu "Networking applications"
 	source "package/fping/Config.in"
 	source "package/freeswitch/Config.in"
 	source "package/freeswitch-mod-bcg729/Config.in"
+	source "package/frr/Config.in"
 	source "package/gerbera/Config.in"
 	source "package/gesftpserver/Config.in"
 	source "package/glorytun/Config.in"
diff --git a/package/frr/Config.in b/package/frr/Config.in
new file mode 100644
index 0000000000..01673eb837
--- /dev/null
+++ b/package/frr/Config.in
@@ -0,0 +1,23 @@ 
+config BR2_PACKAGE_FRR
+	bool "frr"
+	depends on BR2_USE_MMU # fork()
+	depends on BR2_PACKAGE_BASH # init
+	select BR2_PACKAGE_RTRLIB
+	select BR2_PACKAGE_READLINE
+	select BR2_PACKAGE_JSON_C
+	select BR2_PACKAGE_LIBYANG
+	select BR2_PACKAGE_LIBCAP
+	select BR2_PACKAGE_LIBNL
+	select BR2_PACKAGE_NCURSES
+	select BR2_PACKAGE_NETSNMP
+	select BR2_PACKAGE_C_ARES
+	help
+	  The FRRouting Protocol Suite.
+
+	  FRR is free software that implements and manages various IPv4 and
+	  IPv6 routing protocols.
+
+	  https://frrouting.org
+
+comment "frr requires BASH for init service"
+	depends on !BR2_PACKAGE_BASH
diff --git a/package/frr/S50frr b/package/frr/S50frr
new file mode 100644
index 0000000000..dec7d82a88
--- /dev/null
+++ b/package/frr/S50frr
@@ -0,0 +1,38 @@ 
+#!/bin/sh
+#
+# Starts frr.
+#
+
+start() {
+	printf "Starting frr: "
+	start-stop-daemon -S -q -b \
+		--exec /usr/sbin/frrinit.sh -- start
+	[ $? = 0 ] && echo "OK" || echo "FAIL"
+}
+stop() {
+	printf "Stopping frr: "
+	/usr/sbin/frrinit.sh stop
+	start-stop-daemon -K -q -p /run/frr.pid
+	[ $? = 0 ] && echo "OK" || echo "FAIL"
+}
+restart() {
+	stop
+	start
+}
+
+case "$1" in
+  start)
+	start
+	;;
+  stop)
+	stop
+	;;
+  restart|reload)
+	restart
+	;;
+  *)
+	echo "Usage: $0 {start|stop|restart}"
+	exit 1
+esac
+
+exit $?
diff --git a/package/frr/frr.hash b/package/frr/frr.hash
new file mode 100644
index 0000000000..7d9ff7ea04
--- /dev/null
+++ b/package/frr/frr.hash
@@ -0,0 +1,2 @@ 
+sha256 c209ed66a0331221649b8c21dc8c6704ce1696e2017ef4d48f8c2ac6b1fa01b7  frr-7.3.tar.gz
+sha256 8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643  COPYING
diff --git a/package/frr/frr.mk b/package/frr/frr.mk
new file mode 100644
index 0000000000..c53e9bb4b0
--- /dev/null
+++ b/package/frr/frr.mk
@@ -0,0 +1,105 @@ 
+################################################################################
+#
+# frr
+#
+################################################################################
+
+FRR_VERSION = 7.3
+FRR_SOURCE = frr-$(FRR_VERSION).tar.gz
+FRR_SITE = https://github.com/FRRouting/frr/archive
+FRR_LICENSE = GPL-2.0
+FRR_LICENSE_FILES = COPYING
+
+FRR_DEPENDENCIES = rtrlib readline json-c libyang libcap libnl \
+		   ncurses host-frr c-ares
+
+HOST_FRR_DEPENDENCIES = host-flex host-bison host-python
+
+FRR_CONF_OPTS = --with-clippy=$(HOST_DIR)/bin/clippy \
+		--sysconfdir=/etc/frr \
+		--localstatedir=/var/run/frr \
+		--with-moduledir=/usr/lib/frr/modules \
+		--enable-configfile-mask=0640 \
+		--enable-logfile-mask=0640 \
+		--enable-multipath=256 \
+		--disable-ospfclient \
+		--enable-shell-access \
+		--enable-user=frr \
+		--enable-group=frr \
+		--enable-vty-group=frrvty \
+		--disable-exampledir \
+		--enable-rpki \
+		--enable-fpm
+
+HOST_FRR_CONF_OPTS = --enable-clippy-only
+
+define FRR_RUN_BOOTSTRAP
+	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)
+endef
+FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP
+HOST_FRR_PRE_CONFIGURE_HOOKS += FRR_RUN_BOOTSTRAP
+
+define HOST_FRR_INSTALL_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/lib/clippy $(HOST_DIR)/bin/clippy
+endef
+
+
+# for some reason the normal 'install' target fails
+FRR_INSTALL_TARGET_OPTS = DESTDIR="$(TARGET_DIR)" libdir="/usr/lib" \
+			  install-binPROGRAMS \
+			  install-sbinPROGRAMS \
+			  install-sbinSCRIPTS \
+			  installdirs
+
+define FRR_INSTALL_CONFIG_FILES
+	(cd $(@D) && PATH=$(BR_PATH) ./bootstrap.sh)
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/log/frr
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/var/run/frr
+
+	$(INSTALL) -d -m 0755 $(TARGET_DIR)/etc/frr
+	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons $(TARGET_DIR)/etc/frr/daemons
+	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/daemons.conf $(TARGET_DIR)/etc/frr/daemons.conf
+	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/frr.conf $(TARGET_DIR)/etc/frr/frr.conf
+	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/vtysh.conf $(TARGET_DIR)/etc/frr/vtysh.conf
+	$(INSTALL) -D -m 0644 $(@D)/tools/etc/frr/support_bundle_commands.conf $(TARGET_DIR)/etc/frr/support_bundle_commands.conf
+
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/zebra.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/bgpd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospfd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ospf6d.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/isisd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ripngd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/pimd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/ldpd.conf
+	$(INSTALL) -m 0644 /dev/null $(TARGET_DIR)/etc/frr/nhrpd.conf
+endef
+FRR_POST_INSTALL_TARGET_HOOKS += FRR_INSTALL_CONFIG_FILES
+
+define FRR_PERMISSIONS
+	/var/log/frr d 755 frr frr - - - - -
+	/var/run/frr d 755 frr frr - - - - -
+	/etc/frr/zebra.conf f 644 frr frr - - - - -
+	/etc/frr/bgpd.conf f 644 frr frr - - - - -
+	/etc/frr/ospfd.conf f 644 frr frr - - - - -
+	/etc/frr/ospf6d.conf f 644 frr frr - - - - -
+	/etc/frr/isisd.conf f 644 frr frr - - - - -
+	/etc/frr/ripd.conf f 644 frr frr - - - - -
+	/etc/frr/ripngd.conf f 644 frr frr - - - - -
+	/etc/frr/pimd.conf f 644 frr frr - - - - -
+	/etc/frr/ldpd.conf f 644 frr frr - - - - -
+	/etc/frr/nhrpd.conf f 644 frr frr - - - - -
+	/etc/frr/vtysh.conf f 644 frr frrvty - - - - -
+endef
+
+define FRR_USERS
+	frr -1 frr -1 * /var/run/frr - frrvty FRR user priv
+endef
+
+define FRR_INSTALL_INIT_SYSV
+	$(INSTALL) -D -m 755 $(FRR_PKGDIR)/S50frr \
+		$(TARGET_DIR)/etc/init.d/S50frr
+endef
+
+$(eval $(autotools-package))
+$(eval $(host-autotools-package))