UI cleanup, phase 5, ARM (functional changes)
[tomato.git] / release / src-rt-6.x.4708 / router / www / nas-samba.asp
blobbed33c8a2d482661b2062b2f2b944090da2b3e10
1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.0//EN'>
2 <!--
3 Tomato GUI
4 Samba Server - !!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 <meta name="viewport" content="width=device-width">
14 <title>[<% ident(); %>] NAS: File Sharing</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 #ss-grid {
22 width: 99%;
24 #ss-grid .co1, #ss-grid .co2, #ss-grid .co3 {
25 width: 25%;
27 #ss-grid .co4 {
28 width: 16%;
30 #ss-grid .co5 {
31 width: 9%;
33 </style>
34 <style type='text/css'>
35 textarea {
36 width: 98%;
37 height: 6em;
39 </style>
41 <script type='text/javascript' src='debug.js'></script>
43 <script type='text/javascript'>
45 // <% nvram("smbd_enable,smbd_user,smbd_passwd,smbd_wgroup,smbd_cpage,smbd_ifnames,smbd_custom,smbd_master,smbd_wins,smbd_shares,smbd_autoshare,wan_wins"); %>
47 var ssg = new TomatoGrid();
49 ssg.exist = function(f, v)
51 var data = this.getAllData();
52 for (var i = 0; i < data.length; ++i) {
53 if (data[i][f] == v) return true;
55 return false;
58 ssg.existName = function(name)
60 return this.exist(0, name);
63 ssg.sortCompare = function(a, b) {
64 var col = this.sortColumn;
65 var da = a.getRowData();
66 var db = b.getRowData();
67 var r = cmpText(da[col], db[col]);
68 return this.sortAscending ? r : -r;
71 ssg.dataToView = function(data) {
72 return [data[0], data[1], data[2], ['Read Only', 'Read / Write'][data[3]], ['No', 'Yes'][data[4]]];
75 ssg.fieldValuesToData = function(row) {
76 var f = fields.getAll(row);
77 return [f[0].value, f[1].value, f[2].value, f[3].value, f[4].value];
80 ssg.verifyFields = function(row, quiet)
82 var f, s;
84 f = fields.getAll(row);
86 s = f[0].value.trim().replace(/\s+/g, ' ');
87 if (s.length > 0) {
88 if (s.search(/^[ a-zA-Z0-9_\-\$]+$/) == -1) {
89 ferror.set(f[0], 'Invalid share name. Only characters "$ A-Z 0-9 - _" and spaces are allowed.', quiet);
90 return 0;
92 if (this.existName(s)) {
93 ferror.set(f[0], 'Duplicate share name.', quiet);
94 return 0;
96 f[0].value = s;
98 else {
99 ferror.set(f[0], 'Empty share name is not allowed.', quiet);
100 return 0;
103 if (!v_nodelim(f[1], quiet, 'Directory', 1) || !v_path(f[1], quiet, 1)) return 0;
104 if (!v_nodelim(f[2], quiet, 'Description', 1)) return 0;
106 return 1;
109 ssg.resetNewEditor = function()
111 var f;
113 f = fields.getAll(this.newEditor);
114 ferror.clearAll(f);
116 f[0].value = '';
117 f[1].value = '';
118 f[2].value = '';
119 f[3].selectedIndex = 0;
120 f[4].selectedIndex = 0;
123 ssg.setup = function()
125 this.init('ss-grid', 'sort', 50, [
126 { type: 'text', maxlen: 32 },
127 { type: 'text', maxlen: 256 },
128 { type: 'text', maxlen: 64 },
129 { type: 'select', options: [[0, 'Read Only'],[1, 'Read / Write']] },
130 { type: 'select', options: [[0, 'No'],[1, 'Yes']] }
132 this.headerSet(['Share Name', 'Directory', 'Description', 'Access Level', 'Hidden']);
134 var s = nvram.smbd_shares.split('>');
135 for (var i = 0; i < s.length; ++i) {
136 var t = s[i].split('<');
137 if (t.length == 5) {
138 this.insertData(-1, t);
142 this.sort(0);
143 this.showNewEditor();
144 this.resetNewEditor();
147 function verifyFields(focused, quiet)
149 var a, b;
151 a = E('_smbd_enable').value;
153 elem.display(PR('_smbd_user'), PR('_smbd_passwd'), (a == 2));
155 E('_smbd_wgroup').disabled = (a == 0);
156 E('_smbd_cpage').disabled = (a == 0);
157 E('_smbd_ifnames').disabled = (a == 0);
158 E('_smbd_custom').disabled = (a == 0);
159 E('_smbd_autoshare').disabled = (a == 0);
160 E('_f_smbd_master').disabled = (a == 0);
161 E('_f_smbd_wins').disabled = (a == 0 || (nvram.wan_wins != '' && nvram.wan_wins != '0.0.0.0'));
163 if (a != 0 && !v_length('_smbd_ifnames', quiet, 0, 50)) return 0;
164 if (a != 0 && !v_length('_smbd_custom', quiet, 0, 2048)) return 0;
166 if (a == 2) {
167 if (!v_length('_smbd_user', quiet, 1)) return 0;
168 if (!v_length('_smbd_passwd', quiet, 1)) return 0;
170 b = E('_smbd_user');
171 if (b.value == 'root') {
172 ferror.set(b, 'User Name \"root\" is not allowed.', quiet);
173 return 0;
175 ferror.clear(b);
178 return 1;
181 function save()
183 if (ssg.isEditing()) return;
184 if (!verifyFields(null, 0)) return;
186 var fom = E('_fom');
188 var data = ssg.getAllData();
189 var r = [];
190 for (var i = 0; i < data.length; ++i) r.push(data[i].join('<'));
191 fom.smbd_shares.value = r.join('>');
192 fom.smbd_master.value = E('_f_smbd_master').checked ? 1 : 0;
193 if (nvram.wan_wins == '' || nvram.wan_wins == '0.0.0.0')
194 fom.smbd_wins.value = E('_f_smbd_wins').checked ? 1 : 0;
195 else
196 fom.smbd_wins.value = nvram.smbd_wins;
198 form.submit(fom, 1);
201 function init()
203 var c;
204 if (((c = cookie.get('nas_samba_notes_vis')) != null) && (c == '1')) {
205 toggleVisibility("notes");
209 function toggleVisibility(whichone) {
210 if(E('sesdiv' + whichone).style.display=='') {
211 E('sesdiv' + whichone).style.display='none';
212 E('sesdiv' + whichone + 'showhide').innerHTML='(Click here to show)';
213 cookie.set('nas_samba_' + whichone + '_vis', 0);
214 } else {
215 E('sesdiv' + whichone).style.display='';
216 E('sesdiv' + whichone + 'showhide').innerHTML='(Click here to hide)';
217 cookie.set('nas_samba_' + whichone + '_vis', 1);
220 </script>
222 </head>
223 <body onload='init()'>
224 <form id='_fom' method='post' action='tomato.cgi'>
225 <table id='container' cellspacing=0>
226 <tr><td colspan=2 id='header'>
227 <div class='title'>Tomato</div>
228 <div class='version'>Version <% version(); %></div>
229 </td></tr>
230 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
231 <td id='content'>
232 <div id='ident'><% ident(); %></div>
234 <!-- / / / -->
236 <input type='hidden' name='_nextpage' value='nas-samba.asp'>
237 <input type='hidden' name='_service' value='samba-restart'>
239 <input type='hidden' name='smbd_master'>
240 <input type='hidden' name='smbd_wins'>
241 <input type='hidden' name='smbd_shares'>
243 <div class='section-title'>Samba File Sharing</div>
244 <div class='section'>
245 <script type='text/javascript'>
246 createFieldTable('', [
247 { title: 'Enable File Sharing', name: 'smbd_enable', type: 'select',
248 options: [['0', 'No'],['1', 'Yes, no Authentication'],['2', 'Yes, Authentication required']],
249 value: nvram.smbd_enable },
250 { title: 'User Name', indent: 2, name: 'smbd_user', type: 'text', maxlen: 50, size: 32,
251 value: nvram.smbd_user },
252 { title: 'Password', indent: 2, name: 'smbd_passwd', type: 'password', maxlen: 50, size: 32, peekaboo: 1,
253 value: nvram.smbd_passwd },
254 null,
255 { title: 'Workgroup Name', name: 'smbd_wgroup', type: 'text', maxlen: 20, size: 32,
256 value: nvram.smbd_wgroup },
257 { title: 'Client Codepage', name: 'smbd_cpage', type: 'select',
258 options: [['', 'Unspecified'],['437', '437 (United States, Canada)'],['850', '850 (Western Europe)'],['852', '852 (Central / Eastern Europe)'],['866', '866 (Cyrillic / Russian)']
259 /* LINUX26-BEGIN */
260 ,['932', '932 (Japanese)'],['936', '936 (Simplified Chinese)'],['949', '949 (Korean)'],['950', '950 (Traditional Chinese / Big5)']
261 /* LINUX26-END */
263 suffix: ' <small> (start cmd.exe and type chcp to see the current code page)</small>',
264 value: nvram.smbd_cpage },
265 { title: 'Network Interfaces', name: 'smbd_ifnames', type: 'text', maxlen: 50, size: 32,
266 suffix: ' <small> (space-delimited)</small>',
267 value: nvram.smbd_ifnames },
268 { title: 'Samba<br>Custom Configuration', name: 'smbd_custom', type: 'textarea', value: nvram.smbd_custom },
269 { title: 'Auto-share all USB Partitions', name: 'smbd_autoshare', type: 'select',
270 options: [['0', 'Disabled'],['1', 'Read Only'],['2', 'Read / Write'],['3', 'Hidden Read / Write']],
271 value: nvram.smbd_autoshare },
272 { title: 'Options', multi: [
273 { suffix: '&nbsp; Master Browser &nbsp;&nbsp;&nbsp;', name: 'f_smbd_master', type: 'checkbox', value: nvram.smbd_master == 1 },
274 { suffix: '&nbsp; WINS Server &nbsp;', name: 'f_smbd_wins', type: 'checkbox', value: (nvram.smbd_wins == 1) && (nvram.wan_wins == '' || nvram.wan_wins == '0.0.0.0') }
277 </script>
278 </div>
279 <br>
281 <div class='section-title'>Additional Shares List</div>
282 <div class='section'>
283 <table class='tomato-grid' cellspacing=1 id='ss-grid'></table>
284 <script type='text/javascript'>ssg.setup();</script>
285 <br>
286 <small>When no shares are specified and auto-sharing is disabled, <i>/mnt</i> directory is shared in Read Only mode.</small>
287 </div>
289 <!-- / / / -->
291 <div class='section-title'>Notes <small><i><a href='javascript:toggleVisibility("notes");'><span id='sesdivnotesshowhide'>(Click here to show)</span></a></i></small></div>
292 <div class='section' id='sesdivnotes' style='display:none'>
293 <ul>
294 <li><b>Network Interfaces</b> - Space-delimited list of router interface names Samba will bind to.
295 <ul>
296 <li>If empty, <i>interfaces = <% nv("lan_ifname"); %></i> will be used instead.</li>
297 <li>The <i>bind interfaces only = yes</i> directive is always set.</li>
298 <li>Refer to the <a href="https://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html">Samba documentation</a> for details.</li>
299 </ul></li>
300 </ul>
301 </div>
303 <!-- / / / -->
305 </td></tr>
306 <tr><td id='footer' colspan=2>
307 <span id='footer-msg'></span>
308 <input type='button' value='Save' id='save-button' onclick='save()'>
309 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'>
310 </td></tr>
311 </table>
312 </form>
313 <script type='text/javascript'>verifyFields(null, 1);</script>
314 </body>
315 </html>