Project

General

Profile

Download (15.2 KB) Statistics
| Branch: | Tag: | Revision:
1
#!/usr/local/bin/php -q
2
<?php
3
/* $Id$ */
4
/*
5
	rc.initial.setlanip
6
	part of m0n0wall (http://m0n0.ch/wall)
7

    
8
	Copyright (C) 2003-2004 Manuel Kasper <mk@neon1.net>.
9
	All rights reserved.
10

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

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

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

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

    
33

    
34

    
35
$options = getopt("hn", array("dry-run", "help"));
36

    
37
if (isset($options["h"]) || isset($options["help"])) {
38
	echo "usage: /etc/rc.initial.setlanip [option ...]\n";
39
	echo "  -h, --help       show this message\n";
40
	echo "  -n, --dry-run    do not make any configuration changes\n";
41
	exit(0);
42
}
43

    
44
$dry_run = isset($options["n"]) || isset($options["dry-run"]);
45
if ($dry_run) {
46
	echo "DRY RUN MODE IS ON\n";
47
}
48

    
49

    
50

    
51
/* parse the configuration and include all functions used below */
52
require_once("config.inc");
53
require_once("functions.inc");
54
require_once("filter.inc");
55
require_once("shaper.inc");
56
require_once("rrd.inc");
57

    
58
function console_get_interface_from_ppp($realif) {
59
	global $config;
60

    
61
	if (is_array($config['ppps']['ppp']) && count($config['ppps']['ppp'])) {
62
		foreach ($config['ppps']['ppp'] as $pppid => $ppp) {
63
			if ($realif == $ppp['if']) {
64
				$ifaces = explode(",", $ppp['ports']);
65
				return $ifaces[0];
66
			}
67
		}
68
	}
69

    
70
	return "";
71
}
72

    
73
function prompt_for_enable_dhcp_server($version = 4) {
74
	global $config, $fp, $interface;
75
	if($interface == "wan") {
76
		if($config['interfaces']['lan']) 
77
			return "n";
78
	}
79
	/* only allow DHCP server to be enabled when static IP is
80
	   configured on this interface */
81
	if ($version === 6) {
82
		$is_ipaddr = is_ipaddrv6($config['interfaces'][$interface]['ipaddrv6']);
83
	} else {
84
		$is_ipaddr = is_ipaddrv4($config['interfaces'][$interface]['ipaddr']);
85
	}
86
	if ($is_ipaddr) {
87
		$label_DHCP = ($version === 6) ? "DHCP6" : "DHCP";
88
		do {
89
			$good = false;
90
			$upperifname = strtoupper($interface);
91
			echo "\n" . sprintf(gettext("Do you want to enable the %s server on %s? [y|n]"),
92
			                    $label_DHCP, $upperifname) . "  ";
93
			$yn = strtolower(chop(fgets($fp)));
94
			if ($yn[0] == "y" or $yn[0] == "n")
95
				$good = true;
96
		} while (!$good);
97
	}
98
	return $yn;
99
}
100

    
101
function get_interface_config_description($iface) {
102
	global $config;
103
	$c = $config['interfaces'][$iface];
104
	if (!$c) { return null; }
105
	$if = $c['if'];
106
	$result = $if;
107
	$result2 = array();
108
	$ipaddr = $c['ipaddr'];
109
	$ipaddrv6 = $c['ipaddrv6'];
110
	if (is_ipaddr($ipaddr)) {
111
		$result2[] = "static";
112
	} else if ($ipaddr == "dhcp") {
113
		$result2[] = "dhcp";
114
	}
115
	if (is_ipaddr($ipaddrv6)) {
116
		$result2[] = "staticv6";
117
	} else if ($ipaddrv6 == "dhcp6") {
118
		$result2[] = "dhcp6";
119
	}
120
	if (count($result2)) {
121
		$result .= " - " . implode(", ", $result2);
122
	}
123
	return $result;
124
}
125

    
126
$fp = fopen('php://stdin', 'r');
127

    
128
/* build an interface collection */
129
$ifdescrs = get_configured_interface_with_descr(false, true);
130
$count = count($ifdescrs);
131
	
