Busybox: Upgrade to 1.21.1 (stable). lsof active.
[tomato.git] / release / src / router / www / nas-media.asp
blob57cb1ab3eae681bdbc30af3125ccd74c7cabbdda
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Media Server Settings - !!TB
6 For use with Tomato Firmware only.
7 No part of this file may be used without permission.
8 -->
9 <html>
10 <head>
11 <meta http-equiv='content-type' content='text/html;charset=utf-8'>
12 <meta name='robots' content='noindex,nofollow'>
13 <title>[<% ident(); %>] NAS: Media Server</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>
18 <!-- / / / -->
20 <style tyle='text/css'>
21 #ms-grid {
22 width: 81%;
24 #ms-grid .co1 {
25 width: 56%;
27 #ms-grid .co2 {
28 width: 44%;
30 </style>
32 <script type='text/javascript' src='debug.js'></script>
34 <script type='text/javascript'>
36 // <% nvram("ms_enable,ms_port,ms_dirs,ms_dbdir,ms_tivo,ms_stdlna,ms_sas,cifs1,cifs2,jffs2_on"); %>
38 changed = 0;
39 mdup = parseInt('<% psup("minidlna"); %>');
41 var mediatypes = [['', 'All Media Files'], ['A', 'Audio only'], ['V', 'Video only'], ['P', 'Images only']];
42 var msg = new TomatoGrid();
44 msg.dataToView = function(data) {
45 var b = [];
46 var i;
48 b.push(escapeHTML('' + data[0]));
49 for (i = 0; i < mediatypes.length; ++i)
50 if (mediatypes[i][0] == ('' + data[1])) {
51 b.push(mediatypes[i][1]);
52 break;
54 if (b.length < 2) b.push(mediatypes[0][1]);
55 return b;
58 msg.verifyFields = function(row, quiet)
60 var ok = 1;
61 var f;
62 f = fields.getAll(row);
64 if (!v_nodelim(f[0], quiet, 'Directory', 1) || !v_path(f[0], quiet, 1))
65 ok = 0;
67 changed |= ok;
68 return ok;
71 msg.resetNewEditor = function()
73 var f;
75 f = fields.getAll(this.newEditor);
76 ferror.clearAll(f);
77 f[0].value = '';
78 f[1].selectedIndex = 0;
81 msg.setup = function()
83 this.init('ms-grid', 'sort', 50, [
84 { type: 'text', maxlen: 256 },
85 { type: 'select', options: mediatypes }
86 ]);
87 this.headerSet(['Directory', 'Content Filter']);
89 var s = ('' + nvram.ms_dirs).split('>');
90 for (var i = 0; i < s.length; ++i) {
91 var t = s[i].split('<');
92 if (t.length == 2) this.insertData(-1, t);
95 this.sort(0);
96 this.showNewEditor();
97 this.resetNewEditor();
100 function getDbPath()
102 var s = E('_f_loc').value;
103 return (s == '*user') ? E('_f_user').value : s;
106 function verifyFields(focused, quiet)
108 var ok = 1;
109 var a, b, v;
110 var eLoc, eUser;
112 elem.display('_restart_button', nvram.ms_enable == '1');
114 a = E('_f_ms_enable').checked ? 1 : 0;
116 eLoc = E('_f_loc');
117 eUser = E('_f_user');
119 eLoc.disabled = (a == 0);
120 eUser.disabled = (a == 0);
121 E('_f_ms_sas').disabled = (a == 0);
122 E('_f_ms_rescan').disabled = (a == 0);
123 E('_f_ms_tivo').disabled = (a == 0);
124 E('_f_ms_stdlna').disabled = (a == 0);
125 E('_restart_button').disabled = (a == 0);
127 ferror.clear(eLoc);
128 ferror.clear(eUser);
130 v = eLoc.value;
131 b = (v == '*user');
132 elem.display(eUser, b);
133 elem.display(PR('_f_ms_sas'), (v != ''));
135 if (a == 0) {
136 if (focused != E('_f_ms_rescan'))
137 changed |= ok;
138 return ok;
140 if (b) {
141 if (!v_path(eUser, quiet || !ok, 1)) ok = 0;
143 /* JFFS2-BEGIN */
144 else if (v == '/jffs/dlna') {
145 if (nvram.jffs2_on != '1') {
146 ferror.set(eLoc, 'JFFS is not enabled.', quiet || !ok);
147 ok = 0;
149 else ferror.clear(eLoc);
151 /* JFFS2-END */
152 /* REMOVE-BEGIN */
153 /* CIFS-BEGIN */
154 else if (v.match(/^\/cifs(1|2)\/dlna$/)) {
155 if (nvram['cifs' + RegExp.$1].substr(0, 1) != '1') {
156 ferror.set(eLoc, 'CIFS #' + RegExp.$1 + ' is not enabled.', quiet || !ok);
157 ok = 0;
159 else ferror.clear(eLoc);
161 /* CIFS-END */
162 /* REMOVE-END */
164 if (focused != E('_f_ms_rescan'))
165 changed |= ok;
166 return ok;
169 function save()
171 if (msg.isEditing()) return;
172 if (!verifyFields(null, 0)) return;
174 var fom = E('_fom');
176 fom.ms_enable.value = E('_f_ms_enable').checked ? 1 : 0;
177 fom.ms_tivo.value = E('_f_ms_tivo').checked ? 1 : 0;
178 fom.ms_stdlna.value = E('_f_ms_stdlna').checked ? 1 : 0;
179 fom.ms_rescan.value = E('_f_ms_rescan').checked ? 1 : 0;
180 fom.ms_sas.value = E('_f_ms_sas').checked ? 1 : 0;
182 fom.ms_dbdir.value = getDbPath();
184 var data = msg.getAllData();
185 var r = [];
186 for (var i = 0; i < data.length; ++i) r.push(data[i].join('<'));
187 fom.ms_dirs.value = r.join('>');
189 form.submit(fom, 1);
192 function restart(isup)
194 if (changed) {
195 if (!confirm("Unsaved changes will be lost. Continue anyway?")) return;
197 E('_restart_button').disabled = true;
198 form.submitHidden('tomato.cgi', {
199 ms_rescan: E('_f_ms_rescan').checked ? 1 : 0,
200 _reboot: 0, _commit: 0, _nvset: 1,
201 _redirect: 'nas-media.asp',
202 _sleep: '3',
203 _service: 'media-' + (isup ? 're' : '') + 'start'
207 function submit_complete()
209 reloadPage();
212 var xob = null;
214 function setNoticeText(s)
216 if (s.length)
217 s = '<div id="notice1">' + s.replace(/\n/g, '<br>') + '</div><br style="clear:both">';
218 elem.setInnerHTML('notice-msg', s);
221 function updateNotice()
223 if (xob) return;
225 xob = new XmlHttp();
226 xob.onCompleted = function(text, xml) {
227 setNoticeText(text);
228 xob = null;
229 setTimeout(updateNotice, 5000);
231 xob.onError = function(ex) { xob = null; }
232 xob.post('update.cgi', 'exec=notice&arg0=dlna');
235 function init()
237 changed = 0;
238 updateNotice();
240 </script>
242 </head>
243 <body onload="init()">
244 <form id='_fom' method='post' action='tomato.cgi'>
245 <table id='container' cellspacing=0>
246 <tr><td colspan=2 id='header'>
247 <div class='title'>Tomato</div>
248 <div class='version'>Version <% version(); %></div>
249 </td></tr>
250 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
251 <td id='content'>
252 <div id='ident'><% ident(); %></div>
254 <!-- / / / -->
256 <input type='hidden' name='_nextpage' value='nas-media.asp'>
257 <input type='hidden' name='_service' value='media-restart'>
259 <input type='hidden' name='ms_enable'>
260 <input type='hidden' name='ms_dirs'>
261 <input type='hidden' name='ms_dbdir'>
262 <input type='hidden' name='ms_tivo'>
263 <input type='hidden' name='ms_stdlna'>
264 <input type='hidden' name='ms_rescan'>
265 <input type='hidden' name='ms_sas'>
267 <div class='section-title'>Media / DLNA Server</div>
268 <div class='section'>
269 <script type='text/javascript'>
271 switch (nvram.ms_dbdir) {
272 case '':
273 case '/jffs/dlna':
274 case '/cifs1/dlna':
275 case '/cifs2/dlna':
276 loc = nvram.ms_dbdir;
277 break;
278 default:
279 loc = '*user';
280 break;
283 createFieldTable('', [
284 { title: 'Enable', name: 'f_ms_enable', type: 'checkbox', value: nvram.ms_enable == '1' },
285 { title: 'Database Location', multi: [
286 { name: 'f_loc', type: 'select', options: [['','RAM (Temporary)'],
287 /* JFFS2-BEGIN */
288 ['/jffs/dlna','JFFS'],
289 /* JFFS2-END */
290 /* REMOVE-BEGIN */
291 /* CIFS-BEGIN */
292 ['/cifs1/dlna','CIFS 1'],['/cifs2/dlna','CIFS 2'],
293 /* CIFS-END */
294 /* REMOVE-END */
295 ['*user','Custom Path']], value: loc },
296 { name: 'f_user', type: 'text', maxlen: 256, size: 60, value: nvram.ms_dbdir }
297 ] },
298 { title: 'Scan Media at Startup*', indent: 2, name: 'f_ms_sas', type: 'checkbox', value: nvram.ms_sas == '1', hidden: 1 },
299 { title: 'Rescan on the next run*', indent: 2, name: 'f_ms_rescan', type: 'checkbox', value: 0,
300 suffix: '<br><small>* Media scan may take considerable time to complete.</small>' },
301 null,
302 { title: 'TiVo Support', name: 'f_ms_tivo', type: 'checkbox', value: nvram.ms_tivo == '1' },
303 { title: 'Strictly adhere to DLNA standards', name: 'f_ms_stdlna', type: 'checkbox', value: nvram.ms_stdlna == '1' }
305 W('<br><input type="button" value="' + (mdup ? 'Res' : 'S') + 'tart Now" onclick="restart(mdup)" id="_restart_button">');
306 </script>
307 </div>
308 <span id="notice-msg"></span>
309 <br>
311 <div class='section-title'>Media Directories</div>
312 <div class='section'>
313 <table class='tomato-grid' cellspacing=1 id='ms-grid'></table>
314 <script type='text/javascript'>msg.setup();</script>
315 <br>
316 </div>
318 <!-- / / / -->
320 </td></tr>
321 <tr><td id='footer' colspan=2>
322 <span id='footer-msg'></span>
323 <input type='button' value='Save' id='save-button' onclick='save()'>
324 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'>
325 </td></tr>
326 </table>
327 </form>
328 <script type='text/javascript'>verifyFields(null, 1);</script>
329 </body>
330 </html>