diff --git a/luci-app-alist/Makefile b/luci-app-alist/Makefile index d1ecd19..3a58b09 100644 --- a/luci-app-alist/Makefile +++ b/luci-app-alist/Makefile @@ -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 diff --git a/luci-app-alist/htdocs/luci-static/resources/view/alist/basic.js b/luci-app-alist/htdocs/luci-static/resources/view/alist/basic.js index 9d6c2a3..bef4cde 100644 --- a/luci-app-alist/htdocs/luci-static/resources/view/alist/basic.js +++ b/luci-app-alist/htdocs/luci-static/resources/view/alist/basic.js @@ -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(); } diff --git a/luci-app-alist/po/zh_Hans/alist.po b/luci-app-alist/po/zh_Hans/alist.po index 6aae154..6f0c452 100644 --- a/luci-app-alist/po/zh_Hans/alist.po +++ b/luci-app-alist/po/zh_Hans/alist.po @@ -23,6 +23,9 @@ msgstr "设置" msgid "Basic Setting" msgstr "基本设置" +msgid "Global Settings" +msgstr "全局设置" + msgid "Logs" msgstr "日志" @@ -126,7 +129,13 @@ msgid "Max Connections" 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)" +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 端口"