update 2022-09-25 20:21:16

This commit is contained in:
github-actions[bot] 2022-09-25 20:21:16 +08:00
parent a6bf742729
commit 008bfca74f
22 changed files with 760 additions and 386 deletions

View File

@ -30,5 +30,5 @@ start() {
stop() {
echo "${db_dir}/${db_name}" > "/lib/upgrade/keep.d/filebrowser"
killall -9 filebrowser >/dev/null 2>&1
killall -3 filebrowser >/dev/null 2>&1
}

View File

@ -52,5 +52,5 @@ stop() {
init_conf
set_type="stop" && set_firewall 2>"/dev/null"
killall "gowebdav" 2>"/dev/null"
killall -3 "gowebdav" 2>"/dev/null"
}

View File

@ -10,11 +10,11 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
PKG_VERSION:=0.9.8
PKG_VERSION:=1.0.0
PKG_RELEASE:=$(PKG_ARCH_LINKEASE)-1
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://fw.koolcenter.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=a349bc5dc8f1546498213ce6f224b1951540917358f01013dd45e4d3e9ee84c2
PKG_HASH:=7410e97e096700ade8242edc50265caa85c7682d97c08032bc8174fa1e882a56
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)

View File

@ -1,15 +1,13 @@
# SPDX-License-Identifier: GPL-3.0-only
#
# Copyright (C) 2022 ImmortalWrt.org
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for v2rayA
LUCI_DEPENDS:=+v2raya
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-v2raya
PKG_VERSION:=1.1
PKG_RELEASE:=2
PKG_MAINTAINER:=zxlhhyccc <zxlhhy@gmail.com>
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -1 +1,8 @@
# 简易的 v2rayA 开关
# luci-app-v2raya
v2rayA 是一个易用而强大的,跨平台的 V2Ray 客户端,支持 SS、SSR、Trojantrojan-go、PingTunnel 协议。
## 注意
1、master分支的版本为js版本是适配官方openwrt的19.07及以上分支非19.07及以上分支请不要使用。
2、18.06分支的版本为luci-compat版本主要适配的是官方operwrt的18.06分支和 Lean Openwrt [如果你是lean代码 请选择这个版本]不过此版本也可以使用在openwrt的19.07及以上分支。

View File

