luci-app-alist: Add ftp/sftp tabs and use paging menus

Signed-off-by: sbwml <admin@cooluc.com>
This commit is contained in:
sbwml 2025-02-14 16:15:46 +08:00
parent c7d7c2a5ce
commit 991b1fd6d1
3 changed files with 165 additions and 80 deletions

View File

@ -6,7 +6,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-alist
PKG_VERSION:=1.1.2
PKG_VERSION:=1.1.3
PKG_RELEASE:=1
LUCI_TITLE:=LuCI support for alist

View File

@ -95,251 +95,292 @@ return view.extend({
]);
}
// init
s = m.section(form.TypedSection, 'alist', _('Basic Settings'));
s.anonymous = true;
s = m.section(form.NamedSection, '@alist[0]', 'alist');
o = s.option(form.Flag, 'enabled', _('Enabled'));
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.option(form.Value, 'port', _('Port'));
o = s.taboption('basic', form.Value, 'port', _('Port'));
o.datatype = 'and(port,min(1))';
o.default = '5244';
o.rmempty = false;
o = s.option(form.Value, 'delayed_start', _('Delayed Start (seconds)'));
o = s.taboption('basic', form.Value, 'delayed_start', _('Delayed Start (seconds)'));
o.datatype = 'uinteger';
o.default = '0';
o.rmempty = false;
o = s.option(form.Flag, 'allow_wan', _('Open firewall port'));
o = s.taboption('basic', form.Flag, 'allow_wan', _('Open firewall port'));
o.rmempty = false;
o = s.option(form.Button, '_newpassword', _('Reset Password'),
o = s.taboption('basic', form.Value, 'data_dir', _('Data directory'));
o.default = '/etc/alist';
o = s.taboption('basic', form.Value, 'temp_dir', _('Cache directory'));
o.default = '/tmp/alist';
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
s = m.section(form.TypedSection, 'alist', _('Global Settings'));
s.anonymous = true;
o = s.option(form.Flag, 'force', _('Force read config'),
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.option(form.Value, 'site_url', _('Site URL'),
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.option(form.Value, 'cdn', _('CDN URL'));
o = s.taboption('global', form.Value, 'cdn', _('CDN URL'));
o.default = '';
o = s.option(form.Value, 'jwt_secret', _('JWT Key'));
o = s.taboption('global', form.Value, 'jwt_secret', _('JWT Key'));
o.default = '';
o = s.option(form.Value, 'token_expires_in', _('Login Validity Period (hours)'));
o = s.taboption('global', form.Value, 'token_expires_in', _('Login Validity Period (hours)'));
o.datatype = 'uinteger';
o.default = '48';
o.rmempty = false;
o = s.option(form.Value, 'max_connections', _('Max Connections'),
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.option(form.Flag, 'tls_insecure_skip_verify', _('Disable TLS Verify'));
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;
o = s.option(form.Value, 'data_dir', _('Data directory'));
o.default = '/etc/alist';
o = s.option(form.Value, 'temp_dir', _('Cache directory'));
o.default = '/tmp/alist';
o.rmempty = false;
// Logs
s = m.section(form.TypedSection, 'alist', _('Logs'));
s.anonymous = true;
o = s.option(form.Flag, 'log', _('Enable Logs'));
o = s.taboption('log', form.Flag, 'log', _('Enable Logs'));
o.default = 1;
o.rmempty = false;
o = s.option(form.Value, 'log_path', _('Log path'));
o = s.taboption('log', form.Value, 'log_path', _('Log path'));
o.default = '/var/log/alist.log';
o.rmempty = false;
o.depends('log', '1');
o = s.option(form.Value, 'log_max_size', _('Max Size (MB)'));
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.option(form.Value, 'log_max_backups', _('Max backups'));
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.option(form.Value, 'log_max_age', _('Max age'));
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.option(form.Flag, 'log_compress', _('Log Compress'));
o = s.taboption('log', form.Flag, 'log_compress', _('Log Compress'));
o.default = 'false';
o.rmempty = false;
o.depends('log', '1');
// database
s = m.section(form.TypedSection, 'alist', _('Database'));
s.anonymous = true;
o = s.option(form.ListValue, 'database_type', _('Database Type'));
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.option(form.Value, 'mysql_host', _('Database Host'));
o = s.taboption('database', form.Value, 'mysql_host', _('Database Host'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_port', _('Database Port'));
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.option(form.Value, 'mysql_username', _('Database Username'));
o = s.taboption('database', form.Value, 'mysql_username', _('Database Username'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_password', _('Database Password'));
o = s.taboption('database', form.Value, 'mysql_password', _('Database Password'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_database', _('Database Name'));
o = s.taboption('database', form.Value, 'mysql_database', _('Database Name'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_table_prefix', _('Database Table Prefix'));
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.option(form.Value, 'mysql_ssl_mode', _('Database SSL Mode'));
o = s.taboption('database', form.Value, 'mysql_ssl_mode', _('Database SSL Mode'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
o = s.option(form.Value, 'mysql_dsn', _('Database DSN'));
o = s.taboption('database', form.Value, 'mysql_dsn', _('Database DSN'));
o.depends('database_type','mysql');
o.depends('database_type','postgres');
// scheme
s = m.section(form.TypedSection, 'alist', _('Web Protocol'));
s.anonymous = true;
o = s.option(form.Flag, 'ssl', _('Enable SSL'));
o = s.taboption('scheme', form.Flag, 'ssl', _('Enable SSL'));
o.rmempty = false;
o = s.option(form.Flag, 'force_https', _('Force HTTPS'));
o = s.taboption('scheme', form.Flag, 'force_https', _('Force HTTPS'));
o.rmempty = false;
o.depends('ssl', '1');
o = s.option(form.Value, 'ssl_cert', _('SSL cert'),
o = s.taboption('scheme', form.Value, 'ssl_cert', _('SSL cert'),
_('SSL certificate file path'));
o.rmempty = false;
o.depends('ssl', '1');
o = s.option(form.Value, 'ssl_key', _('SSL key'),
o = s.taboption('scheme', form.Value, 'ssl_key', _('SSL key'),
_('SSL key file path'));
o.rmempty = false;
o.depends('ssl', '1');
// tasks
s = m.section(form.TypedSection, 'alist', _('Task threads'));
s.anonymous = true;
o = s.option(form.Value, 'download_workers', _('Download Workers'));
o = s.taboption('tasks', form.Value, 'download_workers', _('Download Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'download_max_retry', _('Download Max Retry'));
o = s.taboption('tasks', form.Value, 'download_max_retry', _('Download Max Retry'));
o.datatype = 'uinteger';
o.default = '1';
o.rmempty = false;
o = s.option(form.Value, 'transfer_workers', _('Transfer Workers'));
o = s.taboption('tasks', form.Value, 'transfer_workers', _('Transfer Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'transfer_max_retry', _('Transfer Max Retry'));
o = s.taboption('tasks', form.Value, 'transfer_max_retry', _('Transfer Max Retry'));
o.datatype = 'uinteger';
o.default = '2';
o.rmempty = false;
o = s.option(form.Value, 'upload_workers', _('Upload Workers'));
o = s.taboption('tasks', form.Value, 'upload_workers', _('Upload Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'upload_max_retry', _('Upload Max Retry'));
o = s.taboption('tasks', form.Value, 'upload_max_retry', _('Upload Max Retry'));
o.datatype = 'uinteger';
o.default = '0';
o.rmempty = false;
o = s.option(form.Value, 'copy_workers', _('Copy Workers'));
o = s.taboption('tasks', form.Value, 'copy_workers', _('Copy Workers'));
o.datatype = 'uinteger';
o.default = '5';
o.rmempty = false;
o = s.option(form.Value, 'copy_max_retry', _('Copy Max Retry'));
o = s.taboption('tasks', form.Value, 'copy_max_retry', _('Copy Max Retry'));
o.datatype = 'uinteger';
o.default = '2';
o.rmempty = false;
// cors
s = m.section(form.TypedSection, 'alist', _('CORS Settings'));
s.anonymous = true;
o = s.option(form.Value, 'cors_allow_origins', _('Allow Origins'));
o = s.taboption('cors', form.Value, 'cors_allow_origins', _('Allow Origins'));
o.default = '*';
o.rmempty = false;
o = s.option(form.Value, 'cors_allow_methods', _('Allow Methods'));
o = s.taboption('cors', form.Value, 'cors_allow_methods', _('Allow Methods'));
o.default = '*';
o.rmempty = false;
o = s.option(form.Value, 'cors_allow_headers', _('Allow Headers'));
o = s.taboption('cors', form.Value, 'cors_allow_headers', _('Allow Headers'));
o.default = '*';
o.rmempty = false;
// s3
s = m.section(form.TypedSection, 'alist', _('Object Storage'));
s.anonymous = true;
o = s.option(form.Flag, 's3', _('Enabled S3'));
o = s.taboption('s3', form.Flag, 's3', _('Enabled S3'));
o.rmempty = false;
o = s.option(form.Value, 's3_port', _('Port'));
o = s.taboption('s3', form.Value, 's3_port', _('Port'));
o.datatype = 'and(port,min(1))';
o.default = 5246;
o.rmempty = false;
o.depends('s3', '1');
o = s.option(form.Flag, 's3_ssl', _('Enable SSL'));
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', _('Binary mode transmission'));
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;
o.depends('s3', '1');
return m.render();
}

View File

@ -23,6 +23,9 @@ msgstr "设置"
msgid "Basic Setting"
msgstr "基本设置"
msgid "Global Settings"
msgstr "全局设置"
msgid "Logs"
msgstr "日志"
@ -128,6 +131,12 @@ msgstr "最大并发连接数"
msgid "0 is unlimited, It is recommend to set a low number of concurrency (10-20) for poor performance device"
msgstr "默认 0 不限制低性能设备建议设置较低的并发数10-20"
msgid "Max concurrency of local proxies"
msgstr "本地代理最大并发数"
msgid "0 is unlimited, Limit the maximum concurrency of local agents. The default value is 64"
msgstr "限制本地代理最大并发数,值为 0 表示不限制,默认值 64"
msgid "Site URL"
msgstr "站点地址"
@ -221,3 +230,38 @@ msgstr "对象存储"
msgid "Enabled S3"
msgstr "启用 S3"
msgid "Enabled FTP"
msgstr "启用 FTP"
msgid "FTP Port"
msgstr "FTP 端口"
msgid "Max retries on port conflict during passive transfer"
msgstr "被动传输端口冲突时重试最大次数"
msgid "Enable non-20 port for active transfer"
msgstr "启用非 20 端口进行主动传输"
msgid "Client idle timeout (seconds)"
msgstr "客户端空闲超时(秒)"
msgid "Connection timeout (seconds)"
msgstr "连接超时(秒)"
msgid "Disable active transfer mode"
msgstr "禁用主动传输模式"
msgid "Binary mode transmission"
msgstr "二进制模式传输"
msgid "Client IP check in active transfer mode"
msgstr "主动传输模式下客户端 IP 检查"
msgid "Client IP check in passive transfer mode"
msgstr "被动传输模式下客户端 IP 检查"
msgid "Enabled SFTP"
msgstr "启用 SFTP"
msgid "SFTP Port"
msgstr "SFTP 端口"