1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
6 For use with Tomato Firmware only.
7 No part of this file may be used without permission.
11 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
12 <meta name='robots' content='noindex,nofollow'
>
13 <title>[<%
ident(); %>] NAS: USB Support
</title>
14 <link rel='stylesheet' type='text/css' href='tomato.css'
>
15 <link rel='stylesheet' type='text/css' href='color.css'
>
16 <script type='text/javascript' src='tomato.js'
></script>
20 <style type='text/css'
>
27 <style type='text/css'
>
49 <script type='text/javascript' src='debug.js'
></script>
51 <script type='text/javascript'
>
53 // <% nvram("usb_enable,usb_uhci,usb_ohci,usb_usb2,usb_storage,usb_printer,usb_printer_bidirect,usb_automount,usb_fs_ext3,usb_fs_fat,script_usbmount,script_usbumount,script_usbhotplug"); %>
55 // <% nvram("usb_fs_ntfs"); %>
57 // <% usbdevices(); %>
63 function _umountHost(host
)
65 form
.submitHidden('usbcmd.cgi', { remove
: host
});
68 function _mountHost(host
)
70 form
.submitHidden('usbcmd.cgi', { mount
: host
});
73 function _forceRefresh()
76 if ((e
= E('refresh-button')) != null) {
77 if (e
.value
== 'Refresh' && (!e
.disabled
)) {
84 function umountHost(a
, host
)
88 if ((xob
= new XmlHttp()) == null) {
94 a
.innerHTML
= 'Please wait...';
96 xob
.onCompleted = function(text
, xml
) {
98 if (usb
.length
== 1) {
100 ferror
.set(a
, 'The device is busy. Please make sure no applications are using it, and try again.', 0);
106 xob
.onError = function() {
111 xob
.post('usbcmd.cgi', 'remove=' + host
);
114 function mountHost(a
, host
)
118 if ((xob
= new XmlHttp()) == null) {
124 a
.innerHTML
= 'Please wait...';
126 xob
.onCompleted = function(text
, xml
) {
128 if (usb
.length
== 1) {
130 ferror
.set(a
, 'Failed to mount. Verify the device is plugged in, and try again.', 0);
136 xob
.onError = function() {
141 xob
.post('usbcmd.cgi', 'mount=' + host
);
144 var ref
= new TomatoRefresh('update.cgi', 'exec=usbdevices', 0, 'nas_usb_refresh');
146 ref
.refresh = function(text
)
159 var dg
= new TomatoGrid();
161 dg
.sortCompare = function(a
, b
) {
162 var col
= this.sortColumn
;
163 var ra
= a
.getRowData();
164 var rb
= b
.getRowData();
169 if (ra
.type
== 'Storage' && ra
.type
== rb
.type
)
170 r
= cmpInt(ra
.host
, rb
.host
);
172 r
= cmpText(ra
.host
, rb
.host
);
175 r
= cmpText(a
.cells
[col
].innerHTML
, b
.cells
[col
].innerHTML
);
177 return this.sortAscending
? r
: -r
;
180 dg
.populate = function()
182 var i
, j
, k
, a
, b
, c
, e
, s
, desc
, d
, parts
, p
;
186 for (i
= 0; i
< list
.length
; ++i
) {
190 list
[i
].product
= '';
193 list
[i
].is_mounted
= 0;
196 for (i
= usbdev
.length
- 1; i
>= 0; --i
) {
210 for (i
= list
.length
- 1; i
>= 0; --i
) {
213 if (e
.type
!= 'Storage')
214 s
= ' <br><small> </small>';
217 s
= ((e
.is_mounted
== 0) ? 'No' : 'Yes') + '<br><small>Please wait...</small>';
218 else if (e
.is_mounted
== 0)
219 s
= 'No<br><small><a href="javascript:mountHost(\'L' + i
+ '\',\'' + e
.host
+ '\')" title="Mount all Partitions of Storage Device" id="L' + i
+ '">[ Mount ]</a></small>';
221 s
= 'Yes<br><small><a href="javascript:umountHost(\'L' + i
+ '\',\'' + e
.host
+ '\')" title="Safely Remove Storage Device" id="L' + i
+ '">[ Unmount ]</a></small>';
223 desc
= e
.product
+ '<small>'; // + (e.serial == '' ? '' : '<br>Serial No: ' + e.serial);
225 for (j
= 0; j
<= e
.discs
.length
- 1; ++j
) {
228 for (k
= 0; k
<= parts
.length
- 1; ++k
) {
231 desc
= desc
+ '<br>Partition \'' + p
[0] + '\'' + (p
[3] != '' ? ' ' + p
[3] : '') +
232 (p
[5] != '0' && p
[5] != '' ? ' (' + p
[5] + ' MB)' : '') +
233 ((p
[1] != 0) ? ((p
[1] == 2) ? ' is active ' : ' is mounted ') +
234 ((p
[2] != '') ? 'on ' : '') : ' is not mounted ') + p
[2];
239 desc
= desc
+ '</small>';
240 this.insert(-1, e
, [e
.type
, e
.host
, e
.vendor
, desc
, s
], false);
246 dg
.setup = function()
248 this.init('dev-grid', 'sort');
249 this.headerSet(['Type', 'Host', 'Vendor', 'Description', 'Mounted?']);
265 function verifyFields(focused
, quiet
)
267 var b
= !E('_f_usb').checked
;
268 var a
= !E('_f_storage').checked
;
270 E('_f_uhci').disabled
= b
;
271 E('_f_ohci').disabled
= b
;
272 E('_f_usb2').disabled
= b
;
273 E('_f_print').disabled
= b
;
274 E('_f_storage').disabled
= b
;
276 E('_f_ext3').disabled
= b
|| a
;
277 E('_f_fat').disabled
= b
|| a
;
279 E('_f_ntfs').disabled
= b
|| a
;
281 E('_f_automount').disabled
= b
|| a
;
282 E('_f_bprint').disabled
= b
|| !E('_f_print').checked
;
284 elem
.display(PR('_f_automount'), !b
&& !a
);
285 elem
.display(PR('_script_usbmount'), !b
&& !a
&& E('_f_automount').checked
);
286 elem
.display(PR('_script_usbumount'), !b
&& !a
&& E('_f_automount').checked
);
287 elem
.display(PR('_script_usbhotplug'), !b
&& (!a
|| E('_f_print').checked
));
289 if (!v_length('_script_usbmount', quiet
, 0, 2048)) return 0;
290 if (!v_length('_script_usbumount', quiet
, 0, 2048)) return 0;
291 if (!v_length('_script_usbhotplug', quiet
, 0, 2048)) return 0;
300 if (!verifyFields(null, 0)) return;
303 fom
.usb_enable
.value
= E('_f_usb').checked
? 1 : 0;
304 fom
.usb_uhci
.value
= E('_f_uhci').checked
? 1 : 0;
305 fom
.usb_ohci
.value
= E('_f_ohci').checked
? 1 : 0;
306 fom
.usb_usb2
.value
= E('_f_usb2').checked
? 1 : 0;
307 fom
.usb_storage
.value
= E('_f_storage').checked
? 1 : 0;
308 fom
.usb_printer
.value
= E('_f_print').checked
? 1 : 0;
309 fom
.usb_printer_bidirect
.value
= E('_f_bprint').checked
? 1 : 0;
310 fom
.usb_fs_ext3
.value
= E('_f_ext3').checked
? 1 : 0;
311 fom
.usb_fs_fat
.value
= E('_f_fat').checked
? 1 : 0;
313 fom
.usb_fs_ntfs
.value
= E('_f_ntfs').checked
? 1 : 0;
315 fom
.usb_automount
.value
= E('_f_automount').checked
? 1 : 0;
320 function submit_complete()
327 <body onload='init()'
>
328 <form id='_fom' method='post' action='tomato.cgi'
>
329 <table id='container' cellspacing=
0>
330 <tr><td colspan=
2 id='header'
>
331 <div class='title'
>Tomato
</div>
332 <div class='version'
>Version <%
version(); %></div>
334 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
336 <div id='ident'
><%
ident(); %></div>
340 <input type='hidden' name='_nextpage' value='nas-usb.asp'
>
341 <input type='hidden' name='_service' value='usb-restart'
>
343 <input type='hidden' name='usb_enable'
>
344 <input type='hidden' name='usb_uhci'
>
345 <input type='hidden' name='usb_ohci'
>
346 <input type='hidden' name='usb_usb2'
>
347 <input type='hidden' name='usb_storage'
>
348 <input type='hidden' name='usb_printer'
>
349 <input type='hidden' name='usb_printer_bidirect'
>
350 <input type='hidden' name='usb_fs_ext3'
>
351 <input type='hidden' name='usb_fs_fat'
>
353 <input type='hidden' name='usb_fs_ntfs'
>
355 <input type='hidden' name='usb_automount'
>
357 <div class='section-title'
>USB Support
</div>
358 <div class='section'
>
359 <script type='text/javascript'
>
361 createFieldTable('', [
362 { title
: 'Core USB Support', name
: 'f_usb', type
: 'checkbox', value
: nvram
.usb_enable
== 1 },
363 { title
: 'USB 1.1 Support (OHCI)', name
: 'f_ohci', type
: 'checkbox', value
: nvram
.usb_ohci
== 1 },
364 { title
: 'USB 1.1 Support (UHCI)', name
: 'f_uhci', type
: 'checkbox', value
: nvram
.usb_uhci
== 1 },
365 { title
: 'USB 2.0 Support', name
: 'f_usb2', type
: 'checkbox', value
: nvram
.usb_usb2
== 1 },
367 { title
: 'USB Printer Support', name
: 'f_print', type
: 'checkbox', value
: nvram
.usb_printer
== 1 },
368 { title
: 'Bidirectional copying', indent
: 2, name
: 'f_bprint', type
: 'checkbox', value
: nvram
.usb_printer_bidirect
== 1 },
370 { title
: 'USB Storage Support', name
: 'f_storage', type
: 'checkbox', value
: nvram
.usb_storage
== 1 },
371 { title
: 'Ext2 / Ext3 File System Support', indent
: 2, name
: 'f_ext3', type
: 'checkbox', value
: nvram
.usb_fs_ext3
== 1 },
372 { title
: 'FAT File System Support', indent
: 2, name
: 'f_fat', type
: 'checkbox', value
: nvram
.usb_fs_fat
== 1 },
374 { title
: 'NTFS File System Support', indent
: 2, name
: 'f_ntfs', type
: 'checkbox', suffix
: ' <small>(limited write support)</small>', value
: nvram
.usb_fs_ntfs
== 1 },
376 { title
: 'Automount', indent
: 2, name
: 'f_automount', type
: 'checkbox',
377 suffix
: ' <small>Automatically mount all partitions to sub-directories in <i>/mnt</i>.</small>', value
: nvram
.usb_automount
== 1 },
378 { title
: 'Run after mounting', indent
: 2, name
: 'script_usbmount', type
: 'textarea', value
: nvram
.script_usbmount
},
379 { title
: 'Run before unmounting', indent
: 2, name
: 'script_usbumount', type
: 'textarea', value
: nvram
.script_usbumount
},
381 { title
: 'Hotplug script<br><small>(called when any USB device is attached or removed)</small>', name
: 'script_usbhotplug', type
: 'textarea', value
: nvram
.script_usbhotplug
},
383 { text
: '<small>Some of the changes will take effect only after a restart.</small>' }
390 <div class='section-title'
>Attached Devices
</div>
391 <div class='section'
>
392 <table id='dev-grid' class='tomato-grid' cellspacing=
0></table>
393 <div id='usb-controls'
>
394 <script type='text/javascript'
>genStdRefresh(1,0,'ref.toggle()');</script>
396 <script type='text/javascript'
></script>
402 <tr><td id='footer' colspan=
2>
403 <span id='footer-msg'
></span>
404 <input type='button' value='Save' id='save-button' onclick='save()'
>
405 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'
>
409 <script type='text/javascript'
>earlyInit();verifyFields(null, 1);</script>