@ -0,0 +1,193 @@
/* SPDX-License-Identifier: GPL-3.0-only
*
* Copyright (C) 2022 ImmortalWrt.org
*/
'use strict';
'require form';
'require fs';
'require poll';
'require rpc';
'require uci';
'require ui';
'require validation';
'require view';
var callServiceList = rpc.declare({
object: 'service',
method: 'list',
params: ['name'],
expect: { '': {} }
});
var callInitAction = rpc.declare({
object: 'luci',
method: 'setInitAction',
params: ['name', 'action'],
expect: { result:false }
});
function getServiceStatus() {
return L.resolveDefault(callServiceList('v2raya'), {}).then(function (res) {
var isRunning = false;
try {
isRunning = res['v2raya']['instances']['v2raya']['running'];
} catch (e) { }
return isRunning;
});
}
function renderStatus(isRunning, port) {
var spanTemp = '<span style="color:%s"><strong>%s %s</strong></span>';
var renderHTML;
if (isRunning) {
var button = String.format('&#160;<a class="btn cbi-button" href="%s:%s" target="_blank" rel="noreferrer noopener">%s</a>',
window.location.origin, port, _('Open Web Interface'));
renderHTML = spanTemp.format('green', _('v2rayA'), _('RUNNING')) + button;
} else {
renderHTML = spanTemp.format('red', _('v2rayA'), _('NOT RUNNING'));
}
return renderHTML;
}
function uploadCertificate(type, filename, ev) {
L.resolveDefault(fs.exec('/bin/mkdir', [ '-p', '/etc/v2raya/' ]));
return ui.uploadFile('/etc/v2raya/' + filename, ev.target)
.then(L.bind(function(btn, res) {
btn.firstChild.data = _('Checking %s...').format(type);
if (res.size <= 0) {
ui.addNotification(null, E('p', _('The uploaded %s is empty.').format(type)));
return fs.remove('/etc/v2raya/' + filename);
}
ui.addNotification(null, E('p', _('Your %s was successfully uploaded. Size: %sB.').format(type, res.size)));
}, this, ev.target))
.catch(function(e) { ui.addNotification(null, E('p', e.message)) })
.finally(L.bind(function(btn, input) {
btn.firstChild.data = _('Upload...');
}, this, ev.target));
}
return view.extend({
load: function() {
return Promise.all([
uci.load('v2raya')
]);
},
handleSaveApply: function(ev, mode) {
return this.handleSave(ev).then(function() {
classes.ui.changes.apply(mode == '0');
callInitAction('v2raya', 'disable').then(function() {
callInitAction('v2raya', 'restart');
});
})
},
render: function(data) {
var m, s, o;
var webport = (uci.get(data[0], 'config', 'address') || '0.0.0.0:2017').split(':').slice(-1)[0];
m = new form.Map('v2raya', _('v2rayA'),
_('v2rayA is a V2Ray Linux client supporting global transparent proxy, compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols.'));
s = m.section(form.TypedSection);
s.anonymous = true;
s.render = function () {
poll.add(function () {
return L.resolveDefault(getServiceStatus()).then(function (res) {
var view = document.getElementById('service_status');
view.innerHTML = renderStatus(res, webport);
});
});
return E('div', { class: 'cbi-section', id: 'status_bar' }, [
E('p', { id: 'service_status' }, _('Collecting data...'))
]);
}
s = m.section(form.NamedSection, 'config', 'v2raya');
o = s.option(form.Flag, 'enabled', _('Enable'));
o.default = o.disabled;
o.rmempty = false;
o = s.option(form.Value, 'address', _('Listening address'));
o.datatype = 'ipaddrport(1)';
o.default = '0.0.0.0:2017';
o.rmempty = false;
o = s.option(form.Value, 'config', _('Configuration directory'));
o.datatype = 'path';
o.default = '/etc/v2raya';
o.rmempty = false;
o = s.option(form.ListValue, 'ipv6_support', _('IPv6 support'),
_('Make sure your IPv6 network works fine before you turn it on.'));
o.value('auto', _('Auto'));
o.value('on', _('On'));
o.value('off', _('Off'));
o.default = 'auto';
o.rmempty = false;
o = s.option(form.ListValue, 'log_level', _('Log level'));
o.value('trace', _('Trace'));
o.value('debug', _('Debug'));
o.value('info', _('Info'));
o.value('warn', _('Warn'));
o.value('error', _('Error'));
o.default = 'info';
o.rmempty = false;
o = s.option(form.Value, 'log_file', _('Log file path'));
o.datatype = 'path';
o.default = '/var/log/v2raya/v2raya.log';
o.rmempty = false;
/* Due to ACL rule, this value must retain default otherwise log page will be broken */
o.readonly = true;
o = s.option(form.Value, 'log_max_days', _('Max log retention period'),
_('Maximum number of days to keep log files.'));
o.datatype = 'uinteger';
o.default = '3';
o.rmempty = false;
o = s.option(form.Flag, 'log_disable_color', _('Disable log color output'));
o.default = o.enabled;
o.rmempty = false;
o = s.option(form.Flag, 'log_disable_timestamp', _('Disable log timestamp'));
o.default = o.disabled;
o.rmempty = false;
o = s.option(form.Value, 'v2ray_bin', _('v2ray binary path'),
_('Executable v2ray binary path. Auto-detect if put it empty (recommended).'));
o.datatype = 'path';
o = s.option(form.Value, 'v2ray_confdir', _('Extra config directory'),
_('Additional v2ray config directory, files in it will be combined with config generated by v2rayA.'));
o.datatype = 'path';
o = s.option(form.Value, 'vless_grpc_inbound_cert_key', _('Certpath for gRPC inbound'),
_('Specify the certification path instead of automatically generating a self-signed certificate.'));
o.value('', _('Automatically generate'));
o.value('/etc/v2raya/grpc_certificate.crt,/etc/v2raya/grpc_private.key');
o = s.option(form.Button, '_upload_cert', _('Upload certificate'));
o.inputstyle = 'action';
o.inputtitle = _('Upload...');
o.onclick = L.bind(uploadCertificate, this, _('certificate'), 'grpc_certificate.crt');
o.depends('vless_grpc_inbound_cert_key', '/etc/v2raya/grpc_certificate.crt,/etc/v2raya/grpc_private.key');
o = s.option(form.Button, '_upload_key', _('Upload privateKey'));
o.inputstyle = 'action';
o.inputtitle = _('Upload...');
o.onclick = L.bind(uploadCertificate, this, _('private key'), 'grpc_private.key');
o.depends('vless_grpc_inbound_cert_key', '/etc/v2raya/grpc_certificate.crt,/etc/v2raya/grpc_private.key');
return m.render();
}
});

