UI cleanup, phase 5, ARM (functional changes)
[tomato.git] / release / src-rt-6.x.4708 / router / www / basic-ddns.asp
blob5188a4f4ba0a5baf2564215ac2552a2534180802
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 <meta name="viewport" content="width=device-width">
15 <title>[<% ident(); %>] Basic: DDNS</title>
16 <link rel='stylesheet' type='text/css' href='tomato.css'>
17 <link rel='stylesheet' type='text/css' href='color.css'>
18 <script type='text/javascript' src='tomato.js'></script>
20 <!-- / / / -->
22 <script type='text/javascript' src='debug.js'></script>
24 <script type='text/javascript'>
26 // <% nvram("ddnsx0,ddnsx1,ddnsx_ip,wan_dns,wan_get_dns,dns_addget,ddnsx_refresh,ddnsx_save"); %>
27 // <% ddnsx(); %>
29 /* REMOVE-BEGIN
31 t = hostname (top)
32 u = username/password
33 p = password
34 h = hostname
35 j = hostname (optional)
36 c = custom url
37 w = wildcard
38 m = MX
39 b = backup MX
40 o = use OpenDNS
41 a = freedns.afraid
42 z = can't use client-given IP address
43 s = save state checkbox
45 REMOVE-END */
47 var services = [
48 ['', 'None', '', ''],
49 ['3322', '3322', 'http://www.3322.org/', 'uhwmb'],
50 ['3322-static', '3322 - Static', 'http://www.3322.org/', 'uhwmb'],
51 ['dnsexit', 'DNS Exit', 'http://www.dnsexit.com/', 'uh'],
52 ['dnsomatic', 'DNS-O-Matic', 'http://www.dnsomatic.com/', 'uj'],
53 ['dyndns', 'DynDNS - Dynamic', 'http://www.dyndns.com/', 'uhwmbs'],
54 ['dyndns-static', 'DynDNS - Static', 'http://www.dyndns.com/', 'uhwmbs'],
55 ['dyndns-custom', 'DynDNS - Custom', 'http://www.dyndns.com/', 'uhwmbs'],
56 ['sdyndns', 'DynDNS (https) - Dynamic', 'http://www.dyndns.com/', 'uhwmbs'],
57 ['sdyndns-static', 'DynDNS (https) - Static', 'http://www.dyndns.com/', 'uhwmbs'],
58 ['sdyndns-custom', 'DynDNS (https) - Custom', 'http://www.dyndns.com/', 'uhwmbs'],
59 ['dyns', 'DyNS', 'http://www.dyns.cx/', 'uh'],
60 ['easydns', 'easyDNS', 'http://www.easydns.com/', 'uhwm'],
61 ['seasydns', 'easyDNS (https)', 'http://www.easydns.com/', 'uhwm'],
62 ['editdns', 'EditDNS', 'http://www.editdns.net/', 'tpz'],
63 ['everydns', 'EveryDNS', 'http://www.everydns.net/', 'uj', null, null, 'Domain <small>(optional)</small>'],
64 ['minidns', 'miniDNS', 'http://www.minidns.net/', 'uh'],
65 ['enom', 'eNom', 'http://www.enom.com/', 'ut', 'Domain'],
66 ['afraid', 'FreeDNS (afraid.org)', 'http://freedns.afraid.org/', 'az'],
67 ['heipv6tb', 'HE.net IPv6 Tunnel Broker', 'http://www.tunnelbroker.net/', 'uh', 'User ID <small>(not your username)</small>', null, 'Global Tunnel ID'],
68 ['ieserver', 'ieServer.net', 'http://www.ieserver.net/', 'uhz', 'Username / Hostname', null, 'Domain'],
69 ['namecheap', 'namecheap', 'http://www.namecheap.com/', 'ut', 'Domain'],
70 ['noip', 'No-IP.com', 'http://www.no-ip.com/', 'uh', 'Email Address', null, 'Hostname / Group'],
71 ['opendns', 'OpenDNS', 'http://www.opendns.com/', 'uhoz', null, null, 'Network <small>(optional)</small>'],
72 ['tzo', 'TZO', 'http://www.tzo.com/', 'uh', 'Email Address', 'Password'],
73 ['zoneedit', 'ZoneEdit', 'http://www.zoneedit.com/', 'uh'],
74 ['szoneedit', 'ZoneEdit (https)', 'http://www.zoneedit.com/', 'uh'],
75 ['pairnic', 'pairNIC', 'http://www.pairnic.com/', 'uh'],
76 ['spairnic', 'pairNIC (https)', 'http://www.pairnic.com/', 'uh'],
77 ['ovh', 'OVH', 'http://www.ovh.com/', 'uh'],
78 ['sovh', 'OVH (https)', 'https://www.ovh.com/', 'uh'],
79 ['schangeip', 'ChangeIP (https)', 'https://www.changeip.com/', 'uh'],
80 ['custom', 'Custom URL', '', 'c']];
82 var opendns = ['208.67.222.222', '208.67.220.220'];
83 var opendnsInUse = 0;
85 function msgLoc(s)
87 var r;
89 s = s.trim().replace(/\n+/g, ' ');
90 if (r = s.match(/^(.*?): (.*)/)) {
91 r[2] = r[2].replace(/#RETRY (\d+) (\d+)/,
92 function(s, min, num) {
93 return '<br><small>(' + ((num >= 1) ? (num + '/3: ') : '') + 'Automatically retrying in ' + min + ' minutes)</small>';
96 return '<small>' + (new Date(r[1])).toLocaleString() + ':</small><br>' + r[2];
98 else if (s.length == 0) {
99 return '-';
101 return s;
104 function mop(s)
106 var op, i;
108 op = {};
109 for (i = s.length - 1; i >= 0; --i) {
110 op[s.charAt(i)] = 1;
113 return op;
116 function verifyFields(focused, quiet)
118 var i;
119 var data, r, e;
120 var op;
121 var enabled;
122 var b;
124 b = E('_f_ddnsx_ip').value == 'custom';
125 elem.display(PR('_f_custom_ip'), b);
126 if ((b) && (!v_ip('_f_custom_ip', quiet))) return 0;
128 if (!v_range('_ddnsx_refresh', quiet, 0, 90)) return 0;
130 r = 1;
131 for (i = 0; i < 2; ++i) {
132 data = services[E('_f_service' + i).selectedIndex] || services[0];
133 enabled = (data[0] != '');
135 op = mop(data[3]);
137 elem.display(PR('url' + i), (enabled) && (data[0] != 'custom'));
138 elem.display('row_z' + i, op.z);
140 elem.display(PR('_f_hosttop' + i), op.t);
141 elem.display(PR('_f_user' + i), op.u);
142 elem.display(PR('_f_pass' + i), op.u || op.p);
143 elem.display(PR('_f_host' + i), op.h || op.j);
144 elem.display(PR('_f_cust' + i), op.c);
146 elem.display(PR('_f_wild' + i), op.w);
147 elem.display(PR('_f_mx' + i), op.m);
148 elem.display(PR('_f_bmx' + i), op.b);
149 elem.display(PR('_f_opendns' + i), op.o);
150 elem.display(PR('_f_afraid' + i), op.a);
151 elem.display(PR('_f_ddnsx_save' + i), op.s);
153 elem.display(PR('_f_force' + i), 'last-response' + i, enabled);
154 elem.display('last-update' + i, enabled && !op.z);
156 if (enabled) {
157 PR('_f_user' + i).cells[0].innerHTML = data[4] || 'Username';
158 PR('_f_pass' + i).cells[0].innerHTML = data[5] || 'Password';
159 PR('_f_host' + i).cells[0].innerHTML = data[6] || 'Hostname';
161 e = E('url' + i);
162 e.href = data[2];
163 e.innerHTML = data[2];
165 if (op.c) {
166 e = E('_f_cust' + i);
167 e.value = e.value.trim();
168 if (e.value == '') {
169 e.value = 'http://';
171 if (e.value.search(/http(s?):\/\/./) != 0) {
172 ferror.set(e, 'Expecting a URL -- http://... or https://...', quiet);
173 r = 0;
175 else {
176 if (!v_nodelim('_f_cust' + i, quiet, 'URL')) r = 0;
177 else ferror.clear(e);
180 else if (op.a) {
181 e = E('_f_afraid' + i);
182 e.value = e.value.trim();
183 if (e.value.match(/freedns\.afraid\.org\/dynamic\/update\.php\?([a-zA-Z0-9]+)/)) {
184 e.value = RegExp.$1;
186 if (e.value.search(/^[A-Za-z0-9]+/) == -1) {
187 ferror.set(e, 'Invalid hash or URL', quiet);
188 r = 0;
190 else {
191 if (!v_nodelim('_f_afraid' + i, quiet, 'Token / URL')) r = 0;
192 else ferror.clear(e);
195 else {
196 if (((op.u) && (!v_length('_f_user' + i, quiet, 1) || !v_nodelim('_f_user' + i, quiet, 'Username'))) ||
197 (!v_length('_f_pass' + i, quiet, 1) || !v_nodelim('_f_pass' + i, quiet, 'Password')) ||
198 ((op.m) && (!v_nodelim('_f_mx' + i, quiet, 'MX'))) ||
199 ((op.h) && (!op.o) && (!v_length('_f_host' + i, quiet, 1) || !v_nodelim('_f_host' + i, quiet, 'Hostname'))) ||
200 ((op.t) && (!v_length('_f_hosttop' + i, quiet, 1) || !v_nodelim('_f_hosttop' + i, quiet, 'Hostname')))) {
201 r = 0;
207 // shouldn't do this twice, but...
208 if (E('_f_opendns0') == focused) E('_f_opendns1').checked = E('_f_opendns0').checked;
209 if (E('_f_opendns1') == focused) E('_f_opendns0').checked = E('_f_opendns1').checked;
211 if (E('_f_ddnsx_save0') == focused) E('_f_ddnsx_save1').checked = E('_f_ddnsx_save0').checked;
212 if (E('_f_ddnsx_save1') == focused) E('_f_ddnsx_save0').checked = E('_f_ddnsx_save1').checked;
214 return r;
217 function save()
219 var fom;
220 var i, j, s;
221 var data, a, b;
222 var setopendns;
223 var op;
225 if (!verifyFields(null, 0)) return;
227 fom = E('_fom');
228 fom.ddnsx_save.value = (nvram.ddnsx_save == 1) ? 1 : 0;
230 fom.ddnsx_ip.value = (E('_f_ddnsx_ip').value == 'custom') ? E('_f_custom_ip').value : E('_f_ddnsx_ip').value;
232 setopendns = -1;
233 for (i = 0; i < 2; ++i) {
234 s = [];
235 data = services[E('_f_service' + i).selectedIndex] || services[0];
236 s.push(data[0]);
237 if (data[0] != '') {
238 /* REMOVE-BEGIN
240 t = hostname (top)
241 u = username/password
242 h = hostname
243 c = custom url
244 w = wildcard
245 m = MX
246 b = backup MX
247 o = use OpenDNS
248 a = freedns.afraid
249 z = can't use client-given IP address
250 s = save state checkbox
256 username:password<
257 hostname<
258 wildcard<
260 backup mx<
261 custom url/afraid hash<
263 REMOVE-END */
264 op = mop(data[3]);
266 if ((op.u) || (op.p)) s.push(E('_f_user' + i).value + ':' + E('_f_pass' + i).value);
267 else s.push('');
269 if (op.t) {
270 s.push(E('_f_hosttop' + i).value);
272 else if ((op.h) || (op.j)) {
273 s.push(E('_f_host' + i).value);
275 else {
276 s.push('');
279 if (op.w) s.push(E('_f_wild' + i).checked ? 1 : 0);
280 else s.push('');
281 if (op.m) s.push(E('_f_mx' + i).value)
282 else s.push('');
283 if (op.b) s.push(E('_f_bmx' + i).checked ? 1 : 0);
284 else s.push('');
286 if (op.c) {
287 s.push(E('_f_cust' + i).value);
289 else if (op.a) {
290 s.push(E('_f_afraid' + i).value);
292 else {
293 s.push('');
296 if (op.s) {
297 fom.ddnsx_save.value = E('_f_ddnsx_save' + i).checked ? 1 : 0;
300 if (data[0] == 'opendns') setopendns = E('_f_opendns' + i).checked;
302 s = s.join('<');
303 fom['ddnsx' + i].value = s;
304 fom['ddnsx' + i + '_cache'].disabled = (!E('_f_force' + i).checked) && (s == nvram['ddnsx' + i]);
307 if (setopendns != -1) {
308 if (setopendns) {
309 if (opendnsInUse != opendns.length) {
310 fom.wan_dns.value = opendns.join(' ');
311 fom.wan_dns.disabled = 0;
312 fom._service.value += ',dns-restart';
315 else {
316 // not set if partial, do not remove if partial
317 if (opendnsInUse == opendns.length) {
318 a = nvram.wan_dns.split(/\s+/);
319 b = [];
320 for (i = a.length - 1; i >= 0; --i) {
321 for (j = opendns.length - 1; j >= 0; --j) {
322 if (a[i] == opendns[j]) {
323 a.splice(i, 1);
324 break;
328 fom.wan_dns.value = a.join(' ');
329 fom.wan_dns.disabled = 0;
330 fom._service.value += ',dns-restart';
335 form.submit(fom);
338 function init()
340 if ('<% psup("ddns-update"); %>' != 0) {
341 var e = E('footer-msg');
342 e.innerHTML = 'DDNS update is running. Please refresh after a few seconds.';
343 e.style.visibility = 'visible';
346 </script>
348 </head>
349 <body onload='init()'>
350 <form id='_fom' method='post' action='tomato.cgi'>
351 <table id='container' cellspacing=0>
352 <tr><td colspan=2 id='header'>
353 <div class='title'>Tomato</div>
354 <div class='version'>Version <% version(); %></div>
355 </td></tr>
356 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
357 <td id='content'>
358 <div id='ident'><% ident(); %></div>
360 <!-- / / / -->
362 <input type='hidden' name='_nextpage' value='basic-ddns.asp'>
363 <input type='hidden' name='_service' value='ddns-restart'>
364 <input type='hidden' name='_nextwait' value='10'>
366 <input type='hidden' name='ddnsx0' value=''>
367 <input type='hidden' name='ddnsx1' value=''>
368 <input type='hidden' name='ddnsx0_cache' value='' disabled>
369 <input type='hidden' name='ddnsx1_cache' value='' disabled>
370 <input type='hidden' name='wan_dns' value='' disabled>
371 <input type='hidden' name='ddnsx_ip' value=''>
372 <input type='hidden' name='ddnsx_save' value=''>
375 <div class='section-title'>Dynamic DNS</div>
376 <div class='section'>
377 <script type='text/javascript'>
378 s = nvram.ddnsx_ip;
379 a = (s != '') && (s.indexOf('@') != 0) && (s != '0.0.0.0') && (s != '1.1.1.1') && (s != '10.1.1.1');
380 createFieldTable('', [
381 { title: 'IP address', name: 'f_ddnsx_ip', type: 'select',
382 options: [
383 ['', 'Use WAN IP Address ' + ddnsx_ip + ' (recommended)'],
384 ['@', 'Use External IP Address Checker (every 10 minutes)'],
385 ['0.0.0.0', 'Offline (0.0.0.0)'],
386 ['1.1.1.1', 'Offline (1.1.1.1)'],
387 ['10.1.1.1', 'Offline (10.1.1.1)'],
388 ['custom', 'Custom IP Address...']
390 value: a ? 'custom' : nvram.ddnsx_ip },
391 { title: 'Custom IP address', indent: 2, name: 'f_custom_ip', type: 'text', maxlen: 15, size: 20,
392 value: a ? nvram.ddnsx_ip : '', hidden: !a },
393 { title: 'Auto refresh every', name: 'ddnsx_refresh', type: 'text', maxlen: 8, size: 8, suffix: '<small> days (0 = disable)</small>', value: fixInt(nvram.ddnsx_refresh, 0, 90, 28) }
395 </script>
396 </div>
399 <script type='text/javascript'>
400 a = nvram.wan_dns.split(/\s+/);
401 for (i = 0; i < a.length; ++i) {
402 for (j = 0; j < opendns.length; ++j) {
403 if (a[i] == opendns[j]) ++opendnsInUse;
407 if (nvram.dns_addget == 1) {
408 dns = nvram.wan_dns + ' ' + nvram.wan_get_dns;
410 else if (nvram.wan_dns != '') {
411 dns = nvram.wan_dns;
413 else {
414 dns = nvram.wan_get_dns;
416 dns = dns.split(/\s+/);
417 for (i = 0; i < dns.length; ++i) {
418 for (j = 0; j < opendns.length; ++j) {
419 if (dns[i] == opendns[j]) {
420 dns[i] = '<i>' + dns[i] + '</i>';
421 break;
425 dns = dns.join(', ');
427 for (i = 0; i < 2; ++i) {
428 v = nvram['ddnsx' + i].split('<');
429 if (v.length != 7) v = ['', '', '', 0, '', 0, ''];
431 u = v[1].split(':');
432 if (u.length != 2) u = ['', ''];
433 h = (v[0] == '');
435 W('<div class="section-title">Dynamic DNS ' + (i + 1) + '</div><div class="section">');
436 createFieldTable('', [
437 { title: 'Service', name: 'f_service' + i, type: 'select', options: services, value: v[0] },
438 { title: 'URL', indent: 2, text: '<a href="" id="url' + i + '" target="tomato-ext-ddns"></a>', hidden: 1 },
439 { title: '&nbsp;', text: '<small>* This service determines the IP address using its own method.</small>', hidden: 1, rid: 'row_z' + i },
440 { title: 'Hostname', name: 'f_hosttop' + i, type: 'text', maxlen: 96, size: 35, value: v[2], hidden: 1 },
441 { title: 'Username', name: 'f_user' + i, type: 'text', maxlen: 64, size: 35, value: u[0], hidden: 1 },
442 { title: 'Password', name: 'f_pass' + i, type: 'password', maxlen: 64, size: 35, peekaboo: 1, value: u[1], hidden: 1 },
443 { title: 'Hostname', name: 'f_host' + i, type: 'text', maxlen: 255, size: 80, value: v[2], hidden: 1 },
444 { title: 'URL', name: 'f_cust' + i, type: 'text', maxlen: 255, size: 80, value: v[6], hidden: 1 },
445 { title: 'Wildcard', indent: 2, name: 'f_wild' + i, type: 'checkbox', value: v[3] != '0', hidden: 1 },
446 { title: 'MX', name: 'f_mx' + i, type: 'text', maxlen: 32, size: 35, value: v[4], hidden: 1 },
447 { title: 'Backup MX', indent: 2, name: 'f_bmx' + i, type: 'checkbox', value: v[5] != '0', hidden: 1 },
448 { title: 'Use as DNS', name: 'f_opendns' + i, type: 'checkbox', value: (opendnsInUse == opendns.length),
449 suffix: '<br><small>(Current DNS: ' + dns + ')</small>', hidden: 1 },
450 { title: 'Token / URL', name: 'f_afraid' + i, type: 'text', maxlen: 255, size: 80, value: v[6], hidden: 1 },
451 { title: 'Save state when IP changes (nvram commit)', name: 'f_ddnsx_save' + i, type: 'checkbox', value: nvram.ddnsx_save == '1', hidden: 1 },
452 { title: 'Force next update', name: 'f_force' + i, type: 'checkbox', value: 0, hidden: 1 },
453 null,
454 { title: 'Last IP Address', custom: msgLoc(ddnsx_last[i]), rid: 'last-update' + i, hidden: 1 },
455 { title: 'Last Result', custom: msgLoc(ddnsx_msg[i]), rid: 'last-response' + i, hidden: h }
457 W('</div>');
459 </script>
461 <!-- / / / -->
463 <div class='section-title'>Notes</div>
464 <div class='section'>
465 <ul>
466 <li><b>URL</b> - Use <code>@IP</code> in an HTTP parameter/argument to refer to the current WAN IP address.</li>
467 </ul>
468 </div>
470 <!-- / / / -->
472 </td></tr>
473 <tr><td id='footer' colspan=2>
474 <span id='footer-msg'></span>
475 <input type='button' value='Save' id='save-button' onclick='save()'>
476 <input type='button' value='Cancel' id='cancel-button' onclick='reloadPage();'>
477 </td></tr>
478 </table>
479 <script type='text/javascript'>verifyFields(null, 1);</script>
480 </form>
481 </body>
482 </html>