system_gateways.php 16 KB
Newer Older
Ad Schellevis's avatar
Ad Schellevis committed
1
<?php
2

Ad Schellevis's avatar
Ad Schellevis committed
3
/*
4
	Copyright (C) 2014-2015 Deciso B.V.
Ad Schellevis's avatar
Ad Schellevis committed
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
	Copyright (C) 2010 Seth Mos <seth.mos@dds.nl>.
	All rights reserved.

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

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

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

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

30
require_once("guiconfig.inc");
31
require_once("interfaces.inc");
Ad Schellevis's avatar
Ad Schellevis committed
32
require_once("filter.inc");
33
require_once("services.inc");
34
require_once("system.inc");
35
require_once("pfsense-utils.inc");
36
require_once("rrd.inc");
Ad Schellevis's avatar
Ad Schellevis committed
37 38 39

$a_gateways = return_gateways_array(true, false, true);
$a_gateways_arr = array();
40
foreach ($a_gateways as $gw) {
41
    $a_gateways_arr[] = $gw;
42
}
Ad Schellevis's avatar
Ad Schellevis committed
43 44
$a_gateways = $a_gateways_arr;

45
if (!is_array($config['gateways'])) {
46
    $config['gateways'] = array();
47 48 49
}

if (!is_array($config['gateways']['gateway_item'])) {
50
    $config['gateways']['gateway_item'] = array();
51
}
Ad Schellevis's avatar
Ad Schellevis committed
52 53 54 55

$a_gateway_item = &$config['gateways']['gateway_item'];

if ($_POST) {
56
    $pconfig = $_POST;
Ad Schellevis's avatar
Ad Schellevis committed
57

58 59
    if ($_POST['apply']) {
        $retval = 0;
Ad Schellevis's avatar
Ad Schellevis committed
60

61 62 63 64
        $retval = system_routing_configure();
        $retval |= filter_configure();
        /* reconfigure our gateway monitor */
        setup_gateways_monitor();
Ad Schellevis's avatar
Ad Schellevis committed
65

66
        $savemsg = get_std_save_message();
67 68 69 70
        if ($retval == 0) {
            clear_subsystem_dirty('staticroutes');
        }
    }
Ad Schellevis's avatar
Ad Schellevis committed
71 72
}

73 74 75 76 77 78 79 80
function can_delete_gateway_item($id)
{
    global $config, $input_errors, $a_gateways;

    if (!isset($a_gateways[$id])) {
        return false;
    }

81
    if (isset($config['gateways']['gateway_group'])) {
82 83 84 85 86 87 88 89 90 91 92
        foreach ($config['gateways']['gateway_group'] as $group) {
            foreach ($group['item'] as $item) {
                $items = explode("|", $item);
                if ($items[0] == $a_gateways[$id]['name']) {
                    $input_errors[] = sprintf(gettext("Gateway '%s' cannot be deleted because it is in use on Gateway Group '%s'"), $a_gateways[$id]['name'], $group['name']);
                    break;
                }
            }
        }
    }

93
    if (isset($config['staticroutes']['route'])) {
94 95 96 97 98 99 100 101
        foreach ($config['staticroutes']['route'] as $route) {
            if ($route['gateway'] == $a_gateways[$id]['name']) {
                $input_errors[] = sprintf(gettext("Gateway '%s' cannot be deleted because it is in use on Static Route '%s'"), $a_gateways[$id]['name'], $route['network']);
                break;
            }
        }
    }

102
    if (isset($input_errors) && count($input_errors) > 0) {
103 104 105 106
        return false;
    }

    return true;
Ad Schellevis's avatar
Ad Schellevis committed
107 108
}

109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
function delete_gateway_item($id)
{
    global $config, $a_gateways;

    if (!isset($a_gateways[$id])) {
        return;
    }

    /* NOTE: Cleanup static routes for the monitor ip if any */
    if (!empty($a_gateways[$id]['monitor']) &&
        $a_gateways[$id]['monitor'] != "dynamic" &&
        is_ipaddr($a_gateways[$id]['monitor']) &&
        $a_gateways[$id]['gateway'] != $a_gateways[$id]['monitor']) {
        if (is_ipaddrv4($a_gateways[$id]['monitor'])) {
            mwexec("/sbin/route delete " . escapeshellarg($a_gateways[$id]['monitor']));
        } else {
            mwexec("/sbin/route delete -inet6 " . escapeshellarg($a_gateways[$id]['monitor']));
        }
    }

    if ($config['interfaces'][$a_gateways[$id]['friendlyiface']]['gateway'] == $a_gateways[$id]['name']) {
        unset($config['interfaces'][$a_gateways[$id]['friendlyiface']]['gateway']);
    }
    unset($config['gateways']['gateway_item'][$a_gateways[$id]['attribute']]);
Ad Schellevis's avatar
Ad Schellevis committed
133 134 135 136
}