View File

@ -0,0 +1,80 @@
/* SPDX-License-Identifier: GPL-3.0-only
*
* Copyright (C) 2022 ImmortalWrt.org
*/
'use strict';
'require dom';
'require fs';
'require poll';
'require uci';
'require view';
return view.extend({
render: function() {
/* Thanks to luci-app-aria2 */
var css = ' \
#log_textarea { \
padding: 10px; \
text-align: left; \
} \
#log_textarea pre { \
padding: .5rem; \
word-break: break-all; \
margin: 0; \
} \
.description { \
background-color: #33ccff; \
}';
var log_textarea = E('div', { 'id': 'log_textarea' },
E('img', {
'src': L.resource(['icons/loading.gif']),
'alt': _('Loading...'),
'style': 'vertical-align:middle'
}, _('Collecting data...'))
);
var log_path = uci.get('v2raya', 'config', 'log_file') || '/var/log/v2raya/v2raya.log';
poll.add(L.bind(function() {
return fs.read_direct(log_path, 'text')
.then(function(res) {
var log = E('pre', { 'wrap': 'pre' }, [
res.trim() || _('Log is clean.')
]);
dom.content(log_textarea, log);
}).catch(function(err) {
var log;
if (err.toString().includes('NotFoundError'))
log = E('pre', { 'wrap': 'pre' }, [
_('Log file does not exist.')
]);
else
log = E('pre', { 'wrap': 'pre' }, [
_('Unknown error: %s').format(err)
]);
dom.content(log_textarea, log);
});
}));
return E([
E('style', [ css ]),
E('div', {'class': 'cbi-map'}, [
E('div', {'class': 'cbi-section'}, [
log_textarea,
E('div', {'style': 'text-align:right'},
E('small', {}, _('Refresh every %s seconds.').format(L.env.pollinterval))
)
])
])
]);
},
handleSaveApply: null,
handleSave: null,
handleReset: null
});

View File

@ -1,32 +0,0 @@
module("luci.controller.v2raya", package.seeall)
function index()
if not nixio.fs.access("/etc/config/v2raya") then
return
end
local page = entry({"admin", "services", "v2raya"}, alias("admin", "services", "v2raya", "basic"), _("v2rayA"), 30)
page.dependent = true
page.acl_depends = { "luci-app-v2raya" }
entry({"admin", "services", "v2raya", "basic"}, cbi("v2raya/basic")).leaf = true
entry({"admin", "services", "v2raya", "log"}, cbi("v2raya/log")).leaf = true
entry({"admin", "services", "v2raya", "get_log"}, call("get_log")).leaf = true
entry({"admin", "services", "v2raya", "clear_log"}, call("clear_log")).leaf = true
entry({"admin", "services", "v2raya", "status"}, call("act_status")).leaf = true
end
function act_status()
local e = {}
e.running = luci.sys.call("pgrep -f v2raya >/dev/null") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end
function get_log()
luci.http.write(luci.sys.exec("[ -f $(uci -q get v2raya.config.log_file) ] && cat $(uci -q get v2raya.config.log_file)"))
end
function clear_log()
luci.sys.call("echo '' > $(uci -q get v2raya.config.log_file)")
end

