Project

General

Profile

Download (14.1 KB) Statistics
| Branch: | Tag: | Revision:
1 b991e3b5 Ermal Lu?i
<?php
2
/*
3
	Copyright (C) 2009 Ermal Lu?i
4
	All rights reserved.
5
6
	Redistribution and use in source and binary forms, with or without
7
	modification, are permitted provided that the following conditions are met:
8
9
	1. Redistributions of source code must retain the above copyright notice,
10
	   this list of conditions and the following disclaimer.
11
12
	2. Redistributions in binary form must reproduce the above copyright
13
	   notice, this list of conditions and the following disclaimer in the
14
	   documentation and/or other materials provided with the distribution.
15
16
	THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
17
	INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
	AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
19
	AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
20
	OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21
	SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22
	INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23
	CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24
	ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25
	POSSIBILITY OF SUCH DAMAGE.
26
*/
27 7ac5a4cb Scott Ullrich
/*
28
	pfSense_BUILDER_BINARIES:	/usr/sbin/ngctl	
29
	pfSense_MODULE:	interfaces
30
*/
31 b991e3b5 Ermal Lu?i
32
##|+PRIV
33
##|*IDENT=page-interfacess-qinq
34
##|*NAME=Interfaces: QinQ: Edit page
35
##|*DESCR=Edit Interface qinq
36
##|*MATCH=interfaces_qinq_edit.php*
37
##|-PRIV
38
39 93bcbb6a Renato Botelho
$pgtitle = array(gettext("Interfaces"),gettext("QinQ"), gettext("Edit"));
40 b991e3b5 Ermal Lu?i
41
require("guiconfig.inc");
42
43
if (!is_array($config['qinqs']['qinqentry']))
44
	$config['qinqs']['qinqentry'] = array();
45
46
$a_qinqs = &$config['qinqs']['qinqentry'];
47
48
$portlist = get_interface_list();
49
50
/* add LAGG interfaces */
51
if (is_array($config['laggs']['lagg']) && count($config['laggs']['lagg'])) {
52
        foreach ($config['laggs']['lagg'] as $lagg)
53
                $portlist[$lagg['laggif']] = $lagg;
54
}
55
56
if (count($portlist) < 1) {
57
	header("Location: interfaces_qinq.php");
58
	exit;
59
}
60
61
$id = $_GET['id'];
62
if (isset($_POST['id']))
63
	$id = $_POST['id'];
