ucentral: development update

* minor luci menu fix

Signed-off-by: John Crispin <john@phrozen.org>
This commit is contained in:
John Crispin
2021-07-29 08:34:38 +02:00
parent 7d5789186c
commit 759a4e9a4e
22 changed files with 2 additions and 4221 deletions

View File

@@ -1,17 +0,0 @@
#
# Copyright (C) 2021 Jo-Philipp Wich <jo@mein.io>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI uCentral Configuration
LUCI_DEPENDS:=+luci-base
PKG_LICENSE:=Apache-2.0
include ../luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@@ -1,102 +0,0 @@
'use strict';
'require fs';
'require ui';
'require dom';
'require rpc';
'require session';
'require baseclass';
var callReboot = rpc.declare({
object: 'system',
method: 'reboot',
expect: { result: 0 }
});
callReboot = function() {
return Promise.resolve(0);
}
function handleReboot(ev) {
return callReboot().then(function(res) {
if (res != 0) {
showError(_('The reboot command failed with code %d').format(res));
L.raise('Error', 'Reboot failed');
}
showProgress(_('The system is rebooting in order to attempt applying the remote configuration profile now. If not successful, the device will revert back into the initial provisioning state.'));
ui.awaitReconnect();
}).catch(function(e) { showError(e.message) });
}
function setDirty(isDirty) {
if (isDirty) {
session.setLocalData('ucentral-dirty', true);
ui.showIndicator('ucentral-dirty', _('Reboot required'), showApplySettings);
}
else {
session.setLocalData('ucentral-dirty', null);
ui.hideIndicator('ucentral-dirty');
}
}
function handleContinue(ev) {
setDirty(true);
ui.hideModal();
}
function showApplySettings() {
ui.showModal(_('Apply Settings'), [
E('p', _('The device must be rebooted in order to apply the changed settings. Once the uCentral agent successfully connects to the controller, the remote configuration profile will be applied and the initial provisioning web interface is disabled.')),
E('div', { 'class': 'right' }, [
E('button', { 'click': handleReboot, 'class': 'btn primary' }, [ _('Apply settings and reboot device now') ]),
'\xa0',
E('button', { 'click': handleContinue, 'class': 'btn' }, [ _('Continue configuration') ])
])
]);
}
function showProgress(text, timeout) {
var dlg = ui.showModal(null, [
E('p', { 'class': (timeout > 0) ? null : 'spinning' }, text)
]);
dlg.removeChild(dlg.firstElementChild);
if (timeout > 0)
window.setTimeout(ui.hideModal, timeout);
return dlg;
}
function showError(text) {
ui.showModal(_('Error'), [
E('p', [ text ]),
E('div', { 'class': 'right' }, [
E('button', { 'class': 'btn', 'click': ui.hideModal }, _('OK'))
])
]);
}
if (session.getLocalData('ucentral-dirty'))
setDirty(true);
return baseclass.extend({
save: function(serializeFn, ev) {
var m = dom.findClassInstance(document.querySelector('.cbi-map'));
return m.save().then(function() {
return fs.write('/etc/ucentral/profile.json', serializeFn(m.data.data));
}).then(function() {
return fs.exec('/sbin/profileupdate');
}).then(function() {
showApplySettings();
}).catch(function(err) {
showError(_('Unable to save settings: %s').format(err));
});
},
setDirty: setDirty,
showError: showError,
showProgress: showProgress,
});

View File

@@ -1,70 +0,0 @@
'use strict';
'require view';
'require form';
'require fs';
'require ui';
'require tools.ucentral as uctool';
var profile = null;
function serialize(data) {
if (!L.isObject(profile.unit))
profile.unit = {};
profile.redirector = data.local.redirector;
profile.unit.location = data.local.location;
return JSON.stringify(profile, null, '\t');
}
return view.extend({
load: function() {
return L.resolveDefault(fs.read('/etc/ucentral/profile.json'), '').then(function(data) {
try { profile = JSON.parse(data); }
catch(e) { profile = {}; };
});
},
render: function() {
var m, s, o, data = { local: {
redirector: profile.redirector,
location: L.isObject(profile.unit) ? profile.unit.location : ''
} };
m = new form.JSONMap(data);
m.readonly = !L.hasViewPermission();
s = m.section(form.NamedSection, 'local', 'local', _('Local settings'),
_('The settings on this page specify how the local uCentral client connects to the controller server.'));
s.option(form.Value, 'redirector', _('Redirector URL'));
s.option(form.Value, 'location', _('Unit location'));
o = s.option(form.Button, '_certs', _('Certificates'));
o.inputtitle = _('Upload certificate bundle…');
o.onclick = function(ev) {
return ui.uploadFile('/tmp/certs.tar').then(function(res) {
uctool.showProgress(_('Verifying certificates…'));
return fs.exec('/sbin/certupdate').then(function(res) {
if (res.code) {
uctool.showError(_('Certificate validation failed: %s').format(res.stderr || res.stdout));
}
else {
uctool.showProgress(_('Certificates updated.'), 1500);
uctool.setDirty(true);
}
}, function(err) {
uctool.showError(_('Unable to verify certificates: %s').format(err));
});
});
};
return m.render();
},
handleSave: uctool.save.bind(uctool, serialize),
handleSaveApply: null,
handleReset: null
});

View File

@@ -1,121 +0,0 @@
'use strict';
'require rpc';
'require view';
'require tools.ucentral as uctool';
var callSystemBoard = rpc.declare({
object: 'system',
method: 'board'
});
var callSystemInfo = rpc.declare({
object: 'system',
method: 'info'
});
function progressbar(value, max, byte) {
var vn = parseInt(value) || 0,
mn = parseInt(max) || 100,
fv = byte ? String.format('%1024.2mB', value) : value,
fm = byte ? String.format('%1024.2mB', max) : max,
pc = Math.floor((100 / mn) * vn);
return E('div', {
'class': 'cbi-progressbar',
'title': '%s / %s (%d%%)'.format(fv, fm, pc)
}, E('div', { 'style': 'width:%.2f%%'.format(pc) }));
}
return view.extend({
load: function() {
return Promise.all([
L.resolveDefault(callSystemBoard(), {}),
L.resolveDefault(callSystemInfo(), {})
]);
},
render: function(data) {
var boardinfo = data[0],
systeminfo = data[1],
mem = L.isObject(systeminfo.memory) ? systeminfo.memory : {},
swap = L.isObject(systeminfo.swap) ? systeminfo.swap : {},
datestr = null;
if (systeminfo.localtime) {
var date = new Date(systeminfo.localtime * 1000);
datestr = '%04d-%02d-%02d %02d:%02d:%02d'.format(
date.getUTCFullYear(),
date.getUTCMonth() + 1,
date.getUTCDate(),
date.getUTCHours(),
date.getUTCMinutes(),
date.getUTCSeconds()
);
}
var sysfields = [
_('Hostname'), boardinfo.hostname,
_('Model'), boardinfo.model,
_('Architecture'), boardinfo.system,
_('Firmware Version'), (L.isObject(boardinfo.release) ? boardinfo.release.description : '?'),
_('Kernel Version'), boardinfo.kernel,
_('Local Time'), datestr,
_('Uptime'), systeminfo.uptime ? '%t'.format(systeminfo.uptime) : null,
_('Load Average'), Array.isArray(systeminfo.load) ? '%.2f, %.2f, %.2f'.format(
systeminfo.load[0] / 65535.0,
systeminfo.load[1] / 65535.0,
systeminfo.load[2] / 65535.0
) : null
];
var systable = E('table', { 'class': 'table' });
for (var i = 0; i < sysfields.length; i += 2) {
systable.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, [ sysfields[i] ]),
E('td', { 'class': 'td left' }, [ (sysfields[i + 1] != null) ? sysfields[i + 1] : '?' ])
]));
}
var memfields = [
_('Total Available'), (mem.available) ? mem.available : (mem.total && mem.free && mem.buffered) ? mem.free + mem.buffered : null, mem.total,
_('Used'), (mem.total && mem.free) ? (mem.total - mem.free) : null, mem.total,
_('Buffered'), (mem.total && mem.buffered) ? mem.buffered : null, mem.total
];
if (mem.cached)
memfields.push(_('Cached'), mem.cached, mem.total);
if (swap.total > 0)
memfields.push(_('Swap free'), swap.free, swap.total);
var memtable = E('table', { 'class': 'table' });
for (var i = 0; i < memfields.length; i += 3) {
memtable.appendChild(E('tr', { 'class': 'tr' }, [
E('td', { 'class': 'td left', 'width': '33%' }, [ memfields[i] ]),
E('td', { 'class': 'td left' }, [
(memfields[i + 1] != null) ? progressbar(memfields[i + 1], memfields[i + 2], true) : '?'
])
]));
}
return E([], [
E('div', { 'class': 'cbi-section' }, [
E('h3', _('System')),
systable
]),
E('div', { 'class': 'cbi-section' }, [
E('h3', _('Memory')),
memtable
]),
]);
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});

View File