View File

@ -1,140 +0,0 @@
-- Copyright 2008 Yanira <forum-2008@email.de>
-- Licensed to the public under the Apache License 2.0.
local uci = luci.model.uci.cursor()
local m, o, s
require("nixio.fs")
local v2raya_bin = "/usr/bin/v2raya"
v2raya_version="<b><font style=\"color:red\">"..luci.sys.exec(v2raya_bin.." --version 2>/dev/null").."</font></b>"
m = Map("v2raya")
m.title = translate("v2rayA Client")
m.description = translate("v2rayA is a V2Ray Linux client supporting global transparent proxy, compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols.")
m:section(SimpleSection).template = "v2raya/v2raya_status"
s = m:section(TypedSection, "v2raya")
s:tab("settings", translate("Basic Setting"))
s:tab("log", translate("Logs"))
s.addremove = false
s.anonymous = true
o = s:taboption("settings", Flag, "enabled", translate("Enabled"))
o.default = o.disabled
o.rmempty = false
o = s:taboption("settings", DummyValue,"v2raya_version",translate("v2rayA Version"))
o.rawhtml = true
o.value = v2raya_version
o = s:taboption("settings", Value, "address", translate("GUI access address"))
o.description = translate("Use 0.0.0.0:2017 to monitor all access.")
--[[o.datatype = 'ipaddrport(1)']]--
o.default = "http://0.0.0.0:2017"
o.rmempty = false
o = s:taboption("settings", Value, "config", translate("v2rayA configuration directory"))
o.rmempty = '/etc/v2raya'
o.rmempty = false;
o = s:taboption("settings", ListValue, "ipv6_support", translate("Ipv6 Support"))
o.description = translate("Make sure your IPv6 network works fine before you turn it on.")
o:value("auto", translate("AUTO"))
o:value("on", translate("ON"))
o:value("off", translate("OFF"))
o.default = auto
o.rmempty = false
o = s:taboption("settings", Value, "log_file", translate("Log file"))
o.default = "/var/log/v2raya/v2raya.log"
o.rmempty = false
o.readonly = true
o = s:taboption("settings", ListValue, "log_level", translate("Log Level"))
o:value("trace",translate("Trace"))
o:value("debug",translate("Debug"))
o:value("info",translate("Info"))
o:value("warn",translate("Warning"))
o:value("error",translate("Error"))
o.default = "Info"
o.rmempty = false
o = s:taboption("settings", ListValue, "log_max_days", translate("Log Keepd Max Days"))
o.description = translate("Maximum number of days to keep log files is 3 day.")
o.datatype = "uinteger"
o:value("1", translate("1"))
o:value("2", translate("2"))
o:value("3", translate("3"))
o.default = 3
o.rmempty = false
o = s:taboption("settings", Flag, "log_disable_color", translate("Disable log color"))
o.default = o.enabled
o.rmempty = false
o = s:taboption("settings", Flag, "log_disable_timestamp", translate("Log disable timestamp"))
o.default = o.disabled
o.rmempty = false
o = s:taboption("settings", Value, "v2ray_bin", translate("v2ray binary path"))
o.description = translate("Executable v2ray binary path. Auto-detect if put it empty (recommended).")
o.datatype = 'path'
o = s:taboption("settings", Value, "v2ray_confdir", translate("Extra config directory"))
o.description = translate("Additional v2ray config directory, files in it will be combined with config generated by v2rayA.")
o.datatype = 'path'
o = s:taboption("settings", Value, "vless_grpc_inbound_cert_key", translate("Upload certificate"))
o.description = translate("Specify the certification path instead of automatically generating a self-signed certificate.")
o.template = "v2raya/v2raya_certupload"
cert_dir = "/etc/v2raya/"
local path
luci.http.setfilehandler(function(meta, chunk, eof)
if not fd then
if (not meta) or (not meta.name) or (not meta.file) then
return
end
fd = nixio.open(cert_dir .. meta.file, "w")
if not fd then
path = translate("Create upload file error.")
return
end
end
if chunk and fd then
fd:write(chunk)
end
if eof and fd then
fd:close()
fd = nil
path = '/etc/v2raya/' .. meta.file .. ''
end
end)
if luci.http.formvalue("upload") then
local f = luci.http.formvalue("ulfile")
if #f <= 0 then
path = translate("No specify upload file.")
end
end
o = s:taboption("settings", Value, "vless_grpc_inbound_cert_key", translate("Upload Certificate Path"))
o.description = translate("This is the path where the certificate resides after the certificate is uploaded.")
o.default = "/etc/v2raya/cert.crt,/etc/v2raya/cert.key"
o = s:taboption("log", Value, "log", translate("Logs"))
o.template = "v2raya/v2raya_log"
--[[o.rows = 50]]--
m.apply_on_parse = true
m.on_after_apply = function(self,map)
luci.sys.call("/etc/init.d/v2raya restart")
end
--[[
o.inputstyle = "reload"
luci.sys.exec("/etc/init.d/v2raya start >/dev/null 2>&1 &")
]]--
return m

