system_gateways.php 15.8 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("functions.inc");
Ad Schellevis's avatar
Ad Schellevis committed
32 33 34 35
require_once("filter.inc");

$a_gateways = return_gateways_array(true, false, true);
$a_gateways_arr = array();
36
foreach ($a_gateways as $gw) {
37
    $a_gateways_arr[] = $gw;
38
}
Ad Schellevis's avatar
Ad Schellevis committed
39 40
$a_gateways = $a_gateways_arr;

41
if (!is_array($config['gateways'])) {
42
    $config['gateways'] = array();
43 44 45
}

if (!is_array($config['gateways']['gateway_item'])) {
46
    $config['gateways']['gateway_item'] = array();
47
}
Ad Schellevis's avatar
Ad Schellevis committed
48 49 50 51

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

if ($_POST) {
52
    $pconfig = $_POST;
Ad Schellevis's avatar
Ad Schellevis committed
53

54 55
    if ($_POST['apply']) {
        $retval = 0;
Ad Schellevis's avatar
Ad Schellevis committed
56

57 58 59 60
        $retval = system_routing_configure();
        $retval |= filter_configure();
        /* reconfigure our gateway monitor */
        setup_gateways_monitor();
Ad Schellevis's avatar
Ad Schellevis committed
61

62 63 64 65 66
        $savemsg = get_std_save_message($retval);
        if ($retval == 0) {
            clear_subsystem_dirty('staticroutes');
        }
    }
Ad Schellevis's avatar
Ad Schellevis committed
67 68
}

69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
function can_delete_gateway_item($id)
{
    global $config, $input_errors, $a_gateways;

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

    if (is_array($config['gateways']['gateway_group'])) {
        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;
                }
            }
        }
    }

    if (is_array($config['staticroutes']['route'])) {
        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;
            }
        }
    }

    if (isset($input_errors)) {
        return false;
    }

    return true;
Ad Schellevis's avatar
Ad Schellevis committed
103 104
}

105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
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
129 130 131 132
}

unset($input_errors);
if ($_GET['act'] == "del") {
133 134 135 136 137 138 139 140
    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
141 142 143
}

if (isset($_POST['del_x'])) {
144 145 146 147 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
    /* 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
182 183 184 185 186 187 188
}

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

include("head.inc");

Ad Schellevis's avatar
Ad Schellevis committed
189
$main_buttons = array(
190
    array('label'=>'Add Gateway', 'href'=>'system_gateways_edit.php'),
Ad Schellevis's avatar
Ad Schellevis committed
191 192
);

Ad Schellevis's avatar
Ad Schellevis committed
193 194
?>

195 196
<body>
    <?php include("fbegin.inc"); ?>
197 198


199
<!-- row -->
200

201 202
<section class="page-content-main">
	<div class="container-fluid">
203

204
        <div class="row">
205

206
            <?php
207 208 209 210 211 212 213 214 215
            if ($input_errors) {
                print_input_errors($input_errors);
            }
            if ($savemsg) {
                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."));
            }
216
            ?>
217

218
            <section class="col-xs-12">
219
                <? include('system_gateways_tabs.inc'); ?>
220 221 222

                <div class="content-box">

223
                    <div class="table-responsive">
224 225

                        <form action="system_gateways.php" method="post">
226 227

                            <table class="table table-striped table-sort sortable" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
228 229 230 231 232 233 234 235 236 237 238 239 240 241
				<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>

242 243 244 245
                                <tbody>
                                <?php
                                $textse = "</span>";
                                $i = 0;
246 247 248 249 250 251 252 253
                                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";
                                    }
254
                                ?>
255 256 257
				<tr valign="top" id="fr<?=$i;?>">
					<td class="listt">

258
                                    <?php
259 260 261 262 263
                                    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;" />
264
                                    <?php
265
                                    else :
266
                                    ?>
267
						&nbsp;
268
                                    <?php
269
                                    endif;
270
                                    ?>
271 272
					</td>
					<td class="listt" align="center">
273
                                    <?php
274 275 276
                                    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>
277

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

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

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

358
                                            <?php
359 360
                                            if (is_numeric($gateway['attribute'])) :
                                                            ?>
361

362 363 364 365 366
                                                    <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>
367

368
                                            <?php
369

370
                                            endif;
371
                                            ?>
372 373
							<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");?>">
374 375 376 377
										<span class="glyphicon glyphicon-plus"></span>
									</a>
					</td>
				</tr>
378 379 380 381
                                <?php
                                $i++;
                                endforeach;
                                ?>
382 383 384 385 386 387
				<tr>
					<td class="list" colspan="7"></td>
					<td class="list">
						<table border="0" cellspacing="0" cellpadding="1" summary="edit">
							<tr>
								<td>
388
                                                <?php
389 390 391 392 393 394 395
                                                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>
396
                                                <?php
397 398
                                                endif;
                                ?>
399 400 401 402 403 404 405
								</td>
							</tr>
						</table>
					</td>
				</tr>

				</tbody>
406
                            </table>
407

408 409
                        </form>

410
                    </div>
411 412 413 414 415 416
                </div>
            </section>
        </div>
	</div>
</section>

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