include ifconfig_ environment variables in --up-restart env set

here's my patch for bug #93: missing ifconfig_* env vars after
up-restart. Tested with both IPv4, IPv6, topology subnet and topology net30

Document differences between --up-restart and --up in openvpn.8

See trac #93 and the discussion starting with <555BF270.3090706@nikhef.nl>
on the openvpn-devel mailing list.

fix trac #93

Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <555BF270.3090706@nikhef.nl>
URL: http://article.gmane.org/gmane.network.openvpn.devel/9705
Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Jan Just Keijser 2015-05-20 04:33:20 +02:00 committed by Gert Doering
parent d3eacb2d6e
commit db950be85d
4 changed files with 56 additions and 43 deletions

View file

@ -1817,6 +1817,12 @@ has been specified, the up script will be called with
.I restart
as the last parameter.
NOTE: on restart, OpenVPN will not pass the full set of environment
variables to the script. Namely, everything related to routing and
gateways will not be passed, as nothing needs to be done anyway - all
the routing setup is already in place. Additionally, the up\-restart
script will run with the downgraded UID/GID settings (if configured).
The following standalone example shows how the
.B \-\-up
script can be called in both an initialization and restart context.

View file

@ -1486,6 +1486,9 @@ do_open_tun (struct context *c)
msg (M_INFO, "Preserving previous TUN/TAP instance: %s",
c->c1.tuntap->actual_name);
/* explicitly set the ifconfig_* env vars */
do_ifconfig_setenv(c->c1.tuntap, c->c2.es);
/* run the up script if user specified --up-restart */
if (c->options.up_restart)
run_up_down (c->options.up_script,

View file

@ -396,6 +396,45 @@ is_tun_p2p (const struct tuntap *tt)
return tun;
}
/*
* Set the ifconfig_* environment variables, both for IPv4 and IPv6
*/
void
do_ifconfig_setenv (const struct tuntap *tt, struct env_set *es)
{
struct gc_arena gc = gc_new ();
bool tun = is_tun_p2p (tt);
const char *ifconfig_local = print_in_addr_t (tt->local, 0, &gc);
const char *ifconfig_remote_netmask = print_in_addr_t (tt->remote_netmask, 0, &gc);
/*
* Set environmental variables with ifconfig parameters.
*/
setenv_str (es, "ifconfig_local", ifconfig_local);
if (tun)
{
setenv_str (es, "ifconfig_remote", ifconfig_remote_netmask);
}
else
{
const char *ifconfig_broadcast = print_in_addr_t (tt->broadcast, 0, &gc);
setenv_str (es, "ifconfig_netmask", ifconfig_remote_netmask);
setenv_str (es, "ifconfig_broadcast", ifconfig_broadcast);
}
if (tt->did_ifconfig_ipv6_setup)
{
const char *ifconfig_ipv6_local = print_in6_addr (tt->local_ipv6, 0, &gc);
const char *ifconfig_ipv6_remote = print_in6_addr (tt->remote_ipv6, 0, &gc);
setenv_str (es, "ifconfig_ipv6_local", ifconfig_ipv6_local);
setenv_int (es, "ifconfig_ipv6_netbits", tt->netbits_ipv6);
setenv_str (es, "ifconfig_ipv6_remote", ifconfig_ipv6_remote);
}
gc_free (&gc);
}
/*
* Init tun/tap object.
*
@ -428,9 +467,6 @@ init_tun (const char *dev, /* --dev option */
if (ifconfig_local_parm && ifconfig_remote_netmask_parm)
{
bool tun = false;
const char *ifconfig_local = NULL;
const char *ifconfig_remote_netmask = NULL;
const char *ifconfig_broadcast = NULL;
/*
* We only handle TUN/TAP devices here, not --dev null devices.
@ -498,45 +534,20 @@ init_tun (const char *dev, /* --dev option */
check_subnet_conflict (tt->local, IPV4_NETMASK_HOST, "TUN/TAP adapter");
}
/*
* Set ifconfig parameters
*/
ifconfig_local = print_in_addr_t (tt->local, 0, &gc);
ifconfig_remote_netmask = print_in_addr_t (tt->remote_netmask, 0, &gc);
/*
* If TAP-style interface, generate broadcast address.
*/
if (!tun)
{
tt->broadcast = generate_ifconfig_broadcast_addr (tt->local, tt->remote_netmask);
ifconfig_broadcast = print_in_addr_t (tt->broadcast, 0, &gc);
}
/*
* Set environmental variables with ifconfig parameters.
*/
if (es)
{
setenv_str (es, "ifconfig_local", ifconfig_local);
if (tun)
{
setenv_str (es, "ifconfig_remote", ifconfig_remote_netmask);
}
else
{
setenv_str (es, "ifconfig_netmask", ifconfig_remote_netmask);
setenv_str (es, "ifconfig_broadcast", ifconfig_broadcast);
}
}
tt->did_ifconfig_setup = true;
}
if (ifconfig_ipv6_local_parm && ifconfig_ipv6_remote_parm)
{
const char *ifconfig_ipv6_local = NULL;
const char *ifconfig_ipv6_remote = NULL;
/*
* Convert arguments to binary IPv6 addresses.
@ -549,24 +560,14 @@ init_tun (const char *dev, /* --dev option */
}
tt->netbits_ipv6 = ifconfig_ipv6_netbits_parm;
/*
* Set ifconfig parameters
*/
ifconfig_ipv6_local = print_in6_addr (tt->local_ipv6, 0, &gc);
ifconfig_ipv6_remote = print_in6_addr (tt->remote_ipv6, 0, &gc);
/*
* Set environmental variables with ifconfig parameters.
*/
if (es)
{
setenv_str (es, "ifconfig_ipv6_local", ifconfig_ipv6_local);
setenv_int (es, "ifconfig_ipv6_netbits", tt->netbits_ipv6);
setenv_str (es, "ifconfig_ipv6_remote", ifconfig_ipv6_remote);
}
tt->did_ifconfig_ipv6_setup = true;
}
/*
* Set environmental variables with ifconfig parameters.
*/
if (es) do_ifconfig_setenv(tt, es);
gc_free (&gc);
return tt;
}

View file

@ -241,6 +241,9 @@ void init_tun_post (struct tuntap *tt,
const struct frame *frame,
const struct tuntap_options *options);
void do_ifconfig_setenv (const struct tuntap *tt,
struct env_set *es);
void do_ifconfig (struct tuntap *tt,
const char *actual, /* actual device name */
int tun_mtu,