Samba: extra codepages
[tomato.git] / release / src / router / www / nas-samba.asp
blob373798dc19b756178af8768467ba642575b4ca23
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 <title>[<% ident(); %>] NAS: File Sharing</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 <!-- / / / -->
19 <style tyle='text/css'>
20 #ss-grid {
21 width: 99%;
23 #ss-grid .co1, #ss-grid .co2, #ss-grid .co3 {
24 width: 25%;
26 #ss-grid .co4 {
27 width: 16%;
29 #ss-grid .co5 {
30 width: 9%;
32 </style>
33 <style type='text/css'>
34 textarea {
35 width: 98%;
36 height: 6em;
38 </style>
40 <script type='text/javascript' src='debug.js'></script>
42 <script type='text/javascript'>
44 // <% nvram("smbd_enable,smbd_user,smbd_passwd,smbd_wgroup,smbd_cpage,smbd_custom,smbd_loglevel,smbd_master,smbd_wins,smbd_shares,smbd_autoshare,wan_wins"); %>
46 function v_nodelim(e, quiet, name)
48 e.value = e.value.trim().replace(/>/g, '_');
49 if (e.value.indexOf('<') != -1) {
50 ferror.set(e, 'Invalid ' + name, quiet);
51 return 0;
53 ferror.clear(e);
54 return 1;
57 var ssg = new TomatoGrid();
59 ssg.exist = function(f, v)
61 var data = this.getAllData();
62 for (var i = 0; i < data.length; ++i) {
63 if (data[i][f] == v) return true;
65 return false;
68 ssg.existName = function(name)
70 return this.exist(0, name);
73 ssg.sortCompare = function(a, b) {
74 var col = this.sortColumn;
75 var da = a.getRowData();
76 var db = b.getRowData();
77 var r = cmpText(da[col], db[col]);
78 return this.sortAscending ? r : -r;
81 ssg.dataToView = function(data) {
82 return [data[0], data[1], data[2], ['Read Only', 'Read / Write'][data[3]], ['No', 'Yes'][data[4]]];
85 ssg.fieldValuesToData = function(row) {
86 var f = fields.getAll(row);
87 return [f[0].value, f[1].value, f[2].value, f[3].value, f[4].value];
90 ssg.verifyFields = function(row, quiet)
92 var f, s;
93 f = fields.getAll(row);
95 s = f[0].value.trim().replace(/\s+/g, ' ');
96 if (s.length > 0) {
97 if (s.search(/^[ a-zA-Z0-9_\-\$]+$/) == -1) {
98 ferror.set(f[0], 'Invalid share name. Only characters "$ A-Z 0-9 - _" and spaces are allowed.', quiet);
99 return 0;
101 if (this.existName(s)) {
102 ferror.set(f[0], 'Duplicate share name.', quiet);
103 return 0;
105 f[0].value = s;
107 else {
108 ferror.set(f[0], 'Empty share name is not allowed.', quiet);
109 return 0;
112 if ((!v_nodelim(f[1], quiet, 'Directory')) || (!v_nodelim(f[2], quiet, 'Description')))
113 return 0;
115 if (f[1].value.length <= 0) {
116 ferror.set(f[1], 'Directory must not be empty.', quiet);
117 return 0;
120 return 1;
123 ssg.resetNewEditor = function()
125 var f;
127 f = fields.getAll(this.newEditor);
128 ferror.clearAll(f);
130 f[0].value = '';
131 f[1].value = '';
132 f[2].value = '';
133 f[3].selectedIndex = 0;
134 f[4].selectedIndex = 0;
137 ssg.setup = function()
139 this.init('ss-grid', 'sort', 50, [
140 { type: 'text', maxlen: 32 },
141 { type: 'text', maxlen: 256 },
142 { type: 'text', maxlen: 64 },
143 { type: 'select', options: [[0, 'Read Only'],[1, 'Read / Write']] },
144 { type: 'select', options: [[0, 'No'],[1, 'Yes']] }
146 this.headerSet(['Share Name', 'Directory', 'Description', 'Access Level', 'Hidden']);
148 var s = nvram.smbd_shares.split('>');
149 for (var i = 0; i < s.length; ++i) {
150 var t = s[i].split('<');
151 if (t.length == 5) {
152 this.insertData(-1, t);
156 this.sort(0);
157 this.showNewEditor();
158 this.resetNewEditor();
161 function verifyFields(focused, quiet)
163 var a, b;
165 a = E('_smbd_enable').value;
167 elem.display(PR('_smbd_user'), PR('_smbd_passwd'), (a == 2));
169 E('_smbd_wgroup').disabled = (a == 0);
170 E('_smbd_cpage').disabled = (a == 0);
171 E('_smbd_custom').disabled = (a == 0);
172 E('_smbd_loglevel').disabled = (a == 0);
173 E('_smbd_autoshare').disabled = (a == 0);
174 E('_f_smbd_master').disabled = (a == 0);
175 E('_f_smbd_wins').disabled = (a == 0 || (nvram.wan_wins != '' && nvram.wan_wins != '0.0.0.0'));
177 if (a != 0) {
178 if (!v_range('_smbd_autoshare', quiet, 0, 3)) return 0;
179 if (!v_range('_smbd_loglevel', quiet, 0, 100)) return 0;
180 if (!v_length('_smbd_custom', quiet, 0, 2048)) return 0;
181 if (!v_length('_smbd_wgroup', quiet, 1, 20)) return 0;
184 if (a == 2) {
185 b = E('_smbd_user');
186 if (b.value == '') {
187 ferror.set(b, 'User Name must not be empty.', quiet);
188 return 0;
190 if (b.value == 'root') {
191 ferror.set(b, 'User Name root is not allowed.', quiet);
192 return 0;
194 if (!v_length(b, quiet, 1, 50)) return 0;
195 ferror.clear(b);
197 b = E('_smbd_passwd');
198 if (b.value == '') {
199 ferror.set(b, 'Password must not be empty.', quiet);
200 return 0;
202 if (!v_length(b, quiet, 1, 50)) return 0;
203 ferror.clear(b);
206 return 1;
209 function save()
211 if (ssg.isEditing()) return;
212 if (!verifyFields(null, 0)) return;
214 var fom = E('_fom');
216 var data = ssg.getAllData();
217 var r = [];
218 for (var i = 0; i < data.length; ++i) r.push(data[i].join('<'));
219 fom.smbd_shares.value = r.join('>');
220 fom.smbd_master.value = E('_f_smbd_master').checked ? 1 : 0;
221 if (nvram.wan_wins == '' || nvram.wan_wins == '0.0.0.0')
222 fom.smbd_wins.value = E('_f_smbd_wins').checked ? 1 : 0;
223 else
224 fom.smbd_wins.value = nvram.smbd_wins;
226 form.submit(fom, 1);
228 </script>
230 </head>
231 <body>
232 <form id='_fom' method='post' action='tomato.cgi'>
233 <table id='container' cellspacing=0>
234 <tr><td colspan=2 id='header'>
235 <div class='title'>Tomato</div>
236 <div class='version'>Version <% version(); %></div>
237 </td></tr>
238 <tr id='body'><td id='navi'><script type='text/javascript'>navi()</script></td>
239 <td id='content'>
240 <div id='ident'><% ident(); %></div>
242 <!-- / / / -->
244 <input type='hidden' name='_nextpage' value='nas-samba.asp'>
245 <input type='hidden' name='_service' value='samba-restart'>
247 <input type='hidden' name='smbd_master'>
248 <input type='hidden' name='smbd_wins'>
249 <input type='hidden' name='smbd_shares'>
251 <div class='section-title'>Samba File Sharing</div>
252 <div class='section'>
253 <script type='text/javascript'>
254 createFieldTable('', [
255 { title: 'Enable File Sharing', name: 'smbd_enable', type: 'select',
256 options: [['0', 'No'],['1', 'Yes, no Authentication'],['2', 'Yes, Authentication required']],
257 value: nvram.smbd_enable },
258 { title: 'User Name', indent: 2, name: 'smbd_user', type: 'text', maxlen: 50, size: 32,
259 value: nvram.smbd_user },
260 { title: 'Password', indent: 2, name: 'smbd_passwd', type: 'text', maxlen: 50, size: 32,
261 value: nvram.smbd_passwd },
262 null,
263 { title: 'Workgroup Name', name: 'smbd_wgroup', type: 'text', maxlen: 20, size: 32,
264 value: nvram.smbd_wgroup },
265 { title: 'Client Codepage', name: 'smbd_cpage', type: 'select',
266 options: [['', 'Unspecified'],['437', '437 (United States, Canada)'],['850', '850 (Western Europe)'],['852', '852 (Central / Eastern Europe)'],['866', '866 (Cyrillic / Russian)']
267 /* LINUX26-BEGIN */
268 ,['932', '932 (Japanese)'],['936', '936 (Simplified Chinese)'],['949', '949 (Korean)'],['950', '950 (Traditional Chinese / Big5)']
269 /* LINUX26-END */
271 suffix: ' <small> (start cmd.exe and type chcp to see the current code page)</small>',
272 value: nvram.smbd_cpage },
273 { title: 'Samba<br>Custom Configuration', name: 'smbd_custom', type: 'textarea', value: nvram.smbd_custom },
274 { title: 'Auto-share all USB Partitions', name: 'smbd_autoshare', type: 'select',
275 options: [['0', 'Disabled'],['1', 'Read Only'],['2', 'Read / Write'],['3', 'Hidden Read / Write']],
276 value: nvram.smbd_autoshare },
277 { title: 'Options', multi: [
278 { suffix: '&nbsp; Master Browser &nbsp;&nbsp;&nbsp;', name: 'f_smbd_master', type: 'checkbox', value: nvram.smbd_master == 1 },
279 { 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') }
280 ] },
281 null,
282 { title: 'Samba Log Level', name: 'smbd_loglevel', type: 'select',
283 options: [['0', '0'],['1', '1'],['2', '2'],['3', '3'],['4', '4'],['5', '5'],['6', '6'],['7', '7'],['8', '8'],['9', '9'],['10', '10'],['50', '50'],['100', '100']],
284 value: nvram.smbd_loglevel }
286 </script>
287 </div>
288 <br>
290 <div class='section-title'>Network Shares List</div>
291 <div class='section'>
292 <table class='tomato-grid' cellspacing=1 id='ss-grid'></table>
293 <script type='text/javascript'>ssg.setup();</script>
294 <br>
295 <small>When no shares are specified, <i>/mnt</i> directory is shared in Read Only mode.</small>
296 </div>
298 <!-- / / / -->
300 </td></tr>
301 <tr><td id='footer' colspan=2>
302 <span id='footer-msg'></span>
303 <input type='button' value='Save' id='save-button' onclick='save()'>
304 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'>
305 </td></tr>
306 </table>
307 </form>
308 <script type='text/javascript'>verifyFields(null, 1);</script>
309 </body>
310 </html>