64
65
if (isset($id) && $a_qinqs[$id]) {
66
	$pconfig['if'] = $a_qinqs[$id]['if'];
67
	$pconfig['tag'] = $a_qinqs[$id]['tag'];
68
	$pconfig['members'] = $a_qinqs[$id]['members'];
69
	$pconfig['descr'] = html_entity_decode($a_qinqs[$id]['descr']);
70
/*
71
	$pconfig['autoassign'] = isset($a_qinqs[$id]['autoassign']);
72
	$pconfig['autoenable'] = isset($a_qinqs[$id]['autoenable']);
73
*/
74
	$pconfig['autogroup'] = isset($a_qinqs[$id]['autogroup']);
75
	$pconfig['autoadjustmtu'] = isset($a_qinqs[$id]['autoadjustmtu']);
76
}
77
78
if ($_POST) {
79
80
	unset($input_errors);
81
	$pconfig = $_POST;
82
83
	if (empty($_POST['tag']))
84 93bcbb6a Renato Botelho
		$input_errors[] = gettext("First level tag cannot be empty.");
85 b991e3b5 Ermal Lu?i
	if (isset($id) && $a_qinqs[$id]['tag'] != $_POST['tag'])
86 93bcbb6a Renato Botelho
		$input_errors[] = gettext("You are editing an existing entry and modifying the first level tag is not allowed.");
87 b991e3b5 Ermal Lu?i
	if (isset($id) && $a_qinqs[$id]['if'] != $_POST['if'])
88 93bcbb6a Renato Botelho
		$input_errors[] = gettext("You are editing an existing entry and modifying the interface is not allowed.");
89 b991e3b5 Ermal Lu?i
	if (!isset($id)) {
90
		foreach ($a_qinqs as $qinqentry)
91
			if ($qinqentry['tag'] == $_POST['tag'] && $qinqentry['if'] == $_POST['if'])
92 93bcbb6a Renato Botelho
				$input_errors[] = gettext("QinQ level already exists for this interface, edit it!");
93 b991e3b5 Ermal Lu?i
		if (is_array($config['vlans']['vlan'])) {
94
			foreach ($config['vlans']['vlan'] as $vlan)
95
				if ($vlan['tag'] == $_POST['tag'] && $vlan['if'] == $_POST['if'])
96 93bcbb6a Renato Botelho
					$input_errors[] = gettext("A normal VLAN exists with this tag please remove it to use this tag for QinQ first level.");
97 b991e3b5 Ermal Lu?i
		}
98
	}
99
100
	$qinqentry = array();
101
	$qinqentry['if'] = $_POST['if'];
102
	$qinqentry['tag'] = $_POST['tag'];
103
/*
104
	if ($_POST['autoassign'] == "yes") {
105
		$qinqentry['autoassign'] = true;
106
	if ($_POST['autoenable'] == "yes")
107
		$qinqentry['autoenable'] = true;
108
	if ($_POST['autoadjust'] == "yes")
109
		$qinqentry['autoadjustmtu'] = true;
110
*/
111
	if ($_POST['autogroup'] == "yes")
112
		$qinqentry['autogroup'] = true;
113
114
	$members = "";
115
	$isfirst = 0;
116
	/* item is a normal qinqentry type */
117
	for($x=0; $x<9999; $x++) {
118
		if($_POST["members{$x}"] <> "") {
119
			$member = explode("-", $_POST["members{$x}"]);
120
			if (count($member) > 1) {
121
				if (preg_match("/([^0-9])+/", $member[0], $match)  ||
122
					preg_match("/([^0-9])+/", $member[1], $match))
123 93bcbb6a Renato Botelho
					$input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
124 b991e3b5 Ermal Lu?i
125 a80281c6 Ermal Lu?i
				for ($i = $member[0]; $i <= $member[1]; $i++) {
126 b991e3b5 Ermal Lu?i
					if ($isfirst > 0)
127
						$members .= " ";
128
					$members .= $i;
129
					$isfirst++;
130
				}
131
			} else {
132
				if (preg_match("/([^0-9])+/", $_POST["members{$x}"], $match))
133 93bcbb6a Renato Botelho
					$input_errors[] = gettext("Tags can contain only numbers or a range in format #-#.");
134 b991e3b5 Ermal Lu?i
135
				if ($isfirst > 0)
136
					$members .= " ";
137
				$members .= $_POST["members{$x}"];
138
				$isfirst++;
139
			}
140
		}
141
	}
142
143
	if (!$input_errors) {
144
		$qinqentry['members'] = $members;
145 d865241e jim-p
		$qinqentry['descr'] = $_POST['descr'];
146 4400ad66 Ermal Lu?i
		$qinqentry['vlanif'] = "{$_POST['if']}_{$_POST['tag']}";
147 b991e3b5 Ermal Lu?i
		$nmembers = explode(" ", $members);
148
149
		if (isset($id) && $a_qinqs[$id]) {
150
			$omembers = explode(" ", $a_qinqs[$id]['members']);
151
			$delmembers = array_diff($omembers, $nmembers);
152
			if (count($delmembers) > 0) {
153
				foreach ($delmembers as $tag) {
154 4400ad66 Ermal Lu?i
					mwexec("/usr/sbin/ngctl shutdown {$qinqentry['vlanif']}h{$tag}:");
155
					mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}qinq: delfilter \\\"{$qinqentry['vlanif']}{$tag}\\\"");
156 b991e3b5 Ermal Lu?i
				}
157
			}
158
			$addmembers = array_diff($nmembers, $omembers);
159
			if (count($addmembers) > 0) {
160
				foreach ($addmembers as $member) {
161 4400ad66 Ermal Lu?i
					$macaddr = get_interface_mac($qinqentry['vlanif']);
162
					mwexec("/usr/sbin/ngctl mkpeer {$$qinqentry['vlanif']}qinq: eiface {$$qinqentry['vlanif']}{$member} ether");
163
					mwexec("/usr/sbin/ngctl name {$qinqentry['vlanif']}qinq:{$qinqentry['vlanif']}{$tag} {$qinqentry['vlanif']}h{$member}");
164
					mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}qinq: addfilter '{ vlan={$member} hook=\\\"{$qinqentry['vlanif']}{$member}\\\" }'");
165
					mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}h{$tag}: setifname \\\"{$qinqentry['vlanif']}_{$member}\\\"");
