update 2026-07-28 01:38:11

This commit is contained in:
action committed 2026-07-28 01:38:11 +08:00
1 parent 20b786ab77
commit 25d570431d
6243 files changed
+2850542

No files matched your search

+17
View File
@@ -0,0 +1,17 @@
# Copyright (C) 2016 Openwrt.org
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-openlist2
PKG_VERSION:=1.0.2
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for openlist
LUCI_DEPENDS:=+openlist2
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -0,0 +1,393 @@
'use strict';
'require form';
'require fs';
'require poll';
'require rpc';
'require uci';
'require view';
const callServiceList = rpc.declare({
object: 'service',
method: 'list',
params: ['name'],
expect: { '': {} }
});
const getServiceStatus = () => {
return L.resolveDefault(callServiceList('openlist2'), {}).then(res => {
let isRunning = false;
try {
isRunning = res['openlist2']['instances']['openlist2']['running'];
} catch (e) { }
return isRunning;
});
};
const renderStatus = (isRunning, protocol, webport, site_url) => {
const spanTemp = '<em><span style="color:%s"><strong>%s %s</strong></span></em>';
let renderHTML;
if (isRunning) {
let buttonUrl = '';
if (site_url && site_url.trim() !== '') {
buttonUrl = site_url;
} else {
buttonUrl = `${protocol}//${window.location.hostname}:${webport}/`;
}
const button = String.format('<input class="cbi-button-reload" type="button" style="margin-left: 50px" value="%s" onclick="window.open(\'%s\')">',
_('Open Web Interface'), buttonUrl);
renderHTML = spanTemp.format('green', 'OpenList', _('RUNNING')) + button;
} else {
renderHTML = spanTemp.format('red', 'OpenList', _('NOT RUNNING'));
}
return renderHTML;
};
return view.extend({
load() {
return Promise.all([
uci.load('openlist2')
]);
},
async handleResetPassword(data) {
const data_dir = uci.get(data[0], '@openlist2[0]', 'data_dir') || '/etc/openlist2';
try {
const newpassword = await fs.exec('/usr/bin/openlist2', ['admin', 'random', '--data', data_dir]);
const new_password = newpassword.stdout.match(/password:\s*(\S+)/)[1];
const textArea = document.createElement('textarea');
textArea.value = new_password;
document.body.appendChild(textArea);
textArea.select();
document.execCommand('copy');
document.body.removeChild(textArea);
alert(`${_('Username:')}admin\n${_('New Password:')}${new_password}\n\n${_('New password has been copied to clipboard.')}`);
} catch (error) {
console.error('Failed to reset password: ', error);
}
},
render(data) {
let m, s, o;
const webport = uci.get(data[0], '@openlist2[0]', 'port') || '5244';
const ssl = uci.get(data[0], '@openlist2[0]', 'ssl') || '0';
let protocol;
if (ssl === '0') {
protocol = 'http:';
} else if (ssl === '1') {
protocol = 'https:';
}
const site_url = uci.get(data[0], '@openlist2[0]', 'site_url') || '';
m = new form.Map('openlist2', _('OpenList'),
_('A file list program that supports multiple storage.'));
s = m.section(form.TypedSection);
s.anonymous = true;
s.addremove = false;
s.render = () => {
poll.add(() => {
return L.resolveDefault(getServiceStatus()).then(res => {
const view = document.getElementById('service_status');
if (view)
view.innerHTML = renderStatus(res, protocol, webport, site_url);
});
});
return E('div', { class: 'cbi-section', id: 'status_bar' }, [
E('p', { id: 'service_status' }, _('Collecting data...'))
]);
};
s = m.section(form.NamedSection, '@openlist2[0]', 'openlist2');
s.tab('basic', _('Basic Settings'));
s.tab('global', _('Global Settings'));
s.tab('log', _('Logs'));
s.tab('database', _('Database'));
s.tab('scheme', _('Web Protocol'));
s.tab('tasks', _('Task threads'));
s.tab('cors', _('CORS Settings'));
s.tab('s3', _('Object Storage'));
s.tab('ftp', _('FTP'));
s.tab('sftp', _('SFTP'));
// init
o = s.taboption('basic', form.Flag, 'enabled', _('Enabled'));
o.default = o.disabled;
o.rmempty = false;
o = s.taboption('basic', form.Value, 'port', _('Port'));
o.datatype = 'and(port,min(1))';
o.default = '5244';
o.rmempty = false;
o = s.taboption('basic', form.Value, 'delayed_start', _('Delayed Start (seconds)'));
o.datatype = 'uinteger';
o.default = '0';
o.rmempty = false;
o = s.taboption('basic', form.Flag, 'allow_wan', _('Open firewall port'));
o.rmempty = false;
o = s.taboption('basic', form.Value, 'data_dir', _('Data directory'));
o.default = '/etc/openlist2';
o = s.taboption('basic', form.Value, 'temp_dir', _('Cache directory'));
o.default = '/tmp/openlist2';
o.rmempty = false;
o = s.taboption('basic', form.Button, '_newpassword', _('Reset Password'),
_('Generate a new random password.'));
o.inputtitle = _('Reset Password');
o.inputstyle = 'apply';
o.onclick = L.bind(this.handleResetPassword, this, data);
// global
o = s.taboption('global', form.Flag, 'force', _('Force read config'),
_('Setting this to true will force the program to read the configuration file, ignoring environment variables.'));
o.default = true;
o.rmempty = false;
o = s.taboption('global', form.Value, 'site_url', _('Site URL'),
_('When the web is reverse proxied to a subdirectory, this option must be filled out to ensure proper functioning of the web. Do not include \'/\' at the end of the URL'));
o = s.taboption('global', form.Value, 'cdn', _('CDN URL'));
o.default = '';
o = s.taboption('global', form.Value, 'jwt_secret', _('JWT Key'));
o.default = '';
o = s.taboption('global', form.Value, 'token_expires_in', _('Login Validity Period (hours)'));
o.datatype = 'uinteger';
o.default = '48';
o.rmempty = false;
o = s.taboption('global', form.Value, 'max_connections', _('Max Connections'),
_('0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device'));
o.default = '0';
o.datatype = 'uinteger';
o.rmempty = false;
o = s.taboption('global', form.Value, 'max_concurrency', _('Max concurrency of local proxies'),
_('0 is unlimited, Limit the maximum concurrency of local agents. The default value is 64'));
o.default = '0';
o.datatype = 'uinteger';
o.rmempty = false;
o = s.taboption('global', form.Flag, 'tls_insecure_skip_verify', _('Disable TLS Verify'));
o.default = true;
o.rmempty = false;
// Logs
o = s.taboption('log', form.Flag, 'log', _('Enable Logs'));
o.default = 1;
o.rmempty = false;
o = s.taboption('log', form.Value, 'log_path', _('Log path'));
o.default = '/var/log/openlist2.log';
o.rmempty = false;
o.depends('log', '1');
o = s.taboption('log', form.Value, 'log_max_size', _('Max Size (MB)'));
o.datatype = 'uinteger';
o.default = '10';
o.rmempty = false;
o.depends('log', '1');
o = s.taboption('log', form.Value, 'log_max_backups', _('Max backups'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o.depends('log', '1');
o = s.taboption('log', form.Value, 'log_max_age', _('Max age'));
o.datatype = 'uinteger';
o.default = '28';
o.rmempty = false;
o.depends('log', '1');
o = s.taboption('log', form.Flag, 'log_compress', _('Log Compress'));
o.default = 'false';
o.rmempty = false;
o.depends('log', '1');
// database
o = s.taboption('database', form.ListValue, 'database_type', _('Database Type'));
o.default = 'sqlite3';
o.value('sqlite3', _('SQLite'));
o.value('mysql', _('MySQL'));
o.value('postgres', _('PostgreSQL'));
o = s.taboption('database', form.Value, 'mysql_host', _('Database Host'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_port', _('Database Port'));
o.datatype = 'port';
o.default = '3306';
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_username', _('Database Username'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_password', _('Database Password'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_database', _('Database Name'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_table_prefix', _('Database Table Prefix'));
o.default = 'x_';
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_ssl_mode', _('Database SSL Mode'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
o = s.taboption('database', form.Value, 'mysql_dsn', _('Database DSN'));
o.depends('database_type', 'mysql');
o.depends('database_type', 'postgres');
// scheme
o = s.taboption('scheme', form.Flag, 'ssl', _('Enable SSL'));
o.rmempty = false;
o = s.taboption('scheme', form.Flag, 'force_https', _('Force HTTPS'));
o.rmempty = false;
o.depends('ssl', '1');
o = s.taboption('scheme', form.Value, 'ssl_cert', _('SSL cert'),
_('SSL certificate file path'));
o.rmempty = false;
o.depends('ssl', '1');
o = s.taboption('scheme', form.Value, 'ssl_key', _('SSL key'),
_('SSL key file path'));
o.rmempty = false;
o.depends('ssl', '1');
// tasks
o = s.taboption('tasks', form.Value, 'download_workers', _('Download Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'download_max_retry', _('Download Max Retry'));
o.datatype = 'uinteger';
o.default = '1';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'transfer_workers', _('Transfer Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'transfer_max_retry', _('Transfer Max Retry'));
o.datatype = 'uinteger';
o.default = '2';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'upload_workers', _('Upload Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'upload_max_retry', _('Upload Max Retry'));
o.datatype = 'uinteger';
o.default = '0';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'copy_workers', _('Copy Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.taboption('tasks', form.Value, 'copy_max_retry', _('Copy Max Retry'));
o.datatype = 'uinteger';
o.default = '2';
o.rmempty = false;
// cors
o = s.taboption('cors', form.Value, 'cors_allow_origins', _('Allow Origins'));
o.default = '*';
o.rmempty = false;
o = s.taboption('cors', form.Value, 'cors_allow_methods', _('Allow Methods'));
o.default = '*';
o.rmempty = false;
o = s.taboption('cors', form.Value, 'cors_allow_headers', _('Allow Headers'));
o.default = '*';
o.rmempty = false;
// s3
o = s.taboption('s3', form.Flag, 's3', _('Enabled S3'));
o.rmempty = false;
o = s.taboption('s3', form.Value, 's3_port', _('Port'));
o.datatype = 'and(port,min(1))';
o.default = 5246;
o.rmempty = false;
o = s.taboption('s3', form.Flag, 's3_ssl', _('Enable SSL'));
o.rmempty = false;
// ftp
o = s.taboption('ftp', form.Flag, 'ftp', _('Enabled FTP'));
o.rmempty = false;
o = s.taboption('ftp', form.Value, 'ftp_port', _('FTP Port'));
o.datatype = 'and(port,min(1))';
o.default = 5221;
o.rmempty = false;
o = s.taboption('ftp', form.Value, 'find_pasv_port_attempts', _('Max retries on port conflict during passive transfer'));
o.datatype = 'uinteger';
o.default = '50';
o.rmempty = false;
o = s.taboption('ftp', form.Flag, 'active_transfer_port_non_20', _('Enable non-20 port for active transfer'));
o.rmempty = false;
o = s.taboption('ftp', form.Value, 'idle_timeout', _('Client idle timeout (seconds)'));
o.datatype = 'uinteger';
o.default = '900';
o.rmempty = false;
o = s.taboption('ftp', form.Value, 'connection_timeout', _('Connection timeout (seconds)'));
o.datatype = 'uinteger';
o.default = '900';
o.rmempty = false;
o = s.taboption('ftp', form.Flag, 'disable_active_mode', _('Disable active transfer mode'));
o.rmempty = false;
o = s.taboption('ftp', form.Flag, 'default_transfer_binary', _('Enable binary transfer mode'));
o.rmempty = false;
o = s.taboption('ftp', form.Flag, 'enable_active_conn_ip_check', _('Client IP check in active transfer mode'));
o.rmempty = false;
o = s.taboption('ftp', form.Flag, 'enable_pasv_conn_ip_check', _('Client IP check in passive transfer mode'));
o.rmempty = false;
// sftp
o = s.taboption('sftp', form.Flag, 'sftp', _('Enabled SFTP'));
o.rmempty = false;
o = s.taboption('sftp', form.Value, 'sftp_port', _('SFTP Port'));
o.datatype = 'and(port,min(1))';
o.default = 5222;
o.rmempty = false;
return m.render();
}
});
@@ -0,0 +1,78 @@
'use strict';
'require dom';
'require fs';
'require poll';
'require uci';
'require view';
let scrollPosition = 0;
let userScrolled = false;
let logTextarea;
let log_path;
uci.load('openlist2').then(() => {
log_path = uci.get('openlist2', '@openlist2[0]', 'log_path') || '/var/log/openlist2.log';
});
const pollLog = () => {
return Promise.all([
fs.read_direct(log_path, 'text').then(res => {
return res.trim().split(/\n/).join('\n').replace(/\u001b\[33mWARN\u001b\[0m/g, '').replace(/\u001b\[36mINFO\u001b\[0m/g, '').replace(/\u001b\[31mERRO\u001b\[0m/g, '');
}),
]).then(data => {
logTextarea.value = data[0] || _('No log data.');
if (!userScrolled) {
logTextarea.scrollTop = logTextarea.scrollHeight;
} else {
logTextarea.scrollTop = scrollPosition;
}
});
};
return view.extend({
handleCleanLogs() {
return fs.write(log_path, '')
.catch(e => { ui.addNotification(null, E('p', e.message)) });
},
render() {
logTextarea = E('textarea', {
'id': 'log_content',
'class': 'cbi-input-textarea',
'wrap': 'off',
'readonly': 'readonly',
'style': 'width: calc(100% - 20px);height: 535px;margin: 10px;overflow-y: scroll;',
});
logTextarea.addEventListener('scroll', () => {
userScrolled = true;
scrollPosition = logTextarea.scrollTop;
});
const log_textarea_wrapper = E('div', { 'id': 'log_textarea' }, logTextarea);
setTimeout(() => {
poll.add(pollLog);
}, 100);
const clear_logs_button = E('input', { 'class': 'btn cbi-button-action', 'type': 'button', 'style': 'margin-left: 10px; margin-top: 10px;', 'value': _('Clear logs') });
clear_logs_button.addEventListener('click', L.bind(this.handleCleanLogs, this));
return E([
E('div', { 'class': 'cbi-map' }, [
E('div', { 'class': 'cbi-section' }, [
clear_logs_button,
log_textarea_wrapper,
E('div', { 'style': 'text-align:right' },
E('small', {}, _('Refresh every %s seconds.').format(L.env.pollinterval))
)
])
])
]);
},
handleSave: null,
handleSaveApply: null,
handleReset: null
});
@@ -0,0 +1,384 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:169
msgid ""
"0 is unlimited, It is recommend to set a low number of concurrency (10-20) "
"for poor performance device"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:175
msgid ""
"0 is unlimited, Limit the maximum concurrency of local agents. The default "
"value is 64"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:84
msgid "A file list program that supports multiple storage."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327
msgid "Allow Headers"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:323
msgid "Allow Methods"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:319
msgid "Allow Origins"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:106
msgid "Basic Settings"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:157
msgid "CDN URL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:112
msgid "CORS Settings"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:138
msgid "Cache directory"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:59
msgid "Clear logs"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376
msgid "Client IP check in active transfer mode"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:379
msgid "Client IP check in passive transfer mode"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:360
msgid "Client idle timeout (seconds)"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100
msgid "Collecting data..."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365
msgid "Connection timeout (seconds)"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:313
msgid "Copy Max Retry"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:308
msgid "Copy Workers"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:135
msgid "Data directory"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:109
msgid "Database"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255
msgid "Database DSN"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224
msgid "Database Host"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:242
msgid "Database Name"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:238
msgid "Database Password"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228
msgid "Database Port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251
msgid "Database SSL Mode"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:246
msgid "Database Table Prefix"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218
msgid "Database Type"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:234
msgid "Database Username"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:127
msgid "Delayed Start (seconds)"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:180
msgid "Disable TLS Verify"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:370
msgid "Disable active transfer mode"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283
msgid "Download Max Retry"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:278
msgid "Download Workers"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185
msgid "Enable Logs"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:260
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:340
msgid "Enable SSL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:373
msgid "Enable binary transfer mode"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:357
msgid "Enable non-20 port for active transfer"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:118
msgid "Enabled"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:344
msgid "Enabled FTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:332
msgid "Enabled S3"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:383
msgid "Enabled SFTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:114
msgid "FTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:347
msgid "FTP Port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:263
msgid "Force HTTPS"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:149
msgid "Force read config"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:143
msgid "Generate a new random password."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:107
msgid "Global Settings"
msgstr ""
#: luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json:3
msgid "Grant UCI access for luci-app-openlist2"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:160
msgid "JWT Key"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212
msgid "Log Compress"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:189
msgid "Log path"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:163
msgid "Login Validity Period (hours)"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:108
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21
msgid "Logs"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:168
msgid "Max Connections"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:194
msgid "Max Size (MB)"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:206
msgid "Max age"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:200
msgid "Max backups"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:174
msgid "Max concurrency of local proxies"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:352
msgid "Max retries on port conflict during passive transfer"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:221
msgid "MySQL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:40
msgid "NOT RUNNING"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "New Password:"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "New password has been copied to clipboard."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:23
msgid "No log data."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:113
msgid "Object Storage"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:37
msgid "Open Web Interface"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132
msgid "Open firewall port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:83
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3
msgid "OpenList"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:122
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:335
msgid "Port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:222
msgid "PostgreSQL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:38
msgid "RUNNING"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:68
msgid "Refresh every %s seconds."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:142
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:144
msgid "Reset Password"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:115
msgid "SFTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386
msgid "SFTP Port"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220
msgid "SQLite"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267
msgid "SSL cert"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:268
msgid "SSL certificate file path"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272
msgid "SSL key"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273
msgid "SSL key file path"
msgstr ""
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:13
msgid "Setting"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:150
msgid ""
"Setting this to true will force the program to read the configuration file, "
"ignoring environment variables."
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:154
msgid "Site URL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:111
msgid "Task threads"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:293
msgid "Transfer Max Retry"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288
msgid "Transfer Workers"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:303
msgid "Upload Max Retry"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:298
msgid "Upload Workers"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "Username:"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:110
msgid "Web Protocol"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:155
msgid ""
"When the web is reverse proxied to a subdirectory, this option must be "
"filled out to ensure proper functioning of the web. Do not include '/' at "
"the end of the URL"
msgstr ""
+393
View File
@@ -0,0 +1,393 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: zh_Hans\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:169
msgid ""
"0 is unlimited, It is recommend to set a low number of concurrency (10-20) "
"for poor performance device"
msgstr "默认 0 不限制,低性能设备建议设置较低的并发数(10-20)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:175
msgid ""
"0 is unlimited, Limit the maximum concurrency of local agents. The default "
"value is 64"
msgstr "限制本地代理最大并发数,值为 0 表示不限制,默认值 64"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:84
msgid "A file list program that supports multiple storage."
msgstr "一款支持多种存储的目录文件列表程序。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:327
msgid "Allow Headers"
msgstr "允许标头(Headers)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:323
msgid "Allow Methods"
msgstr "允许方法(Methods)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:319
msgid "Allow Origins"
msgstr "允许来源(Origins)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:106
msgid "Basic Settings"
msgstr "基本设置"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:157
msgid "CDN URL"
msgstr "CDN 地址"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:112
msgid "CORS Settings"
msgstr "跨域设置"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:138
msgid "Cache directory"
msgstr "缓存目录"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:59
msgid "Clear logs"
msgstr "清空日志"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:376
msgid "Client IP check in active transfer mode"
msgstr "主动传输模式下对客户端进行 IP 检查"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:379
msgid "Client IP check in passive transfer mode"
msgstr "被动传输模式下对客户端进行 IP 检查"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:360
msgid "Client idle timeout (seconds)"
msgstr "客户端空闲超时(秒)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:100
msgid "Collecting data..."
msgstr "收集数据..."
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:365
msgid "Connection timeout (seconds)"
msgstr "连接超时(秒)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:313
msgid "Copy Max Retry"
msgstr "复制任务重试次数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:308
msgid "Copy Workers"
msgstr "复制任务线程数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:135
msgid "Data directory"
msgstr "数据目录"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:109
msgid "Database"
msgstr "数据库"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:255
msgid "Database DSN"
msgstr "DSN"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:224
msgid "Database Host"
msgstr "主机"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:242
msgid "Database Name"
msgstr "数据库名"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:238
msgid "Database Password"
msgstr "密码"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:228
msgid "Database Port"
msgstr "端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:251
msgid "Database SSL Mode"
msgstr "SSL模式"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:246
msgid "Database Table Prefix"
msgstr "数据库表前缀"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:218
msgid "Database Type"
msgstr "数据库类型"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:234
msgid "Database Username"
msgstr "用户名"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:127
msgid "Delayed Start (seconds)"
msgstr "开机延时启动(秒)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:180
msgid "Disable TLS Verify"
msgstr "禁用 TLS 验证"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:370
msgid "Disable active transfer mode"
msgstr "禁用主动传输模式"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:283
msgid "Download Max Retry"
msgstr "下载任务重试次数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:278
msgid "Download Workers"
msgstr "下载任务线程数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:185
msgid "Enable Logs"
msgstr "启用日志"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:260
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:340
msgid "Enable SSL"
msgstr "启用 SSL"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:373
msgid "Enable binary transfer mode"
msgstr "启用二进制传输模式"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:357
msgid "Enable non-20 port for active transfer"
msgstr "启用非 20 端口进行主动传输"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:118
msgid "Enabled"
msgstr "启用"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:344
msgid "Enabled FTP"
msgstr "启用 FTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:332
msgid "Enabled S3"
msgstr "启用 S3"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:383
msgid "Enabled SFTP"
msgstr "启用 SFTP"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:114
msgid "FTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:347
msgid "FTP Port"
msgstr "FTP 端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:263
msgid "Force HTTPS"
msgstr "强制 HTTPS"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:149
msgid "Force read config"
msgstr "强制读取配置"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:143
msgid "Generate a new random password."
msgstr "随机生成一个新密码。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:107
msgid "Global Settings"
msgstr "全局设置"
#: luci-app-openlist2/root/usr/share/rpcd/acl.d/luci-app-openlist2.json:3
msgid "Grant UCI access for luci-app-openlist2"
msgstr "授予 luci-app-openlist2 的 UCI 访问权限"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:160
msgid "JWT Key"
msgstr "JWT 密钥"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:212
msgid "Log Compress"
msgstr "日志压缩"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:189
msgid "Log path"
msgstr "日志文件路径"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:163
msgid "Login Validity Period (hours)"
msgstr "登录有效期(小时)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:108
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:21
msgid "Logs"
msgstr "日志"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:168
msgid "Max Connections"
msgstr "最大并发连接数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:194
msgid "Max Size (MB)"
msgstr "日志文件大小(MB)"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:206
msgid "Max age"
msgstr "日志保存天数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:200
msgid "Max backups"
msgstr "日志备份数量"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:174
msgid "Max concurrency of local proxies"
msgstr "本地代理最大并发数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:352
msgid "Max retries on port conflict during passive transfer"
msgstr "被动传输端口冲突时最大重试次数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:221
msgid "MySQL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:40
msgid "NOT RUNNING"
msgstr "未运行"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "New Password:"
msgstr "新密码:"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "New password has been copied to clipboard."
msgstr "新密码已复制到剪贴板。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:23
msgid "No log data."
msgstr "无日志数据。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:113
msgid "Object Storage"
msgstr "对象存储"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:37
msgid "Open Web Interface"
msgstr "打开 Web 界面"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:132
msgid "Open firewall port"
msgstr "打开防火墙端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:83
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:3
msgid "OpenList"
msgstr "OpenList"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:122
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:335
msgid "Port"
msgstr "端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:222
msgid "PostgreSQL"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:38
msgid "RUNNING"
msgstr "运行中"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/logs.js:68
msgid "Refresh every %s seconds."
msgstr "每 %s 秒刷新。"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:142
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:144
msgid "Reset Password"
msgstr "重置密码"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:115
msgid "SFTP"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:386
msgid "SFTP Port"
msgstr "SFTP 端口"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:220
msgid "SQLite"
msgstr ""
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:267
msgid "SSL cert"
msgstr "SSL 证书"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:268
msgid "SSL certificate file path"
msgstr "SSL 证书文件路径"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:272
msgid "SSL key"
msgstr "SSL 密钥"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:273
msgid "SSL key file path"
msgstr "SSL 密钥文件路径"
#: luci-app-openlist2/root/usr/share/luci/menu.d/luci-app-openlist2.json:13
msgid "Setting"
msgstr "设置"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:150
msgid ""
"Setting this to true will force the program to read the configuration file, "
"ignoring environment variables."
msgstr "将此设置为 true 可以强制程序读取配置文件,而忽略环境变量"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:154
msgid "Site URL"
msgstr "站点地址"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:111
msgid "Task threads"
msgstr "任务线程"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:293
msgid "Transfer Max Retry"
msgstr "中转任务下载重试次数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:288
msgid "Transfer Workers"
msgstr "中转任务线程数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:303
msgid "Upload Max Retry"
msgstr "上传任务重试次数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:298
msgid "Upload Workers"
msgstr "上传任务线程数"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:65
msgid "Username:"
msgstr "用户名:"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:110
msgid "Web Protocol"
msgstr "Web 协议"
#: luci-app-openlist2/htdocs/luci-static/resources/view/openlist2/basic.js:155
msgid ""
"When the web is reverse proxied to a subdirectory, this option must be "
"filled out to ensure proper functioning of the web. Do not include '/' at "
"the end of the URL"
msgstr ""
"Web 被反向代理到二级目录时,必须填写该选项以确保 Web 正常工作。URL 结尾请勿携"
"带 '/'"
@@ -0,0 +1,13 @@
#!/bin/sh
[ -f "/etc/config/ucitrack" ] && {
uci -q batch <<-EOF >/dev/null
delete ucitrack.@openlist2[-1]
add ucitrack openlist2
set ucitrack.@openlist2[-1].init=openlist2
commit ucitrack
EOF
}
rm -rf /tmp/luci-*
exit 0
@@ -0,0 +1,28 @@
{
"admin/services/openlist2": {
"title": "OpenList",
"action": {
"type": "firstchild"
},
"depends": {
"acl": [ "luci-app-openlist2" ],
"uci": { "openlist2": true }
}
},
"admin/services/openlist2/basic": {
"title": "Setting",
"order": 10,
"action": {
"type": "view",
"path": "openlist2/basic"
}
},
"admin/services/openlist2/logs": {
"title": "Logs",
"order": 20,
"action": {
"type": "view",
"path": "openlist2/logs"
}
}
}
@@ -0,0 +1,21 @@
{
"luci-app-openlist2": {
"description": "Grant UCI access for luci-app-openlist2",
"read": {
"file": {
"/usr/bin/openlist2": [ "exec" ],
"/*": [ "read" ]
},
"ubus": {
"service": [ "list" ]
},
"uci": [ "openlist2" ]
},
"write": {
"file": {
"/*": [ "write" ]
},
"uci": [ "openlist2" ]
}
}
}
@@ -0,0 +1,4 @@
{
"config": "openlist2",
"init": "openlist2"
}