luci-base: network.js: support dynamically loaded protocol classes
Port the existing server side protocol support framework to the client side network.js. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
00ec399fa1
commit
d528a96947
2 changed files with 53 additions and 6 deletions
|
@ -83,6 +83,12 @@ var callNetworkDeviceStatus = rpc.declare({
|
|||
expect: { '': {} }
|
||||
});
|
||||
|
||||
var callGetProtoHandlers = rpc.declare({
|
||||
object: 'network',
|
||||
method: 'get_proto_handlers',
|
||||
expect: { '': {} }
|
||||
});
|
||||
|
||||
var _cache = {},
|
||||
_flush = true,
|
||||
_state = null,
|
||||
|
@ -166,6 +172,29 @@ function getBoardState(flush) {
|
|||
return Promise.resolve(_cache.board);
|
||||
}
|
||||
|
||||
function getProtocolHandlers(flush) {
|
||||
if (_cache.protocols == null || flush)
|
||||
return callGetProtoHandlers().then(function(protos) {
|
||||
if (!L.isObject(protos))
|
||||
throw !1;
|
||||
|
||||
_cache.protocols = protos;
|
||||
|
||||
return Promise.all(Object.keys(protos).map(function(p) {
|
||||
return Promise.resolve(L.require('protocol.%s'.format(p))).catch(function(err) {
|
||||
if (L.isObject(err) && err.name != 'NetworkError')
|
||||
L.error(err);
|
||||
});
|
||||
})).then(function() {
|
||||
return _cache.protocols;
|
||||
});
|
||||
}).catch(function() {
|
||||
return (_cache.protocols = {});
|
||||
});
|
||||
|
||||
return Promise.resolve(_cache.protocols);
|
||||
}
|
||||
|
||||
function getWifiStateBySid(sid) {
|
||||
var s = uci.get('wireless', sid);
|
||||
|
||||
|
@ -606,7 +635,7 @@ Network = L.Class.extend({
|
|||
getProtocol: function(protoname, netname) {
|
||||
var v = _protocols[protoname];
|
||||
if (v != null)
|
||||
return v(netname || '__dummy__');
|
||||
return new v(netname || '__dummy__');
|
||||
|
||||
return null;
|
||||
},
|
||||
|
@ -615,18 +644,35 @@ Network = L.Class.extend({
|
|||
var rv = [];
|
||||
|
||||
for (var protoname in _protocols)
|
||||
rv.push(_protocols[protoname]('__dummy__'));
|
||||
rv.push(new _protocols[protoname]('__dummy__'));
|
||||
|
||||
return rv;
|
||||
},
|
||||
|
||||
registerProtocol: function(protoname, methods) {
|
||||
var proto = Protocol.extend(Object.assign({}, methods, {
|
||||
var spec = L.isObject(_cache.protocols) ? _cache.protocols[protoname] : null;
|
||||
var proto = Protocol.extend(Object.assign({
|
||||
getI18n: function() {
|
||||
return protoname;
|
||||
},
|
||||
|
||||
isFloating: function() {
|
||||
return false;
|
||||
},
|
||||
|
||||
isVirtual: function() {
|
||||
return (L.isObject(spec) && spec.no_device == true);
|
||||
},
|
||||
|
||||
renderFormOptions: function(section) {
|
||||
|
||||
}
|
||||
}, methods, {
|
||||
__init__: function(name) {
|
||||
this.sid = name;
|
||||
},
|
||||
|
||||
proto: function() {
|
||||
getProtocol: function() {
|
||||
return protoname;
|
||||
}
|
||||
}));
|
||||
|
@ -1202,7 +1248,7 @@ Protocol = L.Class.extend({
|
|||
if (this.isFloating())
|
||||
ifname = this._ubus('l3_device');
|
||||
else
|
||||
ifname = this._ubus('device');
|
||||
ifname = this._ubus('device') || this._ubus('l3_device');
|
||||
|
||||
if (ifname != null)
|
||||
return ifname;
|
||||
|
@ -1212,7 +1258,7 @@ Protocol = L.Class.extend({
|
|||
},
|
||||
|
||||
getProtocol: function() {
|
||||
return 'none';
|
||||
return null;
|
||||
},
|
||||
|
||||
getI18n: function() {
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
"network.device": [ "status" ],
|
||||
"network.interface": [ "dump" ],
|
||||
"network.wireless": [ "status" ],
|
||||
"network": [ "get_proto_handlers" ],
|
||||
"uci": [ "changes", "get" ]
|
||||
},
|
||||
"uci": [ "*" ]
|
||||
|
|
Loading…
Reference in a new issue