Project

General

Profile

Download (20.1 KB) Statistics
| Branch: | Tag: | Revision:

univnautes / usr / local / www / firewall_shaper_layer7.php @ a1b66bec

1
<?php
2
/* $Id$ */
3
/*
4
	firewall_shaper_layer7.php
5
	Copyright (C) 2008 Helder Pereira, André Ribeiro
6
	All rights reserved.
7

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

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

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

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

    
34
##|+PRIV
35
##|*IDENT=page-firewall-trafficshaper-layer7
36
##|*NAME=Firewall: Traffic Shaper: Layer7 page
37
##|*DESCR=Allow access to the 'Firewall: Traffic Shaper: Layer7' page.
38
##|*MATCH=firewall_shaper_layer7.php*
39
##|-PRIV
40

    
41
require("guiconfig.inc");
42
require_once("functions.inc");
43
require_once("filter.inc");
44
require_once("shaper.inc");
45

    
46
// Variables protocols (dynamic) and structures (static)
47
$avail_protos =& generate_protocols_array();
48
$avail_structures = array("action","queue","limiter");
49

    
50
// Available behaviours
51
$avail_behaviours_action = array("block");
52
read_altq_config();
53
$avail_behaviours_altq = get_altq_name_list();
54
read_dummynet_config();
55
$avail_behaviours_limiter = get_dummynet_name_list();
56
$show_proto_form = false;
57

    
58
//More variables
59
$pgtitle = array(gettext("Firewall"),gettext("Traffic Shaper"), gettext("Layer7"));
60
$shortcut_section = "trafficshaper";
61

    
62
$output_form = "";
63

    
64
$default_layer7shaper_msg = "<tr><td colspan=\"4\">";
65
$default_layer7shaper_msg .= "<span class=\"vexpl\"><span class=\"red\"><strong>" . gettext("Note") . ":<br />";
66
$default_layer7shaper_msg .= "</strong></span>" . gettext("You can add new layer7 protocol patterns by simply uploading the file") . " <a href=\"diag_patterns.php\">" . gettext("here") . ".</a></span><br />";
67
$default_layer7shaper_msg .= "</td></tr>";
68

    
69

    
70
read_layer7_config();
71

    
72
if($_GET['reset'] <> "") {
73
	// kill all ipfw-classifyd processes
74
	mwexec("killall -9 ipfw-classifyd");
75
	exit;
76
}
77

    
78
if ($_GET) {
79
	if ($_GET['container'])
80
		$name = htmlspecialchars(trim($_GET['container']));
81
        if ($_GET['action'])
82
                $action = htmlspecialchars($_GET['action']);
83
}
84

    
85
if($_POST) {
86
	if ($_POST['container']) {
87
		$name = htmlspecialchars(trim($_POST['container']));
88
	}
89
}
90

    
91
if ($name) {
92
	//Get the object from the 7rules list
93
	$container = $layer7_rules_list[$name];
94
}
95

    
96
if ($_GET) {
97
	switch ($action) {
98
		case "add":
99
			$show_proto_form = true;
100
			$container = new layer7();
101
			$output_form .= $container->build_form(); //constructs the graphical interface on the right side
102
			unset($container);
103
			break;
104
		case "show":
105
			$show_proto_form = true;
106
			if($container) {
107
				$output_form .= $container->build_form();
108
			}
109
			else {
110
				$show_proto_form = false;
111
				$input_errors[] = gettext("Layer7 Rules Container not found!");
112
			}
113
			break;
114
		default:
115
			echo log_error("Get default");
116
			$show_proto_form = false;
117
			$output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
118
			break;
119
	}
120
}
121

    
122
//add a new l7rules container
123
else if ($_POST) {
124
	$show_proto_form = true;
125
	unset($input_errors);
126

    
127
	if($_POST['submit']) {
128
		if (isset($layer7_rules_list[$name])) {
129
			$l7r = $layer7_rules_list[$name];
130
			$_POST['divert_port'] = $l7r->GetRPort();
131
		} else {
132
			$l7r =& new layer7();
133
			$_POST['divert_port'] = $l7r->gen_divert_port();
134
		}
135
		for($i=0; $_POST['protocol'][$i] <> ""; $i++) {
136
			$_POST['l7rules'][$i]['protocol'] = $_POST['protocol'][$i];
137
			$_POST['l7rules'][$i]['structure'] = $_POST['structure'][$i];
138
			$_POST['l7rules'][$i]['behaviour'] = $_POST['behaviour'][$i];
139
		}
140
		$l7r->validate_input($_POST,$input_errors);
141
		$l7r->ReadConfig($_POST['container'], $_POST);
142
		//Before writing the results, we need to test for repeated protocols
143
		$non_dupes = array();
144
		$dupes = array();
145
		for($j=0; $j<$i; $j++) {
146
			if(!$non_dupes[$_POST['protocol'][$j]])
147
				$non_dupes[$_POST['protocol'][$j]] = true;
148
			else
149
				$dupes[] = $_POST['protocol'][$j];
150
		}
151
		unset($non_dupes);
152
		if(sizeof($dupes) == 0 && !$input_errors) {
153
			$l7r->wconfig();
154
			if (write_config())
155
				mark_subsystem_dirty('shaper');
156

    
157
			read_layer7_config();
158
		}
159
		else {
160
			if(sizeof($dupes) > 0) {
161
				$dupe_error = gettext("Found the following repeated protocol definitions") . ": ";
162
				foreach($dupes as $dupe)
163
					$dupe_error .= "$dupe ";
164
				$input_errors[] .= $dupe_error;
165
			}
166
		}
167
		unset($dupes);
168
		unset($dupe_error);
169
		//Even if there are repeated protocols, we won't lose any previous values
170
		//The user will be able to solve the situation
171
		$output_form .= $l7r->build_form();
172
		//Necessary to correctly build the proto form
173
		$container = $layer7_rules_list[$name];
174
		if($input_errors)
175
			$container =& $l7r;
176
	} else if($_POST['apply']) {
177
		write_config();
178

    
179
		$retval = 0;
180
		$retval = filter_configure();
181
		$savemsg = get_std_save_message($retval);
182

    
183
		if(stristr($retval, "error") <> true)
184
			$savemsg = get_std_save_message($retval);
185
		else
186
			$savemsg = $retval;
187

    
188
		clear_subsystem_dirty('shaper');
189

    
190
		if($container) {
191
			$output_form .= $container->build_form();
192
		} else {
193
			$show_proto_form = false;
194
			$output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
195
		}
196
	} else if ($_POST['delete']) {
197
		$container->delete_l7c();
198
		if (write_config())
199
			mark_subsystem_dirty('shaper');
200
		unset($container);
201

    
202
		header("Location: firewall_shaper_layer7.php");
203
		exit;
204
	}
205
	else {
206
		$show_proto_form = false;
207
	}
208
}
209
else {
210
	$show_proto_form = false;
211
	$output_form .= $dn_default_shaper_msg . $default_layer7shaper_msg;
212
}
213

    
214
// Builds the left tree
215
$tree = "<ul class=\"tree\" >";
216
if (is_array($layer7_rules_list)) {
217
        foreach ($layer7_rules_list as $tmpl7) {
218
                $tree .= $tmpl7->build_tree();
219
        }
220
}
221
$tree .= "</ul>";
222

    
223
$output = "<table summary=\"output form\">";
224
$output .= $output_form;
225
$closehead = false;
226
include("head.inc");
227
?>
228
<link rel="stylesheet" type="text/css" media="all" href="./tree/tree.css" />
229
<script type="text/javascript" src="./tree/tree.js"></script>
230

    
231
<script type="text/javascript">
232
//<![CDATA[
233
var initial_count = new Array();
234
var rows_limit = 0; // Set to 0 to disable limitation
235

    
236

    
237
/* Build the behaviours arrays in javascript */
238
var js_behaviours_action = ['block']; //static
239

    
240
var js_behaviours_altq = new Array();
241
js_behaviours_altq = array_altq(js_behaviours_altq);
242

    
243
var js_behaviours_limiter = new Array();
244
js_behaviours_limiter = array_limiter(js_behaviours_limiter);
245

    
246
function array_altq(a_behav) {
247
	var index;
248
	<?php if (!empty($avail_behaviours_altq)) {
249
	  foreach ($avail_behaviours_altq as $key => $queue) { ?>
250
	    name = "<?= $queue; ?>";
251
	    index = <?= $key; ?>;
252
	    a_behav[index] = name;
253
	<?php }
254
	} ?>
255
	return a_behav;
256
}
257

    
258
function array_limiter(a_behav) {
259
	var index;
260
	<?php if (!empty($avail_behaviours_limiter)) {
261
	  foreach ($avail_behaviours_limiter as $key => $limiter) { ?>
262
		name = "<?= $limiter; ?>";
263
		index = <?= $key; ?>;
264
		a_behav[index] = name;
265
	<?php }
266
	} ?>
267
	return a_behav;
268
}
269

    
270
/* Fill the variables with available protocols, structures and behaviours */
271
function fillProtocol() {
272
	var protocol = '<select name="protocol[]" style="font-size:8pt">';
273
	var name;
274

    
275
	<?php foreach ($avail_protos as $key => $proto) { ?>
276
		name = "<?= $proto; ?>";
277
		protocol += "<option value=" + name + ">" + name + "<\/option>";
278
	<?php } ?>
279
	protocol += "<\/select>";
280

    
281
	return protocol;
282
}
283

    
284
function fillStructure() {
285
	var structure = '<select name="structure[]" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">';
286
	var name;
287
	<?php foreach ($avail_structures as $key => $struct) { ?>
288
		name = "<?= $struct; ?>";
289
		if(name == "queue") {
290
		  if(js_behaviours_altq != "") { structure += "<option value=" + name + ">" + name + "<\/option>";}
291
		}
292
		else {
293
		  if(name == "limiter") {
294
		    if(js_behaviours_limiter != "") { structure += "<option value=" + name + ">" + name + "<\/option>";}
295
		  }
296
		  else structure += "<option value=" + name + ">" + name + "<\/option>"; //action
297
		}
298
	<?php } ?>
299
	structure += "<\/select>";
300

    
301
	return structure;
302
}
303

    
304
//Used by default to fill the values when inserting a new row.
305
function fillBehaviour() {
306
	var behaviour = '<select name="behaviour[]" style="width:80px; font-size:8pt">';
307
	var name;
308
	<?php foreach ($avail_behaviours_action as $key => $behav) { ?>
309
		name = "<?= $behav; ?>";
310
		behaviour += "<option value=" + name + ">" + name + "<\/option>";
311
	<?php } ?>
312
	behaviour += "<\/select>";
313

    
314
	return behaviour;
315
}
316

    
317
/* Change the values on behaviours select when changing the structure row */
318
function changeBehaviourValues(row) {
319
	var selectedRow = row.rowIndex - 2; //because row.rowIndex returns 2, not 0
320
	var structureSelected = document.getElementsByName("structure[]")[selectedRow].value;
321

    
322
	//Select the behaviours values to array a_behav
323
	var a_behav = new Array();
324
	if (structureSelected == "action") {
325
		a_behav = js_behaviours_action; //static
326
	}
327
	else {
328
		if (structureSelected == "queue") {
329
			a_behav = js_behaviours_altq;
330
		}
331
		else {
332
			a_behav = js_behaviours_limiter;
333
		}
334
	}
335

    
336
	//Build the html statement with the array values previously selected
337
	var new_behav;
338
	var name;
339
	for(i=0; i<a_behav.length; i++) {
340
		new_behav += "<option value=" + a_behav[i] + ">" + a_behav[i] + "<\/option>";
341
	}
342

    
343
	document.getElementsByName("behaviour[]")[selectedRow].innerHTML = new_behav;
344
}
345

    
346
/* Add row to the table */
347
function addRow(table_id) {
348
  var tbl = document.getElementById(table_id);
349
  // counting rows in table
350
  var rows_count = tbl.rows.length;
351
  if (initial_count[table_id] == undefined) {
352
    // if it is first adding in this table setting initial rows count
353
    initial_count[table_id] = rows_count;
354
  }
355
  // determining real count of added fields
356
  var tFielsNum =  rows_count - initial_count[table_id];
357
  if (rows_limit!=0 && tFielsNum >= rows_limit) return false;
358

    
359
  var remove = '<a onclick="removeRow(\''+table_id+'\',this.parentNode.parentNode)" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /><\/a>';
360

    
361
  try {
362
    var newRow = tbl.insertRow(rows_count);
363
    var newCell = newRow.insertCell(0);
364
    newCell.innerHTML = fillProtocol();
365
    var newCell = newRow.insertCell(1);
366
    newCell.innerHTML = fillStructure();
367
    var newCell = newRow.insertCell(2);
368
    newCell.innerHTML = fillBehaviour();
369
    var newCell = newRow.insertCell(3);
370
    newCell.innerHTML = remove;
371
  }
372
  catch (ex) {
373
    //if exception occurs
374
    alert(ex);
375
  }
376
}
377

    
378
/* Remove row from the table */
379
function removeRow(tbl,row) {
380
  var table = document.getElementById(tbl);
381
  try {
382
    table.deleteRow(row.rowIndex);
383
  } catch (ex) {
384
    alert(ex);
385
  }
386
}
387
//]]>
388
</script>
389
</head>
390

    
391
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
392

    
393
<?php include("fbegin.inc"); ?>
394
<div id="inputerrors"></div>
395
<?php if ($input_errors) print_input_errors($input_errors); ?>
396

    
397
<form action="firewall_shaper_layer7.php" method="post" id="iform" name="iform">
398

    
399
<?php if ($savemsg) print_info_box($savemsg); ?>
400
<?php if (is_subsystem_dirty('shaper')): ?><p>
401
<?php print_info_box_np(gettext("The traffic shaper configuration has been changed")  .  ".<br />" . gettext("You must apply the changes in order for them to take effect."));?><br /></p>
402
<?php endif; ?>
403
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper layer7">
404
  <tr><td>
