Project

General

Profile

Download (6.19 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php-cgi -f
2
<?php
3
/*
4
	rc.newwanipv6
5
	Copyright (C) 2006 Scott Ullrich (sullrich@gmail.com)
6
	part of pfSense (https://www.pfsense.org)
7

    
8
	Originally part of m0n0wall (http://m0n0.ch)
9
	Copyright (C) 2003-2005 Manuel Kasper <mk@neon1.net>.
10
	All rights reserved.
11

    
12
	Redistribution and use in source and binary forms, with or without
13
	modification, are permitted provided that the following conditions are met:
14

    
15
	1. Redistributions of source code must retain the above copyright notice,
16
	   this list of conditions and the following disclaimer.
17

    
18
	2. Redistributions in binary form must reproduce the above copyright
19
	   notice, this list of conditions and the following disclaimer in the
20
	   documentation and/or other materials provided with the distribution.
21

    
22
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
23
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
24
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
26
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31
	POSSIBILITY OF SUCH DAMAGE.
32
*/
33

    
34
/* parse the configuration and include all functions used below */
35
require_once("globals.inc");
36
require_once("config.inc");
37
require_once("functions.inc");
38
require_once("filter.inc");
39
require_once("shaper.inc");
40
require_once("ipsec.inc");
41
require_once("vpn.inc");
42
require_once("openvpn.inc");
43
require_once("IPv6.inc");
44
require_once("services.inc");
45
require_once("rrd.inc");
46

    
47
function restart_packages() {
48
	global $oldipv6, $curwanipv6, $g;
49

    
50
	/* restart packages */
51
	log_error("{$g['product_name']} package system has detected an IP change or dynamic WAN reconnection - $oldipv6 -> $curwanipv6 - Restarting packages.");
52
	send_event("service reload packages");
53
}
54

    
55
/* Interface IP address has changed */
56
if (isset($_GET['interface'])) {
57
	$argument = $_GET['interface'];
58
} else {
59
	$argument = trim($argv[1], " \n\t");
60
}
61

    
62
log_error("rc.newwanipv6: Info: starting on {$argument}.");
63

    
64
if (empty($argument)) {
65
	$interface = "wan";
66
	$interface_real = get_real_interface($interface, "inet6");
67
	$curwanipv6 = get_interface_ipv6($interface, true);
68
} else {
69
	$interface_real = $argument;
70
	$interface = convert_real_interface_to_friendly_interface_name($interface_real);
71
	$curwanipv6 = get_interface_ipv6($interface, true);
72
}
73

    
74
$interface_descr = convert_friendly_interface_to_friendly_descr($interface);
75

    
76
if (empty($interface)) {
77
	filter_configure();
78
	// restart_packages();
79
	return;
80
}
81

    
82
//Do not process while booting
83
if (platform_booting() && $config['interfaces'][$interface]['ipaddrv6'] != "dhcp6") {
84
	return;
85
}
86

    
87
/*
88
 * NOTE: Take care of openvpn and similar if you generate the event to reconfigure an interface.
89
 *	i.e. OpenVPN might be in tap mode and not have an ip.
90
 */
91
if ((empty($curwanipv6) || !is_ipaddrv6($curwanipv6)) && substr($interface_real, 0, 4) != "ovpn") {
92
	log_error("rc.newwanipv6: Failed to update {$interface_descr}[{$interface}] IPv6, restarting...");
93
	// send_event("interface reconfigure {$interface}");
94
	return;
95
}
96

    
97
if (isset($_GET['dmips'])) {
98
	$new_domain_name_servers = $_GET['dmips'];
99
} else {
100
	$new_domain_name_servers = getenv("new_domain_name_servers");
101
}
102

    
103
if (!empty($new_domain_name_servers)) {
104
	$name_servers = explode(" ", $new_domain_name_servers);
105
	$valid_ns = array();
106
	foreach ($name_servers as $ns) {
107
		if (is_ipaddrv6(trim($ns))) {
108
			$valid_ns[] = trim($ns);
109
		}
110
	}
111

    
112
	if (count($valid_ns > 0)) {
113
		file_put_contents("{$g['varetc_path']}/nameserver_v6{$interface}", implode("\n", $valid_ns));
114
	}
115
}
116
if (isset($_GET['dmnames'])) {
117
	$new_domain_name = $_GET['dmnames'];
118
} else {
119
	$new_domain_name = getenv("new_domain_name");
120
}
121

    
122
if (!empty($new_domain_name)) {
123
	file_put_contents("{$g['varetc_path']}/searchdomain_v6{$interface}", $new_domain_name);
124
}
125

    
126
/* write current WAN IPv6 to file */
127
if (is_ipaddrv6($curwanipv6)) {
128
	@file_put_contents("{$g['vardb_path']}/{$interface}_ipv6", $curwanipv6);
129
}
130

    
131
log_error("rc.newwanipv6: on (IP address: {$curwanipv6}) (interface: {$interface}) (real interface: {$interface_real}).");
132

    
133
$oldipv6 = '';
134
if (file_exists("{$g['vardb_path']}/{$interface}_cacheipv6")) {
135
	$oldipv6 = file_get_contents("{$g['vardb_path']}/{$interface}_cacheipv6");
136
}
137

    
138
$grouptmp = link_interface_to_group($interface);
139
if (!empty($grouptmp)) {
140
	array_walk($grouptmp, 'interface_group_add_member');
141
}
142

    
143
link_interface_to_track6($interface, "update");
144

    
145
/* regenerate resolv.conf if DNS overrides are allowed */
146
system_resolvconf_generate(true);
147

    
148
/* reconfigure static routes (kernel may have deleted them) */
149
system_routing_configure($interface);
150

    
151
/* reconfigure our gateway monitor */
152
setup_gateways_monitor();
153

    
154
/* signal filter reload */
155
filter_configure();
156

    
157
if (empty($oldipv6) || is_ipaddrv6($oldipv6)) {
158
	if ($curwanipv6 == $oldipv6) {
159
		// Still need to sync VPNs on PPPoE and such, as even with the same IP the VPN software is unhappy with the IP disappearing.
160
		if (in_array($config['interfaces'][$interface]['ipaddrv6'], array('pppoe', 'pptp', 'ppp'))) {
161
			/* reconfigure IPsec tunnels */
162
			vpn_ipsec_force_reload($interface);
163

    
164
			/* start OpenVPN server & clients */
165
			if (substr($interface_real, 0, 4) != "ovpn") {
166
				openvpn_resync_all($interface);
167
			}
168
		}
169
		return;
170
	} else if (does_interface_exist($interface_real) && !empty($oldipv6)) {
171
		mwexec("/sbin/ifconfig {$interface_real} inet6 {$oldipv6} delete");
172
	}
173

    
174
	file_put_contents("{$g['vardb_path']}/{$interface}_cacheipv6", $curwanipv6);
175
}
176

    
177
/* reload unbound */
178
services_unbound_configure();
179

    
180
/* perform RFC 2136 DNS update */
181
services_dnsupdate_process($interface);
182

    
183
/* signal dyndns update */
184
services_dyndns_configure($interface);
185

    
186
/* reconfigure IPsec tunnels */
187
vpn_ipsec_force_reload($interface);
188

    
189
/* start OpenVPN server & clients */
190
if (substr($interface_real, 0, 4) != "ovpn") {
191
	openvpn_resync_all($interface);
192
}
193

    
194
/* reload graphing functions */
195
enable_rrd_graphing();
196

    
197
/* reload igmpproxy */
198
services_igmpproxy_configure();
199

    
200
restart_packages();
201

    
202
?>
(74-74/102)