Project

General

Profile

Download (6.43 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
	exit;
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
$argument = str_replace("\n", "", $argv[1]);
62

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

    
65
if(empty($argument)) {
66
	$interface = "wan";
67
	$interface_real = get_real_interface();
68
} else {
69
	$interface = convert_real_interface_to_friendly_interface_name($argument);
70
	$interface_real = $argument;
71
}
72

    
73
if(empty($argument))
74
	$curwanip = get_interface_ip();
75
else {
76
	$curwanip = find_interface_ip($interface_real, true);
77
	if($curwanip == "")
78
		$curwanip = get_interface_ip($interface);
79
	if (($curwanip == "") && !(isset($config['interfaces'][$interface]['ipaddr']))) {
80
		log_error("Interface does not have an IP address, nothing to do.");
81
		return;
82
	}
83
}
84

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

    
87
if($curwanip == "0.0.0.0" || !is_ipaddr($curwanip)) {
88
	log_error("rc.newwanip: Failed to update {$interface} IP, restarting...");
89
	send_event("interface reconfigure {$interface}");
90
	exit;
91
}
92

    
93
if (empty($interface)) {
94
	filter_configure();
95
	restart_packages();
96
	exit;
97
}
98

    
99
$oldip = "0.0.0.0";
100
if (file_exists("{$g['vardb_path']}/{$interface}_cacheip"))
101
	$oldip = file_get_contents("{$g['vardb_path']}/{$interface}_cacheip");
102

    
103
/* regenerate resolv.conf if DNS overrides are allowed */
104
system_resolvconf_generate(true);
105

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

    
109
link_interface_to_vips($interface, "update");
110

    
111
unset($gre);
112
$gre = link_interface_to_gre($interface);
113
if (!empty($gre))
114
	array_walk($gre, 'interface_gre_configure');
115
unset($gif);
116
$gif = link_interface_to_gif($interface);
117
if (!empty($gif))
118
	array_walk($gif, 'interface_gif_configure');
119

    
120
$grouptmp = link_interface_to_group($interface);
121
if (!empty($grouptmp))
122
	array_walk($grouptmp, 'interface_group_add_member');
123

    
124
unset($bridgetmp);
125
$bridgetmp = link_interface_to_bridge($interface);
126
if (!empty($bridgetmp))
127
	interface_bridge_add_member($bridgetmp, $interface_real);
128

    
129
/* make new hosts file */
130
system_hosts_generate();
131

    
132
/* check tunneled IPv6 interface tracking */
133
switch($config['interfaces'][$interface]['ipaddrv6']) {
134
	case "6to4":
135
		interface_6to4_configure($interface, $config['interfaces'][$interface]);
136
		break;
137
	case "6rd":
138
		interface_6rd_configure($interface, $config['interfaces'][$interface]);
139
		break;
140
	case "dhcp6":
141
		if (isset($config['interfaces'][$interface]['dhcp6usev4iface']))
142
			interface_dhcpv6_configure($interface, $config['interfaces'][$interface]);
143
		break;
144
}
145

    
146
/* Check Gif tunnels */
147
if(is_array($config['gifs']['gif'])){
148
	foreach($config['gifs']['gif'] as $gif) {
149
		if($gif['if'] == $interface) {
150
			foreach($config['interfaces'] as $ifname => $ifparent) {
151
				// echo "interface $ifparent, ifname $ifname, gif {$gif['gifif']}\n";
152
				if(($ifparent['if'] == $gif['gifif']) && (isset($ifparent['enable']))) {
153
					// echo "Running routing configure for $ifname\n";
154
					$gif['gifif'] = interface_gif_configure($gif);
155
					$confif = convert_real_interface_to_friendly_interface_name($gif['gifif']);
156
					if ($confif <> "")
157
						interface_configure($confif);
158
					system_routing_configure($ifname);
159
				}
160
			}
161
		}
162
	}
163
}
164

    
165
/*
166
 * We need to force sync VPNs on such even when the IP is the same for dynamic interfaces.
167
 * Even with the same IP the VPN software is unhappy with the IP disappearing, and we
168
 * could be failing back in which case we need to switch IPs back anyhow.
169
 */
170
if (!is_ipaddr($oldip) || $curwanip != $oldip || !is_ipaddrv4($config['interfaces'][$interface]['ipaddr'])) {
171
	/* reconfigure static routes (kernel may have deleted them) */
172
	system_routing_configure($interface);
173

    
174
	/* reconfigure our gateway monitor */
175
	setup_gateways_monitor();
176

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

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

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

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

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

    
192
	/* reload graphing functions */
193
	enable_rrd_graphing();
194

    
195
	/* reload igmpproxy */
196
	services_igmpproxy_configure();
197

    
198
	/* restart snmp */
199
	services_snmpd_configure();
200

    
201
	restart_packages();
202
}
203

    
204
/* signal filter reload */
205
filter_configure();
206

    
207
?>
(79-79/110)