405
<?php
406
	$tab_array = array();
407
	$tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
408
	$tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
409
	$tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
410
	$tab_array[3] = array(gettext("Layer7"), true, "firewall_shaper_layer7.php");
411
	$tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
412
	display_top_tabs($tab_array);
413
?>
414
  </td></tr>
415
  <tr>
416
    <td>
417
	<div id="mainarea">
418
              <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
419

    
420
		<?php if (count($layer7_rules_list) > 0): ?>
421
                        <tr class="tabcont"><td width="25%" align="left">
422
                        </td><td width="75%"> </td></tr>
423

    
424
		<?php endif; ?>
425
			<tr>
426
			<td width="25%" valign="top" align="left">
427
			<?php
428
				echo $tree;
429
			?>
430
			<br /><br />
431
			<a href="firewall_shaper_layer7.php?action=add">
432
			<img src="./themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif" title="<?=gettext("Create new l7 rules group"); ?>" width="17" height="17" border="0" alt="add" />  <?=gettext("Create new l7 rules group"); ?>
433
			</a><br />
434
			</td>
435
			<td width="75%" valign="top" align="center">
436
			<div id="shaperarea" style="position:relative">
437
			<?php
438
				echo $output;
439
			?>
440

    
441
			<!-- Layer 7 rules form -->
