Merge remote branch 'remotes/origin/Teaman-IPTraffic' into Teaman-ND
[tomato.git] / release / src / router / www / forward-basic.asp
blob58725f54c76aa48a69ccedaa196fd6379afc0fb4
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_hostname(f[5], 1)) {
115 if (!v_ip(f[5], quiet, 1)) return 0;
118 f[6].value = f[6].value.replace(/>/g, '_');
119 if (!v_nodelim(f[6], quiet, 'Description')) return 0;
120 return 1;
123 fog.resetNewEditor = function() {
124 var f = fields.getAll(this.newEditor);
125 f[0].checked = 1;
126 f[1].selectedIndex = 0;
127 f[2].value = '';
128 f[3].value = '';
129 f[4].value = '';
130 f[5].value = '';
131 f[6].value = '';
132 ferror.clearAll(fields.getAll(this.newEditor));
135 fog.setup = function() {
136 this.init('fo-grid', 'sort', 50, [
137 { type: 'checkbox' },
138 { type: 'select', options: [[1, 'TCP'],[2, 'UDP'],[3,'Both']] },
139 { type: 'text', maxlen: 32 },
140 { type: 'text', maxlen: 16 },
141 { type: 'text', maxlen: 5 },
142 { type: 'text', maxlen: 15 },
143 { type: 'text', maxlen: 32 }]);
144 this.headerSet(['On', 'Proto', 'Src Address', 'Ext Ports', 'Int Port', 'Int Address', 'Description']);
145 var nv = nvram.portforward.split('>');
146 for (var i = 0; i < nv.length; ++i) {
147 var r;
149 // temp: <=1.06
150 if (r = nv[i].match(/^(\d)<(\d)<([\d\-\:,]+)<(\d*)<(.*)<(.*)$/)) {
151 r[1] *= 1;
152 r[2] *= 1;
153 r[3] = r[3].replace(/:/g, '-');
154 if (r[5].match(/^ *\d+ *$/)) r[5] = lipp + r[5];
155 fog.insertData(-1, [r[1], r[2], '', r[3], r[4], r[5], r[6]]);
157 // >=1.07
158 else if (r = nv[i].match(/^(\d)<(\d)<(.*)<(.+?)<(\d*)<(.*)<(.*)$/)) {
159 r[1] *= 1;
160 r[2] *= 1;
161 r[4] = r[4].replace(/:/g, '-');
162 if (r[6].match(/^ *\d+ *$/)) r[6] = lipp + r[6];
163 fog.insertData(-1, r.slice(1, 8));
166 fog.sort(6);
167 fog.showNewEditor();
170 function srcSort(a, b)
172 if (a[2].length) return -1;
173 if (b[2].length) return 1;
174 return 0;
177 function save()
179 if (fog.isEditing()) return;
181 var data = fog.getAllData().sort(srcSort);
182 var s = '';
183 for (var i = 0; i < data.length; ++i) {
184 data[i][3] = data[i][3].replace(/-/g, ':');
185 s += data[i].join('<') + '>';
187 var fom = E('_fom');
188 fom.portforward.value = s;
189 form.submit(fom, 0, 'tomato.cgi');
192 function init()
194 fog.recolor();
195 fog.resetNewEditor();
197 </script>
198 </head>
199 <body onload='init()'>
200 <form id='_fom' method='post' action='javascript:{}'>
201 <table id='container' cellspacing=0>
202 <tr><td colspan=2 id='header'>
203 <div class='title'>Tomato</div>
204 <div class='version'>Version <% version(); %></div>
205 </td></tr>
206 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
207 <td id='content'>
208 <div id='ident'><% ident(); %></div>
210 <!-- / / / -->
212 <input type='hidden' name='_nextpage' value='forward-basic.asp'>
213 <input type='hidden' name='_service' value='firewall-restart'>
215 <input type='hidden' name='portforward'>
217 <div class='section-title'>Port Forwarding</div>
218 <div class='section'>
219 <table class='tomato-grid' cellspacing=1 id='fo-grid'></table>
220 <script type='text/javascript'>fog.setup();</script>
221 </div>
223 <div>
224 <ul>
225 <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".
226 <li><b>Ext Ports</b> - The ports to be forwarded, as seen from the WAN. Ex: "2345", "200,300", "200-300,400".
227 <li><b>Int Port</b> <i>(optional)</i> - The destination port inside the LAN. If blank, the destination port
228 is the same as <i>Ext Ports</i>. Only one port per entry is supported when forwarding to a different internal
229 port.
230 <li><b>Int Address</b> - The destination address inside the LAN.
231 </ul>
232 </div>
234 <br>
235 <script type='text/javascript'>show_notice1('<% notice("iptables"); %>');</script>
237 <!-- / / / -->
239 </td></tr>
240 <tr><td id='footer' colspan=2>
241 <span id='footer-msg'></span>
242 <input type='button' value='Save' id='save-button' onclick='save()'>
243 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
244 </td></tr>
245 </table>
246 </form>
247 </body>
248 </html>