Projet

Général

Profil

Télécharger (20,1 ko) Statistiques
| Branche: | Tag: | Révision:

univnautes / usr / local / www / firewall_shaper_layer7.php @ 6b71ebb7

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
$rowIndex = 0;
217
if (is_array($layer7_rules_list)) {
218
        foreach ($layer7_rules_list as $tmpl7) {
219
			$rowIndex++;
220
                $tree .= $tmpl7->build_tree();
221
        }
222
}
223
if ($rowIndex == 0)
224
	$tree .= "<li></li>";
225
$tree .= "</ul>";
226

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

    
235
<script type="text/javascript">
236
//<![CDATA[
237
var initial_count = new Array();
238
var rows_limit = 0; // Set to 0 to disable limitation
239

    
240

    
241
/* Build the behaviours arrays in javascript */
242
var js_behaviours_action = ['block']; //static
243

    
244
var js_behaviours_altq = new Array();
245
js_behaviours_altq = array_altq(js_behaviours_altq);
246

    
247
var js_behaviours_limiter = new Array();
248
js_behaviours_limiter = array_limiter(js_behaviours_limiter);
249

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

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

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

    
279
	<?php foreach ($avail_protos as $key => $proto) { ?>
280
		name = "<?= $proto; ?>";
281
		protocol += "<option value=" + name + ">" + name + "<\/option>";
282
	<?php } ?>
283
	protocol += "<\/select>";
284

    
285
	return protocol;
286
}
287

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

    
305
	return structure;
306
}
307

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

    
318
	return behaviour;
319
}
320

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

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

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

    
347
	document.getElementsByName("behaviour[]")[selectedRow].innerHTML = new_behav;
348
}
349

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

    
363
  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>';
364

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

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

    
395
<body link="#0000CC" vlink="#0000CC" alink="#0000CC">
396

    
397
<?php include("fbegin.inc"); ?>
398
<div id="inputerrors"></div>
399
<?php if ($input_errors) print_input_errors($input_errors); ?>
400

    
401
<form action="firewall_shaper_layer7.php" method="post" id="iform" name="iform">
402

    
403
<?php if ($savemsg) print_info_box($savemsg); ?>
404
<?php if (is_subsystem_dirty('shaper')): ?><p>
405
<?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>
406
<?php endif; ?>
407
<table width="100%" border="0" cellpadding="0" cellspacing="0" summary="traffic shaper layer7">
408
  <tr><td>
409
<?php
410
	$tab_array = array();
411
	$tab_array[0] = array(gettext("By Interface"), false, "firewall_shaper.php");
412
	$tab_array[1] = array(gettext("By Queue"), false, "firewall_shaper_queues.php");
413
	$tab_array[2] = array(gettext("Limiter"), false, "firewall_shaper_vinterface.php");
414
	$tab_array[3] = array(gettext("Layer7"), true, "firewall_shaper_layer7.php");
415
	$tab_array[4] = array(gettext("Wizards"), false, "firewall_shaper_wizards.php");
416
	display_top_tabs($tab_array);
417
?>
418
  </td></tr>
419
  <tr>
420
    <td>
421
	<div id="mainarea">
422
              <table class="tabcont" width="100%" border="0" cellpadding="0" cellspacing="0" summary="main area">
423

    
424
		<?php if (count($layer7_rules_list) > 0): ?>
425
                        <tr class="tabcont"><td width="25%" align="left">
426
                        </td><td width="75%"> </td></tr>
427

    
428
		<?php endif; ?>
429
			<tr>
430
			<td width="25%" valign="top" align="left">
431
			<?php
432
				echo $tree;
433
			?>
434
			<br/><br/>
435
			<a href="firewall_shaper_layer7.php?action=add">
436
			<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"); ?>
437
			</a><br/>
438
			</td>
439
			<td width="75%" valign="top" align="center">
440
			<div id="shaperarea" style="position:relative">
441
			<?php
442
				echo $output;
443
			?>
444

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

    
453
                        <td width="78%" class="vtable">
454
                                <table width="236" id="maintable" summary="main table">
455
					<tbody>
456

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

    
466
                                                <tr>
467
                                                        <td>
468
                                                            <div style="font-size: 8pt; padding:5px;"
469
                                                                id="onecolumn">
470
                                                                <?=gettext("Protocol"); ?>
471
                                                            </div>
472
                                                        </td>
473

    
474
                                                        <td>
475
                                                            <div style="font-size: 8pt; padding:5px;"
476
                                                                id="twocolumn">
477
                                                                <?=gettext("Structure"); ?>
478
                                                            </div>
479
                                                        </td>
480

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

    
550
						<?php
551
							} //end foreach
552
						} //end if
553
						?>
554
                                        </tbody>
555
                                </table>
556

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

    
563
                        <tr>
564
                        <td width="22%" valign="top">
565
                                &nbsp;
566
                        </td>
567

    
568
                        <td width="78%">
569
                                <input id="submit" name="submit" type="submit" class="formbtn" value="<?=gettext("Save"); ?>" />
570

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

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

    
585
		      </td></tr>
586
                    </table>
587
		</div>
588
	  </td>
589
	</tr>
590
</table>
591
</form>
592

    
593
<?php include("fend.inc"); ?>
594
</body>
595
</html>
(74-74/246)