@@ -1,180 +0,0 @@
'use strict';
'require view';
'require dom';
'require form';
'require rpc';
'require fs';
'require ui';
'require tools.ucentral as uctool';
var callSystemValidateFirmwareImage = rpc.declare({
object: 'system',
method: 'validate_firmware_image',
params: [ 'path' ],
expect: { '': { valid: false, forcable: true } }
});
var callReboot = rpc.declare({
object: 'system',
method: 'reboot',
expect: { result: 0 }
});
var mapdata = { actions: {}, config: {} };
return view.extend({
load: function() {
var tasks = [
fs.trimmed('/proc/mtd'),
fs.trimmed('/proc/mounts')
];
return Promise.all(tasks);
},
handleFirstboot: function(ev) {
if (!confirm(_('Do you really want to erase all settings?')))
return;
uctool.showProgress(_('The system is erasing the configuration partition now and will reboot itself when finished.'));
/* Currently the sysupgrade rpc call will not return, hence no promise handling */
fs.exec('/sbin/firstboot', [ '-r', '-y' ]);
ui.awaitReconnect('192.168.1.1', 'openwrt.lan');
},
handleSysupgrade: function(ev) {
return ui.uploadFile('/tmp/firmware.bin', ev.target.firstChild)
.then(L.bind(function(btn, reply) {
btn.firstChild.data = _('Checking image…');
uctool.showProgress(_('Verifying the uploaded image file.'));
return callSystemValidateFirmwareImage('/tmp/firmware.bin')
.then(function(res) { return [ reply, res ]; });
}, this, ev.target))
.then(L.bind(function(btn, reply) {
return fs.exec('/sbin/sysupgrade', [ '--test', '/tmp/firmware.bin' ])
.then(function(res) { reply.push(res); return reply; });
}, this, ev.target))
.then(L.bind(function(btn, res) {
var is_valid = res[1].valid,
body = [];
if (is_valid) {
body.push(E('p', _("The firmware image was uploaded. Compare the checksum and file size listed below with the original file to ensure data integrity. <br /> Click 'Continue' below to start the flash procedure.")));
body.push(E('ul', {}, [
res[0].size ? E('li', {}, '%s: %1024.2mB'.format(_('Size'), res[0].size)) : '',
res[0].checksum ? E('li', {}, '%s: %s'.format(_('MD5'), res[0].checksum)) : '',
res[0].sha256sum ? E('li', {}, '%s: %s'.format(_('SHA256'), res[0].sha256sum)) : ''
]));
}
else {
body.push(E('p', _("The firmware image is invalid and cannot be flashed. Check the diagnostics below for further details.")));
if (res[2].stderr)
body.push(E('pre', { 'class': 'alert-message' }, [ res[2].stderr ]));
}
var cntbtn = E('button', {
'class': 'btn cbi-button-action important',
'click': ui.createHandlerFn(this, 'handleSysupgradeConfirm', btn),
'disabled': !is_valid
}, [ _('Continue') ]);
body.push(E('div', { 'class': 'right' }, [
E('button', {
'class': 'btn',
'click': ui.createHandlerFn(this, function(ev) {
return fs.remove('/tmp/firmware.bin').finally(ui.hideModal);
})
}, [ _('Cancel') ]), ' ', cntbtn
]));
ui.showModal(is_valid ? _('Flash image?') : _('Invalid image'), body);
}, this, ev.target))
.catch(function(e) { uctool.showError(e.message) })
.finally(L.bind(function(btn) {
btn.firstChild.data = _('Flash image…');
}, this, ev.target));
},
handleSysupgradeConfirm: function(btn, ev) {
btn.firstChild.data = _('Flashing…');
uctool.showProgress(_('The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a few minutes before you try to reconnect. It might be necessary to renew the address of your computer to reach the device again, depending on your settings.'));
/* Currently the sysupgrade rpc call will not return, hence no promise handling */
fs.exec('/sbin/sysupgrade', [ '-n', '/tmp/firmware.bin' ]);
ui.awaitReconnect('192.168.1.1', 'openwrt.lan');
},
handleReboot: function(ev) {
return callReboot().then(function(res) {
if (res != 0) {
uctool.showError(_('The reboot command failed with code %d').format(res));
L.raise('Error', 'Reboot failed');
}
uctool.showProgress(_('The device is rebooting now. This page will try to reconnect automatically once the device is fully booted.'));
ui.awaitReconnect();
})
.catch(function(e) { uctool.showError(e.message) });
},
render: function(rpc_replies) {
var procmtd = rpc_replies[0],
procmounts = rpc_replies[1],
has_rootfs_data = (procmtd.match(/"rootfs_data"/) != null) || (procmounts.match("overlayfs:\/overlay \/ ") != null),
m, s, o, ss;
m = new form.JSONMap(mapdata);
m.readonly = !L.hasViewPermission();
s = m.section(form.NamedSection, 'actions');
o = s.option(form.SectionValue, 'actions', form.NamedSection, 'actions', 'actions', _('Reboot device'),
_('Issue a reboot and restart the operating system on this device.'));
ss = o.subsection;
o = ss.option(form.Button, 'reboot');
o.inputstyle = 'action important';
o.inputtitle = _('Reboot');
o.onclick = L.bind(this.handleReboot, this);
o = s.option(form.SectionValue, 'actions', form.NamedSection, 'actions', 'actions', _('Reset to defaults'),
_('Reset the system to its initial state and discard any configuration changes.'));
ss = o.subsection;
if (has_rootfs_data) {
o = ss.option(form.Button, 'reset');
o.inputstyle = 'negative important';
o.inputtitle = _('Perform reset');
o.onclick = this.handleFirstboot;
}
o = s.option(form.SectionValue, 'actions', form.NamedSection, 'actions', 'actions', _('Firmware upgrade'),
_('Upload a compatible firmware image here to upgrade the running system.'));
ss = o.subsection;
o = ss.option(form.Button, 'sysupgrade');
o.inputstyle = 'action important';
o.inputtitle = _('Flash image…');
o.onclick = L.bind(this.handleSysupgrade, this);
return m.render();
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});

View File

@@ -1,118 +0,0 @@
'use strict';
'require view';
'require form';
'require fs';
'require tools.ucentral as uctool';
var profile = null;
function serialize(data) {
if (data.broadband.protocol != 'default')
profile.broadband = Object.assign({}, data.broadband);
else
delete profile.broadband;
return JSON.stringify(profile, function(key, val) {
return (key.charAt(0) != '.') ? val : undefined;
}, '\t');
}
return view.extend({
load: function() {
return L.resolveDefault(fs.read('/etc/ucentral/profile.json'), '').then(function(data) {
try { profile = JSON.parse(data); }
catch(e) { profile = {}; };
if (!L.isObject(profile.broadband))
profile.broadband = { protocol: 'default' };
});
},
render: function() {
var m, s, o, data = { broadband: {} };
m = new form.JSONMap(data);
m.readonly = !L.hasViewPermission();
s = m.section(form.NamedSection, 'broadband', 'broadband', _('Uplink configuration'),
_('The uplink settings allow overriding the WAN connection properties of the local device.'));
o = s.option(form.ListValue, 'protocol', _('Connection'));
o.value('default', _('Use default cloud settings'));
o.value('static', _('Static address configuration'));
o.value('dhcp', _('Address configuration via DHCP'));
o.value('pppoe', _('Address configuration via PPPoE'));
o.value('wwan', _('Cellular network connection'));
o = s.option(form.ListValue, 'modem-type', _('Modem type'));
o.depends('protocol', 'wwan');
o.value('wwan', _('Automatic', 'Automatic modem type selection'));
o.value('mbim', 'MBIM');
o.value('qmi', 'QMI');
o = s.option(form.Value, 'access-point-name', _('APN', 'Cellular access point name'));
o.depends('protocol', 'wwan');
o.validate = function(section_id, value) {
if (!/^[a-zA-Z0-9\-.]*[a-zA-Z0-9]$/.test(value))
return _('Invalid APN provided');
return true;
};
o = s.option(form.Value, 'pin-code', _('PIN'));
o.depends('protocol', 'wwan');
o.datatype = 'and(uinteger,minlength(4),maxlength(8))';
o = s.option(form.ListValue, 'authentication-type', _('Authentication'));
o.depends('protocol', 'wwan');
o.value('', _('No authentication'));
o.value('pap-chap', 'PAP/CHAP');
o.value('chap', 'CHAP');
o.value('pap', 'PAP');
o = s.option(form.Value, 'user-name', _('Username'));
o.depends('authentication-type', 'pap-chap');
o.depends('authentication-type', 'chap');
o.depends('authentication-type', 'pap');
o.depends('protocol', 'pppoe');
o = s.option(form.Value, 'password', _('Password'));
o.depends('authentication-type', 'pap-chap');
o.depends('authentication-type', 'chap');
o.depends('authentication-type', 'pap');
o.depends('protocol', 'pppoe');
o.password = true;
o = s.option(form.Value, 'ipv4-address', _('IPv4 Address'), _('Address and mask in CIDR notation.'));
o.depends('protocol', 'static');
o.datatype = 'or(cidr4,ipnet4)';
o.rmempty = false;
o = s.option(form.Value, 'ipv4-gateway', _('IPv4 Gateway'));
o.depends('protocol', 'static');
o.datatype = 'ip4addr("nomask")';
o.rmempty = false;
o = s.option(form.Value, 'ipv6-address', _('IPv6 Address'), _('Address and mask in CIDR notation.'));
o.depends('protocol', 'static');
o.datatype = 'or(cidr6,ipnet6)';
o = s.option(form.Value, 'ipv6-gateway', _('IPv6 Gateway'));
o.depends('protocol', 'static');
o.datatype = 'ip6addr("nomask")';
o = s.option(form.DynamicList, 'use-dns', _('DNS Servers'));
o.depends('protocol', 'static');
o.datatype = 'ipaddr("nomask")';
for (var i = 0; i < s.children.length; i++)
data.broadband[s.children[i].option] = profile.broadband[s.children[i].option];
return m.render();
},
handleSave: uctool.save.bind(uctool, serialize),
handleSaveApply: null,
handleReset: null
});

View File

@@ -1,426 +0,0 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"X-Generator: Poedit 2.4.2\n"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:53
msgctxt "Cellular access point name"
msgid "APN"
msgstr "APN"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:86
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:96
msgid "Address and mask in CIDR notation."
msgstr "Adresse und Netzmaske in CIDR-Notation."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:43
msgid "Address configuration via DHCP"
msgstr "Adresskonfiguration mittels DHCP"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:44
msgid "Address configuration via PPPoE"
msgstr "Adresskonfiguration mittels PPPoE"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:49
msgid "Apply Settings"
msgstr "Einstellungen anwenden"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:52
msgid "Apply settings and reboot device now"
msgstr "Anwenden und Gerät jetzt neu starten"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:60
msgid "Architecture"
msgstr "Architektur"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:66
msgid "Authentication"
msgstr "Authentifizierung"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:49
msgctxt "Automatic modem type selection"
msgid "Automatic"
msgstr "automatisch"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:85
msgid "Buffered"
msgstr "Gepuffert"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:89
msgid "Cached"
msgstr "Gecached"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:92
msgid "Cancel"
msgstr "Abbrechen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:45
msgid "Cellular network connection"
msgstr "Mobilfunkverbindung"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:51
msgid "Certificate validation failed: %s"
msgstr "Validierung der Zertifikate fehlgeschlagen: %s"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:43
msgid "Certificates"
msgstr "Zertifikate"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:54
msgid "Certificates updated."
msgstr "Zertifikate aktualisiert."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:51
msgid "Checking image…"
msgstr "Prüfe Imagedatei…"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:40
msgid "Connection"
msgstr "Verbindung"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:84
msgid "Continue"
msgstr "Fortfahren"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:54
msgid "Continue configuration"
msgstr "Konfiguration fortsetzen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:104
msgid "DNS Servers"
msgstr "DNS-Server"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:37
msgid "Do you really want to erase all settings?"
msgstr "Sollen wirklich alle Systemeinstellungen zurückgesetzt werden?"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:73
msgid "Error"
msgstr "Fehler"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:61
msgid "Firmware Version"
msgstr "Firmware-Version"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:163
msgid "Firmware upgrade"
msgstr "Firmware Update"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:95
msgid "Flash image?"
msgstr "Image flashen?"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:99
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:170
msgid "Flash image…"
msgstr "Image flashen…"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:104
msgid "Flashing…"
msgstr "Schreibt…"
#: modules/luci-mod-ucentral/root/usr/share/rpcd/acl.d/luci-mod-ucentral.json:3
msgid "Grant access to ucentral configuration"
msgstr "Zugriff auf uCentral-Konfigurationseinstellungen ermöglichen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:58
msgid "Hostname"
msgstr "Hostname"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:86
msgid "IPv4 Address"
msgstr "IPv4-Adresse"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:91
msgid "IPv4 Gateway"
msgstr "IPv4-Gateway"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:96
msgid "IPv6 Address"
msgstr "IPv6-Adresse"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:100
msgid "IPv6 Gateway"
msgstr "IPv6-Gateway"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:57
msgid "Invalid APN provided"
msgstr "Ungültige APN angegeben"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:95
msgid "Invalid image"
msgstr "Ungültige Image-Datei"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:141
msgid "Issue a reboot and restart the operating system on this device."
msgstr "Einen Reboot auslösen und das Betriebssystem des Gerätes neu starten."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:62
msgid "Kernel Version"
msgstr "Kernel-Version"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:65
msgid "Load Average"
msgstr "Systemlast"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:63
msgid "Local Time"
msgstr "Lokalzeit"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:37
msgid "Local settings"
msgstr "Lokale Einstellungen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:69
msgid "MD5"
msgstr "MD5"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:112
msgid "Memory"
msgstr "Arbeitsspeicher"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:59
msgid "Model"
msgstr "Modell"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:47
msgid "Modem type"
msgstr "Modemtyp"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:68
msgid "No authentication"
msgstr "keine Authentifizierung"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:76
msgid "OK"
msgstr "OK"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:62
msgid "PIN"
msgstr "OIN"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:79
msgid "Password"
msgstr "Passwort"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:158
msgid "Perform reset"
msgstr "System zurücksetzen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:147
msgid "Reboot"
msgstr "Reboot"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:140
msgid "Reboot device"
msgstr "Gerät neu starten"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:35
msgid "Reboot required"
msgstr "Neustart erforderlich"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:40
msgid "Redirector URL"
msgstr "Redirector-URL"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:152
msgid ""
"Reset the system to its initial state and discard any configuration changes."
msgstr ""
"Das System auf Grundeinstellungen zurücksetzen und sämtliche "
"Konfigurationsänderungen verwerfen."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:151
msgid "Reset to defaults"
msgstr "Grundeinstellungen wiederherstellen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:70
msgid "SHA256"
msgstr "SHA256"
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:40
msgid "Settings"
msgstr "Einstellungen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:68
msgid "Size"
msgstr "Größe"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:42
msgid "Static address configuration"
msgstr "Statische Adresskonfiguration"
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:16
msgid "Status"
msgstr "Status"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:92
msgid "Swap free"
msgstr "Freier Auslagerungsspeicher"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:108
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:52
msgid "System"
msgstr "System"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:121
msgid ""
"The device is rebooting now. This page will try to reconnect automatically "
"once the device is fully booted."
msgstr ""
"Das Gerät startet jetzt neu. Diese Seite wird versuchen sich automatisch neu "
"zu verbinden sobald das Gerät wieder voll hochgefahren ist."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:50
msgid ""
"The device must be rebooted in order to apply the changed settings. Once the "
"uCentral agent successfully connects to the controller, the remote "
"configuration profile will be applied and the initial provisioning web "
"interface is disabled."
msgstr ""
"Das Gerät muss neu gestartet werden um die geänderten Einstellungen "
"anzuwenden. Sobald sich der uCentral-Client nach dem Neustart erfolgreich "
"mit dem Controller verbindet, wird das entfernte Konfigurationsprofil für "
"dieses Gerät angewendet und das initiale Provisionierungs-Webinterface "
"deaktiviert."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:74
msgid ""
"The firmware image is invalid and cannot be flashed. Check the diagnostics "
"below for further details."
msgstr ""
"Die Firmware-Datei ist ungültig und kann nicht geflasht werden. Die "
"nachfolgenden Diagnosemeldungen enthalten weitere Details."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:66
msgid ""
"The firmware image was uploaded. Compare the checksum and file size listed "
"below with the original file to ensure data integrity. <br /> Click "
"'Continue' below to start the flash procedure."
msgstr ""
"Die Firmware-Datei wurde hochgeladen. Die Prüfsummen und Dateigröße mit der "
"Originaldatei vergleichen um die Integrität des Images sicherzustellen.<br /"
"> \"Fortfahren\" anklicken um die Upgrade-Prozedur zu starten."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:22
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:117
msgid "The reboot command failed with code %d"
msgstr "Das Reboot-Kommando wurde mit Fehlercode %d abgebrochen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:38
msgid ""
"The settings on this page specify how the local uCentral client connects to "
"the controller server."
msgstr ""
"Die Einstellungen auf dieser Seite beeinflussen die Verbindung des uCentral "
"Clients zum Controller-Server."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:40
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
"Das System löscht nun die Konfigurationspartition und startet das Gerät neu "
"sobald die Prozedur abgeschlossen ist."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:106
msgid ""
"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
"few minutes before you try to reconnect. It might be necessary to renew the "
"address of your computer to reach the device again, depending on your "
"settings."
msgstr ""
"Das System-Upgrade läuft jetzt.<br />DAS GERÄT NICHT AUSSCHALTEN!<br /"
">Einige Minuten warten, bevor ein Verbindungsversuch unternommen wird. Ja "
"nach Netzwerktopologie kann es nötig sein, die lokalen Adresseinstellungen "
"des Computers zu verändern bevor wieder eine Verbindung zum Gerät möglich "
"ist."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:26
msgid ""
"The system is rebooting in order to attempt applying the remote "
"configuration profile now. If not successful, the device will revert back "
"into the initial provisioning state."
msgstr ""
"Das System startet jetzt neu um zu versuchen das entfernte "
"Konfigurationsprofil anzuwenden. Im Fehlerfall wird das Gerät in den "
"initialen Provisionierungs-Zustand zurückversetzt."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:38
msgid ""
"The uplink settings allow overriding the WAN connection properties of the "
"local device."
msgstr ""
"Die Uplink-Einstellungen ermöglichen es die WAN-Verbindungseigenschaften des "
"lokalen Gerätes zu überschreiben."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:83
msgid "Total Available"
msgstr "Gesamt verfügbar"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:95
msgid "Unable to save settings: %s"
msgstr "Einstellungen konnten nicht gespeichert werden: %s"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:58
msgid "Unable to verify certificates: %s"
msgstr "Zertifikate konnten nicht verifiziert werden: %s"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:41
msgid "Unit location"
msgstr "Gerätestandort"
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:28
msgid "Uplink"
msgstr "Uplink"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:37
msgid "Uplink configuration"
msgstr "Uplink-Einstellungen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:164
msgid "Upload a compatible firmware image here to upgrade the running system."
msgstr ""
"Kompatible Firmware-Datei hier hochladen um das laufende System zu "
"aktualisieren."
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:44
msgid "Upload certificate bundle…"
msgstr "Zertifikatsarchiv hochladen…"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:64
msgid "Uptime"
msgstr "Laufzeit"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:41
msgid "Use default cloud settings"
msgstr "Cloud-Einstellungen nutzen"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:84
msgid "Used"
msgstr "In Benutzung"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:73
msgid "Username"
msgstr "Benutzername"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:47
msgid "Verifying certificates…"
msgstr "Überprüfe Zertifikate…"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:52
msgid "Verifying the uploaded image file."
msgstr "Überprüfe die hochgeladene Image-Datei."
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:3
msgid "uCentral"
msgstr "uCentral"

View File

@@ -1,385 +0,0 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:53
msgctxt "Cellular access point name"
msgid "APN"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:86
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:96
msgid "Address and mask in CIDR notation."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:43
msgid "Address configuration via DHCP"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:44
msgid "Address configuration via PPPoE"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:49
msgid "Apply Settings"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:52
msgid "Apply settings and reboot device now"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:60
msgid "Architecture"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:66
msgid "Authentication"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:49
msgctxt "Automatic modem type selection"
msgid "Automatic"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:85
msgid "Buffered"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:89
msgid "Cached"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:92
msgid "Cancel"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:45
msgid "Cellular network connection"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:51
msgid "Certificate validation failed: %s"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:43
msgid "Certificates"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:54
msgid "Certificates updated."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:51
msgid "Checking image…"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:40
msgid "Connection"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:84
msgid "Continue"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:54
msgid "Continue configuration"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:104
msgid "DNS Servers"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:37
msgid "Do you really want to erase all settings?"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:73
msgid "Error"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:61
msgid "Firmware Version"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:163
msgid "Firmware upgrade"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:95
msgid "Flash image?"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:99
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:170
msgid "Flash image…"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:104
msgid "Flashing…"
msgstr ""
#: modules/luci-mod-ucentral/root/usr/share/rpcd/acl.d/luci-mod-ucentral.json:3
msgid "Grant access to ucentral configuration"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:58
msgid "Hostname"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:86
msgid "IPv4 Address"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:91
msgid "IPv4 Gateway"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:96
msgid "IPv6 Address"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:100
msgid "IPv6 Gateway"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:57
msgid "Invalid APN provided"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:95
msgid "Invalid image"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:141
msgid "Issue a reboot and restart the operating system on this device."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:62
msgid "Kernel Version"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:65
msgid "Load Average"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:63
msgid "Local Time"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:37
msgid "Local settings"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:69
msgid "MD5"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:112
msgid "Memory"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:59
msgid "Model"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:47
msgid "Modem type"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:68
msgid "No authentication"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:76
msgid "OK"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:62
msgid "PIN"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:79
msgid "Password"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:158
msgid "Perform reset"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:147
msgid "Reboot"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:140
msgid "Reboot device"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:35
msgid "Reboot required"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:40
msgid "Redirector URL"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:152
msgid ""
"Reset the system to its initial state and discard any configuration changes."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:151
msgid "Reset to defaults"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:70
msgid "SHA256"
msgstr ""
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:40
msgid "Settings"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:68
msgid "Size"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:42
msgid "Static address configuration"
msgstr ""
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:16
msgid "Status"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:92
msgid "Swap free"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:108
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:52
msgid "System"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:121
msgid ""
"The device is rebooting now. This page will try to reconnect automatically "
"once the device is fully booted."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:50
msgid ""
"The device must be rebooted in order to apply the changed settings. Once the "
"uCentral agent successfully connects to the controller, the remote "
"configuration profile will be applied and the initial provisioning web "
"interface is disabled."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:74
msgid ""
"The firmware image is invalid and cannot be flashed. Check the diagnostics "
"below for further details."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:66
msgid ""
"The firmware image was uploaded. Compare the checksum and file size listed "
"below with the original file to ensure data integrity. <br /> Click "
"'Continue' below to start the flash procedure."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:22
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:117
msgid "The reboot command failed with code %d"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:38
msgid ""
"The settings on this page specify how the local uCentral client connects to "
"the controller server."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:40
msgid ""
"The system is erasing the configuration partition now and will reboot itself "
"when finished."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:106
msgid ""
"The system is flashing now.<br /> DO NOT POWER OFF THE DEVICE!<br /> Wait a "
"few minutes before you try to reconnect. It might be necessary to renew the "
"address of your computer to reach the device again, depending on your "
"settings."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:26
msgid ""
"The system is rebooting in order to attempt applying the remote "
"configuration profile now. If not successful, the device will revert back "
"into the initial provisioning state."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:38
msgid ""
"The uplink settings allow overriding the WAN connection properties of the "
"local device."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:83
msgid "Total Available"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/tools/ucentral.js:95
msgid "Unable to save settings: %s"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:58
msgid "Unable to verify certificates: %s"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:41
msgid "Unit location"
msgstr ""
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:28
msgid "Uplink"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:37
msgid "Uplink configuration"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:164
msgid "Upload a compatible firmware image here to upgrade the running system."
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:44
msgid "Upload certificate bundle…"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:64
msgid "Uptime"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:41
msgid "Use default cloud settings"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/status.js:84
msgid "Used"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/uplink.js:73
msgid "Username"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/settings.js:47
msgid "Verifying certificates…"
msgstr ""
#: modules/luci-mod-ucentral/htdocs/luci-static/resources/view/ucentral/system.js:52
msgid "Verifying the uploaded image file."
msgstr ""
#: modules/luci-mod-ucentral/root/usr/share/luci/menu.d/luci-mod-ucentral.json:3
msgid "uCentral"
msgstr ""

View File

@@ -1,12 +0,0 @@
#!/bin/sh
if [ -f /tmp/certs.tar ]; then
if [ -f /etc/ucentral/key.pem ]; then
cd /etc/ucentral/
else
cd /certificates/
fi
tar xf /tmp/certs.tar
fi
exit 0

View File

@@ -1,15 +0,0 @@
#!/bin/sh
REDIRECTOR=$(cat /etc/ucentral/profile.json | jsonfilter -e '@.redirector')
if [ -n "$REDIRECTOR" ]; then
uci -c /etc/config-shadow/ set ucentral.config.server="$REDIRECTOR"
uci -c /etc/config-shadow/ commit ucentral
/etc/init.d/firstcontact disable
/etc/init.d/ucentral enable
else
rm /etc/ucentral/redirector.json
/etc/init.d/firstcontact enable
/etc/init.d/ucentral disable
fi
exit 0

View File

@@ -1,62 +0,0 @@
{
"ucentral": {
"title": "uCentral",
"order": 20,
"action": {
"type": "firstchild",
"recurse": true
},
"auth": {
"methods": [ "cookie:sysauth" ],
"login": true
}
},
"ucentral/status": {
"title": "Status",
"order": 1,
"action": {
"type": "view",
"path": "ucentral/status"
},
"depends": {
"acl": [ "luci-mod-ucentral" ]
}
},
"ucentral/uplink": {
"title": "Uplink",
"order": 2,
"action": {
"type": "view",
"path": "ucentral/uplink"
},
"depends": {
"acl": [ "luci-mod-ucentral" ]
}
},
"ucentral/settings": {
"title": "Settings",
"order": 3,
"action": {
"type": "view",
"path": "ucentral/settings"
},
"depends": {
"acl": [ "luci-mod-ucentral" ]
}
},
"ucentral/system": {
"title": "System",
"order": 4,
"action": {
"type": "view",
"path": "ucentral/system"
},
"depends": {
"acl": [ "luci-mod-ucentral" ]
}
}
}

View File

@@ -1,33 +0,0 @@
{
"luci-mod-ucentral": {
"description": "Grant access to ucentral configuration",
"read": {
"file": {
"/etc/ucentral/profile.json": [ "read" ],
"/proc/mounts": [ "read" ],
"/proc/mtd": [ "read" ]
},
"ubus": {
"file": [ "read" ],
"system": [ "board", "info" ]
}
},
"write": {
"cgi-io": [ "upload" ],
"file": {
"/etc/ucentral/profile.json": [ "write" ],
"/sbin/certupdate": [ "exec" ],
"/sbin/firstboot -r -y": [ "exec" ],
"/sbin/profileupdate": [ "exec" ],
"/sbin/sysupgrade -n /tmp/firmware.bin": [ "exec" ],
"/sbin/sysupgrade --test /tmp/firmware.bin": [ "exec" ],
"/tmp/certs.tar": [ "write" ],
"/tmp/firmware.bin": [ "write" ]
},
"ubus": {
"file": [ "exec", "remove", "write" ],
"system": [ "reboot", "validate_firmware_image" ]
}
}
}
}

View File

@@ -1,14 +0,0 @@
#
# Copyright (C) 2021 Jo-Philipp Wich <jo@mein.io>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI theme for uCentral
LUCI_DEPENDS:=
include ../luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@@ -1,152 +0,0 @@
'use strict';
'require baseclass';
'require ui';
return baseclass.extend({
__init__: function() {
ui.menu.load().then(L.bind(this.render, this));
},
render: function(tree) {
var menu = document.querySelector('#mainmenu'),
nav = document.querySelector('#menubar > .navigation'),
node = tree,
url = '';
this.renderModeMenu(node);
if (L.env.dispatchpath.length >= 3) {
for (var i = 0; i < 3 && node; i++) {
node = node.children[L.env.dispatchpath[i]];
url = url + (url ? '/' : '') + L.env.dispatchpath[i];
}
if (node)
this.renderTabMenu(node, url);
}
if (menu.firstElementChild) {
nav.addEventListener('click', ui.createHandlerFn(this, 'handleSidebarToggle'));
nav.style.visibility = 'visible';
}
},
handleMenuExpand: function(ev) {
var a = ev.target, ul1 = a.parentNode.parentNode, ul2 = a.nextElementSibling;
document.querySelectorAll('ul.mainmenu.l1 > li.active').forEach(function(li) {
if (li !== a.parentNode)
li.classList.remove('active');
});
if (!ul2)
return;
if (ul2.parentNode.offsetLeft + ul2.offsetWidth <= ul1.offsetLeft + ul1.offsetWidth)
ul2.classList.add('align-left');
ul1.classList.add('active');
a.parentNode.classList.add('active');
a.blur();
ev.preventDefault();
ev.stopPropagation();
},
renderMainMenu: function(tree, url, level) {
var l = (level || 0) + 1,
ul = E('ul', { 'class': 'mainmenu l%d'.format(l) }),
children = ui.menu.getChildren(tree);
if (children.length == 0 || l > 2)
return E([]);
for (var i = 0; i < children.length; i++) {
var isActive = (L.env.dispatchpath[l] == children[i].name),
isReadonly = children[i].readonly,
activeClass = 'mainmenu-item-%s%s'.format(children[i].name, isActive ? ' selected' : '');
ul.appendChild(E('li', { 'class': activeClass }, [
E('a', {
'href': L.url(url, children[i].name),
'click': (l == 1) ? ui.createHandlerFn(this, 'handleMenuExpand') : null
}, [ _(children[i].title) ]),
this.renderMainMenu(children[i], url + '/' + children[i].name, l)
]));
}
if (l == 1)
document.querySelector('#mainmenu').appendChild(E('div', [ ul ]));
return ul;
},
renderModeMenu: function(tree, root) {
var menu = document.querySelector('#modemenu'),
children = ui.menu.getChildren(tree);
for (var i = 0; i < children.length; i++) {
var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[+!!root] : i == 0),
isUcentral = (!root && children[i].name == 'ucentral');
if (root || children.length > 1)
menu.appendChild(E('div', { 'class': isActive ? 'active' : null }, [
E('a', { 'href': root ? L.url(root, children[i].name) : L.url(children[i].name) }, [ _(children[i].title) ])
]));
if (isUcentral && isActive)
this.renderModeMenu(children[i], children[i].name);
else if (isActive)
this.renderMainMenu(children[i], children[i].name);
}
if (menu.children.length > 1)
menu.style.display = '';
},
renderTabMenu: function(tree, url, level) {
var container = document.querySelector('#tabmenu'),
l = (level || 0) + 1,
ul = E('ul', { 'class': 'cbi-tabmenu' }),
children = ui.menu.getChildren(tree),
activeNode = null;
if (children.length == 0)
return E([]);
for (var i = 0; i < children.length; i++) {
var isActive = (L.env.dispatchpath[l + 2] == children[i].name),
activeClass = isActive ? ' cbi-tab' : '',
className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass);
ul.appendChild(E('li', { 'class': className }, [
E('a', { 'href': L.url(url, children[i].name) }, [ _(children[i].title) ] )
]));
if (isActive)
activeNode = children[i];
}
container.appendChild(ul);
container.style.display = '';
if (activeNode)
container.appendChild(this.renderTabMenu(activeNode, url + '/' + activeNode.name, l));
return ul;
},
handleSidebarToggle: function(ev) {
var btn = ev.currentTarget,
bar = document.querySelector('#mainmenu');
if (btn.classList.contains('active')) {
btn.classList.remove('active');
bar.classList.remove('active');
}
else {
btn.classList.add('active');
bar.classList.add('active');
}
}
});