442
			<?php if($show_proto_form): ?>
443
			<tr><td width="22%" valign="top" class="vncellreq">
444
                                <div id="addressnetworkport">
445
                                        <?=gettext("Rule(s)"); ?>
446
                                </div>
447
                        </td>
448

    
449
                        <td width="78%" class="vtable">
450
                                <table width="236" id="maintable" summary="main table">
451
					<tbody>
452

    
453
						<tr>
454
                                                        <td colspan="4">
455
                                                            <div style="font-size: 8pt; padding:5px; margin-top: 16px; margin-bottom: 16px; border:1px dashed #000066;"
456
                                                                id="itemhelp">
457
                                                                <?=gettext("Add one or more rules"); ?>
458
                                                            </div>
459
                                                        </td>
460
                                                </tr>
461

    
462
                                                <tr>
463
                                                        <td>
464
                                                            <div style="font-size: 8pt; padding:5px;"
465
                                                                id="onecolumn">
466
                                                                <?=gettext("Protocol"); ?>
467
                                                            </div>
468
                                                        </td>
469

    
470
                                                        <td>
471
                                                            <div style="font-size: 8pt; padding:5px;"
472
                                                                id="twocolumn">
473
                                                                <?=gettext("Structure"); ?>
474
                                                            </div>
475
                                                        </td>
