[PATCH] Gate boolean protocol options on filename.

Baptiste Jonglez baptiste at bitsofnetworks.org
Tue May 24 15:00:34 CEST 2016


Hi,

On Sun, May 22, 2016 at 04:50:12PM -0700, João Taveira Araújo wrote:
> Toggling session parameters currently requires editing the configuration
> file and reloading BIRD. Doing so programatically requires keeping up
> with the syntax and layout of a particular configuration.
> 
> This commit introduces an alternative method for gating configuration of
> boolean protocol properties. In addition to the keywords on/off and
> yes/no, a user can instead provide a filename on which to predicate
> whether the flag is set.
> 
> In particular, this makes toggling protocols programatically much simpler,
> since we can decouple state from configuration more cleanly, i.e:
> 
> protocol kernel {
>   disabled filename "/etc/disable-kernel";
> }

Can't you achieve the same effect with an include?  The included file
would just need to contain either nothing, or "disabled yes".

> ---
>  conf/cf-lex.l   | 23 +++++++++++++++++++++++
>  conf/conf.h     |  1 +
>  conf/confbase.Y |  3 ++-
>  doc/bird.sgml   |  5 +++--
>  4 files changed, 29 insertions(+), 3 deletions(-)
> 
> diff --git a/conf/cf-lex.l b/conf/cf-lex.l
> index 5a2a4d6..af85291 100644
> --- a/conf/cf-lex.l
> +++ b/conf/cf-lex.l
> @@ -693,6 +693,29 @@ cf_symbol_class_name(struct symbol *sym)
>      }
>  }
>  
> +/**
> + * cf_file_exists - check if expanded filename exists
> + * @arg: filename
> + *
> + * This function expands relative filenames and returns
> + * whether file is present.
> + */
> +int
> +cf_file_exists(char *arg)
> +{
> +  char *patt = arg;
> +
> +  if (*arg != '/')
> +    {
> +      int dlen = strlen(ifs->file_name);
> +      char *dir = alloca(dlen + 1);
> +      patt = alloca(dlen + strlen(arg) + 2);
> +      memcpy(dir, ifs->file_name, dlen + 1);
> +      sprintf(patt, "%s/%s", dirname(dir), arg);
> +    }
> +
> +  return access(patt, F_OK) != -1;
> +}
>  
>  /**
>   * DOC: Parser
> diff --git a/conf/conf.h b/conf/conf.h
> index 89a2c5b..6f6a33d 100644
> --- a/conf/conf.h
> +++ b/conf/conf.h
> @@ -160,6 +160,7 @@ char *cf_symbol_class_name(struct symbol *sym);
>  static inline int cf_symbol_is_constant(struct symbol *sym)
>  { return (sym->class & 0xff00) == SYM_CONSTANT; }
>  
> +int cf_file_exists(char *arg);
>  
>  /* Parser */
>  
> diff --git a/conf/confbase.Y b/conf/confbase.Y
> index 5f487c1..7ee26f3 100644
> --- a/conf/confbase.Y
> +++ b/conf/confbase.Y
> @@ -88,7 +88,7 @@ CF_DECLS
>  %left '!'
>  %nonassoc '.'
>  
> -CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT)
> +CF_KEYWORDS(DEFINE, ON, OFF, YES, NO, S, MS, US, PORT, FILENAME)
>  
>  CF_GRAMMAR
>  
> @@ -143,6 +143,7 @@ bool:
>   | YES { $$ = 1; }
>   | OFF { $$ = 0; }
>   | NO { $$ = 0; }
> + | FILENAME text { $$ = cf_file_exists($2); }
>   | /* Silence means agreement */ { $$ = 1; }
>   ;
>  
> diff --git a/doc/bird.sgml b/doc/bird.sgml
> index a0b45f4..03682cb 100644
> --- a/doc/bird.sgml
> +++ b/doc/bird.sgml
> @@ -493,8 +493,9 @@ protocol (see sections talking about the protocols).
>  <p>Several options use a <m/switch/ argument. It can be either <cf/on/,
>  <cf/yes/ or a numeric expression with a non-zero value for the option to be
>  enabled or <cf/off/, <cf/no/ or a numeric expression evaluating to zero to
> -disable it. An empty <m/switch/ is equivalent to <cf/on/ ("silence means
> -agreement").
> +disable it. Alternatively you can gate the value of <m/switch/ on the presence
> +of a file through the <cf/filename/ "<m/name/" directive. An empty <m/switch/
> +is equivalent to <cf/on/ ("silence means agreement").
>  
>  <descrip>
>  	<tag>preference <m/expr/</tag>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://trubka.network.cz/pipermail/bird-users/attachments/20160524/f208d0fb/attachment.asc>


More information about the Bird-users mailing list