132
/* grab interface that we will operate on, unless there is only one
133
   interface */
134
if ($count > 1) {
135
	echo "Available interfaces:\n\n";
136
	$x=1;
137
	foreach($ifdescrs as $iface => $ifdescr) {
138
		$config_descr = get_interface_config_description($iface);
139
		echo "{$x} - {$ifdescr} ({$config_descr})\n";
140
		$x++;
141
	}
142
	echo "\nEnter the number of the interface you wish to configure: ";
143
	$intnum = chop(fgets($fp));	
144
} else {
145
	$intnum = $count;
146
}
147
	
148
if($intnum < 1) 
149
	exit;
150
if($intnum > $count)
151
	exit;
152
		
153
$index = 1;
154
foreach ($ifdescrs as $ifname => $ifdesc) {
155
	if ($intnum == $index)  {
156
		$interface = $ifname;
157
		break;
158
	} else {
159
		$index++;
160
	}
161
}	
162
if(!$interface) {
163
	echo "Invalid interface!\n";
164
	exit;
165
}
166

    
167
$ifaceassigned = "";
168

    
169
function next_unused_gateway_name($interface) {
170
	global $g, $config;
171
	$new_name = "GW_" . strtoupper($interface);
172

    
173
	if (!is_array($config['gateways']['gateway_item'])) { return $new_name; }
174
	$count = 1;
175
	do {
176
		$existing = false;
177
		foreach ($config['gateways']['gateway_item'] as $item) {
178
			if ($item['name'] === $new_name) {
179
				$existing = true;
180
				break;
181
			}
182
		}
183
		if ($existing) {
184
			$count += 1;
185
			$new_name = "GW_" . strtoupper($interface) . "_" . $count;
186
		}
187
	} while ($existing);
188
	return $new_name;
189
}
190

    
191
function add_gateway_to_config($interface, $gatewayip, $inet_type) {
192
	global $g, $config, $dry_run;
193
	if (!is_array($config['gateways']['gateway_item'])) {
194
		$config['gateways']['gateway_item'] = array();
195
	}
196
	$a_gateways = &$config['gateways']['gateway_item'];
197
	if ($dry_run) {
198
		print_r($a_gateways);
199
	}
200
	$new_name = '';
201
	$is_default = true;
202
	foreach ($a_gateways as $item) {
203
		if ($item['ipprotocol'] === $inet_type) {
204
			if (isset($item['defaultgw']))
205
				$is_default = false;
206
			if (($item['interface'] === $interface) && ($item['gateway'] === $gatewayip))
207
				$new_name = $item['name'];
208
		}
209
	}
210
	if ($new_name == '') {
211
		$new_name = next_unused_gateway_name($interface);
212
		$item = array(
213
			"interface" => $interface,
214
			"gateway" => $gatewayip,
215
			"name" => $new_name,
216
			"weight" => 1,
217
			"ipprotocol" => $inet_type,
218
			"interval" => true,
219
			"descr" => "Interface $interface Gateway",
220
			"defaultgw" => $is_default
221
		);
222
		if ($dry_run) {
223
			print_r($item);
224
		}
225
		$a_gateways[] = $item;
226
	}
227

    
228
	return $new_name;
229
}
230

    
231
function console_configure_ip_address($version) {
232
	global $g, $config, $interface, $restart_dhcpd, $ifaceassigned, $fp;
233

    
234
	$label_IPvX = ($version === 6) ? "IPv6"   : "IPv4";
235
	$maxbits    = ($version === 6) ? 127      : 31;
236
	$label_DHCP = ($version === 6) ? "DHCP6"  : "DHCP";
237

    
238
	$upperifname = strtoupper($interface);
239

    
240
	if($interface == "wan") {
241
		echo sprintf(gettext("Configure %s address %s interface via %s?  [y|n]"),
242
		             $label_IPvX, $upperifname, $label_DHCP) . "\n> ";
243
		$intdhcp = chop(fgets($fp));
244
		if(strtolower($intdhcp) == "y" || strtolower($intdhcp) == "yes") {
245
			$ifppp = console_get_interface_from_ppp(get_real_interface("wan"));
246
			if (!empty($ifppp))
247
				$ifaceassigned = $ifppp;
248
			$intip = ($version === 6) ? "dhcp6" : "dhcp";
249
			$intbits = "";
250
			$isintdhcp = true;
251
			$restart_dhcpd = true;
252
		} 
253
	}
254
		
255
	if($isintdhcp == false or $interface <> "wan") {
256
		do {
257
			echo "\n" . sprintf(gettext("Enter the new %s %s address.  Press <ENTER> for none:"),
258
			                    $upperifname, $label_IPvX) . "\n> ";
259
			$intip = chop(fgets($fp));
260
			$is_ipaddr = ($version === 6) ? is_ipaddrv6($intip) : is_ipaddrv4($intip);
261
			if ($is_ipaddr && is_ipaddr_configured($intip, $interface, true)) {
262
				$ip_conflict = true;
263
				echo gettext("This IP address conflicts with another interface or a VIP") . "\n";
264
			} else
265
				$ip_conflict = false;
266
		} while (($ip_conflict === true) || !($is_ipaddr || $intip == ''));
267
		if ($intip != '') {
268
			echo "\n" . sprintf(gettext("Subnet masks are entered as bit counts (as in CIDR notation) in %s."),
269
			                    $g['product_name']) . "\n";
270
			if ($version === 6) {
271
				echo "e.g. ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00 = 120\n";
272
				echo "     ffff:ffff:ffff:ffff:ffff:ffff:ffff:0    = 112\n";
273
				echo "     ffff:ffff:ffff:ffff:ffff:ffff:0:0       =  96\n";
274
				echo "     ffff:ffff:ffff:ffff:ffff:0:0:0          =  80\n";
275
				echo "     ffff:ffff:ffff:ffff:0:0:0:0             =  64\n";
276
			} else {
277
				echo "e.g. 255.255.255.0 = 24\n";
278
				echo "     255.255.0.0   = 16\n";
279
				echo "     255.0.0.0     = 8\n";
280
			}
281
			do {
282
				$upperifname = strtoupper($interface);
283
				echo "\n" . sprintf(gettext("Enter the new %s %s subnet bit count:"),
284
				                    $upperifname, $label_IPvX) . "\n> ";
285
				$intbits = chop(fgets($fp));
286
				$restart_dhcpd = true;
287
			} while (!is_numeric($intbits) || ($intbits < 1) || ($intbits > $maxbits));
288

    
289
			if ($version === 6) {
290
				$subnet = gen_subnetv6($intip, $intbits);
291
			} else {
292
				$subnet = gen_subnet($intip, $intbits);
293
			}
294
			do {
295
				echo "\n" . sprintf(gettext("Enter the new %s %s gateway address.  Press <ENTER> for none:"),
296
				                    $upperifname, $label_IPvX) . "\n> ";
297
				$gwip = chop(fgets($fp));
298
				$is_ipaddr = ($version === 6) ? is_ipaddrv6($gwip) : is_ipaddrv4($gwip);
299
				$is_in_subnet = $is_ipaddr && ip_in_subnet($gwip, $subnet . "/" . $intbits);
300
				if ($gwip != '') {
301
					if (!$is_ipaddr) {
302
						echo sprintf(gettext("not an %s IP address!"), $label_IPvX) . "\n";
303
					} else if (!$is_in_subnet) {
304
						echo gettext("not in subnet!") . "\n";
305
					}
306
				}
307
			} while (!($gwip == '' || ($is_ipaddr && $is_in_subnet)));
308

    
309
			if ($gwip != '') {
310
				$inet_type = ($version === 6) ? "inet6" : "inet";
311
				$gwname = add_gateway_to_config($interface, $gwip, $inet_type);
312
			}
313
		}
314
		$ifppp = console_get_interface_from_ppp(get_real_interface($interface));
315
		if (!empty($ifppp))
316
			$ifaceassigned = $ifppp;
317
	}
318

    
319
	return array($intip, $intbits, $gwname);
320
}
321

    
322
list($intip,  $intbits,  $gwname)  = console_configure_ip_address(4);
323
list($intip6, $intbits6, $gwname6) = console_configure_ip_address(6);
324

    
325
if (!empty($ifaceassigned))
326
	$config['interfaces'][$interface]['if'] = $ifaceassigned;