166
					mwexec("/usr/sbin/ngctl msg {$qinqentry['vlanif']}h{$member}: set {$macaddr}");
167 b991e3b5 Ermal Lu?i
				}
168
			}
169
			$a_qinqs[$id] = $qinqentry;
170
		} else {
171
			interface_qinq_configure($qinqentry);
172
			$a_qinqs[] = $qinqentry;
173
		}
174
		if ($_POST['autogroup'] == "yes") {
175
			if (!is_array($config['ifgroups']['ifgroupentry']))
176
				$config['ifgroups']['ifgroupentry'] = array();
177
			foreach ($config['ifgroups']['ifgroupentry'] as $gid => $group) {
178
				if ($group['ifname'] == "QinQ") {
179
					$found = true;
180
					break;
181
				}
182
			}
183
			$additions = "";
184
			foreach($nmembers as $qtag)
185 4400ad66 Ermal Lu?i
				$additions .= "{$qinqentry['vlanif']}_{$qtag} ";
186
			$additions .= "{$qinqentry['vlanif']}";
187 b991e3b5 Ermal Lu?i
			if ($found == true)
188
				$config['ifgroups']['ifgroupentry'][$gid]['members'] .= " {$additions}";
189
			else {
190
				$gentry = array();
191
				$gentry['ifname'] = "QinQ";
192
				$gentry['members'] = "{$additions}";
193 93bcbb6a Renato Botelho
				$gentry['descr'] = gettext("QinQ VLANs group");
194 ceae2616 Ermal Lu?i
				$config['ifgroups']['ifgroupentry'][] = $gentry;
195 b991e3b5 Ermal Lu?i
			}
196
		}
197
198
		write_config();
199
200
		header("Location: interfaces_qinq.php");
201
		exit;
202
	} else {
203 d865241e jim-p
		$pconfig['descr'] = $_POST['descr'];
204 b991e3b5 Ermal Lu?i
		$pconfig['tag'] = $_POST['tag'];
205
		$pconfig['members'] = $members;
206
	}
207
}
208
209
include("head.inc");
210
211
?>
212
213
<body link="#0000CC" vlink="#0000CC" alink="#0000CC" onload="<?= $jsevents["body"]["onload"] ?>">
214
<?php
215
	include("fbegin.inc");
216
?>
217
218
<script type="text/javascript">
219
// Global Variables
220
var rowname = new Array(9999);
221
var rowtype = new Array(9999);
222
var newrow  = new Array(9999);
223
var rowsize = new Array(9999);
224
225
for (i = 0; i < 9999; i++) {
226 9cf46050 Ermal
        rowname[i] = 'members';
227 b991e3b5 Ermal Lu?i
        rowtype[i] = 'select';
228
        newrow[i] = '';
229
        rowsize[i] = '30';
230
}
231
232
var field_counter_js = 0;
233
var loaded = 0;
234
var is_streaming_progress_bar = 0;
235
var temp_streaming_text = "";
236
237
var addRowTo = (function() {
238
    return (function (tableId) {
239
        var d, tbody, tr, td, bgc, i, ii, j;
240
        d = document;
241
        tbody = d.getElementById(tableId).getElementsByTagName("tbody").item(0);
242
        tr = d.createElement("tr");
243
        for (i = 0; i < field_counter_js; i++) {
244
                td = d.createElement("td");
245
		td.innerHTML="<INPUT type='hidden' value='" + totalrows +"' name='" + rowname[i] + "_row-" + totalrows + "'></input><input size='" + rowsize[i] + "' class='formfld unknown' name='" + rowname[i] + totalrows + "'></input> ";
246
                tr.appendChild(td);
247
        }
248
        td = d.createElement("td");
249
        td.rowSpan = "1";
250
251 bddc8818 Erik Fonnesbeck
        td.innerHTML = '<a onclick="removeRow(this);return false;" href="#"><img border="0" src="/themes/' + theme + '/images/icons/icon_x.gif" /></a>';
252 b991e3b5 Ermal Lu?i
        tr.appendChild(td);
253
        tbody.appendChild(tr);
254
        totalrows++;
255
    });
256
})();
257
258
function removeRow(el) {
259
    var cel;
260
    while (el && el.nodeName.toLowerCase() != "tr")
261
            el = el.parentNode;
262
263
    if (el && el.parentNode) {
264
        cel = el.getElementsByTagName("td").item(0);
265
        el.parentNode.removeChild(el);
266
    }
267
}
268
269 93bcbb6a Renato Botelho
	rowname[0] = <?=gettext("members");?>;
