Projet

Général

Profil

Télécharger (7,04 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / etc / rc.newwanip @ 38f6f50a

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 (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("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
$interface_descr = convert_friendly_interface_to_friendly_descr($interface);
74

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

    
81
if (empty($argument))
82
	$curwanip = get_interface_ip();
83
else {
84
	$curwanip = find_interface_ip($interface_real, true);
85
	if($curwanip == "")
86
		$curwanip = get_interface_ip($interface);
87
}
88

    
89
log_error("rc.newwanip: on (IP address: {$curwanip}) (interface: {$interface_descr}[{$interface}]) (real interface: {$interface_real}).");
90

    
91
/*
92
 * NOTE: Take care of openvpn and no-ip interfaces or similar if you generate the event to reconfigure an interface.
93
 *      i.e. OpenVPN might be in tap mode and not have an ip.
94
 */
95
if ($curwanip == "0.0.0.0" || !is_ipaddr($curwanip)) {
96
	if (substr($interface_real, 0, 4) != "ovpn") {
97
		if (!empty($config['interfaces'][$interface]['ipaddr'])) {
98
			log_error("rc.newwanip: Failed to update {$interface} IP, restarting...");
99
			send_event("interface reconfigure {$interface}");
100
			exit;
101
		}
102
	}
103
}
104

    
105
/* XXX: This really possible? */
106
if (empty($interface)) {
107
	filter_configure();
108
	restart_packages();
109
	exit;
110
}
111

    
112
$oldip = "0.0.0.0";
113
if (file_exists("{$g['vardb_path']}/{$interface}_cacheip"))
114
	$oldip = file_get_contents("{$g['vardb_path']}/{$interface}_cacheip");
115

    
116
/* regenerate resolv.conf if DNS overrides are allowed */
117
system_resolvconf_generate(true);
118

    
119
/* write current WAN IP to file */
120
if (is_ipaddr($curwanip))
121
	@file_put_contents("{$g['vardb_path']}/{$interface}_ip", $curwanip);
122

    
123
link_interface_to_vips($interface, "update");
124

    
125
unset($gre);
126
$gre = link_interface_to_gre($interface);
127
if (!empty($gre))
128
	array_walk($gre, 'interface_gre_configure');
129
unset($gif);
130
$gif = link_interface_to_gif($interface);
131
if (!empty($gif))
132
	array_walk($gif, 'interface_gif_configure');
133

    
134
$grouptmp = link_interface_to_group($interface);
135
if (!empty($grouptmp))
136
	array_walk($grouptmp, 'interface_group_add_member');
137

    
138
unset($bridgetmp);
139
$bridgetmp = link_interface_to_bridge($interface);
140
if (!empty($bridgetmp))
141
	interface_bridge_add_member($bridgetmp, $interface_real);
142

    
143
/* make new hosts file */
144
system_hosts_generate();
145

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

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

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

    
188
	/* reconfigure our gateway monitor */
189
	setup_gateways_monitor();
190

    
191
	if (is_ipaddr($curwanip))
192
		@file_put_contents("{$g['vardb_path']}/{$interface}_cacheip", $curwanip);
193

    
194
	/* perform RFC 2136 DNS update */
195
	services_dnsupdate_process($interface);
196

    
197
	/* signal dyndns update */
198
	services_dyndns_configure($interface);
199

    
200
	/* reconfigure IPsec tunnels */
201
	vpn_ipsec_force_reload($interface);
202

    
203
	/* start OpenVPN server & clients */
204
	if (substr($interface_real, 0, 4) != "ovpn")
205
		openvpn_resync_all($interface);
206

    
207
	/* reload graphing functions */
208
	enable_rrd_graphing();
209

    
210
	/* reload igmpproxy */
211
	services_igmpproxy_configure();
212

    
213
	/* restart snmp */
214
	services_snmpd_configure();
215

    
216
	restart_packages();
217
}
218

    
219
/* signal filter reload */
220
filter_configure();
221

    
222
?>
(79-79/110)