327
$config['interfaces'][$interface]['ipaddr']    = $intip;
328
$config['interfaces'][$interface]['subnet']    = $intbits;
329
$config['interfaces'][$interface]['gateway']   = $gwname;
330
$config['interfaces'][$interface]['ipaddrv6']  = $intip6;
331
$config['interfaces'][$interface]['subnetv6']  = $intbits6;
332
$config['interfaces'][$interface]['gatewayv6'] = $gwname6;
333
$config['interfaces'][$interface]['enable']    = true;
334

    
335
function console_configure_dhcpd($version = 4) {
336
	global $g, $config, $restart_dhcpd, $fp, $interface, $dry_run;
337

    
338
	$label_IPvX = ($version === 6) ? "IPv6"    : "IPv4";
339
	$dhcpd      = ($version === 6) ? "dhcpdv6" : "dhcpd";
340

    
341
	if($g['services_dhcp_server_enable'])
342
		$yn = prompt_for_enable_dhcp_server($version);
343
	if ($yn == "y") {
344
		do {
345
			echo sprintf(gettext("Enter the start address of the %s client address range:"), $label_IPvX) . " ";
346
			$dhcpstartip = chop(fgets($fp));
347
			if ($dhcpstartip === "") {
348
				fclose($fp);
349
				exit(0);
350
			}
351
			$is_ipaddr = ($version === 6) ? is_ipaddrv6($dhcpstartip) : is_ipaddrv4($dhcpstartip);
352
		} while (!$is_ipaddr);
353

    
354
		do {
355
			echo sprintf(gettext("Enter the end address of the %s client address range:"), $label_IPvX) . " ";
356
			$dhcpendip = chop(fgets($fp));
357
			if ($dhcpendip === "") {
358
				fclose($fp);
359
				exit(0);
360
			}
361
			$is_ipaddr = ($version === 6) ? is_ipaddrv6($dhcpendip) : is_ipaddrv4($dhcpendip);
362
		} while (!$is_ipaddr);
363
		$restart_dhcpd = true;
364
		$config[$dhcpd][$interface]['enable'] = true;
365
		$config[$dhcpd][$interface]['range']['from'] = $dhcpstartip;
366
		$config[$dhcpd][$interface]['range']['to'] = $dhcpendip;
367
	} else {
368
		/* TODO - this line is causing a "Fatal error: Cannot unset
369
		   string offsets in /etc/rc.initial.setlanip" on below line
370
		   number */
371
		if($config[$dhcpd][$interface]) 
372
			unset($config[$dhcpd][$interface]['enable']);
373
		echo "Disabling DHCPD...";
374
		if (!$dry_run) {
375
			services_dhcpd_configure();
376
		}
377
		echo "Done!\n";
378
	}
379
}
380

    
381
console_configure_dhcpd(4);
382
console_configure_dhcpd(6);
383
	