270 b991e3b5 Ermal Lu?i
	rowtype[0] = "textbox";
271
	rowsize[0] = "30";
272
273 93bcbb6a Renato Botelho
	rowname[2] = <?=gettext("detail");?>;
274 b991e3b5 Ermal Lu?i
	rowtype[2] = "textbox";
275
	rowsize[2] = "50";
276
</script>
277
<input type='hidden' name='members_type' value='textbox' class="formfld unknown" />
278
279
<?php if ($input_errors) print_input_errors($input_errors); ?>
280
<div id="inputerrors"></div>
281
282
<form action="interfaces_qinq_edit.php" method="post" name="iform" id="iform">
283
<table width="100%" border="0" cellpadding="6" cellspacing="0">
284
  <tr>
285 93bcbb6a Renato Botelho
	<td colspan="2" valign="top" class="listtopic"><?=gettext("Interface QinQ Edit");?></td>
286 b991e3b5 Ermal Lu?i
  </tr>
287
  <tr>
288 93bcbb6a Renato Botelho
    <td width="22%" valign="top" class="vncellreq"><?=gettext("Parent interface");?></td>
289 b991e3b5 Ermal Lu?i
    <td width="78%" class="vtable">
290
    <select name="if" id="if" class="formselect">
291
    <?php
292
        foreach ($portlist as $ifn => $ifinfo) {
293
		if (is_jumbo_capable($ifn)) {
294
			echo "<option value=\"{$ifn}\"";
295
                        if ($ifn == $pconfig['if'])
296
				echo "selected";
297
                        echo ">";
298
                        echo htmlspecialchars($ifn . " (" . $ifinfo['mac'] . ")");
299
                        echo "</option>";
300
                }
301
	}
302
    ?>
303
    </select>
304
    <br/>
305 93bcbb6a Renato Botelho
    <span class="vexpl"><?=gettext("Only QinQ capable interfaces will be shown.");?></span></td>
306 b991e3b5 Ermal Lu?i
  </tr>
307
  <tr>
308 93bcbb6a Renato Botelho
    <td width="22%" valign="top" class="vncellreq"><?=gettext("First level tag");?></td>
309 b991e3b5 Ermal Lu?i
    <td width="78%" class="vtable">
310 dd5bf424 Scott Ullrich
      <input name="tag" type="text" class="formfld unknown" id="tag" size="10" value="<?=htmlspecialchars($pconfig['tag']);?>" />
311 b991e3b5 Ermal Lu?i
      <br />
312
      <span class="vexpl">
313 93bcbb6a Renato Botelho
	<?=gettext("This is the first level VLAN tag. On top of this are stacked the member VLANs defined below.");?>
314 b991e3b5 Ermal Lu?i
      </span>
315
    </td>
316
  </tr>
317
  <tr>
318 93bcbb6a Renato Botelho
	<td width="22%" valign="top" class="vncell"><?=gettext("Options");?></td>
319 b991e3b5 Ermal Lu?i
	<td width="78%" class="vtable">
320
<?php /* ?>
321
		<br/>
322
		<input type="checkbox" value="yes" name="autoassign" id="autoassign" <? if ($pconfig['autoassign']) echo checked;?>/>
323
		<span class="vexpl"> Auto assign interface so it can be configured with ip etc...</span>
324
		<br/>
325
		<input type="checkbox" value="yes" name="autoenable" id="autoenable" <? if ($pconfig['autoenable']) echo checked;?>/>
326
		<span class="vexpl"> Auto enable interface so it can be used on filter rules.</span>
327
		<br/>
328
		<input type="checkbox" value="yes" name="autoadjustmtu" id="autoadjustmtu" <? if ($pconfig['autoadjustmtu']) echo "checked";?>>
329
		<span class="vexpl"> Allows to keep clients mtu unchanged(1500). <br/>NOTE: if you are using jumbo frames this option is not needed and may produce incorrect results!</span>
330
<?php */ ?>
331
		<br/>
332
		<input name="autogroup" type="checkbox" value="yes" id="autogroup" <? if ($pconfig['autogroup']) echo "checked";?>>
