From 1de17a4886b66f98e3e668427d67f73026385789 Mon Sep 17 00:00:00 2001 From: Ycarus Date: Tue, 20 Feb 2018 13:49:33 +0100 Subject: [PATCH] Add haproxy and add pot for glorytun --- luci-app-glorytun/po/templates/glorytun.pot | 6 + .../po/zh-cn/haproxy-tcp.zh-cn.po | 35 +++ luci-app-haproxy-tcp/LICENSE | 21 ++ luci-app-haproxy-tcp/Makefile | 80 ++++++ luci-app-haproxy-tcp/README.md | 69 +++++ .../luasrc/controller/haproxy-tcp.lua | 7 + .../luasrc/model/cbi/haproxy-tcp.lua | 57 ++++ .../po/templates/haproxy-tcp.pot | 47 ++++ luci-app-haproxy-tcp/preview.png | Bin 0 -> 29939 bytes .../root/etc/config/haproxy-tcp | 9 + .../root/etc/init.d/haproxy-tcp | 110 ++++++++ .../root/etc/uci-defaults/luci-haproxy-tcp | 15 + .../po/templates/shadowsocks-libev.pot | 259 ++++++++++++++++++ openmptcprouter-full/Makefile | 2 +- 14 files changed, 716 insertions(+), 1 deletion(-) create mode 100644 luci-app-glorytun/po/zh-cn/haproxy-tcp.zh-cn.po create mode 100644 luci-app-haproxy-tcp/LICENSE create mode 100644 luci-app-haproxy-tcp/Makefile create mode 100644 luci-app-haproxy-tcp/README.md create mode 100644 luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua create mode 100644 luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua create mode 100644 luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot create mode 100644 luci-app-haproxy-tcp/preview.png create mode 100644 luci-app-haproxy-tcp/root/etc/config/haproxy-tcp create mode 100644 luci-app-haproxy-tcp/root/etc/init.d/haproxy-tcp create mode 100644 luci-app-haproxy-tcp/root/etc/uci-defaults/luci-haproxy-tcp create mode 100644 luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot diff --git a/luci-app-glorytun/po/templates/glorytun.pot b/luci-app-glorytun/po/templates/glorytun.pot index 095808f7e..9c862bb47 100644 --- a/luci-app-glorytun/po/templates/glorytun.pot +++ b/luci-app-glorytun/po/templates/glorytun.pot @@ -17,6 +17,9 @@ msgstr "" msgid "Bind port" msgstr "" +msgid "Enable" +msgstr "" + msgid "Enabled" msgstr "" @@ -80,6 +83,9 @@ msgstr "" msgid "The secret key" msgstr "" +msgid "Use ChaCha20 stream cipher" +msgstr "" + msgid "no" msgstr "" diff --git a/luci-app-glorytun/po/zh-cn/haproxy-tcp.zh-cn.po b/luci-app-glorytun/po/zh-cn/haproxy-tcp.zh-cn.po new file mode 100644 index 000000000..0c2d3eb2d --- /dev/null +++ b/luci-app-glorytun/po/zh-cn/haproxy-tcp.zh-cn.po @@ -0,0 +1,35 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8\n" + +msgid "%u seconds" +msgstr "%u 秒" + +msgid "Enable" +msgstr "启用" + +msgid "General Setting" +msgstr "基本设置" + +msgid "HAProxy-TCP" +msgstr "负载均衡-TCP" + +msgid "Listen Address:Port" +msgstr "服务地址" + +msgid "Retries" +msgstr "重试次数" + +msgid "Status Admin" +msgstr "状态管理" + +msgid "Startup Delay" +msgstr "自启动延时" + +msgid "Port" +msgstr "端口" + +msgid "Timeout Connect (ms)" +msgstr "连接超时 (毫秒)" + +msgid "UpStream Server" +msgstr "上游服务器" diff --git a/luci-app-haproxy-tcp/LICENSE b/luci-app-haproxy-tcp/LICENSE new file mode 100644 index 000000000..e09a55e37 --- /dev/null +++ b/luci-app-haproxy-tcp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 chenhw2 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/luci-app-haproxy-tcp/Makefile b/luci-app-haproxy-tcp/Makefile new file mode 100644 index 000000000..d4f09a47d --- /dev/null +++ b/luci-app-haproxy-tcp/Makefile @@ -0,0 +1,80 @@ +# +# Copyright (C) 2016 chenhw2 +# Copyright (C) 2018 Ycarus (Yannick Chabanois) +# +# See /LICENSE for more information. +# + +include $(TOPDIR)/rules.mk + +PKG_NAME:=luci-app-haproxy-tcp +PKG_VERSION:=0.1.4 +PKG_RELEASE:=1 + +PKG_LICENSE:=MIT +PKG_LICENSE_FILES:=LICENSE +PKG_MAINTAINER:=chenhw2 + +PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME) + +include ../luci/luci.mk + +define Package/luci-app-haproxy-tcp + SECTION:=luci + CATEGORY:=LuCI + SUBMENU:=3. Applications + TITLE:=LuCI Support for HAProxy-TCP + PKGARCH:=all + DEPENDS:=+haproxy-nossl +endef + +define Package/luci-app-haproxy-tcp/description + LuCI Support for HAProxy-TCP. +endef + +define Build/Configure +endef + +define Build/Compile +endef + +define Package/luci-app-haproxy-tcp/postinst +#!/bin/sh +if [ -z "$${IPKG_INSTROOT}" ]; then + if [ -f /etc/uci-defaults/luci-haproxy-tcp ]; then + ( . /etc/uci-defaults/luci-haproxy-tcp ) && \ + rm -f /etc/uci-defaults/luci-haproxy-tcp + fi + rm -rf /tmp/luci-indexcache /tmp/luci-modulecache +fi +exit 0 +endef + +define Package/luci-app-haproxy-tcp/prerm +#!/bin/sh +/etc/init.d/haproxy-tcp disable +/etc/init.d/haproxy-tcp stop +rm -f /usr/sbin/haproxy-tcp +exit 0 +endef + +define Package/luci-app-haproxy-tcp/conffiles +/etc/config/haproxy-tcp +endef + +define Package/luci-app-haproxy-tcp/install + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller + $(INSTALL_DATA) ./luasrc/controller/*.lua $(1)/usr/lib/lua/luci/controller/ + $(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi + $(INSTALL_DATA) ./luasrc/model/cbi/*.lua $(1)/usr/lib/lua/luci/model/cbi/ + $(INSTALL_DIR) $(1)/etc/config + $(INSTALL_DATA) ./root/etc/config/haproxy-tcp $(1)/etc/config/haproxy-tcp + $(INSTALL_DIR) $(1)/etc/init.d + $(INSTALL_BIN) ./root/etc/init.d/haproxy-tcp $(1)/etc/init.d/haproxy-tcp + $(INSTALL_DIR) $(1)/etc/uci-defaults + $(INSTALL_BIN) ./root/etc/uci-defaults/luci-haproxy-tcp $(1)/etc/uci-defaults/luci-haproxy-tcp + $(INSTALL_DIR) $(1)/usr/sbin + $(LN) haproxy $(1)/usr/sbin/haproxy-tcp +endef + +$(eval $(call BuildPackage,luci-app-haproxy-tcp)) diff --git a/luci-app-haproxy-tcp/README.md b/luci-app-haproxy-tcp/README.md new file mode 100644 index 000000000..a8bcfbdd8 --- /dev/null +++ b/luci-app-haproxy-tcp/README.md @@ -0,0 +1,69 @@ +OpenWrt/LEDE LuCI for HAProxy-TCP +=== + +简介 +--- + +本软件包是 HAProxy-TCP 的 LuCI 控制界面, + +软件包文件结构: +``` +/ +├── etc/ +│   ├── config/ +│   │   └── haproxy-tcp // UCI 配置文件 +│   │── init.d/ +│   │   └── haproxy-tcp // init 脚本 +│   └── uci-defaults/ +│      └── luci-haproxy-tcp // uci-defaults 脚本 +└── usr/ + └── lib/ + └── lua/ + └── luci/ // LuCI 部分 + ├── controller/ + │   └── haproxy-tcp.lua // LuCI 菜单配置 + ├── i18n/ // LuCI 语言文件目录 + │   └── haproxy-tcp.zh-cn.lmo + └── model/ + └── cbi/ + └── haproxy-tcp.lua // LuCI 基本设置 +``` + +依赖 +--- + +软件包的正常使用需要依赖 `haproxy` . + +预览 +--- +![preview](https://github.com/chenhw2/luci-app-haproxy-tcp/blob/master/preview.png) + +配置 +--- + +软件包的配置文件路径: `/etc/config/haproxy-tcp` +此文件为 UCI 配置文件, 配置方式可参考 [Wiki -> Use-UCI-system][Use-UCI-system] 和 [OpenWrt Wiki][uci] + +编译 +--- + +从 OpenWrt 的 [SDK][openwrt-sdk] 编译 +```bash +# 解压下载好的 SDK +tar xjf OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 +cd OpenWrt-SDK-ar71xx-* +# Clone 项目 +git clone https://github.com/chenhw2/luci-app-haproxy-tcp.git package/feeds/luci-app-haproxy-tcp +# 编译 po2lmo (如果有po2lmo可跳过) +pushd package/feeds/luci-app-haproxy-tcp/tools/po2lmo +make && sudo make install +popd +# 选择要编译的包 LuCI -> 3. Applications +make menuconfig +# 开始编译 +make package/feeds/luci-app-haproxy-tcp/compile V=s +``` + + [openwrt-sdk]: https://wiki.openwrt.org/doc/howto/obtain.firmware.sdk + [Use-UCI-system]: https://github.com/shadowsocks/luci-app-shadowsocks/wiki/Use-UCI-system + [uci]: https://wiki.openwrt.org/doc/uci diff --git a/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua new file mode 100644 index 000000000..bb8318887 --- /dev/null +++ b/luci-app-haproxy-tcp/luasrc/controller/haproxy-tcp.lua @@ -0,0 +1,7 @@ +module("luci.controller.haproxy-tcp", package.seeall) + +function index() + entry( + {"admin", "services", "haproxy-tcp"}, + cbi("haproxy-tcp"), _("HAProxy-TCP"), 55) +end diff --git a/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua b/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua new file mode 100644 index 000000000..37b1ad3cb --- /dev/null +++ b/luci-app-haproxy-tcp/luasrc/model/cbi/haproxy-tcp.lua @@ -0,0 +1,57 @@ +local m, s, o + +if luci.sys.call("pgrep haproxy-tcp >/dev/null") == 0 then + m = Map("haproxy-tcp", translate("HAProxy-TCP"), "%s - %s" %{translate("HAProxy-TCP"), translate("RUNNING")}) +else + m = Map("haproxy-tcp", translate("HAProxy-TCP"), "%s - %s" %{translate("HAProxy-TCP"), translate("NOT RUNNING")}) +end + +s = m:section(TypedSection, "general", translate("General Setting"), + "%s" %{ + luci.sys.exec("uci get network.lan.ipaddr | tr -d '\r\n'"), + luci.sys.exec("uci get haproxy-tcp.general.admin_stats | tr -d '\r\n'"), + translate("Status Admin") + }) +s.anonymous = true + +o = s:option(Flag, "enable", translate("Enable")) +o.rmempty = false + +o = s:option(Value, "startup_delay", translate("Startup Delay")) +o:value(0, translate("Not enabled")) +for _, v in ipairs({5, 10, 15, 25, 40}) do + o:value(v, translate("%u seconds") %{v}) +end +o.datatype = "uinteger" +o.default = 0 +o.rmempty = false + +o = s:option(Value, "admin_stats", "%s%s" %{translate("Status Admin"), translate("Port")}) +o.placeholder = "7777" +o.default = "7777" +o.datatype = "port" +o.rmempty = false + +o = s:option(Value, "listen", translate("Listen Address:Port")) +o.placeholder = "0.0.0.0:6666" +o.default = "0.0.0.0:6666" +o.rmempty = false + +o = s:option(Value, "timeout", translate("Timeout Connect (ms)")) +o.placeholder = "666" +o.default = "666" +o.datatype = "range(33, 10000)" +o.rmempty = false + +o = s:option(Value, "retries", translate("Retries")) +o.placeholder = "1" +o.default = "1" +o.datatype = "range(1, 10)" +o.rmempty = false + + +o = s:option(DynamicList, "upstreams", translate("UpStream Server"), translate("e.g. [123.123.123.123:65101 check]")) +o.placeholder = "123.123.123.123:65101" +o.rmempty = false + +return m diff --git a/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot b/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot new file mode 100644 index 000000000..a6d1e80eb --- /dev/null +++ b/luci-app-haproxy-tcp/po/templates/haproxy-tcp.pot @@ -0,0 +1,47 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "%u seconds" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "General Setting" +msgstr "" + +msgid "HAProxy-TCP" +msgstr "" + +msgid "Listen Address:Port" +msgstr "" + +msgid "NOT RUNNING" +msgstr "" + +msgid "Not enabled" +msgstr "" + +msgid "Port" +msgstr "" + +msgid "RUNNING" +msgstr "" + +msgid "Retries" +msgstr "" + +msgid "Startup Delay" +msgstr "" + +msgid "Status Admin" +msgstr "" + +msgid "Timeout Connect (ms)" +msgstr "" + +msgid "UpStream Server" +msgstr "" + +msgid "e.g. [123.123.123.123:65101 check]" +msgstr "" diff --git a/luci-app-haproxy-tcp/preview.png b/luci-app-haproxy-tcp/preview.png new file mode 100644 index 0000000000000000000000000000000000000000..800d928d09dc850d06b853c86e02a3ab8c8f10f5 GIT binary patch literal 29939 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 literal 0 HcmV?d00001 diff --git a/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp b/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp new file mode 100644 index 000000000..e212c0f15 --- /dev/null +++ b/luci-app-haproxy-tcp/root/etc/config/haproxy-tcp @@ -0,0 +1,9 @@ + +config general 'general' + option enable '0' + option retries '1' + option timeout '1000' + option listen '0.0.0.0:65101' + option admin_stats '7777' + option startup_delay '5' + list upstreams '1.2.3.4:65101' diff --git a/luci-app-haproxy-tcp/root/etc/init.d/haproxy-tcp b/luci-app-haproxy-tcp/root/etc/init.d/haproxy-tcp new file mode 100644 index 000000000..cfa838bb3 --- /dev/null +++ b/luci-app-haproxy-tcp/root/etc/init.d/haproxy-tcp @@ -0,0 +1,110 @@ +#!/bin/sh /etc/rc.common +# Copyright (C) 2016 chenhw2 +# Copyright (C) 2018 Ycarus (Yannick Chabanois) + +START=85 + +USE_PROCD=1 +PROG_NAME=haproxy-tcp +PROG=/usr/sbin/${PROG_NAME} + +PIDCOUNT=0 + +_log() { + logger -p daemon.info -t ${PROG_NAME} "$@" +} + +_err() { + logger -p daemon.err -t ${PROG_NAME} "$@" +} + +validate_section() { + uci_validate_section haproxy-tcp general "${1}" \ + 'enable:bool:0' \ + 'retries:uinteger:1' \ + 'timeout:uinteger:1000' \ + 'startup_delay:uinteger:5' \ + 'admin_stats:port:7777' \ + 'listen:string' \ + 'upstreams:list(string)' +} + +genline_srv(){ + line="$1" + hash="$(echo -n $line | md5sum | cut -c1-6)" + hash="$(echo -n $line | tr -d '\t ' | cut -c1-8)__$hash" + echo " server $hash $line" | tr -d "\'" +} + +boot() { + local delay=$(uci -q get $NAME.general.startup_delay) + (sleep ${delay:-0} && start >/dev/null 2>&1) & + return 0 +} + +start_instance() { + local enable retries timeout admin_stats startup_delay listen upstreams + + validate_section "${1}" || { + _err "validation failed" + return 1 + } + + [ "$enable" = 1 ] || return 1 + + PIDCOUNT="$(( ${PIDCOUNT} + 1))" + + mkdir -p /var/etc + cat <<-EOF > /var/etc/$PROG_NAME.cfg + global + nbproc $(grep -c '^processor' /proc/cpuinfo | tr -d "\n") + + defaults + mode tcp + retries ${retries:-2} + timeout connect ${timeout:-1000} + + listen admin_stats + bind 0.0.0.0:${admin_stats:-7777} + mode http + stats uri / + stats refresh 10s + + frontend tcp-in + bind ${listen:-0.0.0.0:6666} + default_backend tcp-out + + backend tcp-out + $( if [ 0 -lt $(grep -c weight /etc/config/$PROG_NAME) ]; then + echo " balance static-rr" + sed -n 's/.*upstreams[\t ]*//p' /etc/config/$PROG_NAME | + while read upstream; do + genline_srv "$upstream" + done + else + config_list_foreach "${1}" "upstreams" genline_srv + fi + ) + +EOF + + procd_open_instance + procd_set_param command ${PROG} \ + -q -D -f /var/etc/$PROG_NAME.cfg \ + -p /var/run/${PROG}.${PIDCOUNT}.pid + + procd_set_param respawn 0 30 0 + procd_set_param stdout 1 + procd_set_param stderr 1 + + procd_close_instance +} + +start_service() { + config_load haproxy-tcp + config_foreach start_instance general +} + +service_triggers() { + procd_add_reload_trigger haproxy-tcp general +} diff --git a/luci-app-haproxy-tcp/root/etc/uci-defaults/luci-haproxy-tcp b/luci-app-haproxy-tcp/root/etc/uci-defaults/luci-haproxy-tcp new file mode 100644 index 000000000..a8923938c --- /dev/null +++ b/luci-app-haproxy-tcp/root/etc/uci-defaults/luci-haproxy-tcp @@ -0,0 +1,15 @@ +#!/bin/sh + +uci -q batch <<-EOF >/dev/null + delete ucitrack.@haproxy-tcp[-1] + add ucitrack haproxy-tcp + set ucitrack.@haproxy-tcp[-1].init=haproxy-tcp + commit ucitrack +EOF + +/etc/init.d/haproxy stop +/etc/init.d/haproxy disable + +/etc/init.d/haproxy-tcp enable + +exit 0 diff --git a/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot b/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot new file mode 100644 index 000000000..a0063edc2 --- /dev/null +++ b/luci-app-shadowsocks-libev/po/templates/shadowsocks-libev.pot @@ -0,0 +1,259 @@ +msgid "" +msgstr "Content-Type: text/plain; charset=UTF-8" + +msgid "" +msgstr "" + +msgid "Add" +msgstr "" + +msgid "Advanced Settings" +msgstr "" + +msgid "Bind address" +msgstr "" + +msgid "Bypass ss-redir for packets with dst address in this list" +msgstr "" + +msgid "Bypass ss-redir for packets with src address in this list" +msgstr "" + +msgid "" +"Continue to have dst address checked for packets with src address in this " +"list" +msgstr "" + +msgid "Default action for locally generated TCP packets" +msgstr "" + +msgid "" +"Default action for packets whose dst address do not match any of the dst ip " +"list" +msgstr "" + +msgid "" +"Default action for packets whose src address do not match any of the src ip/" +"net list" +msgstr "" + +msgid "" +"Definition of remote shadowsocks servers. Disable any of them will also " +"disable instances refering to it." +msgstr "" + +msgid "Destination Settings" +msgstr "" + +msgid "Disable" +msgstr "" + +msgid "Disabled" +msgstr "" + +msgid "Dst default" +msgstr "" + +msgid "Dst ip/net bypass" +msgstr "" + +msgid "Dst ip/net bypass file" +msgstr "" + +msgid "Dst ip/net forward" +msgstr "" + +msgid "Dst ip/net forward file" +msgstr "" + +msgid "Enable" +msgstr "" + +msgid "Enable MPTCP" +msgstr "" + +msgid "Enable SO_REUSEPORT" +msgstr "" + +msgid "Enable TCP Fast Open" +msgstr "" + +msgid "Enable TCP_NODELAY" +msgstr "" + +msgid "Enable/Disable" +msgstr "" + +msgid "Enabled" +msgstr "" + +msgid "Extra arguments" +msgstr "" + +msgid "" +"File containing ip/net for the purposes as with Dst ip/net bypass" +msgstr "" + +msgid "" +"File containing ip/net for the purposes as with Dst ip/net forward" +msgstr "" + +msgid "Forward recentrst" +msgstr "" + +msgid "" +"Forward those packets whose dst have recently sent to us multiple tcp-rst" +msgstr "" + +msgid "Forward through ss-redir for packets with dst address in this list" +msgstr "" + +msgid "Forward through ss-redir for packets with src address in this list" +msgstr "" + +msgid "General Settings" +msgstr "" + +msgid "HTTP path uri" +msgstr "" + +msgid "Host" +msgstr "" + +msgid "IPv6 First" +msgstr "" + +msgid "Ingress interfaces" +msgstr "" + +msgid "Install package %q" +msgstr "" + +msgid "Install package iptables-mod-conntrack-extra" +msgstr "" + +msgid "" +"Instances of shadowsocks-libev components, e.g. ss-local, ss-redir, ss-" +"tunnel, ss-server, etc. To enable an instance it is required to enable both " +"the instance itself and the remote server it refers to." +msgstr "" + +msgid "Key (base64 encoding)" +msgstr "" + +msgid "Local Instances" +msgstr "" + +msgid "Local address" +msgstr "" + +msgid "Local port" +msgstr "" + +msgid "Local-out default" +msgstr "" + +msgid "MTU" +msgstr "" + +msgid "Method" +msgstr "" + +msgid "Mode of operation" +msgstr "" + +msgid "Name" +msgstr "" + +msgid "Obfuscating" +msgstr "" + +msgid "" +"On this page you can configure how traffics are to be forwarded to ss-redir " +"instances. If enabled, packets will first have their src ip addresses " +"checked against Src ip/net bypass, Src ip/net forward, " +"Src ip/net checkdst and if none matches Src default will " +"give the default action to be taken. If the prior check results in action " +"checkdst, packets will continue to have their dst addresses checked." +msgstr "" + +msgid "Only apply rules on packets from these network interfaces" +msgstr "" + +msgid "Overview" +msgstr "" + +msgid "Package is not installed" +msgstr "" + +msgid "Passes additional arguments to iptables. Use with care!" +msgstr "" + +msgid "Password" +msgstr "" + +msgid "Prefer IPv6 addresses when resolving names" +msgstr "" + +msgid "Redir Rules" +msgstr "" + +msgid "Remote Servers" +msgstr "" + +msgid "Remote server" +msgstr "" + +msgid "Run as" +msgstr "" + +msgid "Running" +msgstr "" + +msgid "Server" +msgstr "" + +msgid "Server port" +msgstr "" + +msgid "Shadowsocks-libev" +msgstr "" + +msgid "Source Settings" +msgstr "" + +msgid "Src default" +msgstr "" + +msgid "Src ip/net bypass" +msgstr "" + +msgid "Src ip/net checkdst" +msgstr "" + +msgid "Src ip/net forward" +msgstr "" + +msgid "The address ss-server will initiate connection from" +msgstr "" + +msgid "The address ss-tunnel will forward traffic to" +msgstr "" + +msgid "Timeout (sec)" +msgstr "" + +msgid "Tunnel address" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "Verbose" +msgstr "" + +msgid "ss-redir for TCP" +msgstr "" + +msgid "ss-redir for UDP" +msgstr "" diff --git a/openmptcprouter-full/Makefile b/openmptcprouter-full/Makefile index 625ddb9ee..7a8db8b5f 100644 --- a/openmptcprouter-full/Makefile +++ b/openmptcprouter-full/Makefile @@ -37,7 +37,7 @@ MY_DEPENDS := \ luci-i18n-base-fr \ luci-i18n-firewall-en \ luci-i18n-firewall-fr \ - luci-mod-admin-full luci-app-firewall luci-app-glorytun luci-app-shadowsocks-libev luci-app-unbound luci-theme-openmptcprouter luci-base + luci-mod-admin-full luci-app-firewall luci-app-glorytun luci-app-shadowsocks-libev luci-app-unbound luci-theme-openmptcprouter luci-base luci-app-haproxy-tcp define Package/$(PKG_NAME)