Busybox: Upgrade to 1.21.1 (stable). lsof active.
[tomato.git] / release / src / router / www / forward-basic.asp
blob444634239860a8365fda308c1d3d4500fa5a91ae
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
9 -->
10 <html>
11 <head>
12 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
13 <meta name='robots' content='noindex,nofollow'>
14 <title>[<% ident(); %>] Forwarding: Basic</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'>
16 <link rel='stylesheet' type='text/css' href='color.css'>
17 <script type='text/javascript' src='tomato.js'></script>
19 <!-- / / / -->
20 <style type='text/css'>
21 #fo-grid .co1 {
22 width: 25px;
23 text-align: center;
25 #fo-grid .co2 {
26 width: 70px;
28 #fo-grid .co3 {
29 width: 120px;
31 #fo-grid .co4 {
32 width: 80px;
34 #fo-grid .co5 {
35 width: 55px;
37 #fo-grid .co6 {
38 width: 110px;
40 #fo-grid .co7 {
41 width: 300px;
44 </style>
46 <script type='text/javascript' src='debug.js'></script>
48 <script type='text/javascript'>
50 // <% nvram("portforward"); %>
51 var lipp = '<% lipp(); %>.';
53 var fog = new TomatoGrid();
55 fog.sortCompare = function(a, b) {
56 var col = this.sortColumn;
57 var da = a.getRowData();
58 var db = b.getRowData();
59 var r;
61 switch (col) {
62 case 2: // src
63 case 5: // ia
64 r = cmpIP(da[col], db[col]);
65 break;
66 case 0: // on
67 case 1: // proto
68 case 3: // ext prt
69 case 4: // int prt
70 r = cmpInt(da[col], db[col]);
71 break;
72 default:
73 r = cmpText(da[col], db[col]);
74 break;
77 return this.sortAscending ? r : -r;
80 fog.dataToView = function(data) {
81 return [(data[0] != '0') ? 'On' : '', ['TCP', 'UDP', 'Both'][data[1] - 1], (data[2].match(/(.+)-(.+)/)) ? (RegExp.$1 + ' -<br>' + RegExp.$2) : data[2], data[3], data[4], data[5], data[6]];
84 fog.fieldValuesToData = function(row) {
85 var f = fields.getAll(row);
86 return [f[0].checked ? 1 : 0, f[1].value, f[2].value, f[3].value, f[4].value, f[5].value, f[6].value];
89 fog.verifyFields = function(row, quiet) {
90 var f = fields.getAll(row);
91 var s;
93 f[2].value = f[2].value.trim();
94 ferror.clear(f[2]);
95 if ((f[2].value.length) && (!v_iptaddr(f[2], quiet))) return 0;
97 if (!v_iptport(f[3], quiet)) return 0;
98 ferror.clear(f[4]);
99 if (f[3].value.search(/[-:,]/) != -1) {
100 f[4].value = '';
101 f[4].disabled = true;
103 else {
104 f[4].disabled = false;
105 f[4].value = f[4].value.trim();
106 if (f[4].value != '') {
107 if (!v_port(f[4], quiet)) return 0;
110 ferror.clear(f[4]);
112 s = f[5].value.trim();
113 if (s.match(/^ *\d+ *$/)) f[5].value = lipp + s;
114 if (!v_ip(f[5], quiet, 1)) return 0;
116 f[6].value = f[6].value.replace(/>/g, '_');
117 if (!v_nodelim(f[6], quiet, 'Description')) return 0;
118 return 1;
121 fog.resetNewEditor = function() {
122 var f = fields.getAll(this.newEditor);
123 f[0].checked = 1;
124 f[1].selectedIndex = 0;
125 f[2].value = '';
126 f[3].value = '';
127 f[4].value = '';
128 f[5].value = '';
129 f[6].value = '';
130 ferror.clearAll(fields.getAll(this.newEditor));
133 fog.setup = function() {
134 this.init('fo-grid', 'sort', 50, [
135 { type: 'checkbox' },
136 { type: 'select', options: [[1, 'TCP'],[2, 'UDP'],[3,'Both']] },
137 { type: 'text', maxlen: 32 },
138 { type: 'text', maxlen: 16 },
139 { type: 'text', maxlen: 5 },
140 { type: 'text', maxlen: 15 },
141 { type: 'text', maxlen: 32 }]);
142 this.headerSet(['On', 'Proto', 'Src Address', 'Ext Ports', 'Int Port', 'Int Address', 'Description']);
143 var nv = nvram.portforward.split('>');
144 for (var i = 0; i < nv.length; ++i) {
145 var r;
147 // temp: <=1.06
148 if (r = nv[i].match(/^(\d)<(\d)<([\d\-\:,]+)<(\d*)<(.*)<(.*)$/)) {
149 r[1] *= 1;
150 r[2] *= 1;
151 r[3] = r[3].replace(/:/g, '-');
152 if (r[5].match(/^ *\d+ *$/)) r[5] = lipp + r[5];
153 fog.insertData(-1, [r[1], r[2], '', r[3], r[4], r[5], r[6]]);
155 // >=1.07
156 else if (r = nv[i].match(/^(\d)<(\d)<(.*)<(.+?)<(\d*)<(.*)<(.*)$/)) {
157 r[1] *= 1;
158 r[2] *= 1;
159 r[4] = r[4].replace(/:/g, '-');
160 if (r[6].match(/^ *\d+ *$/)) r[6] = lipp + r[6];
161 fog.insertData(-1, r.slice(1, 8));
164 fog.sort(6);
165 fog.showNewEditor();
168 function srcSort(a, b)
170 if (a[2].length) return -1;
171 if (b[2].length) return 1;
172 return 0;
175 function save()
177 if (fog.isEditing()) return;
179 var data = fog.getAllData().sort(srcSort);
180 var s = '';
181 for (var i = 0; i < data.length; ++i) {
182 data[i][3] = data[i][3].replace(/-/g, ':');
183 s += data[i].join('<') + '>';
185 var fom = E('_fom');
186 fom.portforward.value = s;
187 form.submit(fom, 0, 'tomato.cgi');
190 function init()
192 fog.recolor();
193 fog.resetNewEditor();
194 var c;
195 if (((c = cookie.get('forward_basic_notes_vis')) != null) && (c == '1')) toggleVisibility("notes");
198 function toggleVisibility(whichone) {
199 if (E('sesdiv_' + whichone).style.display == '') {
200 E('sesdiv_' + whichone).style.display = 'none';
201 E('sesdiv_' + whichone + '_showhide').innerHTML = '(Click here to show)';
202 cookie.set('forward_basic_' + whichone + '_vis', 0);
203 } else {
204 E('sesdiv_' + whichone).style.display='';
205 E('sesdiv_' + whichone + '_showhide').innerHTML = '(Click here to hide)';
206 cookie.set('forward_basic_' + whichone + '_vis', 1);
209 </script>
210 </head>
211 <body onload='init()'>
212 <form id='_fom' method='post' action='javascript:{}'>
213 <table id='container' cellspacing=0>
214 <tr><td colspan=2 id='header'>
215 <div class='title'>Tomato</div>
216 <div class='version'>Version <% version(); %></div>
217 </td></tr>
218 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
219 <td id='content'>
220 <div id='ident'><% ident(); %></div>
222 <!-- / / / -->
224 <input type='hidden' name='_nextpage' value='forward-basic.asp'>
225 <input type='hidden' name='_service' value='firewall-restart'>
227 <input type='hidden' name='portforward'>
229 <div class='section-title'>Port Forwarding</div>
230 <div class='section'>
231 <table class='tomato-grid' cellspacing=1 id='fo-grid'></table>
232 <script type='text/javascript'>fog.setup();</script>
233 </div>
235 <div class='section-title'>Notes <small><i><a href='javascript:toggleVisibility("notes");'><span id='sesdiv_notes_showhide'>(Click here to show)</span></a></i></small></div>
236 <div class='section' id='sesdiv_notes' style='display:none'>
237 <ul>
238 <li><b>Src Address</b> <i>(optional)</i> - Forward only if from this address. Ex: "1.2.3.4", "1.2.3.4 - 2.3.4.5", "1.2.3.0/24", "me.example.com".
239 <li><b>Ext Ports</b> - The ports to be forwarded, as seen from the WAN. Ex: "2345", "200,300", "200-300,400".
240 <li><b>Int Port</b> <i>(optional)</i> - The destination port inside the LAN. If blank, the destination port
241 is the same as <i>Ext Ports</i>. Only one port per entry is supported when forwarding to a different internal
242 port.
243 <li><b>Int Address</b> - The destination address inside the LAN.
244 </ul>
245 </div>
247 <br>
248 <script type='text/javascript'>show_notice1('<% notice("iptables"); %>');</script>
250 <!-- / / / -->
252 </td></tr>
253 <tr><td id='footer' colspan=2>
254 <span id='footer-msg'></span>
255 <input type='button' value='Save' id='save-button' onclick='save()'>
256 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
257 </td></tr>
258 </table>
259 </form>
260 </body>
261 </html>