476

    
477
                                                        <td>
478
                                                            <div style="font-size: 8pt; padding:5px;"
479
                                                                id="threecolumn">
480
                                                                <?=gettext("Behaviour"); ?>
481
                                                            </div>
482
                                                        </td>
483
                                                </tr>
484
                                                <!-- PHP Code to generate the existing rules -->
485
						<?php
486
						if($container) {
487
							foreach($container->rsets as $l7rule) {
488
						?>
489
						<tr>
490
							<td>
491
							<select name="protocol[]" class="formselect" style="font-size:8pt">
492
							<?php foreach($avail_protos as $proto): ?>
493
							<option value="<?=$proto;?>" <?php if ($proto == $l7rule->GetRProtocol()) echo "selected=\"selected\""; ?>><?=$proto;?></option>
494
							<?php endforeach; ?>
495
							</select>
496
						</td>
497
						<td>
498
							<select name="structure[]" class="formselect" style="font-size:8pt" onchange="changeBehaviourValues(this.parentNode.parentNode);">
499
							<?php foreach($avail_structures as $struct) {
500
							  if($struct == "queue") {
501
							    if(!empty($avail_behaviours_altq)) { ?>
502
							      <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
503
							    <?php }
504
							  }
505
							  else {
506
							    if($struct == "limiter") {
507
								if(!empty($avail_behaviours_limiter)) { ?>
508
								  <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
509
								<?php }
510
							    }
511
							    else {
512
							      if($struct == "action") { ?>
513
								  <option value="<?=$struct ?>" <?php if ($struct == $l7rule->GetRStructure()) echo "selected=\"selected\""; ?>><?=$struct;?></option>
514
							      <?php }
515
							    }
516
							  }
517
							} ?>
518
							</select>
519
						</td>
520
						<td>
521
							<select name="behaviour[]" class="formselect" style="width:80px; font-size:8pt">
522
							<?php if($l7rule->GetRStructure() == "action"): ?>
523
								<?php foreach($avail_behaviours_action as $behaviour): ?>
524
								<option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
525
								<?php endforeach; ?>
526
								</select>
527
							<?php endif; ?>
528
							<?php if($l7rule->GetRStructure() == "queue"): ?>
529
								<?php foreach($avail_behaviours_altq as $behaviour): ?>
530
								<option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
531
								<?php endforeach; ?>
532
								</select>
533
							<?php endif; ?>
534
							<?php if($l7rule->GetRStructure() == "limiter"): ?>
535
								<?php foreach($avail_behaviours_limiter as $behaviour): ?>
536
								<option value="<?=$behaviour ?>" <?php if ($behaviour == $l7rule->GetRBehaviour()) echo "selected=\"selected\""; ?>><?=$behaviour;?></option>
537
								<?php endforeach; ?>
538
								</select>
539
							<?php endif; ?>
540
						</td>
541
						<td>
542
							<a onclick="removeRow('maintable',this.parentNode.parentNode); return false;" href="#"><img border="0" src="/themes/<?=$g['theme'];?>/images/icons/icon_x.gif" alt="x" /></a>
543
						</td>
544
						</tr>
545

    
546
						<?php
547
							} //end foreach
548
						} //end if