View File

@ -1,6 +0,0 @@
m = Map("v2raya")
m.reset = false
m.submit = false
m:append(Template("v2raya/v2raya_log"))
return m

View File

@ -1,4 +0,0 @@
<%+cbi/valueheader%>
<input class="cbi-input-file" style="width: 240px" type="file" id="ulfile" name="ulfile" />
<input type="submit" class="btn cbi-button cbi-input-apply" name="upload" value="<%:Upload%>" />
<%+cbi/valuefooter%>

View File

@ -1,33 +0,0 @@
<%
local dsp = require "luci.dispatcher"
-%>
<script type="text/javascript">
//<![CDATA[
function clearlog(btn) {
XHR.get('<%=dsp.build_url("admin/services/v2raya/clear_log")%>', null,
function(x, data) {
if(x && x.status == 200) {
var log_textarea = document.getElementById('log_textarea');
log_textarea.innerHTML = "";
log_textarea.scrollTop = log_textarea.scrollHeight;
}
}
);
}
XHR.poll(2, '<%=dsp.build_url("admin/services/v2raya/get_log")%>', null,
function(x, data) {
if(x && x.status == 200 && document.getElementById("checkbox1").checked == true) {
var log_textarea = document.getElementById('log_textarea');
log_textarea.innerHTML = x.responseText;
log_textarea.scrollTop = log_textarea.scrollHeight;
}
}
);
//]]>
</script>
<fieldset class="cbi-section" id="_log_fieldset">
<input type="checkbox" id="checkbox1" style="vertical-align:middle;height: auto;"checked><%:自动刷新%></input>
<input class="btn cbi-button cbi-input-remove" type="button" onclick="clearlog()" value="<%:清除日志%>" />
<textarea id="log_textarea" class="cbi-input-textarea" style="width: 100%;margin-top: 10px;" data-update="change" rows="30" wrap="off" readonly="readonly"></textarea>
</fieldset>

View File

@ -1,28 +0,0 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(1, '<%=url([[admin]], [[services]], [[v2raya]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('v2raya_status');
if (data && tb) {
if (data.running) {
var links = '<em><b style=color:green> <%:v2rayA%> <%:RUNNING%></b></em><input class="btn cbi-button mar-10" type="button" value="<%:Open v2rayA page%>" onclick="openwebui();" />';
tb.innerHTML = links;
} else {
tb.innerHTML = '<em><b style=color:red> <%:v2rayA%> <%:NOT RUNNING%></b></em>';
}
}
}
);
function openwebui(){
var url = window.location.host+":<%=luci.sys.exec("uci -q get v2raya.config.address"):match(":[0-9]+"):gsub(":", "")%>";
window.open('http://'+url,'target','');
}
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="v2raya_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>

View File

