Project

General

Profile

Download (6.79 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php -f
2
<?php
3
/*
4
	rc.newwanip
5
	Copyright (C) 2006 Scott Ullrich (sullrich@gmail.com)
6
	part of pfSense (http://www.pfsense.com)
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("rrd.inc");
45

    
46
// Do not process while booting
47
if($g['booting'])
48
	return;
49

    
50
function restart_packages() {
51
	global $oldip, $curwanip, $g;
52

    
53
	/* restart packages */
54
	system_ntp_configure(false);
55
	mwexec_bg("/usr/local/sbin/ntpdate_sync_once.sh", true);
56
	log_error("{$g['product_name']} package system has detected an ip change $oldip ->  $curwanip ... Restarting packages.");
57
	send_event("service reload packages");
58
}
59

    
60
/* Interface IP address has changed */
61
if (isset($_GET['interface']))
62
	$argument = $_GET['interface'];
63
else
64
	$argument = str_replace("\n", "", $argv[1]);
65

    
66
log_error("rc.newwanip: Informational is starting {$argument}.");
67

    
68
if(empty($argument)) {
69
	$interface = "wan";
70
	$interface_real = get_real_interface();
71
} else {
72
	$interface = convert_real_interface_to_friendly_interface_name($argument);
73
	$interface_real = $argument;
74
}
75

    
76
/* If the interface is configured and not enabled, bail. We do not need to change settings for disabled interfaces. #3313 */
77
if (is_array($config['interfaces'][$interface]) && !isset($config['interfaces'][$interface]['enable'])) {
78
	log_error("Interface is disabled, nothing to do.");
79
	return;
80
}
81

    
82
if(empty($argument))
83
	$curwanip = get_interface_ip();
84
else {
85
	$curwanip = find_interface_ip($interface_real, true);
86
	if($curwanip == "")
87
		$curwanip = get_interface_ip($interface);
88
	if (($curwanip == "") && empty($config['interfaces'][$interface]['ipaddr'])) {
89
		log_error("Interface does not have an IP address, nothing to do.");
90
		return;
91
	}
92
}
93

    
94
log_error("rc.newwanip: on (IP address: {$curwanip}) (interface: {$interface}) (real interface: {$interface_real}).");
95

    
96
if($curwanip == "0.0.0.0" || !is_ipaddr($curwanip)) {
97
	log_error("rc.newwanip: Failed to update {$interface} IP, restarting...");
98
	send_event("interface reconfigure {$interface}");
99
	return;
100
}
101

    
102
if (empty($interface)) {
103
	filter_configure();
104
	restart_packages();
105
	return;
106
}
107

    
108
$oldip = "0.0.0.0";
109
if (file_exists("{$g['vardb_path']}/{$interface}_cacheip"))
110
	$oldip = file_get_contents("{$g['vardb_path']}/{$interface}_cacheip");
111

    
112
/* regenerate resolv.conf if DNS overrides are allowed */
113
system_resolvconf_generate(true);
114

    
115
/* write current WAN IP to file */
116
file_put_contents("{$g['vardb_path']}/{$interface}_ip", $curwanip);
117

    
118
link_interface_to_vips($interface, "update");
119

    
120
unset($gre);
121
$gre = link_interface_to_gre($interface);
122
if (!empty($gre))
123
	array_walk($gre, 'interface_gre_configure');
124
unset($gif);
125
$gif = link_interface_to_gif($interface);
126
if (!empty($gif))
127
	array_walk($gif, 'interface_gif_configure');
128

    
129
$grouptmp = link_interface_to_group($interface);
130
if (!empty($grouptmp))
131
	array_walk($grouptmp, 'interface_group_add_member');
132

    
133
unset($bridgetmp);
134
$bridgetmp = link_interface_to_bridge($interface);
135
if (!empty($bridgetmp))
136
	interface_bridge_add_member($bridgetmp, $interface_real);
137

    
138
/* make new hosts file */
139
system_hosts_generate();
140

    
141
/* check tunneled IPv6 interface tracking */
142
switch($config['interfaces'][$interface]['ipaddrv6']) {
143
	case "6to4":
144
		interface_6to4_configure($interface, $config['interfaces'][$interface]);
145
		break;
146
	case "6rd":
147
		interface_6rd_configure($interface, $config['interfaces'][$interface]);
148
		break;
149
	case "dhcp6":
150
		if (isset($config['interfaces'][$interface]['dhcp6usev4iface']))
151
			interface_dhcpv6_configure($interface, $config['interfaces'][$interface]);
152
		break;
153
}
154

    
155
/* Check Gif tunnels */
156
if(is_array($config['gifs']['gif'])){
157
	foreach($config['gifs']['gif'] as $gif) {
158
		if($gif['if'] == $interface) {
159
			foreach($config['interfaces'] as $ifname => $ifparent) {
160
				// echo "interface $ifparent, ifname $ifname, gif {$gif['gifif']}\n";
161
				if(($ifparent['if'] == $gif['gifif']) && (isset($ifparent['enable']))) {
162
					// echo "Running routing configure for $ifname\n";
163
					$gif['gifif'] = interface_gif_configure($gif);
164
					$confif = convert_real_interface_to_friendly_interface_name($gif['gifif']);
165
					if ($confif <> "")
166
						interface_configure($confif);
167
					system_routing_configure($ifname);
168
				}
169
			}
170
		}
171
	}
172
}
173

    
174
/*
175
 * We need to force sync VPNs on such even when the IP is the same for dynamic interfaces.
176
 * Even with the same IP the VPN software is unhappy with the IP disappearing, and we
177
 * could be failing back in which case we need to switch IPs back anyhow.
178
 */
179
if (!is_ipaddr($oldip) || $curwanip != $oldip || !is_ipaddrv4($config['interfaces'][$interface]['ipaddr'])) {
180
	/* reconfigure static routes (kernel may have deleted them) */
181
	system_routing_configure($interface);
182

    
183
	/* reconfigure our gateway monitor */
184
	setup_gateways_monitor();
185

    
186
	file_put_contents("{$g['vardb_path']}/{$interface}_cacheip", $curwanip);
187

    
188
	/* perform RFC 2136 DNS update */
189
	services_dnsupdate_process($interface);
190

    
191
	/* signal dyndns update */
192
	services_dyndns_configure($interface);
193

    
194
	/* reconfigure IPsec tunnels */
195
	vpn_ipsec_force_reload($interface);
196

    
197
	/* start OpenVPN server & clients */
198
	if (substr($interface_real, 0, 4) != "ovpn")
199
		openvpn_resync_all($interface);
200

    
201
	/* reload graphing functions */
202
	enable_rrd_graphing();
203

    
204
	/* reload igmpproxy */
205
	services_igmpproxy_configure();
206

    
207
	/* restart snmp */
208
	services_snmpd_configure();
209

    
210
	restart_packages();
211
}
212

    
213
/* signal filter reload */
214
filter_configure();
215

    
216
?>
(80-80/111)