384
//*****************************************************************************
385

    
386
if ($config['system']['webgui']['protocol'] == "https") {
387

    
388
	do {
389
		$good = false;
390
		echo "\n" . gettext("Do you want to revert to HTTP as the webConfigurator protocol? (y/n)") . " ";
391
		$yn = strtolower(chop(fgets($fp)));
392
		if ($yn[0] == "y" or $yn[0] == "n")
393
			$good = true;
394
	} while (!$good);
395

    
396
	if ($yn == "y") {
397
		$config['system']['webgui']['protocol'] = "http";
398
		$restart_webgui = true;
399
	}
400
}
401

    
402
if (isset($config['system']['webgui']['noantilockout'])) {
403
	echo "\n" . sprintf(gettext("Note: the anti-lockout rule on %s has been re-enabled."), $interface) . "\n";
404
	unset($config['system']['webgui']['noantilockout']);
405
}
406

    
407
if($config['interfaces']['lan']) {
408
	if($config['dhcpd'])
409
		if($config['dhcpd']['wan'])
410
			unset($config['dhcpd']['wan']);		
411
	if($config['dhcpdv6'])
412
		if($config['dhcpdv6']['wan'])
413
			unset($config['dhcpdv6']['wan']);
414
}
415

    
416
if(!$config['interfaces']['lan']) {
417
	unset($config['interfaces']['lan']);
418
	if($config['dhcpd']['lan'])
419
		unset($config['dhcpd']['lan']);
420
	if($config['dhcpdv6']['lan'])
421
		unset($config['dhcpdv6']['lan']);
422
	unset($config['shaper']);
423
	unset($config['ezshaper']);
424
	unset($config['nat']);
425
	if (!$dry_run) {
426
		system("rm /var/dhcpd/var/db/* >/dev/null 2>/dev/null");
427
		services_dhcpd_configure();
428
	}
429
}
430

    
431
$upperifname = strtoupper($interface);
432
if (!$dry_run) {
433
	echo "\nPlease wait while the changes are saved to {$upperifname}...";
434
	write_config(sprintf(gettext("%s IP configuration from console menu"), $interface));
435
	interface_reconfigure(strtolower($upperifname));
436
	echo " Reloading filter...";
437
	filter_configure_sync();
438
	echo "\n";
439
	if($restart_dhcpd) {
440
		echo " DHCPD..."; 
441
		services_dhcpd_configure();
442
	}
443
	if($restart_webgui) {
444
		echo " restarting webConfigurator... ";
445
		mwexec("/etc/rc.restart_webgui");
446
	}
447
}
448
	
