diff -Nur -x '*.orig' -x '*.rej' smeserver-openvpn-s2s-0.1/root/etc/e-smith/events/actions/openvpn-s2s-delete-networks mezzanine_patched_smeserver-openvpn-s2s-0.1/root/etc/e-smith/events/actions/openvpn-s2s-delete-networks --- smeserver-openvpn-s2s-0.1/root/etc/e-smith/events/actions/openvpn-s2s-delete-networks 2010-10-16 17:56:47.000000000 +0200 +++ mezzanine_patched_smeserver-openvpn-s2s-0.1/root/etc/e-smith/events/actions/openvpn-s2s-delete-networks 2010-10-16 23:47:20.000000000 +0200 @@ -20,18 +20,37 @@ #---------------------------------------------------------------------- use strict; +use esmith::ConfigDB; use esmith::NetworksDB; use esmith::event; my $db = esmith::NetworksDB->open || die "Couldn't open netwoks db\n"; +my $ovpndb = esmith::ConfigDB->open_ro('openvpn-s2s') || die "Couldn't open openvpn-s2s db\n"; my @nets = $db->networks; +my @vpnnets = (); +my $vpnnet; + +# buils a list of network used by a VPN daemon +foreach my $vpn ($ovpndb->get_all_by_prop(type=>'server'), + $ovpndb->get_all_by_prop(type=>'client')){ + $vpnnet = $vpn->prop('RemoteNetworks') || ''; + if ($vpnnet ne ''){ + my ($vpnnet,undef) = split(/\//, $vpnnet); + push @vpnnets, $vpnnet; + } + push @vpnnets, $vpn->prop('RemoteIP'); +} foreach my $net (@nets){ my $key = $net->key; my $vpn = $db->get_prop($key,"VPN") || ''; + if ($vpn ne ''){ - $db->set_prop($key, type=>'network-deleted'); - event_signal("network-delete","$key"); + unless (grep{ $_ eq $key} @vpnnets){ + $db->set_prop($key, type=>'network-deleted'); + event_signal("network-delete","$key"); + $db->get($key)->delete; + } } } diff -Nur -x '*.orig' -x '*.rej' smeserver-openvpn-s2s-0.1/root/etc/openvpn/s2s/bin/up mezzanine_patched_smeserver-openvpn-s2s-0.1/root/etc/openvpn/s2s/bin/up --- smeserver-openvpn-s2s-0.1/root/etc/openvpn/s2s/bin/up 2010-10-16 17:56:47.000000000 +0200 +++ mezzanine_patched_smeserver-openvpn-s2s-0.1/root/etc/openvpn/s2s/bin/up 2010-10-16 23:55:50.000000000 +0200 @@ -25,12 +25,22 @@ net="route_network_$N" mask="route_netmask_$N" if [ ! -z "${!net}" ]; then - /sbin/e-smith/db networks set ${!net} network Mask ${!mask} Router $ifconfig_remote VPN $vpnid - /sbin/e-smith/signal-event network-create ${!net} + db=$(/sbin/e-smith/db networks getprop ${!net} VPN) + if [ ! -z $db ]; then + # if the network already exists in the DB, just push the route + /sbin/route add -net $net netmask $mask gw $ifconfig_remote + else + /sbin/e-smith/db networks set ${!net} network Mask ${!mask} Router $ifconfig_remote VPN $vpnid + /sbin/e-smith/signal-event network-create ${!net} + fi fi done -# In any cas, create a local network for the VPN itself -/sbin/e-smith/db networks set $ifconfig_remote network Mask 255.255.255.255 VPN $vpnid -/sbin/e-smith/signal-event network-create $ifconfig_remote + +# Check route for the VPN itself +db=$(/sbin/e-smith/db networks getprop $ifconfig_remote VPN) +if [ -z $db ]; then + /sbin/e-smith/db networks set $ifconfig_remote network Mask 255.255.255.255 VPN $vpnid + /sbin/e-smith/signal-event network-create $ifconfig_remote +fi