Variables substitution in jail.conf
James Gritton
jamie at freebsd.org
Wed Mar 30 13:47:25 UTC 2016
Niklaas Baudet von Gersdorff <stdin at niklaas.eu> wrote:
> I am experimenting with jail.conf, trying to automate everything as
> much as
> I can. I would like to execute pfctl commands automatically once a jail
> is
> started or stopped; that is, adding the IP of the jail to a table that
> passes
> connection and deleting it again once it's no longer needed. This is my
> jail.conf:
>
> host.hostname = "$name.box-fra-01.klaas";
> path = "/usr/local/jails/$name";
> ip4.addr = "lo1|10.15.$network.$id";
> ip6.addr = "vtnet0|2a00:XXX:XXXX:XXXX:X::$network:$id";
> mount = "/usr/local/jails/templates/base-10.2-RELEASE
> /usr/local/jails/$name/ nullfs ro 0 0";
> mount += "/usr/local/jails/thinjails/$name
> /usr/local/jails/$name/jail nullfs rw 0 0";
> mount.devfs;
>
> exec.start = "/bin/sh /etc/rc";
> exec.stop = "/bin/sh /etc/rc.shutdown";
>
> exec.clean;
>
> www {
> $id = 1;
> $network = 1;
> exec.poststart = "pfctl -t www -T add ${ip4.addr} {$ip6.addr}";
> exec.poststop = "pfctl -t www -T delete {$ip4.addr}
> {$ip6.addr}";
> }
>
> However, I get an error that ip6 is not defined. I have already
> realised that
> pfctl will give an error (because ip{4,6}.addr includes {lo1,vtnet0})
> but what
> I do not understand is why the parameter is not recognised.
>
> I also tried setting things up with additional variables my_ip4 and
> my_ip6 but
> that didn't work either. After reading jail.conf(5) I thought about
> putting
> everything in hierarchical jails but I am not sure whether that will
> help to
> make substitution work the way I want it to.
>
> I am happy for any advise.
The problem is pretty simple - just a case of moving some brackets. In
the definition of exec.poststart, you did ip4.addr right - ${ip4.addr}.
But for ip6.addr, you moved the dollar sign inside the braces -
{$ip6.addr}. That makes it look like the braces and the ".addr" are
just part of the string, and only $ip6 is the variable to be
substituted.
So all you need is:
exec.poststart = "pfctl -t www -T add ${ip4.addr} ${ip6.addr}";
exec.poststop = "pfctl -t www -T delete ${ip4.addr}
${ip6.addr}";
- Jamie
More information about the freebsd-questions
mailing list