449
if ($intip != '') {
450
	if (is_ipaddr($intip)) {
451
		echo "\n\n" . sprintf(gettext("The IPv4 %s address has been set to %s"),
452
		                      $upperifname, "{$intip}/{$intbits}") . "\n";
453
	} else {
454
		echo "\n\n" . sprintf(gettext("The IPv4 %s address has been set to %s"),
455
		                      $upperifname, $intip) . "\n";
456
	}
457
}
458
if ($intip6 != '') {
459
	if (is_ipaddr($intip6)) {
460
		echo "\n\n" . sprintf(gettext("The IPv6 %s address has been set to %s"),
461
		                      $upperifname, "${intip6}/${intbits6}") . "\n";
462
	} else {
463
		echo "\n\n" . sprintf(gettext("The IPv6 %s address has been set to %s"),
464
		                      $upperifname, $intip6) . "\n";
465
	}
466
}
467

    
468
if ($intip != '' || $intip6 != '') {
469
	if (count($ifdescrs) == "1" or $interface = "lan") {
470
		if ($debug) {
471
			echo "ifdescrs count is " . count($ifdescrs) . "\n";
472
			echo "interface is {$interface} \n";
473
		}
474
		echo gettext('You can now access the webConfigurator by opening the following URL in your web browser:') . "\n";
475
		if(!empty($config['system']['webgui']['port'])) {
476
			$webuiport = $config['system']['webgui']['port'];
477
			if ($intip != '') {
478
				echo "		{$config['system']['webgui']['protocol']}://{$intip}:{$webuiport}/\n";
479
			}
480
			if ($intip6 != '') {
481
				if (is_ipaddr($intip6)) {
482
					echo "		{$config['system']['webgui']['protocol']}://[{$intip6}]:{$webuiport}/\n";
483
				} else {
484
					echo "		{$config['system']['webgui']['protocol']}://{$intip6}:{$webuiport}/\n";
485
				}
486
			}
487
		} else {
488
			if ($intip != '') {
489
				echo "		{$config['system']['webgui']['protocol']}://{$intip}/\n";
490
			}
491
			if ($intip6 != '') {
492
				if (is_ipaddr($intip6)) {
493
					echo "		{$config['system']['webgui']['protocol']}://[{$intip6}]/\n";
494
				} else {
495
					echo "		{$config['system']['webgui']['protocol']}://{$intip6}/\n";
496
				}
497
			}
498
		}
499
	}
500
}
501

    
502
echo "\n" . gettext('Press <ENTER> to continue.');
503

    
504
fgets($fp);
505
fclose($fp);
506
		
507
?>
(67-67/110)