@ -0,0 +1,207 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:155
msgid ""
"Additional v2ray config directory, files in it will be combined with config "
"generated by v2rayA."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:114
msgid "Auto"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:160
msgid "Automatically generate"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:158
msgid "Certpath for gRPC inbound"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:52
msgid "Checking %s..."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:92
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:35
msgid "Collecting data..."
msgstr ""
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:14
msgid "Configuration"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:107
msgid "Configuration directory"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:122
msgid "Debug"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:142
msgid "Disable log color output"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:146
msgid "Disable log timestamp"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:98
msgid "Enable"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:125
msgid "Error"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:151
msgid ""
"Executable v2ray binary path. Auto-detect if put it empty (recommended)."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:154
msgid "Extra config directory"
msgstr ""
#: applications/luci-app-v2raya/root/usr/share/rpcd/acl.d/luci-app-v2raya.json:3
msgid "Grant access to v2rayA configuration"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:112
msgid "IPv6 support"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:123
msgid "Info"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:102
msgid "Listening address"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:33
msgid "Loading..."
msgstr ""
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:22
msgid "Log"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:53
msgid "Log file does not exist."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:129
msgid "Log file path"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:44
msgid "Log is clean."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:120
msgid "Log level"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:113
msgid "Make sure your IPv6 network works fine before you turn it on."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:136
msgid "Max log retention period"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:137
msgid "Maximum number of days to keep log files."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:41
msgid "NOT RUNNING"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:116
msgid "Off"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:115
msgid "On"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:38
msgid "Open Web Interface"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:39
msgid "RUNNING"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:70
msgid "Refresh every %s seconds."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:159
msgid ""
"Specify the certification path instead of automatically generating a self-"
"signed certificate."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:55
msgid "The uploaded %s is empty."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:121
msgid "Trace"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:57
msgid "Unknown error: %s"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:163
msgid "Upload certificate"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:169
msgid "Upload privateKey"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:63
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:165
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:171
msgid "Upload..."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:124
msgid "Warn"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:59
msgid "Your %s was successfully uploaded. Size: %sB."
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:166
msgid "certificate"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:172
msgid "private key"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:150
msgid "v2ray binary path"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:39
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:41
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:78
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:3
msgid "v2rayA"
msgstr ""
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:79
msgid ""
"v2rayA is a V2Ray Linux client supporting global transparent proxy, "
"compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols."
msgstr ""

1
luci-app-v2raya/po/zh-cn Symbolic link
View File

@ -0,0 +1 @@
zh_Hans

View File

@ -1,117 +0,0 @@
msgid "Basic Setting"
msgstr "基本设置"
msgid "v2rayA Client"
msgstr "v2rayA 客户端"
msgid "v2rayA is a V2Ray Linux client supporting global transparent proxy, compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols."
msgstr "v2rayA 是一个支持全局透明代理的 V2Ray Linux 客户端,同时兼容 SS、SSR、Trojan(trojan-go)、PingTunnel 协议"
msgid "NOT RUNNING"
msgstr "未运行"
msgid "RUNNING"
msgstr "运行中"
msgid "Enabled"
msgstr "启用"
msgid "v2rayA Version"
msgstr "v2rayA 版本"
msgid "Open v2rayA page"
msgstr "打开 v2rayA 页面"
msgid "GUI access address"
msgstr "GUI访问地址"
msgid "Use 0.0.0.0:2017 to monitor all access."
msgstr "使用 0.0.0.0:2017 监听所有访问。"
msgid "v2rayA configuration directory"
msgstr "v2rayA 配置目录"
msgid "Ipv6 Support"
msgstr "IPv6 支持"
msgid "Make sure your IPv6 network works fine before you turn it on."
msgstr "在开启之前确保您的 IPv6 网络工作正常。"
msgid "AUTO"
msgstr "自动"
msgid "ON"
msgstr "开启"
msgid "OFF"
msgstr "关闭"
msgid "Log file"
msgstr "日志文件"
msgid "Log level"
msgstr "日志等级"
msgid "Trace"
msgstr "追踪"
msgid "Debug"
msgstr "调试"
msgid "Info"
msgstr "信息"
msgid "Warning"
msgstr "警告"
msgid "Error"
msgstr "错误"
msgid "Log Keepd Max Days"
msgstr "日志记录天数"
msgid "Maximum number of days to keep log files is 3 day."
msgstr "保留日志文件的最大天数为 3 天。"
msgid "Disable log color"
msgstr "禁用日志颜色"
msgid "Log disable timestamp"
msgstr "禁用日志时间戳"
msgid "v2ray binary path"
msgstr "v2ray 二进制路径"
msgid ""
"Executable v2ray binary path. Auto-detect if put it empty (recommended)."
msgstr "v2ray 可执行二进制文件目录。留空以自动检测(推荐)。"
msgid "Extra config directory"
msgstr "附加配置目录"
msgid ""
"Additional v2ray config directory, files in it will be combined with config "
"generated by v2rayA."
msgstr ""
"附加 v2ray 配置目录,包含在其中的文件将被合并至 v2rayA 生成的配置文件中。"
msgid "Upload certificate"
msgstr "上传证书"
msgid "Upload"
msgstr "上传"
msgid "Specify the certification path instead of automatically generating a self-signed certificate."
msgstr "指定证书路径而不是自动生成自签名证书。"
msgid "No specify upload file."
msgstr "没有上传证书"
msgid "Upload Certificate Path"
msgstr "上传的证书路径"
msgid "This is the path where the certificate resides after the certificate is uploaded."
msgstr "这里是上传证书后证书所在的路径。"
msgid "Logs"
msgstr "日志"

