X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fluci2%2Fui.git;a=blobdiff_plain;f=luci2%2Fhtdocs%2Fluci2%2Fluci2.js;h=5947791600a9ace955dade058bbd8849ec29a2ce;hp=8d250cd626eeb68bd939e75e91d0b82f076e2272;hb=e314622aa9ad41f5d3083dfd21ff0f61175c237f;hpb=3c884108e834be975aacee8d2e5c0607cc3c92e7 diff --git a/luci2/htdocs/luci2/luci2.js b/luci2/htdocs/luci2/luci2.js index 8d250cd..5947791 100644 --- a/luci2/htdocs/luci2/luci2.js +++ b/luci2/htdocs/luci2/luci2.js @@ -175,7 +175,7 @@ String.prototype.format = function() function LuCI2() { - var _luci2 = this; + var L = this; var Class = function() { }; @@ -253,42 +253,42 @@ function LuCI2() plural: function(n) { return 0 + (n != 1) }, init: function() { - if (_luci2.i18n.loaded) + if (L.i18n.loaded) return; var lang = (navigator.userLanguage || navigator.language || 'en').toLowerCase(); var langs = (lang.indexOf('-') > -1) ? [ lang, lang.split(/-/)[0] ] : [ lang ]; for (var i = 0; i < langs.length; i++) - $.ajax('%s/i18n/base.%s.json'.format(_luci2.globals.resource, langs[i]), { + $.ajax('%s/i18n/base.%s.json'.format(L.globals.resource, langs[i]), { async: false, cache: true, dataType: 'json', success: function(data) { - $.extend(_luci2.i18n.catalog, data); + $.extend(L.i18n.catalog, data); - var pe = _luci2.i18n.catalog['']; + var pe = L.i18n.catalog['']; if (pe) { - delete _luci2.i18n.catalog['']; + delete L.i18n.catalog['']; try { var pf = new Function('n', 'return 0 + (' + pe + ')'); - _luci2.i18n.plural = pf; + L.i18n.plural = pf; } catch (e) { }; } } }); - _luci2.i18n.loaded = true; + L.i18n.loaded = true; } }; this.tr = function(msgid) { - _luci2.i18n.init(); + L.i18n.init(); - var msgstr = _luci2.i18n.catalog[msgid]; + var msgstr = L.i18n.catalog[msgid]; if (typeof(msgstr) == 'undefined') return msgid; @@ -300,23 +300,23 @@ function LuCI2() this.trp = function(msgid, msgid_plural, count) { - _luci2.i18n.init(); + L.i18n.init(); - var msgstr = _luci2.i18n.catalog[msgid]; + var msgstr = L.i18n.catalog[msgid]; if (typeof(msgstr) == 'undefined') return (count == 1) ? msgid : msgid_plural; else if (typeof(msgstr) == 'string') return msgstr; else - return msgstr[_luci2.i18n.plural(count)]; + return msgstr[L.i18n.plural(count)]; }; this.trc = function(msgctx, msgid) { - _luci2.i18n.init(); + L.i18n.init(); - var msgstr = _luci2.i18n.catalog[msgid + '\u0004' + msgctx]; + var msgstr = L.i18n.catalog[msgid + '\u0004' + msgctx]; if (typeof(msgstr) == 'undefined') return msgid; @@ -328,16 +328,16 @@ function LuCI2() this.trcp = function(msgctx, msgid, msgid_plural, count) { - _luci2.i18n.init(); + L.i18n.init(); - var msgstr = _luci2.i18n.catalog[msgid + '\u0004' + msgctx]; + var msgstr = L.i18n.catalog[msgid + '\u0004' + msgctx]; if (typeof(msgstr) == 'undefined') return (count == 1) ? msgid : msgid_plural; else if (typeof(msgstr) == 'string') return msgstr; else - return msgstr[_luci2.i18n.plural(count)]; + return msgstr[L.i18n.plural(count)]; }; this.setHash = function(key, value) @@ -485,6 +485,152 @@ function LuCI2() return n; }; + this.toColor = function(str) + { + if (typeof(str) != 'string' || str.length == 0) + return '#CCCCCC'; + + if (str == 'wan') + return '#F09090'; + else if (str == 'lan') + return '#90F090'; + + var i = 0, hash = 0; + + while (i < str.length) + hash = str.charCodeAt(i++) + ((hash << 5) - hash); + + var r = (hash & 0xFF) % 128; + var g = ((hash >> 8) & 0xFF) % 128; + + var min = 0; + var max = 128; + + if ((r + g) < 128) + min = 128 - r - g; + else + max = 255 - r - g; + + var b = min + (((hash >> 16) & 0xFF) % (max - min)); + + return '#%02X%02X%02X'.format(0xFF - r, 0xFF - g, 0xFF - b); + }; + + this.parseIPv4 = function(str) + { + if ((typeof(str) != 'string' && !(str instanceof String)) || + !str.match(/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/)) + return undefined; + + var num = [ ]; + var parts = str.split(/\./); + + for (var i = 0; i < parts.length; i++) + { + var n = parseInt(parts[i], 10); + if (isNaN(n) || n > 255) + return undefined; + + num.push(n); + } + + return num; + }; + + this.parseIPv6 = function(str) + { + if ((typeof(str) != 'string' && !(str instanceof String)) || + !str.match(/^[a-fA-F0-9:]+(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})?$/)) + return undefined; + + var parts = str.split(/::/); + if (parts.length == 0 || parts.length > 2) + return undefined; + + var lnum = [ ]; + if (parts[0].length > 0) + { + var left = parts[0].split(/:/); + for (var i = 0; i < left.length; i++) + { + var n = parseInt(left[i], 16); + if (isNaN(n)) + return undefined; + + lnum.push((n / 256) >> 0); + lnum.push(n % 256); + } + } + + var rnum = [ ]; + if (parts.length > 1 && parts[1].length > 0) + { + var right = parts[1].split(/:/); + + for (var i = 0; i < right.length; i++) + { + if (right[i].indexOf('.') > 0) + { + var addr = L.parseIPv4(right[i]); + if (!addr) + return undefined; + + rnum.push.apply(rnum, addr); + continue; + } + + var n = parseInt(right[i], 16); + if (isNaN(n)) + return undefined; + + rnum.push((n / 256) >> 0); + rnum.push(n % 256); + } + } + + if (rnum.length > 0 && (lnum.length + rnum.length) > 15) + return undefined; + + var num = [ ]; + + num.push.apply(num, lnum); + + for (var i = 0; i < (16 - lnum.length - rnum.length); i++) + num.push(0); + + num.push.apply(num, rnum); + + if (num.length > 16) + return undefined; + + return num; + }; + + this.isNetmask = function(addr) + { + if (!$.isArray(addr)) + return false; + + var c; + + for (c = 0; (c < addr.length) && (addr[c] == 255); c++); + + if (c == addr.length) + return true; + + if ((addr[c] == 254) || (addr[c] == 252) || (addr[c] == 248) || + (addr[c] == 240) || (addr[c] == 224) || (addr[c] == 192) || + (addr[c] == 128) || (addr[c] == 0)) + { + for (c++; (c < addr.length) && (addr[c] == 0); c++); + + if (c == addr.length) + return true; + } + + return false; + }; + this.globals = { timeout: 15000, resource: '/luci2', @@ -505,7 +651,7 @@ function LuCI2() data: JSON.stringify(req), dataType: 'json', type: 'POST', - timeout: _luci2.globals.timeout, + timeout: L.globals.timeout, _rpc_req: req }).then(cb, cb); }, @@ -536,7 +682,7 @@ function LuCI2() for (var i = 0; i < msg.length; i++) { /* fetch related request info */ - var req = _luci2.rpc._requests[reqs[i].id]; + var req = L.rpc._requests[reqs[i].id]; if (typeof(req) != 'object') throw 'No related request for JSON response'; @@ -567,7 +713,7 @@ function LuCI2() { req.priv[0] = ret; req.priv[1] = req.params; - ret = req.filter.apply(_luci2.rpc, req.priv); + ret = req.filter.apply(L.rpc, req.priv); } /* store response data */ @@ -577,7 +723,7 @@ function LuCI2() data = ret; /* delete request object */ - delete _luci2.rpc._requests[reqs[i].id]; + delete L.rpc._requests[reqs[i].id]; } return $.Deferred().resolveWith(this, [ data ]); @@ -608,7 +754,7 @@ function LuCI2() flush: function() { if (!$.isArray(this._batch)) - return _luci2.deferrable([ ]); + return L.deferrable([ ]); var req = this._batch; delete this._batch; @@ -648,7 +794,7 @@ function LuCI2() id: _rpc._id++, method: 'call', params: [ - _luci2.globals.sid, + L.globals.sid, options.object, options.method, params @@ -660,7 +806,7 @@ function LuCI2() if ($.isArray(_rpc._batch)) { req.index = _rpc._batch.push(msg) - 1; - return _luci2.deferrable(msg); + return L.deferrable(msg); } /* call rpc */ @@ -674,7 +820,7 @@ function LuCI2() init: function() { this.state = { - newid: 0, + newidx: 0, values: { }, creates: { }, changes: { }, @@ -683,38 +829,51 @@ function LuCI2() }; }, - _load: _luci2.rpc.declare({ + _load: L.rpc.declare({ object: 'uci', method: 'get', params: [ 'config' ], expect: { values: { } } }), - _order: _luci2.rpc.declare({ + _order: L.rpc.declare({ object: 'uci', method: 'order', params: [ 'config', 'sections' ] }), - _add: _luci2.rpc.declare({ + _add: L.rpc.declare({ object: 'uci', method: 'add', params: [ 'config', 'type', 'name', 'values' ], expect: { section: '' } }), - _set: _luci2.rpc.declare({ + _set: L.rpc.declare({ object: 'uci', method: 'set', params: [ 'config', 'section', 'values' ] }), - _delete: _luci2.rpc.declare({ + _delete: L.rpc.declare({ object: 'uci', method: 'delete', params: [ 'config', 'section', 'options' ] }), + _newid: function(conf) + { + var v = this.state.values; + var n = this.state.creates; + var sid; + + do { + sid = "new%06x".format(Math.random() * 0xFFFFFF); + } while ((n[conf] && n[conf][sid]) || (v[conf] && v[conf][sid])); + + return sid; + }, + load: function(packages) { var self = this; @@ -724,17 +883,17 @@ function LuCI2() if (!$.isArray(packages)) packages = [ packages ]; - _luci2.rpc.batch(); + L.rpc.batch(); for (var i = 0; i < packages.length; i++) - if (!seen[packages[i]]) + if (!seen[packages[i]] && !self.state.values[packages[i]]) { pkgs.push(packages[i]); seen[packages[i]] = true; self._load(packages[i]); } - return _luci2.rpc.flush().then(function(responses) { + return L.rpc.flush().then(function(responses) { for (var i = 0; i < responses.length; i++) self.state.values[pkgs[i]] = responses[i]; @@ -758,21 +917,21 @@ function LuCI2() add: function(conf, type, name) { - var c = this.state.creates; - var s = '.new.%d'.format(this.state.newid++); + var n = this.state.creates; + var sid = this._newid(conf); - if (!c[conf]) - c[conf] = { }; + if (!n[conf]) + n[conf] = { }; - c[conf][s] = { + n[conf][sid] = { '.type': type, - '.name': s, + '.name': sid, '.create': name, '.anonymous': !name, - '.index': 1000 + this.state.newid + '.index': 1000 + this.state.newidx++ }; - return s; + return sid; }, remove: function(conf, sid) @@ -782,10 +941,9 @@ function LuCI2() var d = this.state.deletes; /* requested deletion of a just created section */ - if (sid.indexOf('.new.') == 0) + if (n[conf] && n[conf][sid]) { - if (n[conf]) - delete n[conf][sid]; + delete n[conf][sid]; } else { @@ -845,7 +1003,7 @@ function LuCI2() return undefined; /* requested option in a just created section */ - if (sid.indexOf('.new.') == 0) + if (n[conf] && n[conf][sid]) { if (!n[conf]) return undefined; @@ -890,6 +1048,7 @@ function LuCI2() set: function(conf, sid, opt, val) { + var v = this.state.values; var n = this.state.creates; var c = this.state.changes; var d = this.state.deletes; @@ -899,15 +1058,12 @@ function LuCI2() opt.charAt(0) == '.') return; - if (sid.indexOf('.new.') == 0) + if (n[conf] && n[conf][sid]) { - if (n[conf] && n[conf][sid]) - { - if (typeof(val) != 'undefined') - n[conf][sid][opt] = val; - else - delete n[conf][sid][opt]; - } + if (typeof(val) != 'undefined') + n[conf][sid][opt] = val; + else + delete n[conf][sid][opt]; } else if (typeof(val) != 'undefined') { @@ -915,6 +1071,10 @@ function LuCI2() if (d[conf] && d[conf][sid] === true) return; + /* only set in existing sections */ + if (!v[conf] || !v[conf][sid]) + return; + if (!c[conf]) c[conf] = { }; @@ -923,12 +1083,16 @@ function LuCI2() /* undelete option */ if (d[conf] && d[conf][sid]) - d[conf][sid] = _luci2.filterArray(d[conf][sid], opt); + d[conf][sid] = L.filterArray(d[conf][sid], opt); c[conf][sid][opt] = val; } else { + /* only delete in existing sections */ + if (!v[conf] || !v[conf][sid]) + return; + if (!d[conf]) d[conf] = { }; @@ -945,6 +1109,35 @@ function LuCI2() return this.set(conf, sid, opt, undefined); }, + get_first: function(conf, type, opt) + { + var sid = undefined; + + L.uci.sections(conf, type, function(s) { + if (typeof(sid) != 'string') + sid = s['.name']; + }); + + return this.get(conf, sid, opt); + }, + + set_first: function(conf, type, opt, val) + { + var sid = undefined; + + L.uci.sections(conf, type, function(s) { + if (typeof(sid) != 'string') + sid = s['.name']; + }); + + return this.set(conf, sid, opt, val); + }, + + unset_first: function(conf, type, opt) + { + return this.set_first(conf, type, opt, undefined); + }, + _reload: function() { var pkgs = [ ]; @@ -964,9 +1157,9 @@ function LuCI2() var r = this.state.reorder; if ($.isEmptyObject(r)) - return _luci2.deferrable(); + return L.deferrable(); - _luci2.rpc.batch(); + L.rpc.batch(); /* gather all created and existing sections, sort them according @@ -976,7 +1169,7 @@ function LuCI2() { var o = [ ]; - if (n && n[c]) + if (n[c]) for (var s in n[c]) o.push(n[c][s]); @@ -999,7 +1192,7 @@ function LuCI2() } this.state.reorder = { }; - return _luci2.rpc.flush(); + return L.rpc.flush(); }, swap: function(conf, sid1, sid2) @@ -1022,49 +1215,67 @@ function LuCI2() save: function() { - _luci2.rpc.batch(); + L.rpc.batch(); + + var v = this.state.values; + var n = this.state.creates; + var c = this.state.changes; + var d = this.state.deletes; var self = this; var snew = [ ]; + var pkgs = { }; - if (self.state.creates) - for (var c in self.state.creates) - for (var s in self.state.creates[c]) + if (n) + for (var conf in n) + { + for (var sid in n[conf]) { var r = { - config: c, + config: conf, values: { } }; - for (var k in self.state.creates[c][s]) + for (var k in n[conf][sid]) { if (k == '.type') - r.type = self.state.creates[c][s][k]; + r.type = n[conf][sid][k]; else if (k == '.create') - r.name = self.state.creates[c][s][k]; + r.name = n[conf][sid][k]; else if (k.charAt(0) != '.') - r.values[k] = self.state.creates[c][s][k]; + r.values[k] = n[conf][sid][k]; } - snew.push(self.state.creates[c][s]); + snew.push(n[conf][sid]); self._add(r.config, r.type, r.name, r.values); } - if (self.state.changes) - for (var c in self.state.changes) - for (var s in self.state.changes[c]) - self._set(c, s, self.state.changes[c][s]); + pkgs[conf] = true; + } + + if (c) + for (var conf in c) + { + for (var sid in c[conf]) + self._set(conf, sid, c[conf][sid]); + + pkgs[conf] = true; + } - if (self.state.deletes) - for (var c in self.state.deletes) - for (var s in self.state.deletes[c]) + if (d) + for (var conf in d) + { + for (var sid in d[conf]) { - var o = self.state.deletes[c][s]; - self._delete(c, s, (o === true) ? undefined : o); + var o = d[conf][sid]; + self._delete(conf, sid, (o === true) ? undefined : o); } - return _luci2.rpc.flush().then(function(responses) { + pkgs[conf] = true; + } + + return L.rpc.flush().then(function(responses) { /* array "snew" holds references to the created uci sections, use it to assign the returned names of the new sections @@ -1073,16 +1284,22 @@ function LuCI2() snew[i]['.name'] = responses[i]; return self._reorder(); + }).then(function() { + pkgs = L.toArray(pkgs); + + self.unload(pkgs); + + return self.load(pkgs); }); }, - _apply: _luci2.rpc.declare({ + _apply: L.rpc.declare({ object: 'uci', method: 'apply', params: [ 'timeout', 'rollback' ] }), - _confirm: _luci2.rpc.declare({ + _confirm: L.rpc.declare({ object: 'uci', method: 'confirm' }), @@ -1127,7 +1344,7 @@ function LuCI2() return deferred; }, - changes: _luci2.rpc.declare({ + changes: L.rpc.declare({ object: 'uci', method: 'changes', expect: { changes: { } } @@ -1135,19 +1352,19 @@ function LuCI2() readable: function(conf) { - return _luci2.session.hasACL('uci', conf, 'read'); + return L.session.hasACL('uci', conf, 'read'); }, writable: function(conf) { - return _luci2.session.hasACL('uci', conf, 'write'); + return L.session.hasACL('uci', conf, 'write'); } }); this.uci = new this.UCIContext(); this.wireless = { - listDeviceNames: _luci2.rpc.declare({ + listDeviceNames: L.rpc.declare({ object: 'iwinfo', method: 'devices', expect: { 'devices': [ ] }, @@ -1157,7 +1374,7 @@ function LuCI2() } }), - getDeviceStatus: _luci2.rpc.declare({ + getDeviceStatus: L.rpc.declare({ object: 'iwinfo', method: 'info', params: [ 'device' ], @@ -1172,7 +1389,7 @@ function LuCI2() } }), - getAssocList: _luci2.rpc.declare({ + getAssocList: L.rpc.declare({ object: 'iwinfo', method: 'assoclist', params: [ 'device' ], @@ -1196,12 +1413,12 @@ function LuCI2() getWirelessStatus: function() { return this.listDeviceNames().then(function(names) { - _luci2.rpc.batch(); + L.rpc.batch(); for (var i = 0; i < names.length; i++) - _luci2.wireless.getDeviceStatus(names[i]); + L.wireless.getDeviceStatus(names[i]); - return _luci2.rpc.flush(); + return L.rpc.flush(); }).then(function(networks) { var rv = { }; @@ -1241,12 +1458,12 @@ function LuCI2() getAssocLists: function() { return this.listDeviceNames().then(function(names) { - _luci2.rpc.batch(); + L.rpc.batch(); for (var i = 0; i < names.length; i++) - _luci2.wireless.getAssocList(names[i]); + L.wireless.getAssocList(names[i]); - return _luci2.rpc.flush(); + return L.rpc.flush(); }).then(function(assoclists) { var rv = [ ]; @@ -1269,21 +1486,21 @@ function LuCI2() } if (!enc || !enc.enabled) - return _luci2.tr('None'); + return L.tr('None'); if (enc.wep) { if (enc.wep.length == 2) - return _luci2.tr('WEP Open/Shared') + ' (%s)'.format(format_list(enc.ciphers, ', ')); + return L.tr('WEP Open/Shared') + ' (%s)'.format(format_list(enc.ciphers, ', ')); else if (enc.wep[0] == 'shared') - return _luci2.tr('WEP Shared Auth') + ' (%s)'.format(format_list(enc.ciphers, ', ')); + return L.tr('WEP Shared Auth') + ' (%s)'.format(format_list(enc.ciphers, ', ')); else - return _luci2.tr('WEP Open System') + ' (%s)'.format(format_list(enc.ciphers, ', ')); + return L.tr('WEP Open System') + ' (%s)'.format(format_list(enc.ciphers, ', ')); } else if (enc.wpa) { if (enc.wpa.length == 2) - return _luci2.tr('mixed WPA/WPA2') + ' %s (%s)'.format( + return L.tr('mixed WPA/WPA2') + ' %s (%s)'.format( format_list(enc.authentication, '/'), format_list(enc.ciphers, ', ') ); @@ -1299,7 +1516,7 @@ function LuCI2() ); } - return _luci2.tr('Unknown'); + return L.tr('Unknown'); } }; @@ -1320,7 +1537,7 @@ function LuCI2() for (var i = 0, color = '#'; i < 3; - color += ('00' + ((hash >> i++ * 8) & 0xFF).tozoneing(16)).slice(-2)); + color += ('00' + ((hash >> i++ * 8) & 0xFF).tostring(16)).slice(-2)); return color; }, @@ -1330,7 +1547,7 @@ function LuCI2() var self = this; var zone = undefined; - return _luci2.uci.sections('firewall', 'zone', function(z) { + return L.uci.sections('firewall', 'zone', function(z) { if (!z.name || !z.network) return; @@ -1365,37 +1582,37 @@ function LuCI2() ], _cache_functions: [ - 'protolist', 0, _luci2.rpc.declare({ + 'protolist', 0, L.rpc.declare({ object: 'network', method: 'get_proto_handlers', expect: { '': { } } }), - 'ifstate', 1, _luci2.rpc.declare({ + 'ifstate', 1, L.rpc.declare({ object: 'network.interface', method: 'dump', expect: { 'interface': [ ] } }), - 'devstate', 2, _luci2.rpc.declare({ + 'devstate', 2, L.rpc.declare({ object: 'network.device', method: 'status', expect: { '': { } } }), - 'wifistate', 0, _luci2.rpc.declare({ + 'wifistate', 0, L.rpc.declare({ object: 'network.wireless', method: 'status', expect: { '': { } } }), - 'bwstate', 2, _luci2.rpc.declare({ + 'bwstate', 2, L.rpc.declare({ object: 'luci2.network.bwmon', method: 'statistics', expect: { 'statistics': { } } }), - 'devlist', 2, _luci2.rpc.declare({ + 'devlist', 2, L.rpc.declare({ object: 'luci2.network', method: 'device_list', expect: { 'devices': [ ] } }), - 'swlist', 0, _luci2.rpc.declare({ + 'swlist', 0, L.rpc.declare({ object: 'luci2.network', method: 'switch_list', expect: { 'switches': [ ] } @@ -1404,8 +1621,8 @@ function LuCI2() _fetch_protocol: function(proto) { - var url = _luci2.globals.resource + '/proto/' + proto + '.js'; - var self = _luci2.NetworkModel; + var url = L.globals.resource + '/proto/' + proto + '.js'; + var self = L.NetworkModel; var def = $.Deferred(); @@ -1418,7 +1635,7 @@ function LuCI2() var protoConstructorSource = ( '(function(L, $) { ' + 'return %s' + - '})(_luci2, $);\n\n' + + '})(L, $);\n\n' + '//@ sourceURL=%s' ).format(data, url); @@ -1440,8 +1657,10 @@ function LuCI2() _fetch_protocols: function() { - var self = _luci2.NetworkModel; - var deferreds = [ ]; + var self = L.NetworkModel; + var deferreds = [ + self._fetch_protocol('none') + ]; for (var proto in self._cache.protolist) deferreds.push(self._fetch_protocol(proto)); @@ -1449,7 +1668,7 @@ function LuCI2() return $.when.apply($, deferreds); }, - _fetch_swstate: _luci2.rpc.declare({ + _fetch_swstate: L.rpc.declare({ object: 'luci2.network', method: 'switch_info', params: [ 'switch' ], @@ -1457,7 +1676,7 @@ function LuCI2() }), _fetch_swstate_cb: function(responses) { - var self = _luci2.NetworkModel; + var self = L.NetworkModel; var swlist = self._cache.swlist; var swstate = self._cache.swstate = { }; @@ -1467,7 +1686,7 @@ function LuCI2() _fetch_cache_cb: function(level) { - var self = _luci2.NetworkModel; + var self = L.NetworkModel; var name = '_fetch_cache_cb_' + level; return self[name] || ( @@ -1479,42 +1698,42 @@ function LuCI2() if (!level) { - _luci2.rpc.batch(); + L.rpc.batch(); for (var i = 0; i < self._cache.swlist.length; i++) self._fetch_swstate(self._cache.swlist[i]); - return _luci2.rpc.flush().then(self._fetch_swstate_cb); + return L.rpc.flush().then(self._fetch_swstate_cb); } - return _luci2.deferrable(); + return L.deferrable(); } ); }, _fetch_cache: function(level) { - var self = _luci2.NetworkModel; + var self = L.NetworkModel; - return _luci2.uci.load(['network', 'wireless']).then(function() { - _luci2.rpc.batch(); + return L.uci.load(['network', 'wireless']).then(function() { + L.rpc.batch(); for (var i = 0; i < self._cache_functions.length; i += 3) if (!level || self._cache_functions[i + 1] == level) self._cache_functions[i + 2](); - return _luci2.rpc.flush().then(self._fetch_cache_cb(level || 0)); + return L.rpc.flush().then(self._fetch_cache_cb(level || 0)); }); }, _get: function(pkg, sid, key) { - return _luci2.uci.get(pkg, sid, key); + return L.uci.get(pkg, sid, key); }, _set: function(pkg, sid, key, val) { - return _luci2.uci.set(pkg, sid, key, val); + return L.uci.set(pkg, sid, key, val); }, _is_blacklisted: function(dev) @@ -1568,7 +1787,7 @@ function LuCI2() _parse_devices: function() { - var self = _luci2.NetworkModel; + var self = L.NetworkModel; var wificount = { }; for (var ifname in self._cache.devstate) @@ -1627,7 +1846,7 @@ function LuCI2() } } - var net = _luci2.uci.sections('network'); + var net = L.uci.sections('network'); for (var i = 0; i < net.length; i++) { var s = net[i]; @@ -1649,7 +1868,7 @@ function LuCI2() } else if (s['.type'] == 'interface' && !s['.anonymous'] && s.ifname) { - var ifnames = _luci2.toArray(s.ifname); + var ifnames = L.toArray(s.ifname); for (var j = 0; j < ifnames.length; j++) self._get_dev(ifnames[j]); @@ -1667,7 +1886,7 @@ function LuCI2() { var sw = self._cache.swstate[s.device]; var vid = parseInt(s.vid || s.vlan); - var ports = _luci2.toArray(s.ports); + var ports = L.toArray(s.ports); if (!sw || !ports.length || isNaN(vid)) continue; @@ -1703,7 +1922,7 @@ function LuCI2() } } - var wifi = _luci2.uci.sections('wireless'); + var wifi = L.uci.sections('wireless'); for (var i = 0; i < wifi.length; i++) { var s = wifi[i]; @@ -1748,7 +1967,7 @@ function LuCI2() if (s['.type'] == 'interface' && !s['.anonymous'] && s.type == 'bridge') { - var ifnames = _luci2.toArray(s.ifname); + var ifnames = L.toArray(s.ifname); for (var ifname in self._devs) { @@ -1757,7 +1976,7 @@ function LuCI2() if (dev.kind != 'wifi') continue; - var wnets = _luci2.toArray(_luci2.uci.get('wireless', dev.sid, 'network')); + var wnets = L.toArray(L.uci.get('wireless', dev.sid, 'network')); if ($.inArray(sid, wnets) > -1) ifnames.push(ifname); } @@ -1773,8 +1992,8 @@ function LuCI2() _parse_interfaces: function() { - var self = _luci2.NetworkModel; - var net = _luci2.uci.sections('network'); + var self = L.NetworkModel; + var net = L.uci.sections('network'); for (var i = 0; i < net.length; i++) { @@ -1789,7 +2008,7 @@ function LuCI2() var l3dev = undefined; var l2dev = undefined; - var ifnames = _luci2.toArray(s.ifname); + var ifnames = L.toArray(s.ifname); for (var ifname in self._devs) { @@ -1798,7 +2017,7 @@ function LuCI2() if (dev.kind != 'wifi') continue; - var wnets = _luci2.toArray(_luci2.uci.get('wireless', dev.sid, 'network')); + var wnets = L.toArray(L.uci.get('wireless', dev.sid, 'network')); if ($.inArray(entry.name, wnets) > -1) ifnames.push(ifname); } @@ -1844,7 +2063,7 @@ function LuCI2() var self = this; if (self._cache) - return _luci2.deferrable(); + return L.deferrable(); self._cache = { }; self._devs = { }; @@ -1887,14 +2106,14 @@ function LuCI2() for (var ifname in this._devs) if (ifname != 'lo') - devs.push(new _luci2.NetworkModel.Device(this._devs[ifname])); + devs.push(new L.NetworkModel.Device(this._devs[ifname])); return devs.sort(this._sort_devices); }, getDeviceByInterface: function(iface) { - if (iface instanceof _luci2.NetworkModel.Interface) + if (iface instanceof L.NetworkModel.Interface) iface = iface.name(); if (this._ifaces[iface]) @@ -1907,14 +2126,14 @@ function LuCI2() getDevice: function(ifname) { if (this._devs[ifname]) - return new _luci2.NetworkModel.Device(this._devs[ifname]); + return new L.NetworkModel.Device(this._devs[ifname]); return undefined; }, createDevice: function(name) { - return new _luci2.NetworkModel.Device(this._get_dev(name)); + return new L.NetworkModel.Device(this._get_dev(name)); }, getInterfaces: function() @@ -1941,7 +2160,7 @@ function LuCI2() { var ifaces = [ ]; - if (dev instanceof _luci2.NetworkModel.Device) + if (dev instanceof L.NetworkModel.Device) dev = dev.name(); for (var name in this._ifaces) @@ -1966,7 +2185,7 @@ function LuCI2() getInterface: function(iface) { if (this._ifaces[iface]) - return new _luci2.NetworkModel.Interface(this._ifaces[iface]); + return new L.NetworkModel.Interface(this._ifaces[iface]); return undefined; }, @@ -2030,7 +2249,7 @@ function LuCI2() resolveAlias: function(ifname) { - if (ifname instanceof _luci2.NetworkModel.Device) + if (ifname instanceof L.NetworkModel.Device) ifname = ifname.name(); var dev = this._devs[ifname]; @@ -2054,16 +2273,16 @@ function LuCI2() this.NetworkModel.Device = Class.extend({ _wifi_modes: { - ap: _luci2.tr('Master'), - sta: _luci2.tr('Client'), - adhoc: _luci2.tr('Ad-Hoc'), - monitor: _luci2.tr('Monitor'), - wds: _luci2.tr('Static WDS') + ap: L.tr('Master'), + sta: L.tr('Client'), + adhoc: L.tr('Ad-Hoc'), + monitor: L.tr('Monitor'), + wds: L.tr('Static WDS') }, _status: function(key) { - var s = _luci2.NetworkModel._cache.devstate[this.options.ifname]; + var s = L.NetworkModel._cache.devstate[this.options.ifname]; if (s) return key ? s[key] : s; @@ -2075,14 +2294,14 @@ function LuCI2() { var sid = this.options.sid; var pkg = (this.options.kind == 'wifi') ? 'wireless' : 'network'; - return _luci2.NetworkModel._get(pkg, sid, key); + return L.NetworkModel._get(pkg, sid, key); }, set: function(key, val) { var sid = this.options.sid; var pkg = (this.options.kind == 'wifi') ? 'wireless' : 'network'; - return _luci2.NetworkModel._set(pkg, sid, key, val); + return L.NetworkModel._set(pkg, sid, key, val); }, init: function() @@ -2107,52 +2326,52 @@ function LuCI2() switch (this.options.kind) { case 'alias': - return _luci2.tr('Alias for network "%s"').format(this.options.ifname.substring(1)); + return L.tr('Alias for network "%s"').format(this.options.ifname.substring(1)); case 'bridge': - return _luci2.tr('Network bridge'); + return L.tr('Network bridge'); case 'ethernet': - return _luci2.tr('Network device'); + return L.tr('Network device'); case 'tunnel': switch (this.options.type) { case 1: /* tuntap */ - return _luci2.tr('TAP device'); + return L.tr('TAP device'); case 512: /* PPP */ - return _luci2.tr('PPP tunnel'); + return L.tr('PPP tunnel'); case 768: /* IP-IP Tunnel */ - return _luci2.tr('IP-in-IP tunnel'); + return L.tr('IP-in-IP tunnel'); case 769: /* IP6-IP6 Tunnel */ - return _luci2.tr('IPv6-in-IPv6 tunnel'); + return L.tr('IPv6-in-IPv6 tunnel'); case 776: /* IPv6-in-IPv4 */ - return _luci2.tr('IPv6-over-IPv4 tunnel'); + return L.tr('IPv6-over-IPv4 tunnel'); break; case 778: /* GRE over IP */ - return _luci2.tr('GRE-over-IP tunnel'); + return L.tr('GRE-over-IP tunnel'); default: - return _luci2.tr('Tunnel device'); + return L.tr('Tunnel device'); } case 'vlan': - return _luci2.tr('VLAN %d on %s').format(this.options.vid, this.options.vsw.model); + return L.tr('VLAN %d on %s').format(this.options.vid, this.options.vsw.model); case 'wifi': var o = this.options; - return _luci2.trc('(Wifi-Mode) "(SSID)" on (radioX)', '%s "%h" on %s').format( - o.wmode ? this._wifi_modes[o.wmode] : _luci2.tr('Unknown mode'), + return L.trc('(Wifi-Mode) "(SSID)" on (radioX)', '%s "%h" on %s').format( + o.wmode ? this._wifi_modes[o.wmode] : L.tr('Unknown mode'), o.wssid || '?', o.wdev ); } - return _luci2.tr('Unknown device'); + return L.tr('Unknown device'); }, icon: function(up) @@ -2165,12 +2384,12 @@ function LuCI2() if (typeof(up) == 'undefined') up = this.isUp(); - return _luci2.globals.resource + '/icons/%s%s.png'.format(kind, up ? '' : '_disabled'); + return L.globals.resource + '/icons/%s%s.png'.format(kind, up ? '' : '_disabled'); }, isUp: function() { - var l = _luci2.NetworkModel._cache.devlist; + var l = L.NetworkModel._cache.devlist; for (var i = 0; i < l.length; i++) if (l[i].device == this.options.ifname) @@ -2201,8 +2420,8 @@ function LuCI2() isInNetwork: function(net) { - if (!(net instanceof _luci2.NetworkModel.Interface)) - net = _luci2.NetworkModel.getInterface(net); + if (!(net instanceof L.NetworkModel.Interface)) + net = L.NetworkModel.getInterface(net); if (net) { @@ -2210,7 +2429,7 @@ function LuCI2() net.options.l2dev == this.options.ifname) return true; - var dev = _luci2.NetworkModel._devs[net.options.l2dev]; + var dev = L.NetworkModel._devs[net.options.l2dev]; if (dev && dev.kind == 'bridge' && dev.ports) return ($.inArray(this.options.ifname, dev.ports) > -1); } @@ -2220,7 +2439,7 @@ function LuCI2() getMTU: function() { - var dev = _luci2.NetworkModel._cache.devstate[this.options.ifname]; + var dev = L.NetworkModel._cache.devstate[this.options.ifname]; if (dev && !isNaN(dev.mtu)) return dev.mtu; @@ -2232,7 +2451,7 @@ function LuCI2() if (this.options.type != 1) return undefined; - var dev = _luci2.NetworkModel._cache.devstate[this.options.ifname]; + var dev = L.NetworkModel._cache.devstate[this.options.ifname]; if (dev && dev.macaddr) return dev.macaddr.toUpperCase(); @@ -2241,7 +2460,7 @@ function LuCI2() getInterfaces: function() { - return _luci2.NetworkModel.getInterfacesByDevice(this.options.name); + return L.NetworkModel.getInterfacesByDevice(this.options.name); }, getStatistics: function() @@ -2262,7 +2481,7 @@ function LuCI2() for (var i = 0; i < 120; i++) def[i] = 0; - var h = _luci2.NetworkModel._cache.bwstate[this.options.ifname] || { }; + var h = L.NetworkModel._cache.bwstate[this.options.ifname] || { }; return { rx_bytes: (h.rx_bytes || def), tx_bytes: (h.tx_bytes || def), @@ -2273,35 +2492,35 @@ function LuCI2() removeFromInterface: function(iface) { - if (!(iface instanceof _luci2.NetworkModel.Interface)) - iface = _luci2.NetworkModel.getInterface(iface); + if (!(iface instanceof L.NetworkModel.Interface)) + iface = L.NetworkModel.getInterface(iface); if (!iface) return; - var ifnames = _luci2.toArray(iface.get('ifname')); + var ifnames = L.toArray(iface.get('ifname')); if ($.inArray(this.options.ifname, ifnames) > -1) - iface.set('ifname', _luci2.filterArray(ifnames, this.options.ifname)); + iface.set('ifname', L.filterArray(ifnames, this.options.ifname)); if (this.options.kind != 'wifi') return; - var networks = _luci2.toArray(this.get('network')); + var networks = L.toArray(this.get('network')); if ($.inArray(iface.name(), networks) > -1) - this.set('network', _luci2.filterArray(networks, iface.name())); + this.set('network', L.filterArray(networks, iface.name())); }, attachToInterface: function(iface) { - if (!(iface instanceof _luci2.NetworkModel.Interface)) - iface = _luci2.NetworkModel.getInterface(iface); + if (!(iface instanceof L.NetworkModel.Interface)) + iface = L.NetworkModel.getInterface(iface); if (!iface) return; if (this.options.kind != 'wifi') { - var ifnames = _luci2.toArray(iface.get('ifname')); + var ifnames = L.toArray(iface.get('ifname')); if ($.inArray(this.options.ifname, ifnames) < 0) { ifnames.push(this.options.ifname); @@ -2310,7 +2529,7 @@ function LuCI2() } else { - var networks = _luci2.toArray(this.get('network')); + var networks = L.toArray(this.get('network')); if ($.inArray(iface.name(), networks) < 0) { networks.push(iface.name()); @@ -2323,7 +2542,7 @@ function LuCI2() this.NetworkModel.Interface = Class.extend({ _status: function(key) { - var s = _luci2.NetworkModel._cache.ifstate; + var s = L.NetworkModel._cache.ifstate; for (var i = 0; i < s.length; i++) if (s[i]['interface'] == this.options.name) @@ -2334,12 +2553,12 @@ function LuCI2() get: function(key) { - return _luci2.NetworkModel._get('network', this.options.name, key); + return L.NetworkModel._get('network', this.options.name, key); }, set: function(key, val) { - return _luci2.NetworkModel._set('network', this.options.name, key, val); + return L.NetworkModel._set('network', this.options.name, key, val); }, name: function() @@ -2365,7 +2584,7 @@ function LuCI2() getProtocol: function() { var prname = this.get('proto') || 'none'; - return _luci2.NetworkModel._protos[prname] || _luci2.NetworkModel._protos.none; + return L.NetworkModel._protos[prname] || L.NetworkModel._protos.none; }, getUptime: function() @@ -2377,7 +2596,7 @@ function LuCI2() getDevice: function(resolveAlias) { if (this.options.l3dev) - return _luci2.NetworkModel.getDevice(this.options.l3dev); + return L.NetworkModel.getDevice(this.options.l3dev); return undefined; }, @@ -2385,7 +2604,7 @@ function LuCI2() getPhysdev: function() { if (this.options.l2dev) - return _luci2.NetworkModel.getDevice(this.options.l2dev); + return L.NetworkModel.getDevice(this.options.l2dev); return undefined; }, @@ -2394,11 +2613,11 @@ function LuCI2() { var rv = [ ]; var dev = this.options.l2dev ? - _luci2.NetworkModel._devs[this.options.l2dev] : undefined; + L.NetworkModel._devs[this.options.l2dev] : undefined; if (dev && dev.kind == 'bridge' && dev.ports && dev.ports.length) for (var i = 0; i < dev.ports.length; i++) - rv.push(_luci2.NetworkModel.getDevice(dev.ports[i])); + rv.push(L.NetworkModel.getDevice(dev.ports[i])); return rv; }, @@ -2508,13 +2727,13 @@ function LuCI2() getStatistics: function() { - var dev = this.getDevice() || new _luci2.NetworkModel.Device({}); + var dev = this.getDevice() || new L.NetworkModel.Device({}); return dev.getStatistics(); }, getTrafficHistory: function() { - var dev = this.getDevice() || new _luci2.NetworkModel.Device({}); + var dev = this.getDevice() || new L.NetworkModel.Device({}); return dev.getTrafficHistory(); }, @@ -2536,7 +2755,7 @@ function LuCI2() { var dev = devs[i]; - if (dev instanceof _luci2.NetworkModel.Device) + if (dev instanceof L.NetworkModel.Device) dev = dev.name(); if (!dev || old_devs[i].name() != dev) @@ -2555,8 +2774,8 @@ function LuCI2() { var dev = devs[i]; - if (!(dev instanceof _luci2.NetworkModel.Device)) - dev = _luci2.NetworkModel.getDevice(dev); + if (!(dev instanceof L.NetworkModel.Device)) + dev = L.NetworkModel.getDevice(dev); if (dev) dev.attachToInterface(this); @@ -2566,7 +2785,7 @@ function LuCI2() changeProtocol: function(proto) { - var pr = _luci2.NetworkModel._protos[proto]; + var pr = L.NetworkModel._protos[proto]; if (!pr) return; @@ -2604,55 +2823,55 @@ function LuCI2() var device = self.getDevice(); if (!mapwidget) - mapwidget = _luci2.cbi.Map; + mapwidget = L.cbi.Map; var map = new mapwidget('network', { - caption: _luci2.tr('Configure "%s"').format(self.name()) + caption: L.tr('Configure "%s"').format(self.name()) }); - var section = map.section(_luci2.cbi.SingleSection, self.name(), { + var section = map.section(L.cbi.SingleSection, self.name(), { anonymous: true }); section.tab({ id: 'general', - caption: _luci2.tr('General Settings') + caption: L.tr('General Settings') }); section.tab({ id: 'advanced', - caption: _luci2.tr('Advanced Settings') + caption: L.tr('Advanced Settings') }); section.tab({ id: 'ipv6', - caption: _luci2.tr('IPv6') + caption: L.tr('IPv6') }); section.tab({ id: 'physical', - caption: _luci2.tr('Physical Settings') + caption: L.tr('Physical Settings') }); - section.taboption('general', _luci2.cbi.CheckboxValue, 'auto', { - caption: _luci2.tr('Start on boot'), + section.taboption('general', L.cbi.CheckboxValue, 'auto', { + caption: L.tr('Start on boot'), optional: true, initial: true }); - var pr = section.taboption('general', _luci2.cbi.ListValue, 'proto', { - caption: _luci2.tr('Protocol') + var pr = section.taboption('general', L.cbi.ListValue, 'proto', { + caption: L.tr('Protocol') }); pr.ucivalue = function(sid) { return self.get('proto') || 'none'; }; - var ok = section.taboption('general', _luci2.cbi.ButtonValue, '_confirm', { - caption: _luci2.tr('Really switch?'), - description: _luci2.tr('Changing the protocol will clear all configuration for this interface!'), - text: _luci2.tr('Change protocol') + var ok = section.taboption('general', L.cbi.ButtonValue, '_confirm', { + caption: L.tr('Really switch?'), + description: L.tr('Changing the protocol will clear all configuration for this interface!'), + text: L.tr('Change protocol') }); ok.on('click', function(ev) { @@ -2660,7 +2879,7 @@ function LuCI2() self.createForm(mapwidget).show(); }); - var protos = _luci2.NetworkModel.getProtocols(); + var protos = L.NetworkModel.getProtocols(); for (var i = 0; i < protos.length; i++) pr.value(protos[i].name, protos[i].description); @@ -2669,29 +2888,29 @@ function LuCI2() if (!proto.virtual) { - var br = section.taboption('physical', _luci2.cbi.CheckboxValue, 'type', { - caption: _luci2.tr('Network bridge'), - description: _luci2.tr('Merges multiple devices into one logical bridge'), + var br = section.taboption('physical', L.cbi.CheckboxValue, 'type', { + caption: L.tr('Network bridge'), + description: L.tr('Merges multiple devices into one logical bridge'), optional: true, enabled: 'bridge', disabled: '', initial: '' }); - section.taboption('physical', _luci2.cbi.DeviceList, '__iface_multi', { - caption: _luci2.tr('Devices'), + section.taboption('physical', L.cbi.DeviceList, '__iface_multi', { + caption: L.tr('Devices'), multiple: true, bridges: false }).depends('type', true); - section.taboption('physical', _luci2.cbi.DeviceList, '__iface_single', { - caption: _luci2.tr('Device'), + section.taboption('physical', L.cbi.DeviceList, '__iface_single', { + caption: L.tr('Device'), multiple: false, bridges: true }).depends('type', false); - var mac = section.taboption('physical', _luci2.cbi.InputValue, 'macaddr', { - caption: _luci2.tr('Override MAC'), + var mac = section.taboption('physical', L.cbi.InputValue, 'macaddr', { + caption: L.tr('Override MAC'), optional: true, placeholder: device ? device.getMACAddress() : undefined, datatype: 'macaddr' @@ -2719,15 +2938,15 @@ function LuCI2() }; } - section.taboption('physical', _luci2.cbi.InputValue, 'mtu', { - caption: _luci2.tr('Override MTU'), + section.taboption('physical', L.cbi.InputValue, 'mtu', { + caption: L.tr('Override MTU'), optional: true, placeholder: device ? device.getMTU() : undefined, datatype: 'range(1, 9000)' }); - section.taboption('physical', _luci2.cbi.InputValue, 'metric', { - caption: _luci2.tr('Override Metric'), + section.taboption('physical', L.cbi.InputValue, 'metric', { + caption: L.tr('Override Metric'), optional: true, placeholder: 0, datatype: 'uinteger' @@ -2768,19 +2987,19 @@ function LuCI2() }); this.system = { - getSystemInfo: _luci2.rpc.declare({ + getSystemInfo: L.rpc.declare({ object: 'system', method: 'info', expect: { '': { } } }), - getBoardInfo: _luci2.rpc.declare({ + getBoardInfo: L.rpc.declare({ object: 'system', method: 'board', expect: { '': { } } }), - getDiskInfo: _luci2.rpc.declare({ + getDiskInfo: L.rpc.declare({ object: 'luci2.system', method: 'diskfree', expect: { '': { } } @@ -2788,13 +3007,13 @@ function LuCI2() getInfo: function(cb) { - _luci2.rpc.batch(); + L.rpc.batch(); this.getSystemInfo(); this.getBoardInfo(); this.getDiskInfo(); - return _luci2.rpc.flush().then(function(info) { + return L.rpc.flush().then(function(info) { var rv = { }; $.extend(rv, info[0]); @@ -2805,43 +3024,8 @@ function LuCI2() }); }, - getProcessList: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'process_list', - expect: { processes: [ ] }, - filter: function(data) { - data.sort(function(a, b) { return a.pid - b.pid }); - return data; - } - }), - - getSystemLog: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'syslog', - expect: { log: '' } - }), - - getKernelLog: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'dmesg', - expect: { log: '' } - }), - - getZoneInfo: function(cb) - { - return $.getJSON(_luci2.globals.resource + '/zoneinfo.json', cb); - }, - - sendSignal: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'process_signal', - params: [ 'pid', 'signal' ], - filter: function(data) { - return (data == 0); - } - }), - initList: _luci2.rpc.declare({ + initList: L.rpc.declare({ object: 'luci2.system', method: 'init_list', expect: { initscripts: [ ] }, @@ -2862,7 +3046,7 @@ function LuCI2() }); }, - initRun: _luci2.rpc.declare({ + initRun: L.rpc.declare({ object: 'luci2.system', method: 'init_action', params: [ 'name', 'action' ], @@ -2871,351 +3055,125 @@ function LuCI2() } }), - initStart: function(init, cb) { return _luci2.system.initRun(init, 'start', cb) }, - initStop: function(init, cb) { return _luci2.system.initRun(init, 'stop', cb) }, - initRestart: function(init, cb) { return _luci2.system.initRun(init, 'restart', cb) }, - initReload: function(init, cb) { return _luci2.system.initRun(init, 'reload', cb) }, - initEnable: function(init, cb) { return _luci2.system.initRun(init, 'enable', cb) }, - initDisable: function(init, cb) { return _luci2.system.initRun(init, 'disable', cb) }, + initStart: function(init, cb) { return L.system.initRun(init, 'start', cb) }, + initStop: function(init, cb) { return L.system.initRun(init, 'stop', cb) }, + initRestart: function(init, cb) { return L.system.initRun(init, 'restart', cb) }, + initReload: function(init, cb) { return L.system.initRun(init, 'reload', cb) }, + initEnable: function(init, cb) { return L.system.initRun(init, 'enable', cb) }, + initDisable: function(init, cb) { return L.system.initRun(init, 'disable', cb) }, - getRcLocal: _luci2.rpc.declare({ + performReboot: L.rpc.declare({ object: 'luci2.system', - method: 'rclocal_get', - expect: { data: '' } - }), - - setRcLocal: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'rclocal_set', - params: [ 'data' ] - }), - - - getCrontab: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'crontab_get', - expect: { data: '' } - }), - - setCrontab: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'crontab_set', - params: [ 'data' ] - }), + method: 'reboot' + }) + }; + this.session = { - getSSHKeys: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'sshkeys_get', - expect: { keys: [ ] } + login: L.rpc.declare({ + object: 'session', + method: 'login', + params: [ 'username', 'password' ], + expect: { '': { } } }), - setSSHKeys: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'sshkeys_set', - params: [ 'keys' ] + access: L.rpc.declare({ + object: 'session', + method: 'access', + params: [ 'scope', 'object', 'function' ], + expect: { access: false } }), + isAlive: function() + { + return L.session.access('ubus', 'session', 'access'); + }, - setPassword: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'password_set', - params: [ 'user', 'password' ] - }), + startHeartbeat: function() + { + this._hearbeatInterval = window.setInterval(function() { + L.session.isAlive().then(function(alive) { + if (!alive) + { + L.session.stopHeartbeat(); + L.ui.login(true); + } + }); + }, L.globals.timeout * 2); + }, - listLEDs: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'led_list', - expect: { leds: [ ] } - }), + stopHeartbeat: function() + { + if (typeof(this._hearbeatInterval) != 'undefined') + { + window.clearInterval(this._hearbeatInterval); + delete this._hearbeatInterval; + } + }, - listUSBDevices: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'usb_list', - expect: { devices: [ ] } - }), + _acls: { }, - testUpgrade: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'upgrade_test', + _fetch_acls: L.rpc.declare({ + object: 'session', + method: 'access', expect: { '': { } } }), - startUpgrade: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'upgrade_start', - params: [ 'keep' ] - }), - - cleanUpgrade: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'upgrade_clean' - }), - - - restoreBackup: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'backup_restore' - }), + _fetch_acls_cb: function(acls) + { + L.session._acls = acls; + }, - cleanBackup: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'backup_clean' - }), + updateACLs: function() + { + return L.session._fetch_acls() + .then(L.session._fetch_acls_cb); + }, + hasACL: function(scope, object, func) + { + var acls = L.session._acls; - getBackupConfig: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'backup_config_get', - expect: { config: '' } - }), + if (typeof(func) == 'undefined') + return (acls && acls[scope] && acls[scope][object]); - setBackupConfig: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'backup_config_set', - params: [ 'data' ] - }), + if (acls && acls[scope] && acls[scope][object]) + for (var i = 0; i < acls[scope][object].length; i++) + if (acls[scope][object][i] == func) + return true; + return false; + } + }; - listBackup: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'backup_list', - expect: { files: [ ] } - }), + this.ui = { + saveScrollTop: function() + { + this._scroll_top = $(document).scrollTop(); + }, - testReset: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'reset_test', - expect: { supported: false } - }), + restoreScrollTop: function() + { + if (typeof(this._scroll_top) == 'undefined') + return; - startReset: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'reset_start' - }), + $(document).scrollTop(this._scroll_top); + delete this._scroll_top; + }, - performReboot: _luci2.rpc.declare({ - object: 'luci2.system', - method: 'reboot' - }) - }; + loading: function(enable) + { + var win = $(window); + var body = $('body'); - this.opkg = { - updateLists: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'update', - expect: { '': { } } - }), - - _allPackages: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'list', - params: [ 'offset', 'limit', 'pattern' ], - expect: { '': { } } - }), - - _installedPackages: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'list_installed', - params: [ 'offset', 'limit', 'pattern' ], - expect: { '': { } } - }), - - _findPackages: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'find', - params: [ 'offset', 'limit', 'pattern' ], - expect: { '': { } } - }), - - _fetchPackages: function(action, offset, limit, pattern) - { - var packages = [ ]; - - return action(offset, limit, pattern).then(function(list) { - if (!list.total || !list.packages) - return { length: 0, total: 0 }; - - packages.push.apply(packages, list.packages); - packages.total = list.total; - - if (limit <= 0) - limit = list.total; - - if (packages.length >= limit) - return packages; - - _luci2.rpc.batch(); - - for (var i = offset + packages.length; i < limit; i += 100) - action(i, (Math.min(i + 100, limit) % 100) || 100, pattern); - - return _luci2.rpc.flush(); - }).then(function(lists) { - for (var i = 0; i < lists.length; i++) - { - if (!lists[i].total || !lists[i].packages) - continue; - - packages.push.apply(packages, lists[i].packages); - packages.total = lists[i].total; - } - - return packages; - }); - }, - - listPackages: function(offset, limit, pattern) - { - return _luci2.opkg._fetchPackages(_luci2.opkg._allPackages, offset, limit, pattern); - }, - - installedPackages: function(offset, limit, pattern) - { - return _luci2.opkg._fetchPackages(_luci2.opkg._installedPackages, offset, limit, pattern); - }, - - findPackages: function(offset, limit, pattern) - { - return _luci2.opkg._fetchPackages(_luci2.opkg._findPackages, offset, limit, pattern); - }, - - installPackage: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'install', - params: [ 'package' ], - expect: { '': { } } - }), - - removePackage: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'remove', - params: [ 'package' ], - expect: { '': { } } - }), - - getConfig: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'config_get', - expect: { config: '' } - }), - - setConfig: _luci2.rpc.declare({ - object: 'luci2.opkg', - method: 'config_set', - params: [ 'data' ] - }) - }; - - this.session = { - - login: _luci2.rpc.declare({ - object: 'session', - method: 'login', - params: [ 'username', 'password' ], - expect: { '': { } } - }), - - access: _luci2.rpc.declare({ - object: 'session', - method: 'access', - params: [ 'scope', 'object', 'function' ], - expect: { access: false } - }), - - isAlive: function() - { - return _luci2.session.access('ubus', 'session', 'access'); - }, - - startHeartbeat: function() - { - this._hearbeatInterval = window.setInterval(function() { - _luci2.session.isAlive().then(function(alive) { - if (!alive) - { - _luci2.session.stopHeartbeat(); - _luci2.ui.login(true); - } - - }); - }, _luci2.globals.timeout * 2); - }, - - stopHeartbeat: function() - { - if (typeof(this._hearbeatInterval) != 'undefined') - { - window.clearInterval(this._hearbeatInterval); - delete this._hearbeatInterval; - } - }, - - - _acls: { }, - - _fetch_acls: _luci2.rpc.declare({ - object: 'session', - method: 'access', - expect: { '': { } } - }), - - _fetch_acls_cb: function(acls) - { - _luci2.session._acls = acls; - }, - - updateACLs: function() - { - return _luci2.session._fetch_acls() - .then(_luci2.session._fetch_acls_cb); - }, - - hasACL: function(scope, object, func) - { - var acls = _luci2.session._acls; - - if (typeof(func) == 'undefined') - return (acls && acls[scope] && acls[scope][object]); - - if (acls && acls[scope] && acls[scope][object]) - for (var i = 0; i < acls[scope][object].length; i++) - if (acls[scope][object][i] == func) - return true; - - return false; - } - }; - - this.ui = { - - saveScrollTop: function() - { - this._scroll_top = $(document).scrollTop(); - }, - - restoreScrollTop: function() - { - if (typeof(this._scroll_top) == 'undefined') - return; - - $(document).scrollTop(this._scroll_top); - - delete this._scroll_top; - }, - - loading: function(enable) - { - var win = $(window); - var body = $('body'); - - var state = _luci2.ui._loading || (_luci2.ui._loading = { + var state = L.ui._loading || (L.ui._loading = { modal: $('
') + .css('z-index', 2000) .addClass('modal fade') .append($('
') .addClass('modal-dialog') @@ -3223,7 +3181,7 @@ function LuCI2() .addClass('modal-content luci2-modal-loader') .append($('
') .addClass('modal-body') - .text(_luci2.tr('Loading data…'))))) + .text(L.tr('Loading data…'))))) .appendTo(body) .modal({ backdrop: 'static', @@ -3239,7 +3197,7 @@ function LuCI2() var win = $(window); var body = $('body'); - var state = _luci2.ui._dialog || (_luci2.ui._dialog = { + var state = L.ui._dialog || (L.ui._dialog = { dialog: $('
') .addClass('modal fade') .append($('
') @@ -3254,7 +3212,7 @@ function LuCI2() .addClass('modal-body')) .append($('
') .addClass('modal-footer') - .append(_luci2.ui.button(_luci2.tr('Close'), 'primary') + .append(L.ui.button(L.tr('Close'), 'primary') .click(function() { $(this).parents('div.modal').modal('hide'); }))))) @@ -3278,20 +3236,20 @@ function LuCI2() if (options.style == 'confirm') { - ftr.append(_luci2.ui.button(_luci2.tr('Ok'), 'primary') - .click(options.confirm || function() { _luci2.ui.dialog(false) })); + ftr.append(L.ui.button(L.tr('Ok'), 'primary') + .click(options.confirm || function() { L.ui.dialog(false) })); - ftr.append(_luci2.ui.button(_luci2.tr('Cancel'), 'default') - .click(options.cancel || function() { _luci2.ui.dialog(false) })); + ftr.append(L.ui.button(L.tr('Cancel'), 'default') + .click(options.cancel || function() { L.ui.dialog(false) })); } else if (options.style == 'close') { - ftr.append(_luci2.ui.button(_luci2.tr('Close'), 'primary') - .click(options.close || function() { _luci2.ui.dialog(false) })); + ftr.append(L.ui.button(L.tr('Close'), 'primary') + .click(options.close || function() { L.ui.dialog(false) })); } else if (options.style == 'wait') { - ftr.append(_luci2.ui.button(_luci2.tr('Close'), 'primary') + ftr.append(L.ui.button(L.tr('Close'), 'primary') .attr('disabled', true)); } @@ -3314,7 +3272,7 @@ function LuCI2() upload: function(title, content, options) { - var state = _luci2.ui._upload || (_luci2.ui._upload = { + var state = L.ui._upload || (L.ui._upload = { form: $('
') .attr('method', 'post') .attr('action', '/cgi-bin/luci-upload') @@ -3356,17 +3314,17 @@ function LuCI2() json = $.parseJSON(body.innerHTML); } catch(e) { json = { - message: _luci2.tr('Invalid server response received'), - error: [ -1, _luci2.tr('Invalid data') ] + message: L.tr('Invalid server response received'), + error: [ -1, L.tr('Invalid data') ] }; }; if (json.error) { L.ui.dialog(L.tr('File upload'), [ - $('

').text(_luci2.tr('The file upload failed with the server response below:')), + $('

').text(L.tr('The file upload failed with the server response below:')), $('

').addClass('alert-message').text(json.message || json.error[1]),
-							$('

').text(_luci2.tr('In case of network problems try uploading the file again.')) + $('

').text(L.tr('In case of network problems try uploading the file again.')) ], { style: 'close' }); } else if (typeof(state.success_cb) == 'function') @@ -3388,7 +3346,7 @@ function LuCI2() f.hide(); b.show(); - p.text(_luci2.tr('File upload in progress …')); + p.text(L.tr('File upload in progress …')); state.form.parent().parent().find('button').prop('disabled', true); } @@ -3396,14 +3354,14 @@ function LuCI2() state.form.find('.progress').hide(); state.form.find('.cbi-input-file').val('').show(); - state.form.find('p').text(content || _luci2.tr('Select the file to upload and press "%s" to proceed.').format(_luci2.tr('Ok'))); + state.form.find('p').text(content || L.tr('Select the file to upload and press "%s" to proceed.').format(L.tr('Ok'))); - state.form.find('[name=sessionid]').val(_luci2.globals.sid); + state.form.find('[name=sessionid]').val(L.globals.sid); state.form.find('[name=filename]').val(options.filename); state.success_cb = options.success; - _luci2.ui.dialog(title || _luci2.tr('File upload'), state.form, { + L.ui.dialog(title || L.tr('File upload'), state.form, { style: 'confirm', confirm: state.confirm_cb }); @@ -3417,9 +3375,9 @@ function LuCI2() var images = $(); var interval, timeout; - _luci2.ui.dialog( - _luci2.tr('Waiting for device'), [ - $('

').text(_luci2.tr('Please stand by while the device is reconfiguring …')), + L.ui.dialog( + L.tr('Waiting for device'), [ + $('

').text(L.tr('Please stand by while the device is reconfiguring …')), $('

') .css('width', '100%') .addClass('progressbar') @@ -3432,7 +3390,7 @@ function LuCI2() for (var i = 0; i < protocols.length; i++) images = images.add($('').attr('url', protocols[i] + '://' + address + ':' + ports[i])); - //_luci2.network.getNetworkStatus(function(s) { + //L.network.getNetworkStatus(function(s) { // for (var i = 0; i < protocols.length; i++) // { // for (var j = 0; j < s.length; j++) @@ -3447,12 +3405,12 @@ function LuCI2() //}).then(function() { images.on('load', function() { var url = this.getAttribute('url'); - _luci2.session.isAlive().then(function(access) { + L.session.isAlive().then(function(access) { if (access) { window.clearTimeout(timeout); window.clearInterval(interval); - _luci2.ui.dialog(false); + L.ui.dialog(false); images = null; } else @@ -3464,7 +3422,7 @@ function LuCI2() interval = window.setInterval(function() { images.each(function() { - this.setAttribute('src', this.getAttribute('url') + _luci2.globals.resource + '/icons/loading.gif?r=' + Math.random()); + this.setAttribute('src', this.getAttribute('url') + L.globals.resource + '/icons/loading.gif?r=' + Math.random()); }); }, 5000); @@ -3472,9 +3430,9 @@ function LuCI2() window.clearInterval(interval); images.off('load'); - _luci2.ui.dialog( - _luci2.tr('Device not responding'), - _luci2.tr('The device was not responding within 180 seconds, you might need to manually reconnect your computer or use SSH to regain access.'), + L.ui.dialog( + L.tr('Device not responding'), + L.tr('The device was not responding within 180 seconds, you might need to manually reconnect your computer or use SSH to regain access.'), { style: 'close' } ); }, 180000); @@ -3483,16 +3441,16 @@ function LuCI2() login: function(invalid) { - var state = _luci2.ui._login || (_luci2.ui._login = { + var state = L.ui._login || (L.ui._login = { form: $('') .attr('target', '') .attr('method', 'post') .append($('

') .addClass('alert-message') - .text(_luci2.tr('Wrong username or password given!'))) + .text(L.tr('Wrong username or password given!'))) .append($('

') .append($('

') .append($('

') - .text(_luci2.tr('Enter your username and password above, then click "%s" to proceed.').format(_luci2.tr('Ok')))), + .text(L.tr('Enter your username and password above, then click "%s" to proceed.').format(L.tr('Ok')))), response_cb: function(response) { if (!response.ubus_rpc_session) { - _luci2.ui.login(true); + L.ui.login(true); } else { - _luci2.globals.sid = response.ubus_rpc_session; - _luci2.setHash('id', _luci2.globals.sid); - _luci2.session.startHeartbeat(); - _luci2.ui.dialog(false); + L.globals.sid = response.ubus_rpc_session; + L.setHash('id', L.globals.sid); + L.session.startHeartbeat(); + L.ui.dialog(false); state.deferred.resolve(); } }, @@ -3540,9 +3498,9 @@ function LuCI2() if (!u) return; - _luci2.ui.dialog( - _luci2.tr('Logging in'), [ - $('

').text(_luci2.tr('Log in in progress …')), + L.ui.dialog( + L.tr('Logging in'), [ + $('

').text(L.tr('Log in in progress …')), $('

') .css('width', '100%') .addClass('progressbar') @@ -3552,8 +3510,8 @@ function LuCI2() ], { style: 'wait' } ); - _luci2.globals.sid = '00000000000000000000000000000000'; - _luci2.session.login(u, p).then(state.response_cb); + L.globals.sid = '00000000000000000000000000000000'; + L.session.login(u, p).then(state.response_cb); } }); @@ -3561,20 +3519,20 @@ function LuCI2() state.deferred = $.Deferred(); /* try to find sid from hash */ - var sid = _luci2.getHash('id'); + var sid = L.getHash('id'); if (sid && sid.match(/^[a-f0-9]{32}$/)) { - _luci2.globals.sid = sid; - _luci2.session.isAlive().then(function(access) { + L.globals.sid = sid; + L.session.isAlive().then(function(access) { if (access) { - _luci2.session.startHeartbeat(); + L.session.startHeartbeat(); state.deferred.resolve(); } else { - _luci2.setHash('id', undefined); - _luci2.ui.login(); + L.setHash('id', undefined); + L.ui.login(); } }); @@ -3586,7 +3544,7 @@ function LuCI2() else state.form.find('.alert-message').hide(); - _luci2.ui.dialog(_luci2.tr('Authorization Required'), state.form, { + L.ui.dialog(L.tr('Authorization Required'), state.form, { style: 'confirm', confirm: state.confirm_cb }); @@ -3596,7 +3554,7 @@ function LuCI2() return state.deferred; }, - cryptPassword: _luci2.rpc.declare({ + cryptPassword: L.rpc.declare({ object: 'luci2.ui', method: 'crypt', params: [ 'data' ], @@ -3671,29 +3629,42 @@ function LuCI2() } }, - listAvailableACLs: _luci2.rpc.declare({ + listAvailableACLs: L.rpc.declare({ object: 'luci2.ui', method: 'acls', expect: { acls: [ ] }, filter: function(trees) { var acl_tree = { }; for (var i = 0; i < trees.length; i++) - _luci2.ui._acl_merge_tree(acl_tree, trees[i]); + L.ui._acl_merge_tree(acl_tree, trees[i]); return acl_tree; } }), - renderMainMenu: _luci2.rpc.declare({ + _render_change_indicator: function() + { + return $('