[Babel-users] [PATCH] Add option to consider sysctl write failures as non-fatal.
Jernej Kos
jernej at kos.mx
Mon Aug 10 16:43:09 UTC 2015
Hello!
+1 for this patch. We are also running babeld in a Docker container and
this requires us to run it as a privileged container due to some Docker
deficiencies in setting network sysctls inside containers.
Jernej
On 10. 08. 2015 18:02, Toke Høiland-Jørgensen wrote:
> Babeld will exit with a fatal error if it is unable to write sysctls.
> When running in a container, however, /proc/sys may be mounted
> read-only, which causes babeld to fail.
>
> This adds a switch to consider sysctl failures as non-fatal, in which
> case a warning will be issues rather than having the daemon fail to
> start.
>
> Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
> ---
> babeld.c | 8 ++++++--
> babeld.h | 1 +
> babeld.man | 12 ++++++++++++
> configuration.c | 3 +++
> kernel_netlink.c | 7 ++++++-
> 5 files changed, 28 insertions(+), 3 deletions(-)
>
> diff --git a/babeld.c b/babeld.c
> index 943f042..45b14fa 100644
> --- a/babeld.c
> +++ b/babeld.c
> @@ -67,6 +67,7 @@ int default_wired_hello_interval = -1;
> int resend_delay = -1;
> int random_id = 0;
> int do_daemonise = 0;
> +int sysctl_nonfatal = 0;
> const char *logfile = NULL,
> *pidfile = "/var/run/babeld.pid",
> *state_file = "/var/lib/babel-state";
> @@ -128,7 +129,7 @@ main(int argc, char **argv)
>
> while(1) {
> opt = getopt(argc, argv,
> - "m:p:h:H:i:k:A:srR:uS:d:g:lwz:M:t:T:c:C:DL:I:");
> + "m:p:h:H:i:k:A:srR:uS:d:g:lwz:M:t:T:c:C:DL:I:F");
> if(opt < 0)
> break;
>
> @@ -263,6 +264,9 @@ main(int argc, char **argv)
> case 'D':
> do_daemonise = 1;
> break;
> + case 'F':
> + sysctl_nonfatal = 1;
> + break;
> case 'L':
> logfile = optarg;
> break;
> @@ -800,7 +804,7 @@ main(int argc, char **argv)
> " "
> "[-t table] [-T table] [-c file] [-C statement]\n"
> " "
> - "[-d level] [-D] [-L logfile] [-I pidfile]\n"
> + "[-d level] [-D] [-F] [-L logfile] [-I pidfile]\n"
> " "
> "[id] interface...\n",
> argv[0]);
> diff --git a/babeld.h b/babeld.h
> index 92ce9b5..c1f26fe 100644
> --- a/babeld.h
> +++ b/babeld.h
> @@ -86,6 +86,7 @@ extern time_t reboot_time;
> extern int default_wireless_hello_interval, default_wired_hello_interval;
> extern int resend_delay;
> extern int random_id;
> +extern int sysctl_nonfatal;
> extern int do_daemonise;
> extern const char *logfile, *pidfile, *state_file;
> extern int link_detect;
> diff --git a/babeld.man b/babeld.man
> index ec600c2..7182f30 100644
> --- a/babeld.man
> +++ b/babeld.man
> @@ -135,6 +135,11 @@ Specify a configuration statement directly on the command line.
> .B \-D
> Daemonise at startup.
> .TP
> +.B \-F
> +Don't consider failures writing to sysctl as fatal. Warn of the failures, but
> +continue running. This is useful when running babeld in a container that mounts
> +/proc/sys as read-only (as systemd-nspawn does, for instance).
> +.TP
> .BI \-L " logfile"
> Specify a file to log random ``how do you do?'' messages to. This
> defaults to standard error if not daemonising, and to
> @@ -253,6 +258,13 @@ This specifies whether to daemonize at startup, and is equivalent to
> the command-line option
> .BR \-D .
> .TP
> +.BR sysctl-nonfatal " {" true | false }
> +This controls whether to consider failures writing to sysctl as fatal. If set,
> +warn of the failures, but continue running. This is useful when running babeld
> +in a container that mounts /proc/sys as read-only (as systemd-nspawn does, for
> +instance). Equivalent to the command line option
> +.BR \-F .
> +.TP
> .BI state-file " filename"
> This specifies the name of the file used for preserving long-term
> information between invocations of the
> diff --git a/configuration.c b/configuration.c
> index 6a9c09d..571e220 100644
> --- a/configuration.c
> +++ b/configuration.c
> @@ -691,6 +691,7 @@ parse_option(int c, gnc_t gnc, void *closure, char *token)
> strcmp(token, "link-detect") == 0 ||
> strcmp(token, "random-id") == 0 ||
> strcmp(token, "daemonise") == 0 ||
> + strcmp(token, "sysctl-nonfatal") == 0 ||
> strcmp(token, "ipv6-subtrees") == 0 ||
> strcmp(token, "reflect-kernel-metric") == 0) {
> int b;
> @@ -706,6 +707,8 @@ parse_option(int c, gnc_t gnc, void *closure, char *token)
> random_id = b;
> else if(strcmp(token, "daemonise") == 0)
> do_daemonise = b;
> + else if(strcmp(token, "sysctl-nonfatal") == 0)
> + sysctl_nonfatal = b;
> else if(strcmp(token, "ipv6-subtrees") == 0)
> has_ipv6_subtrees = b;
> else if(strcmp(token, "reflect-kernel-metric") == 0)
> diff --git a/kernel_netlink.c b/kernel_netlink.c
> index ab63d33..0154c63 100644
> --- a/kernel_netlink.c
> +++ b/kernel_netlink.c
> @@ -183,8 +183,13 @@ write_proc(char *filename, int value)
> n = snprintf(buf, 100, "%d", value);
>
> fd = open(filename, O_WRONLY);
> - if(fd < 0)
> + if(fd < 0 && sysctl_nonfatal) {
> + fprintf(stderr, "Warning: writing sysctl %s failed (non-fatal): %s.\n",
> + filename, strerror(errno));
> + return 1;
> + } else if(fd < 0) {
> return -1;
> + }
>
> rc = write(fd, buf, n);
> if(rc < n) {
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: OpenPGP digital signature
URL: <http://lists.alioth.debian.org/pipermail/babel-users/attachments/20150810/03573525/attachment.sig>
More information about the Babel-users
mailing list