View File

@ -1 +0,0 @@
zh-cn

View File

@ -0,0 +1,217 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"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-Transfer-Encoding: 8bit\n"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:155
msgid ""
"Additional v2ray config directory, files in it will be combined with config "
"generated by v2rayA."
msgstr ""
"附加 v2ray 配置目录,包含在其中的文件将被合并至 v2rayA 生成的配置文件中。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:114
msgid "Auto"
msgstr "自动"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:160
msgid "Automatically generate"
msgstr "自动生成"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:158
msgid "Certpath for gRPC inbound"
msgstr "gPRC 入站证书目录"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:52
msgid "Checking %s..."
msgstr "检查%s中..."
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:92
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:35
msgid "Collecting data..."
msgstr "收集数据中..."
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:14
msgid "Configuration"
msgstr "配置"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:107
msgid "Configuration directory"
msgstr "配置文件目录"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:122
msgid "Debug"
msgstr "调试"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:142
msgid "Disable log color output"
msgstr "禁用日志彩色输出"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:146
msgid "Disable log timestamp"
msgstr "禁用日志时间戳"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:98
msgid "Enable"
msgstr "启用"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:125
msgid "Error"
msgstr "错误"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:151
msgid ""
"Executable v2ray binary path. Auto-detect if put it empty (recommended)."
msgstr "v2ray 可执行二进制文件目录。留空以自动检测(推荐)。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:154
msgid "Extra config directory"
msgstr "附加配置目录"
#: applications/luci-app-v2raya/root/usr/share/rpcd/acl.d/luci-app-v2raya.json:3
msgid "Grant access to v2rayA configuration"
msgstr "授予访问 v2rayA 配置的权限"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:112
msgid "IPv6 support"
msgstr "IPv6 支持"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:123
msgid "Info"
msgstr "信息"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:102
msgid "Listening address"
msgstr "监听地址"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:33
msgid "Loading..."
msgstr "加载中..."
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:22
msgid "Log"
msgstr "日志"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:53
msgid "Log file does not exist."
msgstr "日志文件不存在。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:129
msgid "Log file path"
msgstr "日志文件路径"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:44
msgid "Log is clean."
msgstr "日志为空。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:120
msgid "Log level"
msgstr "日志等级"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:113
msgid "Make sure your IPv6 network works fine before you turn it on."
msgstr "开启前,请确保您的 IPv6 网络工作正常。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:136
msgid "Max log retention period"
msgstr "最长日志保留时间"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:137
msgid "Maximum number of days to keep log files."
msgstr "保留日志文件的最长天数。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:41
msgid "NOT RUNNING"
msgstr "未运行"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:116
msgid "Off"
msgstr "关"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:115
msgid "On"
msgstr "开"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:38
msgid "Open Web Interface"
msgstr "打开 Web 界面"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:39
msgid "RUNNING"
msgstr "运行中"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:70
msgid "Refresh every %s seconds."
msgstr "每 %s 秒刷新。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:159
msgid ""
"Specify the certification path instead of automatically generating a self-"
"signed certificate."
msgstr "指定证书目录而不是自动生成自签证书。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:55
msgid "The uploaded %s is empty."
msgstr "上传的%s为空。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:121
msgid "Trace"
msgstr "跟踪"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/log.js:57
msgid "Unknown error: %s"
msgstr "未知错误:%s"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:163
msgid "Upload certificate"
msgstr "上传证书"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:169
msgid "Upload privateKey"
msgstr "上传私钥"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:63
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:165
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:171
msgid "Upload..."
msgstr "上传..."
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:124
msgid "Warn"
msgstr "警告"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:59
msgid "Your %s was successfully uploaded. Size: %sB."
msgstr "您的%s上传成功。大小%sB。"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:166
msgid "certificate"
msgstr "证书"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:172
msgid "private key"
msgstr "私钥"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:150
msgid "v2ray binary path"
msgstr "v2ray 二进制路径"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:39
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:41
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:78
#: applications/luci-app-v2raya/root/usr/share/rpcd/luci/menu.d/luci-app-v2raya.json:3
msgid "v2rayA"
msgstr "v2rayA"
#: applications/luci-app-v2raya/htdocs/luci-static/resources/view/v2raya/config.js:79
msgid ""
"v2rayA is a V2Ray Linux client supporting global transparent proxy, "
"compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols."
msgstr ""
"v2rayA 是一个易用而强大的,跨平台的 V2Ray 客户端,支持 SS、SSR、"
"Trojantrojan-go、PingTunnel 协议。"