333 93bcbb6a Renato Botelho
		<span class="vexpl"><?=gettext("Adds interface to QinQ interface groups so you can write filter rules easily.");?></span>
334 b991e3b5 Ermal Lu?i
	</td>
335
  </tr>
336
  <tr>
337 93bcbb6a Renato Botelho
    <td width="22%" valign="top" class="vncell"><?=gettext("Description");?></td>
338 b991e3b5 Ermal Lu?i
    <td width="78%" class="vtable">
339 dd5bf424 Scott Ullrich
      <input name="descr" type="text" class="formfld unknown" id="descr" size="40" value="<?=htmlspecialchars($pconfig['descr']);?>" />
340 b991e3b5 Ermal Lu?i
      <br />
341
      <span class="vexpl">
342 93bcbb6a Renato Botelho
        <?=gettext("You may enter a description here for your reference (not parsed).");?>
343 b991e3b5 Ermal Lu?i
      </span>
344
    </td>
345
  </tr>
346
  <tr>
347 93bcbb6a Renato Botelho
    <td width="22%" valign="top" class="vncellreq"><div id="membersnetworkport"><?=gettext("Member (s)");?></div></td>
348 b991e3b5 Ermal Lu?i
    <td width="78%" class="vtable">
349 a80281c6 Ermal Lu?i
	<span vlass="vexpl">
350 93bcbb6a Renato Botelho
		<?=gettext("You can specify ranges in the input below. The format is pretty simple i.e 9-100 or 10.20...");?>
351 a80281c6 Ermal Lu?i
	</span>
352
	<br/>
353 b991e3b5 Ermal Lu?i
      <table id="maintable">
354
        <tbody>
355
          <tr>
356 93bcbb6a Renato Botelho
            <td><div id="onecolumn"><?=gettext("Tag");?></div></td>
357 b991e3b5 Ermal Lu?i
          </tr>
358
359
	<?php
360
	$counter = 0;
361
	$members = $pconfig['members'];
362
	if ($members <> "") {
363
		$item = explode(" ", $members);
364
		foreach($item as $ww) {
365 9cf46050 Ermal
			$member = $item[$counter];
366 b991e3b5 Ermal Lu?i
	?>
367
        <tr>
368
	<td class="vtable">
369 9cf46050 Ermal
	        <input name="members<?php echo $counter; ?>" class="formselect" id="members<?php echo $counter; ?>" value="<? echo $member;?>">
370 b991e3b5 Ermal Lu?i
	</td>
371
        <td>
372 bddc8818 Erik Fonnesbeck
	<a onclick="removeRow(this); return false;" href="#"><img border="0" src="/themes/<?echo $g['theme'];?>/images/icons/icon_x.gif" /></a>
373 b991e3b5 Ermal Lu?i
	      </td>
374
          </tr>
375
<?php
376
		$counter++;
377
378
		} // end foreach
379
	} // end if
380
?>
381
        </tbody>
382
        <tfoot>
383
384
        </tfoot>
385
		  </table>
386
			<a onclick="javascript:addRowTo('maintable'); return false;" href="#">
387 93bcbb6a Renato Botelho
        <img border="0" src="/themes/<?= $g['theme']; ?>/images/icons/icon_plus.gif" alt="" title="<?=gettext("add another entry");?>" />
388 b991e3b5 Ermal Lu?i
      </a>
389
		</td>
390
  </tr>
391
  <tr>
392
    <td width="22%" valign="top">&nbsp;</td>
393
    <td width="78%">
394 93bcbb6a Renato Botelho
      <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save");?>" />
395
      <a href="interfaces_qinq.php"><input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel");?>" /></a>
396 b991e3b5 Ermal Lu?i
      <?php if (isset($id) && $a_qinqs[$id]): ?>
397 225a2f0b Scott Ullrich
      <input name="id" type="hidden" value="<?=htmlspecialchars($id);?>" />
398 b991e3b5 Ermal Lu?i
      <?php endif; ?>
399
    </td>
400
  </tr>
401
</table>
402
</form>
403
404
<script type="text/javascript">
405
	field_counter_js = 1;
406
	rows = 1;
407
	totalrows = <?php echo $counter; ?>;
408
	loaded = <?php echo $counter; ?>;
409
</script>
410
411
<?php include("fend.inc"); ?>
412
</body>
413
</html>