View File

@@ -1,140 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 251.2 114.2" style="enable-background:new 0 0 251.2 114.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FED206;}
.st1{fill:#EB6F53;}
.st2{fill:#3BA9B6;}
.st3{fill:#414141;}
</style>
<g>
<path class="st0" d="M219.6,43.3C219.5,43.3,219.5,43.3,219.6,43.3c-1.3,0-2.2-1-2.2-2.2c0-0.2,0-0.4,0-0.6
c0-11.9-9.7-21.6-21.6-21.6c-0.2,0-0.4,0-0.6,0c-1.2,0-2.2-0.9-2.2-2.1c0-1.2,0.9-2.2,2.1-2.2c0.2,0,0.5,0,0.7,0
c14.3,0,25.9,11.6,25.9,25.9c0,0.2,0,0.5,0,0.7C221.7,42.4,220.7,43.3,219.6,43.3z"/>
<path class="st1" d="M212.1,43.3C212,43.3,212,43.3,212.1,43.3c-1.3-0.1-2.2-1.1-2.2-2.3c0-0.2,0-0.4,0-0.6
c0-7.7-6.3-14.1-14.1-14.1c-0.2,0-0.4,0-0.6,0c-1.2,0.1-2.2-0.9-2.3-2.1c0-1.2,0.9-2.2,2.1-2.3c0.3,0,0.5,0,0.8,0
c10.2,0,18.4,8.3,18.4,18.4c0,0.2,0,0.5,0,0.8C214.2,42.4,213.2,43.3,212.1,43.3z"/>
<path class="st2" d="M204.3,43.3c-0.1,0-0.1,0-0.2,0c-1.2-0.1-2.1-1.1-2-2.3c0-0.2,0-0.4,0-0.5c0-3.5-2.8-6.3-6.3-6.3
c-0.1,0-0.3,0-0.5,0c-1.2,0.1-2.3-0.8-2.3-2c-0.1-1.2,0.8-2.3,2-2.3c0.3,0,0.6,0,0.9,0c5.9,0,10.7,4.8,10.7,10.7c0,0.3,0,0.5,0,0.9
C206.4,42.4,205.4,43.3,204.3,43.3z"/>
<g>
<g>
<g>
<path class="st3" d="M61.9,89.9v-4.7h-1.7v-0.9h4.4v0.9h-1.7v4.7H61.9z"/>
</g>
<g>
<path class="st3" d="M65.6,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H65.6z"/>
</g>
<g>
<path class="st3" d="M70.7,89.9v-5.6h1V89h2.5v0.9H70.7z"/>
</g>
<g>
<path class="st3" d="M74.9,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8V89h2.9v0.9H74.9z"/>
</g>
<g>
<path class="st3" d="M79.8,87.1c0-1.7,1.3-2.9,2.9-2.9c1.1,0,1.8,0.6,2.2,1.3l-0.8,0.4c-0.3-0.5-0.8-0.8-1.4-0.8
c-1.1,0-1.9,0.8-1.9,2c0,1.2,0.8,2,1.9,2c0.6,0,1.1-0.4,1.4-0.8l0.8,0.4c-0.4,0.7-1.1,1.3-2.2,1.3C81.1,90,79.8,88.8,79.8,87.1z
"/>
</g>
<g>
<path class="st3" d="M85.5,87.1c0-1.7,1.2-2.9,2.9-2.9c1.7,0,2.9,1.2,2.9,2.9S90,90,88.3,90C86.7,90,85.5,88.8,85.5,87.1z
M90.2,87.1c0-1.2-0.7-2-1.9-2c-1.1,0-1.9,0.9-1.9,2c0,1.1,0.7,2,1.9,2C89.5,89.1,90.2,88.3,90.2,87.1z"/>
</g>
<g>
<path class="st3" d="M96.9,89.9v-4.3l-1.7,4.3h-0.4l-1.7-4.3v4.3h-1v-5.6h1.4l1.5,3.8l1.5-3.8h1.4v5.6H96.9z"/>
</g>
<g>
<path class="st3" d="M103,89.9v-5.6h1v5.6H103z"/>
</g>
<g>
<path class="st3" d="M109.7,89.9l-2.9-4v4h-1v-5.6h1l2.9,3.9v-3.9h1v5.6H109.7z"/>
</g>
<g>
<path class="st3" d="M112.4,89.9v-5.6h3.8v0.9h-2.9v1.4h2.8v0.9h-2.8v2.4H112.4z"/>
</g>
<g>
<path class="st3" d="M120.3,89.9l-1.2-2.1h-1v2.1h-1v-5.6h2.5c1.1,0,1.8,0.7,1.8,1.8c0,1-0.7,1.5-1.3,1.6l1.4,2.2H120.3z
M120.4,86.1c0-0.5-0.4-0.9-1-0.9h-1.4V87h1.4C120,87,120.4,86.6,120.4,86.1z"/>
</g>
<g>
<path class="st3" d="M126.6,89.9l-0.4-1.1h-2.6l-0.4,1.1h-1.1l2.2-5.6h1.2l2.2,5.6H126.6z M124.9,85.3l-1,2.7h2L124.9,85.3z"/>
</g>
<g>
<path class="st3" d="M131.4,89.9v-5.6h2.1c1.1,0,1.7,0.8,1.7,1.6c0,0.9-0.6,1.6-1.7,1.6h-1.6v2.3H131.4z M134.7,86
c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C134.2,87.2,134.7,86.6,134.7,86z"/>
</g>
<g>
<path class="st3" d="M139.4,89.9l-1.6-2.3h-1.2v2.3h-0.5v-5.6h2.1c1,0,1.7,0.6,1.7,1.6c0,1-0.7,1.6-1.6,1.6l1.6,2.3H139.4z
M139.4,86c0-0.7-0.5-1.2-1.2-1.2h-1.6v2.4h1.6C138.9,87.2,139.4,86.7,139.4,86z"/>
</g>
<g>
<path class="st3" d="M141.2,87.1c0-1.6,1.1-2.9,2.7-2.9c1.6,0,2.7,1.3,2.7,2.9c0,1.6-1.1,2.9-2.7,2.9
C142.3,90,141.2,88.8,141.2,87.1z M146.1,87.1c0-1.4-0.9-2.5-2.2-2.5c-1.4,0-2.2,1-2.2,2.5c0,1.4,0.9,2.5,2.2,2.5
C145.2,89.6,146.1,88.5,146.1,87.1z"/>
</g>
<g>
<path class="st3" d="M147,89.3l0.3-0.4c0.3,0.3,0.6,0.6,1.1,0.6c0.8,0,1.2-0.5,1.2-1.3v-4h0.5v4c0,1.2-0.8,1.7-1.7,1.7
C147.9,90,147.4,89.8,147,89.3z"/>
</g>
<g>
<path class="st3" d="M151.8,89.9v-5.6h3.5v0.4h-3.1v2.1h3v0.4h-3v2.2h3.1v0.4H151.8z"/>
</g>
<g>
<path class="st3" d="M156.3,87.1c0-1.7,1.3-2.9,2.8-2.9c0.9,0,1.6,0.4,2,1l-0.4,0.3c-0.4-0.5-1-0.8-1.6-0.8
c-1.3,0-2.3,1-2.3,2.5c0,1.4,1,2.5,2.3,2.5c0.7,0,1.3-0.3,1.6-0.8l0.4,0.3c-0.5,0.6-1.2,1-2,1C157.5,90,156.3,88.8,156.3,87.1z"
/>
</g>
<g>
<path class="st3" d="M163.5,89.9v-5.2h-1.8v-0.4h4.1v0.4H164v5.2H163.5z"/>
</g>
</g>
<g>
<polygon class="st3" points="33.7,86.5 41.2,79 48.6,86.5 49.8,86.5 41.2,77.9 32.6,86.5 "/>
<polygon class="st3" points="48.6,87.8 41.2,95.2 33.7,87.8 32.6,87.8 41.2,96.4 49.8,87.8 "/>
<polygon class="st3" points="40.3,86.5 47.8,79 55.3,86.5 56.4,86.5 47.8,77.9 39.2,86.5 "/>
<polygon class="st3" points="55.3,87.8 47.8,95.2 40.3,87.8 39.2,87.8 47.8,96.4 56.4,87.8 "/>
</g>
</g>
</g>
<g>
<path class="st3" d="M51.2,41.3c2,1.1,3.6,2.6,4.7,4.5c1.1,1.9,1.7,4,1.7,6.4c0,2.3-0.6,4.5-1.7,6.4c-1.1,1.9-2.7,3.4-4.7,4.6
c-2,1.1-4.2,1.7-6.6,1.7c-2.4,0-4.6-0.6-6.6-1.7c-2-1.1-3.6-2.6-4.7-4.6c-1.1-1.9-1.7-4.1-1.7-6.4c0-2.3,0.6-4.5,1.7-6.4
c1.1-1.9,2.7-3.4,4.7-4.5c2-1.1,4.2-1.6,6.6-1.6C47,39.6,49.2,40.2,51.2,41.3z M40.5,44.9c-1.3,0.7-2.3,1.7-3,3
c-0.7,1.3-1.1,2.7-1.1,4.2s0.4,3,1.1,4.2c0.8,1.3,1.8,2.3,3,3c1.3,0.7,2.7,1.1,4.1,1.1c1.5,0,2.8-0.4,4.1-1.1c1.3-0.7,2.3-1.8,3-3
c0.7-1.3,1.1-2.7,1.1-4.2s-0.4-2.9-1.1-4.2c-0.7-1.3-1.7-2.3-3-3c-1.3-0.7-2.6-1.1-4.1-1.1C43.2,43.8,41.8,44.2,40.5,44.9z"/>
<path class="st3" d="M76.9,46.8c1.3,0.8,2.4,1.9,3.1,3.4c0.7,1.4,1.1,3.1,1.1,5c0,1.9-0.4,3.5-1.1,4.9c-0.7,1.4-1.8,2.5-3.1,3.3
c-1.3,0.8-2.9,1.2-4.6,1.2c-1.4,0-2.6-0.3-3.7-0.8c-1.1-0.5-2-1.3-2.7-2.4v9.8h-4.6V45.7H66v3.1c0.7-1.1,1.5-1.8,2.6-2.4
c1.1-0.5,2.3-0.8,3.7-0.8C74,45.6,75.6,46,76.9,46.8z M75.1,59.1c1-1.1,1.5-2.4,1.5-4.1c0-1.7-0.5-3-1.5-4.1
c-1-1.1-2.2-1.6-3.8-1.6c-1.6,0-2.8,0.5-3.8,1.6c-1,1-1.5,2.4-1.5,4.1c0,1.7,0.5,3,1.5,4.1c1,1.1,2.3,1.6,3.8,1.6
C72.8,60.7,74.1,60.2,75.1,59.1z"/>
<path class="st3" d="M99.3,48.1c1.5,1.7,2.3,4.1,2.3,7.2c0,0.6,0,1.1,0,1.4H87.7c0.3,1.3,0.9,2.4,1.9,3.1c0.9,0.8,2.1,1.1,3.5,1.1
c1,0,1.9-0.2,2.7-0.5c0.9-0.4,1.6-0.9,2.3-1.6l2.5,2.6c-0.9,1-2.1,1.8-3.4,2.4c-1.3,0.6-2.8,0.8-4.5,0.8c-1.9,0-3.6-0.4-5.1-1.2
c-1.5-0.8-2.6-1.9-3.4-3.3c-0.8-1.4-1.2-3.1-1.2-5c0-1.9,0.4-3.5,1.2-5c0.8-1.4,1.9-2.6,3.4-3.4c1.4-0.8,3.1-1.2,4.9-1.2
C95.5,45.6,97.8,46.4,99.3,48.1z M97.4,53.6c0-1.4-0.5-2.5-1.4-3.3c-0.9-0.8-2-1.2-3.4-1.2c-1.3,0-2.4,0.4-3.3,1.2
c-0.9,0.8-1.5,1.9-1.7,3.3H97.4z"/>
<path class="st3" d="M121.5,47.5c1.2,1.3,1.9,3.1,1.9,5.3v11.7h-4.6V54.1c0-1.3-0.4-2.3-1.1-3.1c-0.7-0.8-1.8-1.1-3-1.1
c-1.5,0-2.7,0.5-3.6,1.5s-1.3,2.3-1.3,3.8v9.2h-4.5V45.7h4.5v3.5c1.3-2.4,3.5-3.6,6.7-3.7C118.5,45.5,120.2,46.2,121.5,47.5z"/>
<path class="st3" d="M156.5,39.9h4.9l-8.3,24.5h-4.9l-5.6-18.6l-5.7,18.6h-4.8l-8.3-24.5h5l5.8,19.4l5.7-19.4h4.6l5.8,19.5
L156.5,39.9z"/>
<path class="st3" d="M168,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C166.9,37.7,167.6,37.9,168,38.4z M164,45.7h4.5v18.7H164
V45.7z"/>
<path class="st3" d="M174,39.9h16.9l0,4.1h-12.2v6.6h11.1v4.1h-11.1v9.7H174V39.9z"/>
<path class="st3" d="M197.9,38.4c0.5,0.5,0.7,1.2,0.7,2c0,0.8-0.2,1.4-0.7,1.9c-0.5,0.5-1.1,0.8-1.9,0.8c-0.7,0-1.4-0.3-1.9-0.8
c-0.5-0.5-0.7-1.2-0.7-1.9c0-0.8,0.2-1.4,0.7-2c0.5-0.5,1.1-0.8,1.9-0.8C196.8,37.7,197.4,37.9,197.9,38.4z M193.8,45.7h4.5v18.7
h-4.5V45.7z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,12 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="132 132 264 264">
<defs>
<radialGradient id="g" cx="0%" cy="0%" r="60%">
<stop offset=".8" style="stop-opacity:1" />
<stop offset="1" style="stop-opacity:.5" />
</radialGradient>
</defs>
<g>
<path style="fill:url(#g)" d="M 264 132 A 132 132 0 0 0 132 264 A 132 132 0 0 0 264 396 A 132 132 0 0 0 396 264 A 132 132 0 0 0 264 132 z M 264 170 A 94 94 0 0 1 359 264 A 94 94 0 0 1 264 359 A 94 94 0 0 1 170 264 A 94 94 0 0 1 264 170 z " />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 582 B

View File

@@ -1,13 +0,0 @@
<%#
Copyright 2021 Jo-Philipp Wich <jo@mein.io>
Licensed to the public under the Apache License 2.0.
-%>
</div>
</div>
</div>
<script type="text/javascript">L.require('menu-ucentral')</script>
</body>
</html>

View File

@@ -1,67 +0,0 @@
<%#
Copyright 2021 Jo-Philipp Wich <jo@mein.io>
Licensed to the public under the Apache License 2.0.
-%>
<%
local sys = require "luci.sys"
local util = require "luci.util"
local http = require "luci.http"
local disp = require "luci.dispatcher"
local ver = require "luci.version"
local boardinfo = util.ubus("system", "board") or { }
local node = disp.context.dispatched
local path = table.concat(disp.context.path, "-")
http.prepare_content("text/html; charset=UTF-8")
-%>
<!DOCTYPE html>
<html lang="<%=luci.i18n.context.lang%>">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" type="text/css" media="screen" href="<%=media%>/cascade.css" />
<link rel="icon" href="<%=media%>/logo.svg" type="image/svg+xml" />
<script type="text/javascript" src="<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>"></script>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<title><%=striptags( (boardinfo.hostname or "?") .. ( (node and node.title) and ' - ' .. translate(node.title) or '')) %> - LuCI</title>
<% if css then %><style title="text/css">
<%= css %>
</style>
<% end -%>
</head>
<body class="lang_<%=luci.i18n.context.lang%>" data-page="<%= pcdata(path) %>">
<p class="skiplink">
<span id="skiplink1"><a href="#navigation"><%:Skip to navigation%></a></span>
<span id="skiplink2"><a href="#content"><%:Skip to content%></a></span>
</p>
<div id="page">
<div id="menubar">
<h2 class="navigation" style="visibility:hidden"><a id="navigation" name="navigation"><%:Navigation%></a></h2>
<img src="<%=media%>/logo.svg" />
<span id="indicators"></span>
</div>
<div id="modemenu" style="display:none"></div>
<div id="maincontainer">
<div id="mainmenu"></div>
<div id="maincontent">
<%- if luci.sys.process.info("uid") == 0 and luci.sys.user.getuser("root") and not luci.sys.user.getpasswd("root") and path ~= "admin-system-admin-password" then -%>
<div class="alert-message warning">
<h4><%:No password set!%></h4>
<p><%:There is no password set on this router. Please configure a root password to protect the web interface.%></p>
<% if disp.lookup("admin/system/admin") then %>
<div class="right"><a class="btn" href="<%=url("admin/system/admin")%>"><%:Go to password configuration...%></a></div>
<% end %>
</div>
<%- end -%>
<div id="tabmenu" style="display:none"></div>

View File

@@ -1,12 +0,0 @@
#!/bin/sh
if [ "$PKG_UPGRADE" != 1 ]; then
uci get luci.themes.uCentral >/dev/null 2>&1 || \
uci batch <<-EOF
set luci.themes.uCentral=/luci-static/ucentral
set luci.main.mediaurlbase=/luci-static/ucentral
commit luci
EOF
fi
exit 0

View File

@@ -1,294 +0,0 @@
#
# Copyright (C) 2008-2015 The LuCI Team <luci@lists.subsignal.org>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
LUCI_NAME?=$(notdir ${CURDIR})
LUCI_TYPE?=$(word 2,$(subst -, ,$(LUCI_NAME)))
LUCI_BASENAME?=$(patsubst luci-$(LUCI_TYPE)-%,%,$(LUCI_NAME))
LUCI_LANGUAGES:=$(sort $(filter-out templates,$(notdir $(wildcard ${CURDIR}/po/*))))
LUCI_DEFAULTS:=$(notdir $(wildcard ${CURDIR}/root/etc/uci-defaults/*))
LUCI_PKGARCH?=$(if $(realpath src/Makefile),,all)
# Language code titles
LUCI_LANG.bg=български (Bulgarian)
LUCI_LANG.bn_BD=বাংলা (Bengali)
LUCI_LANG.ca=Català (Catalan)
LUCI_LANG.cs=Čeština (Czech)
LUCI_LANG.de=Deutsch (German)
LUCI_LANG.el=Ελληνικά (Greek)
LUCI_LANG.en=English
LUCI_LANG.es=Español (Spanish)
LUCI_LANG.fr=Français (French)
LUCI_LANG.he=עִבְרִית (Hebrew)
LUCI_LANG.hi=हिंदी (Hindi)
LUCI_LANG.hu=Magyar (Hungarian)
LUCI_LANG.it=Italiano (Italian)
LUCI_LANG.ja=日本語 (Japanese)
LUCI_LANG.ko=한국어 (Korean)
LUCI_LANG.mr=Marāṭhī (Marathi)
LUCI_LANG.ms=Bahasa Melayu (Malay)
LUCI_LANG.nb_NO=Norsk (Norwegian)
LUCI_LANG.pl=Polski (Polish)
LUCI_LANG.pt_BR=Português do Brasil (Brazilian Portuguese)
LUCI_LANG.pt=Português (Portuguese)
LUCI_LANG.ro=Română (Romanian)
LUCI_LANG.ru=Русский (Russian)
LUCI_LANG.sk=Slovenčina (Slovak)
LUCI_LANG.sv=Svenska (Swedish)
LUCI_LANG.tr=Türkçe (Turkish)
LUCI_LANG.uk=Українська (Ukrainian)
LUCI_LANG.vi=Tiếng Việt (Vietnamese)
LUCI_LANG.zh_Hans=简体中文 (Chinese Simplified)
LUCI_LANG.zh_Hant=繁體中文 (Chinese Traditional)
# Submenu titles
LUCI_MENU.col=1. Collections
LUCI_MENU.mod=2. Modules
LUCI_MENU.app=3. Applications
LUCI_MENU.theme=4. Themes
LUCI_MENU.proto=5. Protocols
LUCI_MENU.lib=6. Libraries
# Language aliases
LUCI_LC_ALIAS.bn_BD=bn
LUCI_LC_ALIAS.nb_NO=no
LUCI_LC_ALIAS.pt_BR=pt-br
LUCI_LC_ALIAS.zh_Hans=zh-cn
LUCI_LC_ALIAS.zh_Hant=zh-tw
PKG_NAME?=$(LUCI_NAME)
# 1: everything expect po subdir or only po subdir
define findrev
$(shell \
if git log -1 >/dev/null 2>/dev/null; then \
set -- $$(git log -1 --format="%ct %h" --abbrev=7 -- $(if $(1),. ':(exclude)po',po)); \
if [ -n "$$1" ]; then
secs="$$(($$1 % 86400))"; \
yday="$$(date --utc --date="@$$1" "+%y.%j")"; \
printf 'git-%s.%05d-%s' "$$yday" "$$secs" "$$2"; \
else \
echo "unknown"; \
fi; \
else \
ts=$$(find . -type f $(if $(1),-not) -path './po/*' -printf '%T@\n' 2>/dev/null | sort -rn | head -n1 | cut -d. -f1); \
if [ -n "$$ts" ]; then \
secs="$$(($$ts % 86400))"; \
date="$$(date --utc --date="@$$ts" "+%y%m%d")"; \
printf '%s.%05d' "$$date" "$$secs"; \
else \
echo "unknown"; \
fi; \
fi \
)
endef
PKG_PO_VERSION?=$(if $(DUMP),x,$(strip $(call findrev)))
PKG_SRC_VERSION?=$(if $(DUMP),x,$(strip $(call findrev,1)))
PKG_GITBRANCH?=$(if $(DUMP),x,$(strip $(shell \
variant="LuCI"; \
if git log -1 >/dev/null 2>/dev/null; then \
branch="$$(git branch --remote --verbose --no-abbrev --contains 2>/dev/null | \
sed -rne 's|^[^/]+/([^ ]+) [a-f0-9]{40} .+$$|\1|p' | head -n1)"; \
if [ "$$branch" != "master" ]; then \
variant="LuCI $$branch branch"; \
else \
variant="LuCI Master"; \
fi; \
fi; \
echo "$$variant" \
)))
PKG_RELEASE?=1
PKG_INSTALL:=$(if $(realpath src/Makefile),1)
PKG_BUILD_DEPENDS += lua/host luci-base/host LUCI_CSSTIDY:csstidy/host LUCI_SRCDIET:luasrcdiet/host $(LUCI_BUILD_DEPENDS)
PKG_CONFIG_DEPENDS += CONFIG_LUCI_SRCDIET CONFIG_LUCI_JSMIN CONFIG_LUCI_CSSTIDY
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/$(PKG_NAME)
SECTION:=luci
CATEGORY:=LuCI
SUBMENU:=$(if $(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.$(LUCI_TYPE)),$(LUCI_MENU.app))
TITLE:=$(if $(LUCI_TITLE),$(LUCI_TITLE),LuCI $(LUCI_NAME) $(LUCI_TYPE))
DEPENDS:=$(LUCI_DEPENDS)
VERSION:=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))
$(if $(LUCI_EXTRA_DEPENDS),EXTRA_DEPENDS:=$(LUCI_EXTRA_DEPENDS))
$(if $(LUCI_PKGARCH),PKGARCH:=$(LUCI_PKGARCH))
endef
ifneq ($(LUCI_DESCRIPTION),)
define Package/$(PKG_NAME)/description
$(strip $(LUCI_DESCRIPTION))
endef
endif
# Language selection for luci-base
ifeq ($(PKG_NAME),luci-base)
define Package/luci-base/config
config LUCI_SRCDIET
bool "Minify Lua sources"
default n
config LUCI_JSMIN
bool "Minify JavaScript sources"
default y
config LUCI_CSSTIDY
bool "Minify CSS files"
default y
menu "Translations"$(foreach lang,$(LUCI_LANGUAGES),
config LUCI_LANG_$(lang)
tristate "$(shell echo '$(LUCI_LANG.$(lang))' | sed -e 's/^.* (\(.*\))$$/\1/') ($(lang))")
endmenu
endef
endif
define Build/Prepare
for d in luasrc htdocs root src; do \
if [ -d ./$$$$d ]; then \
mkdir -p $(PKG_BUILD_DIR)/$$$$d; \
$(CP) ./$$$$d/* $(PKG_BUILD_DIR)/$$$$d/; \
fi; \
done
$(call Build/Prepare/Default)
endef
define Build/Configure
endef
ifneq ($(wildcard ${CURDIR}/src/Makefile),)
MAKE_PATH := src/
MAKE_VARS += FPIC="$(FPIC)" LUCI_VERSION="$(PKG_SRC_VERSION)" LUCI_GITBRANCH="$(PKG_GITBRANCH)"
define Build/Compile
$(call Build/Compile/Default,clean compile)
endef
else
define Build/Compile
endef
endif
HTDOCS = /www
LUA_LIBRARYDIR = /usr/lib/lua
LUCI_LIBRARYDIR = $(LUA_LIBRARYDIR)/luci
define SrcDiet
$(FIND) $(1) -type f -name '*.lua' | while read src; do \
if LUA_PATH="$(STAGING_DIR_HOSTPKG)/lib/lua/5.1/?.lua" luasrcdiet --noopt-binequiv -o "$$$$src.o" "$$$$src"; \
then mv "$$$$src.o" "$$$$src"; fi; \
done
endef
define JsMin
$(FIND) $(1) -type f -name '*.js' | while read src; do \
if jsmin < "$$$$src" > "$$$$src.o"; \
then mv "$$$$src.o" "$$$$src"; fi; \
done
endef
define CssTidy
$(FIND) $(1) -type f -name '*.css' | while read src; do \
if csstidy "$$$$src" --template=highest --remove_last_semicolon=true "$$$$src.o"; \
then mv "$$$$src.o" "$$$$src"; fi; \
done
endef
define SubstituteVersion
$(FIND) $(1) -type f -name '*.htm' | while read src; do \
$(SED) 's/<%# *\([^ ]*\)PKG_VERSION *%>/\1$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))/g' \
-e 's/"\(<%= *\(media\|resource\) *%>[^"]*\.\(js\|css\)\)"/"\1?v=$(if $(PKG_VERSION),$(PKG_VERSION),$(PKG_SRC_VERSION))"/g' \
"$$$$src"; \
done
endef
define Package/$(PKG_NAME)/install
if [ -d $(PKG_BUILD_DIR)/luasrc ]; then \
$(INSTALL_DIR) $(1)$(LUCI_LIBRARYDIR); \
cp -pR $(PKG_BUILD_DIR)/luasrc/* $(1)$(LUCI_LIBRARYDIR)/; \
$(FIND) $(1)$(LUCI_LIBRARYDIR)/ -type f -name '*.luadoc' | $(XARGS) rm; \
$(if $(CONFIG_LUCI_SRCDIET),$(call SrcDiet,$(1)$(LUCI_LIBRARYDIR)/),true); \
$(call SubstituteVersion,$(1)$(LUCI_LIBRARYDIR)/); \
else true; fi
if [ -d $(PKG_BUILD_DIR)/htdocs ]; then \
$(INSTALL_DIR) $(1)$(HTDOCS); \
cp -pR $(PKG_BUILD_DIR)/htdocs/* $(1)$(HTDOCS)/; \
$(if $(CONFIG_LUCI_JSMIN),$(call JsMin,$(1)$(HTDOCS)/),true); \
$(if $(CONFIG_LUCI_CSSTIDY),$(call CssTidy,$(1)$(HTDOCS)/),true); \
else true; fi
if [ -d $(PKG_BUILD_DIR)/root ]; then \
$(INSTALL_DIR) $(1)/; \
cp -pR $(PKG_BUILD_DIR)/root/* $(1)/; \
else true; fi
if [ -d $(PKG_BUILD_DIR)/src ]; then \
$(call Build/Install/Default) \
$(CP) $(PKG_INSTALL_DIR)/* $(1)/; \
else true; fi
endef
ifndef Package/$(PKG_NAME)/postinst
define Package/$(PKG_NAME)/postinst
[ -n "$${IPKG_INSTROOT}" ] || {$(foreach script,$(LUCI_DEFAULTS),
(. /etc/uci-defaults/$(script)) && rm -f /etc/uci-defaults/$(script))
rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-modulecache/
killall -HUP rpcd 2>/dev/null
exit 0
}
endef
endif
LUCI_BUILD_PACKAGES := $(PKG_NAME)
# 1: LuCI language code
# 2: BCP 47 language tag
define LuciTranslation
define Package/luci-i18n-$(LUCI_BASENAME)-$(1)
SECTION:=luci
CATEGORY:=LuCI
TITLE:=$(PKG_NAME) - $(1) translation
HIDDEN:=1
DEFAULT:=LUCI_LANG_$(2)||(ALL&&m)
DEPENDS:=$(PKG_NAME)
VERSION:=$(PKG_PO_VERSION)
PKGARCH:=all
endef
define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/description
Translation for $(PKG_NAME) - $(LUCI_LANG.$(2))
endef
define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/install
$$(INSTALL_DIR) $$(1)/etc/uci-defaults
echo "uci set luci.languages.$(subst -,_,$(1))='$(LUCI_LANG.$(2))'; uci commit luci" \
> $$(1)/etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)
$$(INSTALL_DIR) $$(1)$(LUCI_LIBRARYDIR)/i18n
$(foreach po,$(wildcard ${CURDIR}/po/$(2)/*.po), \
po2lmo $(po) \
$$(1)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).$(1).lmo;)
endef
define Package/luci-i18n-$(LUCI_BASENAME)-$(1)/postinst
[ -n "$$$${IPKG_INSTROOT}" ] || {
(. /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)) && rm -f /etc/uci-defaults/luci-i18n-$(LUCI_BASENAME)-$(1)
exit 0
}
endef
LUCI_BUILD_PACKAGES += luci-i18n-$(LUCI_BASENAME)-$(1)
endef
$(foreach lang,$(LUCI_LANGUAGES),$(eval $(call LuciTranslation,$(firstword $(LUCI_LC_ALIAS.$(lang)) $(lang)),$(lang))))
$(foreach pkg,$(LUCI_BUILD_PACKAGES),$(eval $(call BuildPackage,$(pkg))))

View File

@@ -2,8 +2,8 @@
description: Add the webui dependencies
feeds:
- name: luci
uri: https://git.openwrt.org/project/luci.git
tag: openwrt-21.02
uri: https://github.com/blogic/luci.git
branch: luci-mod-ucentral
packages:
- cgi-io
- liblucihttp