1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
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.
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>
20 <style type='text/css'
>
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();
64 r
= cmpIP(da
[col
], db
[col
]);
70 r
= cmpInt(da
[col
], db
[col
]);
73 r
= cmpText(da
[col
], db
[col
]);
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
);
93 f
[2].value
= f
[2].value
.trim();
95 if ((f
[2].value
.length
) && (!v_iptaddr(f
[2], quiet
))) return 0;
97 if (!v_iptport(f
[3], quiet
)) return 0;
99 if (f
[3].value
.search(/[-:,]/) != -1) {
101 f
[4].disabled
= true;
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;
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;
121 fog
.resetNewEditor = function() {
122 var f
= fields
.getAll(this.newEditor
);
124 f
[1].selectedIndex
= 0;
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
) {
148 if (r
= nv
[i
].match(/^(\d)<(\d)<([\d\-\:,]+)<(\d*)<(.*)<(.*)$/)) {
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]]);
156 else if (r
= nv
[i
].match(/^(\d)<(\d)<(.*)<(.+?)<(\d*)<(.*)<(.*)$/)) {
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));
168 function srcSort(a
, b
)
170 if (a
[2].length
) return -1;
171 if (b
[2].length
) return 1;
177 if (fog
.isEditing()) return;
179 var data
= fog
.getAllData().sort(srcSort
);
181 for (var i
= 0; i
< data
.length
; ++i
) {
182 data
[i
][3] = data
[i
][3].replace(/-/g
, ':');
183 s
+= data
[i
].join('<') + '>';
186 fom
.portforward
.value
= s
;
187 form
.submit(fom
, 0, 'tomato.cgi');
193 fog
.resetNewEditor();
197 <body onload='init()'
>
198 <form id='_fom' method='post' action='javascript:{}'
>
199 <table id='container' cellspacing=
0>
200 <tr><td colspan=
2 id='header'
>
201 <div class='title'
>Tomato
</div>
202 <div class='version'
>Version <%
version(); %></div>
204 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
206 <div id='ident'
><%
ident(); %></div>
210 <input type='hidden' name='_nextpage' value='forward-basic.asp'
>
211 <input type='hidden' name='_service' value='firewall-restart'
>
213 <input type='hidden' name='portforward'
>
215 <div class='section-title'
>Port Forwarding
</div>
216 <div class='section'
>
217 <table class='tomato-grid' cellspacing=
1 id='fo-grid'
></table>
218 <script type='text/javascript'
>fog
.setup();</script>
223 <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".
224 <li><b>Ext Ports
</b> - The ports to be forwarded, as seen from the WAN. Ex:
"2345",
"200,300",
"200-300,400".
225 <li><b>Int Port
</b> <i>(optional)
</i> - The destination port inside the LAN. If blank, the destination port
226 is the same as
<i>Ext Ports
</i>. Only one port per entry is supported when forwarding to a different internal
228 <li><b>Int Address
</b> - The destination address inside the LAN.
233 <script type='text/javascript'
>show_notice1('<% notice("iptables"); %>');</script>
238 <tr><td id='footer' colspan=
2>
239 <span id='footer-msg'
></span>
240 <input type='button' value='Save' id='save-button' onclick='save()'
>
241 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'
>