unset($input_errors);
if ($_GET['act'] == "del") {
137 138 139 140 141 142 143 144
    if (can_delete_gateway_item($_GET['id'])) {
        $realid = $a_gateways[$_GET['id']]['attribute'];
        delete_gateway_item($_GET['id']);
        write_config("Gateways: removed gateway {$realid}");
        mark_subsystem_dirty('staticroutes');
        header("Location: system_gateways.php");
        exit;
    }
Ad Schellevis's avatar
Ad Schellevis committed
145 146 147
}

if (isset($_POST['del_x'])) {
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185
    /* delete selected items */
    if (is_array($_POST['rule']) && count($_POST['rule'])) {
        foreach ($_POST['rule'] as $rulei) {
            if (!can_delete_gateway_item($rulei)) {
                break;
            }
        }

        if (!isset($input_errors)) {
            $items_deleted = "";
            foreach ($_POST['rule'] as $rulei) {
                delete_gateway_item($rulei);
                $items_deleted .= "{$rulei} ";
            }
            if (!empty($items_deleted)) {
                write_config("Gateways: removed gateways {$items_deleted}");
                mark_subsystem_dirty('staticroutes');
            }
            header("Location: system_gateways.php");
            exit;
        }
    }

} elseif ($_GET['act'] == "toggle" && $a_gateways[$_GET['id']]) {
    $realid = $a_gateways[$_GET['id']]['attribute'];

    if (isset($a_gateway_item[$realid]['disabled'])) {
        unset($a_gateway_item[$realid]['disabled']);
    } else {
        $a_gateway_item[$realid]['disabled'] = true;
    }

    if (write_config("Gateways: enable/disable")) {
        mark_subsystem_dirty('staticroutes');
    }

    header("Location: system_gateways.php");
    exit;
Ad Schellevis's avatar
Ad Schellevis committed
186 187 188 189 190 191 192
}

$pgtitle = array(gettext("System"),gettext("Gateways"));
$shortcut_section = "gateways";

include("head.inc");

Ad Schellevis's avatar
Ad Schellevis committed
193
$main_buttons = array(
194
    array('label'=>'Add Gateway', 'href'=>'system_gateways_edit.php'),
Ad Schellevis's avatar
Ad Schellevis committed
195 196
);

Ad Schellevis's avatar
Ad Schellevis committed
197 198
?>

199 200
<body>
    <?php include("fbegin.inc"); ?>
201 202


203
<!-- row -->
204

205 206
<section class="page-content-main">
	<div class="container-fluid">
207

208
        <div class="row">
209

210
            <?php
211
            if (isset($input_errors) && count($input_errors) > 0) {
212 213
                print_input_errors($input_errors);
            }
214
            if (isset($savemsg)) {
215 216 217 218 219
                print_info_box($savemsg);
            }
            if (is_subsystem_dirty('staticroutes')) {
                print_info_box_np(gettext("The gateway configuration has been changed.") . "<br />" . gettext("You must apply the changes in order for them to take effect."));
            }
220
            ?>
221

222
            <section class="col-xs-12">
223
                <? include('system_gateways_tabs.inc'); ?>
224 225 226

                <div class="content-box">

227
                    <div class="table-responsive">
228 229

                        <form action="system_gateways.php" method="post">
230 231

                            <table class="table table-striped table-sort sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
232 233 234 235 236 237 238 239 240 241 242 243 244 245
				<thead>
					<tr id="frheader">
						<th width="4%" colspan="2" class="list">&nbsp;</th>
						<th width="15%" class="listhdrr"><?=gettext("Name"); ?></th>
						<th width="10%" class="listhdrr"><?=gettext("Interface"); ?></th>
						<th width="15%" class="listhdrr"><?=gettext("Gateway"); ?></th>
						<th width="15%" class="listhdrr"><?=gettext("Monitor IP"); ?></th>
						<th width="31%" class="listhdr"><?=gettext("Description"); ?></th>
						<th width="10%" class="list">

						</th>
					</tr>
				</thead>

246 247 248 249
                                <tbody>
                                <?php
                                $textse = "</span>";
                                $i = 0;
250 251 252 253 254 255 256 257
                                foreach ($a_gateways as $gateway) :
                                    if (isset($gateway['disabled']) || isset($gateway['inactive'])) {
                                        $textss = "<span class=\"text-muted\">";
                                        $iconfn = "glyphicon glyphicon-play text-muted";
                                    } else {
                                        $textss = "<span>";
                                        $iconfn = "glyphicon glyphicon-play text-success";
                                    }
258
                                ?>
259 260 261
				<tr valign="top" id="fr<?=$i;?>">
					<td class="listt">

262
                                    <?php
263 264 265 266 267
                                    if (is_numeric($gateway['attribute'])) :
                                                    ?>
                                        <input type="checkbox" id="frc<?=$i;
?>" name="rule[]" value="<?=$i;
?>" onclick="fr_bgcolor('<?=$i;?>')" style="margin: 0; padding: 0; width: 15px; height: 15px;" />
268
                                    <?php
269
                                    else :
270
                                    ?>
271
						&nbsp;
272
                                    <?php
273
                                    endif;