549
						?>
550
                                        </tbody>
551
                                </table>
552

    
553
                                        <a onclick="javascript:addRow('maintable'); return false;" href="#"> <img border="0"
554
                                                src="/themes/<?=$g['theme']; ?>/images/icons/icon_plus.gif"
555
                                                alt="" title="<?=gettext("add another entry"); ?>" /> </a>
556
                        </td>
557
			</tr>
558

    
559
                        <tr>
560
                        <td width="22%" valign="top">
561
                                &nbsp;
562
                        </td>
563

    
564
                        <td width="78%">
565
                                <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
566

    
567
				<a href="firewall_shaper_layer7.php">
568
                                <input id="cancelbutton" name="cancelbutton" type="button" class="formbtn" value="<?=gettext("Cancel"); ?>" />
569

    
570
				<?php if($container): ?>
571
						<input id="delete" type="submit" class="formbtn" name="delete" value="<?=gettext("Delete"); ?>" />
572
				<?php endif ?>
573
				</a>
574
                        </td>
575
                        </tr>
576
			<?php endif; ?>
577
			<!-- End of layer7 rules form -->
578
			</table>
579
			</div><!-- end of div:shape area -->
580

    
581
		      </td></tr>
582
                    </table>
583
		</div>
584
	  </td>
585
	</tr>
586
</table>
587
</form>
588

    
589
<?php include("fend.inc"); ?>
590
</body>
591
</html>
(76-76/256)