View File

@ -1,11 +0,0 @@
#!/bin/sh
uci -q batch <<-EOF >/dev/null
delete ucitrack.@v2raya[-1]
add ucitrack v2raya
set ucitrack.@v2raya[-1].init=v2raya
commit ucitrack
EOF
rm -rf /tmp/luci-indexcache /tmp/luci-modulecache
exit 0

View File

@ -0,0 +1,29 @@
{
"admin/services/v2raya": {
"title": "v2rayA",
"order": 90,
"action": {
"type": "firstchild"
},
"depends": {
"acl": [ "luci-app-v2raya" ],
"uci": { "v2raya": true }
}
},
"admin/services/v2raya/config": {
"title": "Configuration",
"order": 10,
"action": {
"type": "view",
"path": "v2raya/config"
}
},
"admin/services/v2raya/log": {
"title": "Log",
"order": 20,
"action": {
"type": "view",
"path": "v2raya/log"
}
}
}

View File

@ -1,10 +1,24 @@
{
"luci-app-v2raya": {
"description": "Grant UCI access for luci-app-v2raya",
"description": "Grant access to v2rayA configuration",
"read": {
"file": {
"/bin/mkdir -p /etc/v2raya/": [ "exec" ],
"/var/log/v2raya/v2raya.log": [ "read" ]
},
"ubus": {
"service": [ "list" ]
},
"uci": [ "v2raya" ]
},
"write": {
"file": {
"/etc/v2raya/grpc_certificate.crt": [ "write" ],
"/etc/v2raya/grpc_private.key": [ "write" ]
},
"ubus": {
"luci": [ "setInitAction" ]
},
"uci": [ "v2raya" ]
}
}

View File

@ -9,10 +9,10 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=natflow
PKG_VERSION:=20220926
PKG_VERSION:=20220928
PKG_SOURCE_URL:=https://codeload.github.com/ptpt52/natflow/tar.gz/$(PKG_VERSION)?
PKG_HASH:=e96ac4d0b12970fc6e4b29a3dfeb689c2e19a1f50818dedeb3ff3f1f52574cb9
PKG_HASH:=e517ccb4c73b412ae6c5c08e0beab67c569eb561d5feccc22b22a4f4e0785cfd
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>