XHTML does not specify ` `, use ` ` instead. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
192 lines
4.8 KiB
JavaScript
192 lines
4.8 KiB
JavaScript
// Thsis file wouldn't have been possible without help from [@vsviridov](https://github.com/vsviridov)
|
|
|
|
'require ui';
|
|
'require rpc';
|
|
'require form';
|
|
|
|
var pkg = {
|
|
get Name() { return 'vpnbypass'; }
|
|
};
|
|
|
|
var _getInitList = rpc.declare({
|
|
object: 'luci.' + pkg.Name,
|
|
method: 'getInitList',
|
|
params: ['name']
|
|
});
|
|
|
|
var _setInitAction = rpc.declare({
|
|
object: 'luci.' + pkg.Name,
|
|
method: 'setInitAction',
|
|
params: ['name', 'action'],
|
|
expect: { result: false }
|
|
});
|
|
|
|
var _getInitStatus = rpc.declare({
|
|
object: 'luci.' + pkg.Name,
|
|
method: 'getInitStatus',
|
|
params: ['name']
|
|
});
|
|
|
|
var RPC = {
|
|
listeners: [],
|
|
on: function on(event, callback) {
|
|
var pair = { event: event, callback: callback }
|
|
this.listeners.push(pair);
|
|
return function unsubscribe() {
|
|
this.listeners = this.listeners.filter(function (listener) {
|
|
return listener !== pair;
|
|
});
|
|
}.bind(this);
|
|
},
|
|
emit: function emit(event, data) {
|
|
this.listeners.forEach(function (listener) {
|
|
if (listener.event === event) {
|
|
listener.callback(data);
|
|
}
|
|
});
|
|
},
|
|
getInitList: function getInitList(name) {
|
|
_getInitList(name).then(function (result) {
|
|
this.emit('getInitList', result);
|
|
}.bind(this));
|
|
|
|
},
|
|
getInitStatus: function getInitStatus(name) {
|
|
_getInitStatus(name).then(function (result) {
|
|
this.emit('getInitStatus', result);
|
|
}.bind(this));
|
|
},
|
|
setInitAction: function setInitAction(name, action) {
|
|
_setInitAction(name, action).then(function (result) {
|
|
this.emit('setInitAction', result);
|
|
}.bind(this));
|
|
}
|
|
}
|
|
|
|
var statusCBI = form.DummyValue.extend({
|
|
renderWidget: function (section) {
|
|
var status = E('span', {}, _("Quering") + "...");
|
|
RPC.on('getInitStatus', function (reply) {
|
|
if (reply[pkg.Name].version) {
|
|
if (reply[pkg.Name].running) {
|
|
status.innerText = _("Running (version: %s)").format(reply[pkg.Name].version);
|
|
}
|
|
else {
|
|
if (reply[pkg.Name].enabled) {
|
|
status.innerText = _("Stopped (version: %s)").format(reply[pkg.Name].version);
|
|
}
|
|
else {
|
|
status.innerText = _("Stopped (Disabled)");
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
status.innerText = _("Not installed or not found")
|
|
}
|
|
});
|
|
return E('div', {}, [status]);
|
|
}
|
|
});
|
|
|
|
var buttonsCBI = form.DummyValue.extend({
|
|
renderWidget: function (section) {
|
|
|
|
var btn_gap = E('span', {}, '  ');
|
|
var btn_gap_long = E('span', {}, '        ');
|
|
|
|
var btn_start = E('button', {
|
|
'class': 'btn cbi-button cbi-button-apply',
|
|
disabled: true,
|
|
click: function (ev) {
|
|
ui.showModal(null, [
|
|
E('p', { 'class': 'spinning' }, _('Starting %s service').format(pkg.Name))
|
|
]);
|
|
return RPC.setInitAction(pkg.Name, 'start');
|
|
}
|
|
}, _('Start'));
|
|
|
|
var btn_action = E('button', {
|
|
'class': 'btn cbi-button cbi-button-apply',
|
|
disabled: true,
|
|
click: function (ev) {
|
|
ui.showModal(null, [
|
|
E('p', { 'class': 'spinning' }, _('Restarting %s service').format(pkg.Name))
|
|
]);
|
|
return RPC.setInitAction(pkg.Name, 'restart');
|
|
}
|
|
}, _('Restart'));
|
|
|
|
var btn_stop = E('button', {
|
|
'class': 'btn cbi-button cbi-button-reset',
|
|
disabled: true,
|
|
click: function (ev) {
|
|
ui.showModal(null, [
|
|
E('p', { 'class': 'spinning' }, _('Stopping %s service').format(pkg.Name))
|
|
]);
|
|
return RPC.setInitAction(pkg.Name, 'stop');
|
|
}
|
|
}, _('Stop'));
|
|
|
|
var btn_enable = E('button', {
|
|
'class': 'btn cbi-button cbi-button-apply',
|
|
disabled: true,
|
|
click: function (ev) {
|
|
ui.showModal(null, [
|
|
E('p', { 'class': 'spinning' }, _('Enabling %s service').format(pkg.Name))
|
|
]);
|
|
return RPC.setInitAction(pkg.Name, 'enable');
|
|
}
|
|
}, _('Enable'));
|
|
|
|
var btn_disable = E('button', {
|
|
'class': 'btn cbi-button cbi-button-reset',
|
|
disabled: true,
|
|
click: function (ev) {
|
|
ui.showModal(null, [
|
|
E('p', { 'class': 'spinning' }, _('Disabling %s service').format(pkg.Name))
|
|
]);
|
|
return RPC.setInitAction(pkg.Name, 'disable');
|
|
}
|
|
}, _('Disable'));
|
|
|
|
RPC.on('getInitStatus', function (reply) {
|
|
if (reply[pkg.Name].version) {
|
|
if (reply[pkg.Name].enabled) {
|
|
btn_enable.disabled = true;
|
|
btn_disable.disabled = false;
|
|
if (reply[pkg.Name].running) {
|
|
btn_start.disabled = true;
|
|
btn_action.disabled = false;
|
|
btn_stop.disabled = false;
|
|
}
|
|
else {
|
|
btn_start.disabled = false;
|
|
btn_action.disabled = true;
|
|
btn_stop.disabled = true;
|
|
}
|
|
}
|
|
else {
|
|
btn_start.disabled = true;
|
|
btn_action.disabled = true;
|
|
btn_stop.disabled = true;
|
|
btn_enable.disabled = false;
|
|
btn_disable.disabled = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
RPC.getInitStatus(pkg.Name);
|
|
|
|
return E('div', {}, [btn_start, btn_gap, btn_action, btn_gap, btn_stop, btn_gap_long, btn_enable, btn_gap, btn_disable]);
|
|
}
|
|
});
|
|
|
|
RPC.on('setInitAction', function (reply) {
|
|
ui.hideModal();
|
|
RPC.getInitStatus(pkg.Name);
|
|
});
|
|
|
|
return L.Class.extend({
|
|
Status: statusCBI,
|
|
Buttons: buttonsCBI
|
|
});
|