274
                                    ?>
275 276
					</td>
					<td class="listt" align="center">
277
                                    <?php
278 279 280
                                    if (isset($gateway['inactive'])) :
                                                    ?>
                                        <span class="glyphicon glyphicon-remove text-muted" data-toggle="tooltip" data-placement="left" title="<?=gettext("This gateway is inactive because interface is missing");?>"></span>
281

282
                                    <?php
283
                                    elseif (is_numeric($gateway['attribute'])) :
284
                                    ?>
285 286
						<a href="?act=toggle&amp;id=<?=$i;
?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>" >
287 288 289
							<span class="glyphicon <?php echo $iconfn;?>"></span>

						</a>
290
                                    <?php
291
                                    else :
292
                                    ?>
293 294
					<span class="glyphicon <?php echo $iconfn;
?>" data-toggle="tooltip" data-placement="left" title="<?=gettext("click to toggle enabled/disabled status");?>"></span>
295
                                    <?php
296
                                    endif;
297
                                    ?>
298
					</td>
299 300 301
					<td class="listlr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
302
                                    <?php
303 304 305 306 307 308
                                    echo $textss;
                                    echo $gateway['name'];
                                    if (isset($gateway['defaultgw'])) {
                                        echo " <strong>(default)</strong>";
                                    }
                                    echo $textse;
309
                                    ?>
310
					</td>
311 312 313
					<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
314
                                    <?php
315 316 317
                                    echo $textss;
                                    echo htmlspecialchars(convert_friendly_interface_to_friendly_descr($gateway['friendlyiface']));
                                    echo $textse;
318
                                    ?>
319
					</td>
320 321 322
					<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
323
                                    <?php
324 325 326
                                    echo $textss;
                                    echo $gateway['gateway'] . " ";
                                    echo $textse;
327
                                    ?>
328
					</td>
329 330 331
					<td class="listr" onclick="fr_toggle(<?=$i;
?>)" id="frd<?=$i;
?>" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
332
                                    <?php
333 334 335
                                    echo $textss;
                                    echo htmlspecialchars($gateway['monitor']) . " ";
                                    echo $textse;
336
                                    ?>
337
					</td>
338
                                    <?php
339
                                    if (is_numeric($gateway['attribute'])) :
340
                                    ?>
341 342
					<td class="listbg" onclick="fr_toggle(<?=$i;
?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
343
                                    <?php
344
                                    else :
345
                                    ?>
346 347
					<td class="listbgns" onclick="fr_toggle(<?=$i;
?>)" ondblclick="document.location='system_gateways_edit.php?id=<?=$i;?>';">
348 349
                                    <?php
                                    endif;
350 351 352
                                    echo $textss;
                                    echo htmlspecialchars($gateway['descr']) . "&nbsp;";
                                    echo $textse;
353
                                    ?>
354 355 356
					</td>
					<td valign="middle" class="list nowrap">

357 358
									<a href="system_gateways_edit.php?id=<?=$i;
?>" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Edit Gateway");?>">
359 360 361
										<span class="glyphicon glyphicon-pencil"></span>
									</a>

362
                                            <?php
363 364
                                            if (is_numeric($gateway['attribute'])) :
                                                            ?>
365

366 367 368 369 370
                                                    <a href="system_gateways.php?act=del&amp;id=<?=$i;
?>" onclick="return confirm('<?=gettext("Do you really want to delete this gateway?");
?>')" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Delete Gateway");?>">
                                                        <span class="glyphicon glyphicon-remove"></span>
                                                    </a>
371

372
                                            <?php
373

374
                                            endif;
375
                                            ?>
376 377
							<a href="system_gateways_edit.php?dup=<?=$i;
?>" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left" title="<?=gettext("Add Gateway based on this one");?>">
378 379 380 381
										<span class="glyphicon glyphicon-plus"></span>
									</a>
					</td>
				</tr>
382 383 384 385
                                <?php
                                $i++;
                                endforeach;
                                ?>
386 387 388 389 390 391
				<tr>
					<td class="list" colspan="7"></td>
					<td class="list">
						<table border="0" cellspacing="0" cellpadding="1" summary="edit">
							<tr>
								<td>
392
                                                <?php
393 394 395 396 397 398 399
                                                if ($i > 0) :
                                                                ?>
                                                    <button type="submit" name="del_x" class="btn btn-default btn-xs" data-toggle="tooltip" data-placement="left"
                                                         title="<?=gettext("delete selected items");?>"
                                                        onclick="return confirm('<?=gettext("Do you really want to delete the selected gateway items?");?>')">
                                                        <span class="glyphicon glyphicon-remove"></span>
                                                    </button>
400
                                                <?php
401 402
                                                endif;
                                ?>
403 404 405 406 407 408 409
								</td>
							</tr>
						</table>
					</td>
				</tr>

				</tbody>
410
                            </table>
411

412 413
                        </form>

414
                    </div>
415 416 417 418 419 420
                </div>
            </section>
        </div>
	</div>
</section>

421
<?php include("foot.inc");