Merge Mainline

This commit is contained in:
AmadeusGhost 2020-06-16 18:20:13 +08:00
commit a006bbea67
64 changed files with 661 additions and 383 deletions

View File

@ -6,14 +6,14 @@ ifdef CONFIG_TESTING_KERNEL
KERNEL_PATCHVER:=$(KERNEL_TESTING_PATCHVER)
endif
LINUX_VERSION-4.9 = .226
LINUX_VERSION-4.14 = .183
LINUX_VERSION-4.19 = .126
LINUX_VERSION-4.9 = .227
LINUX_VERSION-4.14 = .184
LINUX_VERSION-4.19 = .128
LINUX_VERSION-5.4 = .45
LINUX_KERNEL_HASH-4.9.226 = 460a8c168fe5c60ce5b30015a4e4bf348d93a89f8b949de1f90779567ef345ca
LINUX_KERNEL_HASH-4.14.183 = 4265afef56819b04656107a5abecde205c5bc5fb04b2e81447955e7e45db8085
LINUX_KERNEL_HASH-4.19.126 = 6e2a7e0adbe31e39cc8f1a3bd7bfa0d92ec0a4ca5360bb25829db831378f3f89
LINUX_KERNEL_HASH-4.9.227 = 38c485b411a14e825f8a66a5c2e64f1480397325a5f692b4929f68d228070c5f
LINUX_KERNEL_HASH-4.14.184 = 2ff51e278fb3dab918f5014f7966bdfd839b108bc6644d9f9b559d169801d940
LINUX_KERNEL_HASH-4.19.128 = 29aba6849c972c0079ddee4aaf476a500ef52d937c7ba02ceec4c7cf4753613c
LINUX_KERNEL_HASH-5.4.45 = 103f039f34a9009c42ea643b4f473bda6bb9607d5ad7f63b56b3e2351615fe2e
remove_uri_prefix=$(subst git://,,$(subst http://,,$(subst https://,,$(1))))

View File

@ -10,10 +10,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=rclone-ng
PKG_VERSION:=0.2.4
PKG_VERSION:=0.3.2
PKG_RELEASE:=1
PKG_LICENSE:=GPLv3
PKG_MAINTAINER:=ElonH <elonhhuang@gmail.com>
@ -22,7 +21,7 @@ include $(INCLUDE_DIR)/package.mk
PKG_SOURCE:=RcloneNg-v$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/ElonH/RcloneNg/releases/download/v$(PKG_VERSION)/
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_HASH:=3090a713253b17bfbb4d6a69b4b55b81d69e1768cf56d3abca8631e4a35f270b
PKG_HASH:=441fdfa577bdda7f58f62f6e75174a4a48e44d7c1361f7123d9699d791c08b5a
define Package/$(PKG_NAME)
SECTION:=net

View File

@ -10,16 +10,16 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=rclone
PKG_VERSION:=1.51.0
PKG_VERSION:=1.52.1
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/rclone/rclone.git
PKG_SOURCE_DATE:=2020-02-01
PKG_SOURCE_VERSION:=43daecd89b21292b112051340317927b42ccbdd3
PKG_SOURCE_DATE:=2020-06-10
PKG_SOURCE_VERSION:=31dc78905ea8dfb22c43724527b19e097e05c26a
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MIRROR_HASH:=aca159c81971a9490a6a6c323b67879dccba3860955b66787d91590f4ba8ba29
PKG_MIRROR_HASH:=fa79f62babc2f42691c9ad83ef906e90061d4ca6adcc97150c2906605312db66
PKG_LICENSE:=GPLv3
PKG_MAINTAINER:=ElonH <elonhhuang@gmail.com>

View File

@ -1,44 +0,0 @@
##
# File: /patches/020-Notice-Access-Control-Allow-Origin-only-once.patch
# Project: rclone
# File Created: Sunday, 3rd May 2020 1:44:22 pm
# Author: ElonH[EH](elonhhuang@gmail.com)
# License: GNU General Public License v3.0 or later(http://www.gnu.org/licenses/gpl-3.0-standalone.html)
# Copyright (C) 2020 [ElonH]
##
diff --git a/fs/rc/rcserver/rcserver.go b/fs/rc/rcserver/rcserver.go
index 4a2b5c71e..f00994e93 100644
--- a/fs/rc/rcserver/rcserver.go
+++ b/fs/rc/rcserver/rcserver.go
@@ -14,6 +14,7 @@ import (
"regexp"
"sort"
"strings"
+ "sync"
"github.com/pkg/errors"
"github.com/rclone/rclone/cmd/serve/httplib"
@@ -29,6 +30,8 @@ import (
"github.com/skratchdot/open-golang/open"
)
+var onlyOnce sync.Once
+
// Start the remote control server if configured
//
// If the server wasn't configured the *Server returned may be nil
@@ -172,9 +175,11 @@ func (s *Server) handler(w http.ResponseWriter, r *http.Request) {
allowOrigin := rcflags.Opt.AccessControlAllowOrigin
if allowOrigin != "" {
- if allowOrigin == "*" {
- fs.Logf(nil, "Warning: Allow origin set to *. This can cause serious security problems.")
- }
+ onlyOnce.Do(func() {
+ if allowOrigin == "*" {
+ fs.Logf(nil, "Warning: Allow origin set to *. This can cause serious security problems.")
+ }
+ })
w.Header().Add("Access-Control-Allow-Origin", allowOrigin)
} else {
w.Header().Add("Access-Control-Allow-Origin", s.URL())

View File

@ -2,7 +2,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=UnblockNeteaseMusic-Go
PKG_VERSION:=0.2.0
PKG_RELEASE:=1
PKG_RELEASE:=3
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/cnsilvan/UnblockNeteaseMusic.git
@ -44,7 +44,7 @@ define Build/Prepare
endef
define Build/Configure
patch -p1 -d $(BUILD_DIR)/$(PKG_NAME) <./patches/01-fix-endpoint.patch
endef
define Build/Compile

View File

@ -0,0 +1,13 @@
diff --git a/processor/processor.go b/processor/processor.go
index a35f8df..a7e3015 100644
--- a/processor/processor.go
+++ b/processor/processor.go
@@ -393,7 +393,7 @@
//data["url"] = uri.Scheme + "://" + uri.Host + uri.EscapedPath()
//data["url"] = uri.String()
if *config.EndPoint {
- data["url"] = "http://music.163.com/unblockmusic/" + uri.String()
+ data["url"] = "https://music.163.com/unblockmusic/" + uri.String()
} else {
data["url"] = uri.String()
}

View File

@ -9,13 +9,13 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=UnblockNeteaseMusic
PKG_VERSION:=0.25.3
PKG_RELEASE:=4
PKG_RELEASE:=5
PKG_LICENSE:=MIT
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/nondanee/UnblockNeteaseMusic.git
PKG_SOURCE_VERSION:=610ff1716aa3698cd2e9391ff808a35a05719586
PKG_SOURCE_VERSION:=1193e29a2c8f72c738d2988d5cf5afbb2fee7463
PKG_SOURCE_SUBDIR:=$(PKG_NAME)
PKG_SOURCE:=$(PKG_SOURCE_SUBDIR)-$(PKG_VERSION).tar.gz

View File

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=default-settings
PKG_VERSION:=1.1
PKG_RELEASE:=59
PKG_RELEASE:=60
PKG_LICENSE:=GPLv3
PKG_LICENSE_FILES:=LICENSE

View File

@ -5,19 +5,19 @@ msgid "Architecture"
msgstr "架构"
msgid "CPU Temperature"
msgstr "CPU温度"
msgstr "CPU 温度"
msgid "CPU Info"
msgstr "CPU信息"
msgstr "CPU 信息"
msgid "CPU Model"
msgstr "处理器型号"
msgid "CPU frequency"
msgstr "CPU频率"
msgstr "CPU 频率"
msgid "RAM frequency"
msgstr "RAM频率"
msgstr "RAM 频率"
msgid "Flash Size"
msgstr "闪存大小"
@ -44,7 +44,7 @@ msgid "ZRam Size"
msgstr "ZRam 大小"
msgid "Size of the ZRam device in megabytes"
msgstr "划分给ZRam 分区的内存大小MB推荐留空由系统自动管理"
msgstr "划分给 ZRam 分区的内存大小MB推荐留空由系统自动管理"
msgid "Number of parallel threads used for compression"
msgstr "用于压缩内存数据的CPU并发线程数"
@ -59,15 +59,15 @@ msgid "Log"
msgstr "日志"
msgid "Force 40MHz mode"
msgstr "强制40MHz频宽"
msgstr "强制 40MHz 频宽"
msgid ""
"Always use 40MHz channels even if the secondary channel overlaps. Using this "
"option does not comply with IEEE 802.11n-2009!"
msgstr "强制启用40MHz频宽并忽略辅助信道重叠。此选项可能不兼容某些无线硬件导致无法启用!"
msgstr "强制启用 40MHz 频宽并忽略辅助信道重叠。此选项可能不兼容某些无线硬件导致无法启用!"
msgid "Disassociate On Low Acknowledgement"
msgstr "弱信号剔除"
msgid "Allow AP mode to disconnect STAs based on low ACK condition"
msgstr "允许AP模式基于低ACK条件判断剔除弱信号的客户端"
msgstr "允许 AP 模式基于低 ACK 条件判断剔除弱信号的客户端"

View File

@ -105,6 +105,27 @@ e:depends("type","http")
e = t:taboption("other",Value, "host_header_rewrite", translate("Host Header"), translate("The Host header will be rewritten to match the hostname portion of the forwarding address."))
e.default = "dev.yourdomain.com"
e:depends("enable_host_header_rewrite",1)
e=t:taboption("other",Flag,"enable_https_plugin",translate("Use Plugin"))
e.default="0"
e:depends("type","https")
e=t:taboption("other",ListValue,"https_plugin",translate("Choose Plugin"),translate("If plugin is defined, local_ip and local_port is useless, plugin will handle connections got from frps."))
e:value("https2http",translate("https2http"))
e:depends("enable_https_plugin",1)
e=t:taboption("other",Value,"plugin_local_addr",translate("Plugin_Local_Addr"))
e.default="127.0.0.1:80"
e:depends("https_plugin","https2http")
e=t:taboption("other",Value,"plugin_crt_path",translate("plugin_crt_path"))
e.default="./server.crt"
e:depends("https_plugin","https2http")
e=t:taboption("other",Value,"plugin_key_path",translate("plugin_key_path"))
e.default="./server.key"
e:depends("https_plugin","https2http")
e=t:taboption("other",Value,"plugin_host_header_rewrite",translate("plugin_host_header_rewrite"))
e.default="127.0.0.1"
e:depends("https_plugin","https2http")
e=t:taboption("other",Value,"plugin_header_X_From_Where",translate("plugin_header_X-From-Where"))
e.default="frp"
e:depends("https_plugin","https2http")
e = t:taboption("base",ListValue, "proxy_protocol_version", translate("Proxy-Protocol Version"), translate("Proxy Protocol to send user's real IP to local services."))
e.default = "disable"
e:value("disable",translate("Disable"))

View File

@ -253,3 +253,18 @@ msgstr "STCP服务器别名"
msgid "<font color=\"red\">Please ensure the remark name is unique.</font>"
msgstr "<font color=\"red\">确保备注名唯一</font>"
msgid "Plugin_Local_Addr"
msgstr "插件本地地址(格式 IP:Port"
msgid "plugin_crt_path"
msgstr "插件证书路径"
msgid "plugin_key_path"
msgstr "插件私钥路径"
msgid "plugin_host_header_rewrite"
msgstr "插件 Host Header 重写"
msgid "plugin_header_X-From-Where"
msgstr "插件X-From-Where请求头"

View File

@ -32,10 +32,11 @@ conf_proxy_add() {
local enable type domain_type custom_domains remote_port local_ip local_port enable_http_auth enable_host_header_rewrite host_header_rewrite
local subdomain proxy_protocol_version use_encryption use_compression http_user http_pwd remark locations
local enable_plugin plugin plugin_http_user plugin_http_passwd plugin_unix_path stcp_role stcp_secretkey stcp_servername
local enable_https_plugin https_plugin plugin_local_addr plugin_crt_path plugin_key_path plugin_host_header_rewrite plugin_header_X_From_Where
config_get_bool enable "$cfg" enable 1
[ "$enable" -gt 0 ] || return 1
config_get type "$cfg" type
config_get custom_domains "$cfg" custom_domains
config_get subdomain "$cfg" subdomain
@ -55,10 +56,16 @@ conf_proxy_add() {
config_get stcp_secretkey "$cfg" stcp_secretkey
config_get stcp_servername "$cfg" stcp_servername
config_get proxy_protocol_version "$cfg" proxy_protocol_version
config_get https_plugin "$cfg" https_plugin
config_get plugin_local_addr "$cfg" plugin_local_addr
config_get plugin_crt_path "$cfg" plugin_crt_path
config_get plugin_key_path "$cfg" plugin_key_path
config_get plugin_host_header_rewrite "$cfg" plugin_host_header_rewrite
config_get plugin_header_X_From_Where "$cfg" plugin_header_X_From_Where
[ -n "$remark" ] && [ -n "$type" ] || return 1
echo "" >>$tmpconf
echo "[$remark]" >>$tmpconf
echo "type=$type" >>$tmpconf
@ -79,7 +86,7 @@ conf_proxy_add() {
echo "plugin_http_passwd=$plugin_http_passwd" >>$tmpconf
}
[ -n "$plugin_unix_path" ] && echo "plugin_unix_path=$plugin_unix_path" >>$tmpconf
[ -n "$stcp_role" ] && {
if [ "$stcp_role" == "visitor" ]; then
echo "role=$stcp_role" >>$tmpconf
@ -92,13 +99,22 @@ conf_proxy_add() {
fi
[ -n "$stcp_secretkey" ] && echo "sk=$stcp_secretkey" >>$tmpconf || return 1
}
[ -n "$proxy_protocol_version" ] && {
if [ "$proxy_protocol_version" != "disable" ]; then
echo "proxy_protocol_version=$proxy_protocol_version" >>$tmpconf
fi
}
[ -n "$https_plugin" ] && echo "plugin=$https_plugin" >>$tmpconf
[ -n "$plugin_local_addr" ] && echo "plugin_local_addr=$plugin_local_addr" >>$tmpconf
[ -n "$plugin_crt_path" -a -n "$plugin_key_path" ] && {
echo "plugin_crt_path=$plugin_crt_path" >>$tmpconf
echo "plugin_key_path=$plugin_key_path" >>$tmpconf
}
[ -n "$plugin_host_header_rewrite" ] && echo "plugin_host_header_rewrite=$plugin_host_header_rewrite" >>$tmpconf
[ -n "$plugin_header_X_From_Where" ] && echo "plugin_header_X_From_Where=$plugin_header_X_From_Where" >>$tmpconf
frp_write_bool use_encryption $cfg 1
frp_write_bool use_compression $cfg 1
@ -121,15 +137,15 @@ frp_write_bool() {
frp_add_cru(){
time=$1
if [ ! -f "/etc/crontabs/root" ] || [ -z "$(cat /etc/crontabs/root | grep frp)" ]; then
sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
echo "*/$time * * * * /etc/init.d/frp restart" >> /etc/crontabs/root
sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
echo "*/$time * * * * /etc/init.d/frp restart" >> /etc/crontabs/root
fi
}
frp_del_cru(){
if [ ! -f "/etc/crontabs/root" ] || [ -n "$(cat /etc/crontabs/root | grep frp)" ]; then
sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
sed -i '/frp/d' /etc/crontabs/root >/dev/null 2>&1
fi
}
@ -155,7 +171,7 @@ boot() {
start() {
config_load "frp"
local enabled server_addr server_port time privilege_token tcp_mux enable_cpool
local enabled server_addr server_port time privilege_token tcp_mux enable_cpool
local pool_count log_level log_max_days login_fail_exit http_proxy protocol
config_get_bool enabled common enabled 1
@ -175,10 +191,10 @@ start() {
mkdir -p /var/etc/frp
[ ! -f "$LOGFILE" ] && touch $LOGFILE
[ ! -f "/usr/bin/frpc" ] && download_binary
[ ! -f "/usr/bin/frpc" ] && logger -t Frp 'Download frpc failed, please retry.' && exit 0
local tmpconf="/var/etc/frp/frpc.conf"
echo "[common]" >$tmpconf

View File

@ -6,10 +6,10 @@
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI support for KodExplorer
LUCI_DEPENDS:=+nginx +zoneinfo-asia +php7 +php7-fpm +php7-mod-curl +php7-mod-gd +php7-mod-iconv +php7-mod-json +php7-mod-mbstring +php7-mod-opcache +php7-mod-session +php7-mod-zip
LUCI_DEPENDS:=+nginx +zoneinfo-asia +php7 +php7-fpm +php7-mod-curl +php7-mod-gd +php7-mod-iconv +php7-mod-json +php7-mod-mbstring +php7-mod-opcache +php7-mod-session +php7-mod-zip +php7-mod-sqlite3 +php7-mod-pdo +php7-mod-pdo-sqlite +php7-mod-pdo-mysql
LUCI_PKGARCH:=all
PKG_VERSION:=1.1
PKG_RELEASE:=20200210
PKG_VERSION:=13
PKG_DATE:=20200612
include $(TOPDIR)/feeds/luci/luci.mk

View File

@ -8,15 +8,11 @@ function index()
if not nixio.fs.access("/etc/config/kodexplorer") then return end
entry({"admin", "nas"}, firstchild(), "NAS", 44).dependent = false
entry({"admin", "nas", "kodexplorer"}, cbi("kodexplorer/settings"),
_("KodExplorer"), 3).dependent = true
entry({"admin", "nas", "kodexplorer"}, cbi("kodexplorer/settings"), _("KodExplorer"), 3).dependent = true
entry({"admin", "nas", "kodexplorer", "check"}, call("action_check")).leaf =
true
entry({"admin", "nas", "kodexplorer", "download"}, call("action_download")).leaf =
true
entry({"admin", "nas", "kodexplorer", "status"}, call("act_status")).leaf =
true
entry({"admin", "nas", "kodexplorer", "check"}, call("action_check")).leaf = true
entry({"admin", "nas", "kodexplorer", "download"}, call("action_download")).leaf = true
entry({"admin", "nas", "kodexplorer", "status"}, call("act_status")).leaf = true
end
local function http_write_json(content)
@ -26,12 +22,8 @@ end
function act_status()
local e = {}
e.nginx_status = luci.sys.call(
"ps -w | grep nginx | grep kodexplorer | grep -v grep > /dev/null") ==
0
e.php_status = luci.sys.call(
"ps -w | grep php | grep kodexplorer | grep -v grep > /dev/null") ==
0
e.nginx_status = luci.sys.call("ps -w | grep nginx | grep kodexplorer | grep -v grep > /dev/null") == 0
e.php_status = luci.sys.call("ps -w | grep php | grep kodexplorer | grep -v grep > /dev/null") == 0
http_write_json(e)
end

View File

@ -7,26 +7,12 @@ local i18n = require "luci.i18n"
module("luci.model.cbi.kodexplorer.api", package.seeall)
local appname = "kodexplorer"
local api_url =
"https://api.github.com/repos/kalcaddle/KodExplorer/releases/latest"
local download_url = "https://github.com/kalcaddle/KodExplorer/archive/"
local api_url = "https://api.kodcloud.com/?app/version"
local wget = "/usr/bin/wget"
local wget_args = {
"--no-check-certificate", "--quiet", "--timeout=10", "--tries=2"
}
local wget_args = { "--no-check-certificate", "--quiet", "--timeout=10", "--tries=2" }
local command_timeout = 300
function uci_get_type(type, config, default)
value = uci:get(appname, "@" .. type .. "[0]", config) or sys.exec(
"echo -n `uci -q get " .. appname .. ".@" .. type .. "[0]." ..
config .. "`")
if (value == nil or value == "") and (default and default ~= "") then
value = default
end
return value
end
local function _unpack(t, i)
i = i or 1
if t[i] ~= nil then return t[i], _unpack(t, i + 1) end
@ -77,6 +63,15 @@ local function exec(cmd, args, writer, timeout)
end
end
function get_project_directory()
return uci:get(appname, "@global[0]", "project_directory") or "/tmp/kodcloud"
end
function get_version()
local version = get_project_directory() .. "/config/version.php"
return sys.exec(string.format("echo -n $(cat %s 2>/dev/null | grep \"'KOD_VERSION'\" | cut -d \"'\" -f 4)", version))
end
local function compare_versions(ver1, comp, ver2)
local table = table
@ -108,42 +103,16 @@ local function get_api_json(url)
-- function(chunk) output[#output + 1] = chunk end)
-- local json_content = util.trim(table.concat(output))
local json_content = luci.sys.exec("wget-ssl -q --no-check-certificate -O- " .. url)
local json_content = sys.exec(wget .. " --no-check-certificate --timeout=10 -t 1 -O- " .. url)
if json_content == "" then return {} end
return jsonc.parse(json_content) or {}
end
function get_project_directory()
return uci_get_type("global", "project_directory", "/tmp/kodexplorer")
end
function to_check()
local json = get_api_json(api_url)
if json.tag_name == nil then
return {
code = 1,
error = i18n.translate("Get remote version info failed.")
}
end
local remote_version = json.tag_name
local html_url = json.html_url
download_url = download_url .. json.tag_name .. ".tar.gz"
if not download_url then
return {
code = 1,
version = remote_version,
html_url = html_url,
error = i18n.translate(
"New version found, but failed to get new version download url.")
}
end
return {
code = 0,
version = remote_version,
url = {html = html_url, download = download_url}
}
return json
end
function to_download(url)
@ -151,13 +120,11 @@ function to_download(url)
return {code = 1, error = i18n.translate("Download url is required.")}
end
sys.call("/bin/rm -f /tmp/kodexplorer_download.*")
sys.call("/bin/rm -f /tmp/kodcloud_download.*")
local tmp_file = util.trim(util.exec(
"mktemp -u -t kodexplorer_download.XXXXXX"))
local tmp_file = util.trim(util.exec("mktemp -u -t kodcloud_download.XXXXXX"))
local result = exec(wget, {"-O", tmp_file, url, _unpack(wget_args)}, nil,
command_timeout) == 0
local result = exec(wget, {"-O", tmp_file, url, _unpack(wget_args)}, nil, command_timeout) == 0
if not result then
exec("/bin/rm", {"-f", tmp_file})
@ -175,13 +142,11 @@ function to_extract(file)
return {code = 1, error = i18n.translate("File path required.")}
end
sys.call("/bin/rm -rf /tmp/kodexplorer_extract.*")
local tmp_dir = util.trim(util.exec(
"mktemp -d -t kodexplorer_extract.XXXXXX"))
sys.call("/bin/rm -rf /tmp/kodcloud_extract.*")
local tmp_dir = util.trim(util.exec("mktemp -d -t kodcloud_extract.XXXXXX"))
local output = {}
exec("/bin/tar", {"-C", tmp_dir, "-zxvf", file},
function(chunk) output[#output + 1] = chunk end)
exec("/usr/bin/unzip", {"-o", file, "-d", tmp_dir}, function(chunk) output[#output + 1] = chunk end)
local files = util.split(table.concat(output))
@ -192,14 +157,14 @@ end
function to_move(file)
if not file or file == "" or not fs.access(file) then
sys.call("/bin/rm -rf /tmp/kodexplorer_extract.*")
sys.call("/bin/rm -rf /tmp/kodcloud_extract.*")
return {code = 1, error = i18n.translate("Client file is required.")}
end
local client_file = get_project_directory()
sys.call("mkdir -p " .. client_file)
sys.call("cp -R " .. file .. "/KodExplorer*/* " .. client_file)
sys.call("/bin/rm -rf /tmp/kodexplorer_extract.*")
sys.call("cp -R " .. file .. "/* " .. client_file)
sys.call("/bin/rm -rf /tmp/kodcloud_extract.*")
return {code = 0}
end

View File

@ -1,161 +1,163 @@
<%
local dsp = require "luci.dispatcher"
-%>
<script type="text/javascript">
//<![CDATA[
var msgInfo;
<script type="text/javascript">//<![CDATA[
var msgInfo;
var tokenStr = '<%=token%>';
var clickToDownloadText = '<%:Click to update%>';
var inProgressText = '<%:Updating...%>';
var downloadInProgressNotice = '<%:Updating, are you sure to close?%>';
var downloadSuccessText = '<%:Update successful%>';
var unexpectedErrorText = '<%:Unexpected error%>';
var downloadingText = '<%:Downloading...%>';
var decompressioningText = '<%:Unpacking...%>';
var movingText = '<%:Moving...%>';
var latestVersionText = '<%:The latest version:%>';
var tokenStr = '<%=token%>';
var clickToDownloadText = '<%:Click to update%>';
var inProgressText = '<%:Updating...%>';
var downloadInProgressNotice = '<%:Updating, are you sure to close?%>';
var downloadSuccessText = '<%:Update successful%>';
var unexpectedErrorText = '<%:Unexpected error%>';
var downloadingText = '<%:Downloading...%>';
var decompressioningText = '<%:Unpacking...%>';
var movingText = '<%:Moving...%>';
var latestVersionText = '<%:The latest version:%>';
function addPageNotice() {
window.onbeforeunload = function (e) {
e.returnValue = downloadInProgressNotice;
return downloadInProgressNotice;
};
}
function addPageNotice() {
window.onbeforeunload = function(e) {
e.returnValue = downloadInProgressNotice;
return downloadInProgressNotice;
};
}
function removePageNotice() {
window.onbeforeunload = undefined;
}
function removePageNotice() {
window.onbeforeunload = undefined;
}
function onUpdateSuccess(btn) {
alert(downloadSuccessText);
function onUpdateSuccess(btn) {
alert(downloadSuccessText);
if (btn) {
btn.value = downloadSuccessText;
btn.placeholder = downloadSuccessText;
btn.disabled = true;
}
if (btn) {
btn.value = downloadSuccessText;
btn.placeholder = downloadSuccessText;
btn.disabled = true;
}
window.setTimeout(function () {
window.location.reload();
}, 1000);
}
window.setTimeout(function () {
window.location.reload();
}, 1000);
}
function onRequestError(btn, errorMessage) {
btn.disabled = false;
btn.value = btn.placeholder;
function onRequestError(btn, errorMessage) {
btn.disabled = false;
btn.value = btn.placeholder;
if (errorMessage) {
alert(errorMessage);
}
}
if (errorMessage) {
alert(errorMessage);
}
}
function doAjaxGet(url, data, onResult) {
new XHR().get(url, data, function (_, json) {
var resultJson = json || {
'code': 1,
'error': unexpectedErrorText
};
function doAjaxGet(url, data, onResult) {
new XHR().get(url, data, function(_, json) {
var resultJson = json || {
'code': 1,
'error': unexpectedErrorText
};
if (typeof onResult === 'function') {
onResult(resultJson);
}
})
}
if (typeof onResult === 'function') {
onResult(resultJson);
}
})
}
function downloadClick(btn) {
if (msgInfo === undefined) {
checkUpdate(btn);
} else {
doDownload(btn);
}
}
function downloadClick(btn) {
if (msgInfo === undefined) {
checkUpdate(btn);
} else {
doDownload(btn);
}
}
function checkUpdate(btn) {
var text = btn.value;
btn.disabled = true;
btn.value = inProgressText;
function checkUpdate(btn) {
btn.disabled = true;
btn.value = inProgressText;
addPageNotice();
addPageNotice();
var ckeckDetailElm = document.getElementById(btn.id + '-detail');
var ckeckDetailElm = document.getElementById(btn.id + '-detail');
doAjaxGet('<%=url([[admin]], [[nas]], [[kodexplorer]], [[check]])%>', {
token: tokenStr
}, function (json) {
removePageNotice();
if (json.code && json.data.server) {
var server = json.data.server;
eval('Info = json');
btn.disabled = false;
btn.value = clickToDownloadText;
btn.placeholder = clickToDownloadText;
if (ckeckDetailElm) {
var urlNode = '';
if (server.version) {
urlNode = '<em style="color:red;">' + latestVersionText + server.version + '</em>';
var html_url = 'https://kodcloud.com/download/';
if (html_url) {
urlNode = '<a href="' + html_url + '" target="_blank">' + urlNode + '</a>';
}
}
ckeckDetailElm.innerHTML = urlNode;
}
msgInfo = server;
} else {
removePageNotice();
btn.disabled = false;
btn.value = text;
alert(unexpectedErrorText);
}
});
}
doAjaxGet('<%=dsp.build_url("admin/nas/kodexplorer/check")%>/', {
token: tokenStr
}, function (json) {
removePageNotice();
if (json.code) {
eval('Info = undefined');
onRequestError(btn, json.error);
} else {
eval('Info = json');
btn.disabled = false;
btn.value = clickToDownloadText;
btn.placeholder = clickToDownloadText;
}
function doDownload(btn) {
btn.disabled = true;
btn.value = downloadingText;
if (ckeckDetailElm) {
var urlNode = '';
if (json.version) {
urlNode = '<em style="color:red;">' + latestVersionText + json.version + '</em>';
if (json.url && json.url.html) {
urlNode = '<a href="' + json.url.html + '" target="_blank">' + urlNode + '</a>';
}
}
ckeckDetailElm.innerHTML = urlNode;
}
msgInfo = json;
});
}
addPageNotice();
function doDownload(btn) {
btn.disabled = true;
btn.value = downloadingText;
var UpdateUrl = '<%=url([[admin]], [[nas]], [[kodexplorer]], [[download]])%>';
// Download file
doAjaxGet(UpdateUrl, {
token: tokenStr,
url: msgInfo ? msgInfo.link : ''
}, function (json) {
if (json.code) {
removePageNotice();
onRequestError(btn, json.error);
} else {
btn.value = decompressioningText;
addPageNotice();
// Extract file
doAjaxGet(UpdateUrl, {
token: tokenStr,
task: 'extract',
file: json.file
}, function (json) {
if (json.code) {
removePageNotice();
onRequestError(btn, json.error);
} else {
btn.value = movingText;
var UpdateUrl = '<%=dsp.build_url("admin/nas/kodexplorer/download")%>';
// Download file
doAjaxGet(UpdateUrl, {
token: tokenStr,
url: msgInfo ? msgInfo.url.download : ''
}, function (json) {
if (json.code) {
removePageNotice();
onRequestError(btn, json.error);
} else {
btn.value = decompressioningText;
// Extract file
doAjaxGet(UpdateUrl, {
token: tokenStr,
task: 'extract',
file: json.file
}, function (json) {
if (json.code) {
removePageNotice();
onRequestError(btn, json.error);
} else {
btn.value = movingText;
// Move file to target dir
doAjaxGet(UpdateUrl, {
token: tokenStr,
task: 'move',
file: json.file
}, function (json) {
removePageNotice();
if (json.code) {
onRequestError(btn, json.error);
} else {
onUpdateSuccess(btn);
}
})
}
})
}
})
}
//]]></script>
// Move file to target dir
doAjaxGet(UpdateUrl, {
token: tokenStr,
task: 'move',
file: json.file
}, function (json) {
removePageNotice();
if (json.code) {
onRequestError(btn, json.error);
} else {
onUpdateSuccess(btn);
}
})
}
})
}
})
}
//]]>
</script>
<%+cbi/valueheader%>
<% if self:cfgvalue(section) ~= false then %>

View File

@ -22,10 +22,17 @@ local dsp = require "luci.dispatcher"
XHR.poll(3,'<%=dsp.build_url("admin/nas/kodexplorer/status")%>', null,
function(x, json) {
if (x && x.status == 200) {
if (nginx_status)
nginx_status.innerHTML = json.nginx_status ? '<font color="green"><%:RUNNING%> ✓</font>' : '<font color="red"><%:NOT RUNNING%> X</font>';
if (php_status)
if (nginx_status) {
nginx_status.innerHTML = json.nginx_status ? '<font color="green"><%:RUNNING%> ✓</font><input type="button" class="cbi-button cbi-input-apply" value="<%:Enter interface%>" onclick="openwebui()" />' : '<font color="red"><%:NOT RUNNING%> X</font>';
}
if (php_status) {
php_status.innerHTML = json.php_status ? '<font color="green"><%:RUNNING%> ✓</font>' : '<font color="red"><%:NOT RUNNING%> X</font>';
}
}
});
}
);
function openwebui(){
var url = window.location.host+":<%=luci.sys.exec("uci -q get kodexplorer.@global[0].port"):gsub("^%s*(.-)%s*$", "%1")%>";
window.open('http://'+url,'target','');
}
//]]></script>

View File

@ -1,16 +1,16 @@
<%
local kodexplorer_path = luci.sys.exec("echo -n `uci get kodexplorer.@global[0].project_directory`")
local kodexplorer_version = luci.sys.exec("[ -f '" .. kodexplorer_path .. "/ChangeLog.md' ] && echo -n `cat " .. kodexplorer_path .. "/ChangeLog.md | head -1 | awk '{print $2}'`")
local api = require "luci.model.cbi.kodexplorer.api"
local app_version = api.get_version()
-%>
<% if kodexplorer_version ~= nil and kodexplorer_version~="" then %>
<% if app_version and app_version ~= "" then %>
<div class="cbi-value">
<label class="cbi-value-title">
<%:Version%>
</label>
<div class="cbi-value-field">
<div class="cbi-value-description">
<span><%=kodexplorer_version%> 】</span>
<span><%=app_version%> 】</span>
</div>
</div>
</div>

View File

@ -8,5 +8,5 @@ uci -q batch <<-EOF >/dev/null
EOF
/etc/init.d/php7-fpm disable && /etc/init.d/php7-fpm stop
rm -f /tmp/luci-indexcache
rm -rf /tmp/luci-*cache
exit 0

View File

@ -62,9 +62,7 @@ start_service() {
fi
}
reload_service()
{
stop
start
service_triggers() {
procd_add_reload_trigger "nps"
}

View File

@ -0,0 +1,18 @@
#
# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>
#
# This is free software, licensed under the Apache License, Version 2.0 .
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Luci for PS3NETSRV
LUCI_DEPENDS:=+ps3netsrv
LUCI_PKGARCH:=all
PKG_VERSION:=1
PKG_RELEASE:=2
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,21 @@
module("luci.controller.ps3netsrv",package.seeall)
function index()
if not nixio.fs.access("/etc/config/ps3netsrv")then
return
end
entry({"admin", "nas"}, firstchild(), "NAS", 44).dependent = false
local page
entry({"admin", "nas","ps3netsrv"},cbi("ps3netsrv"),_("PS3 NET Server"),40).dependent=true
entry({"admin", "nas","ps3netsrv","status"},call("act_status")).leaf=true
end
function act_status()
local e={}
e.running=luci.sys.call("ps | grep ps3netsrv |grep -v grep >/dev/null") == 0
luci.http.prepare_content("application/json")
luci.http.write_json(e)
end

View File

@ -0,0 +1,24 @@
-- Copyright 2020 Lean <coolsnowwolf@gmail.com>
-- Licensed to the public under the Apache License 2.0.
m = Map("ps3netsrv", translate("PS3 NET Server"), translate("PS3NETSRV is ISO/PKG server for Sony PlayStation 3 webMAN-MOD plugin"))
m:section(SimpleSection).template = "ps3netsrv/ps3netsrv_status"
s = m:section(TypedSection, "ps3netsrv")
s.addremove = false
s.anonymous = true
enable=s:option(Flag, "enabled", translate("Enabled"))
enable.default = "0"
enable.rmempty = false
db_path=s:option(Value, "dir", translate("Dir Path"))
db_path.default = "/root"
db_path.rmempty = false
port=s:option(Value, "port", translate("Port"))
port.rmempty = false
port.datatype = "port"
return m

View File

@ -0,0 +1,22 @@
<script type="text/javascript">//<![CDATA[
XHR.poll(3, '<%=url([[admin]], [[nas]], [[ps3netsrv]], [[status]])%>', null,
function(x, data) {
var tb = document.getElementById('ps3netsrv_status');
if (data && tb) {
if (data.running) {
var links = '<em><b><font color=green>PS3NETSRV <%:RUNNING%></font></b></em>';
tb.innerHTML = links;
} else {
tb.innerHTML = '<em><b><font color=red>PS3NETSRV <%:NOT RUNNING%></font></b></em>';
}
}
}
);
//]]>
</script>
<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>
<fieldset class="cbi-section">
<p id="ps3netsrv_status">
<em><%:Collecting data...%></em>
</p>
</fieldset>

View File

@ -0,0 +1,26 @@
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-06-23 20:16+0800\n"
"PO-Revision-Date: 2015-06-23 20:17+0800\n"
"Last-Translator: coolsnowwolf <coolsnowwolf@gmail.com>\n"
"Language-Team: PandoraBox Team\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Poedit 1.8.1\n"
"X-Poedit-SourceCharset: UTF-8\n"
msgid "PS3 NET Server"
msgstr "PS3 NET 服务器"
msgid "PS3NETSRV is ISO/PKG server for Sony PlayStation 3 webMAN-MOD plugin"
msgstr "PS3NETSRV 是一个 Sony PlayStation 3 自制系统 webMAN-MOD 插件的服务器端(用于加载蓝光/游戏ISO/PKG"
msgid "Dir Path"
msgstr "目录路径"
msgid "Port"
msgstr "端口"

View File

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

View File

@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-unblockmusic
PKG_VERSION:=2.3.5
PKG_RELEASE:=1
PKG_RELEASE:=7
PKG_CONFIG_DEPENDS := \
CONFIG_UnblockNeteaseMusic_Go \

View File

@ -47,20 +47,20 @@ cloudserver.rmempty = true
cloudserver:depends("apptype", "cloud")
flac = s:option(Flag, "flac_enabled", translate("启用无损音质"))
flac.default = 1
flac.default = "1"
flac.rmempty = false
flac.description = translate("目前仅支持酷我、QQ、咪咕")
flac:depends("apptype", "nodejs")
force = s:option(Flag, "force_enabled", translate("强制替换为高音质歌曲"))
force.default = 1
force.default = "1"
force.rmempty = false
force.description = translate("如果歌曲音质在 320Kbps 以内,则尝试强制替换为高音质版本")
force:depends("apptype", "nodejs")
o = s:option(Flag, "autoupdate")
o.title = translate("自动检查更新主程序")
o.default = 0
o.default = "1"
o.rmempty = false
o.description = translate("每天自动检测并更新到最新版本")
o:depends("apptype", "nodejs")

View File

@ -176,14 +176,17 @@ start()
fi
if [ $FORCE -eq 1 ]; then
sed -i '/item.code != 200/ { s/item.code != 200 || item.freeTrialInfo/item.br < 320000/g; }' /usr/share/UnblockNeteaseMusic/src/hook.js
else
sed -i '/item.br < 320000/ { s/item.br < 320000/item.code != 200 || item.freeTrialInfo/g; }' /usr/share/UnblockNeteaseMusic/src/hook.js
fi
node /usr/share/UnblockNeteaseMusic/app.js -e http://music.163.com -p 5200 $musictype >>/tmp/unblockmusic.log 2>&1 &
node /usr/share/UnblockNeteaseMusic/app.js -p 5200 $musictype >>/tmp/unblockmusic.log 2>&1 &
node /usr/share/UnblockNeteaseMusic/app.js -e https://music.163.com -p 5203:5201 $musictype >>/tmp/unblockmusic.log 2>&1 &
add_cron
echo "$(date -R) # UnblockNeteaseMusic Nodejs Version (http:5200, https:5201)" >>/tmp/unblockmusic.log
elif [ "$APPTYPE" == "go" ]; then
UnblockNeteaseMusic -p 5200 -sp 5201 -c /usr/share/UnblockNeteaseMusicGo/server.crt -k /usr/share/UnblockNeteaseMusicGo/server.key -m 0 -e >>/tmp/unblockmusic.log 2>&1 &
UnblockNeteaseMusic -p 5200 -sp 5202 -m 0 -c /usr/share/UnblockNeteaseMusicGo/server.crt -k /usr/share/UnblockNeteaseMusicGo/server.key -m 0 >>/tmp/unblockmusic.log 2>&1 &
echo "$(date -R) # UnblockNeteaseMusic Golang Version (http:5200, https:5201)" >>/tmp/unblockmusic.log
UnblockNeteaseMusic -p 5203 -sp 5201 -m 0 -c /usr/share/UnblockNeteaseMusicGo/server.crt -k /usr/share/UnblockNeteaseMusicGo/server.key -m 0 -e >>/tmp/unblockmusic.log 2>&1 &
else
kill -9 $(busybox ps -w | grep 'sleep 60m' | grep -v grep | awk '{print $1}') >/dev/null 2>&1
/usr/bin/UnblockNeteaseMusicCloud >/dev/null 2>&1 &

View File

@ -49,7 +49,7 @@ function update_core(){
exit 1
else
echo -e "${latest_ver}" > /usr/share/UnblockNeteaseMusic/local_ver
cat /usr/share/UnblockNeteaseMusic/package-lock.json | grep version |awk -F ':' '{print $2}' | cut -c3-8 > /usr/share/UnblockNeteaseMusic/core_ver
cat /usr/share/UnblockNeteaseMusic/package.json | grep version |awk -F ':' '{print $2}' | cut -c3-8 > /usr/share/UnblockNeteaseMusic/core_ver
fi
echo -e "Succeeded in updating core." >/tmp/unblockmusic_update.log

View File

@ -9,13 +9,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=v2ray
PKG_VERSION:=4.23.4
PKG_VERSION:=4.24.2
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/v2ray-core-$(PKG_VERSION)
PKG_SOURCE:=v2ray-core-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/v2fly/v2ray-core/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=726dd98d674bd73150158b1d4c8bc0d59dbb672ba10096ac61548d6278213c78
PKG_HASH:=b58b4477020034b67a7649341fae65ea7bdc81851cad47ae7e4a591c0663e4c9
PKG_LICENSE:=MIT
PKG_LICENSE_FILES:=LICENSE

View File

@ -19,24 +19,26 @@ ifeq ($(ARCH),i386)
PKG_ARCH_VERYSYNC:=386
endif
ifeq ($(ARCH),arm)
PKG_ARCH_VERYSYNC:=arm7
endif
ifeq ($(BOARD),bcm53xx)
PKG_ARCH_VERYSYNC:=arm6
endif
ifeq ($(BOARD),kirkwood)
PKG_ARCH_VERYSYNC:=arm
endif
ifeq ($(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE)))),)
PKG_ARCH_VERYSYNC:=arm
endif
ifeq ($(ARCH),aarch64)
PKG_ARCH_VERYSYNC:=arm64
endif
ifeq ($(ARCH),powerpc64)
PKG_ARCH_VERYSYNC:=ppc64
endif
LATEST_VERSION:=$(shell curl http://www.verysync.com/shell/latest)
PKG_NAME:=verysync
PKG_VERSION:=v1.3.1
PKG_RELEASE:=4
ifneq ($(LATEST_VERSION),)
PKG_VERSION:=$(LATEST_VERSION)
else
PKG_VERSION:=v1.4.3
endif
PKG_RELEASE:=1
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE:=$(PKG_NAME)-linux-$(PKG_ARCH_VERYSYNC)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://releases-cdn.verysync.com/releases/$(PKG_VERSION)/
@ -48,7 +50,7 @@ define Package/$(PKG_NAME)
SECTION:=net
CATEGORY:=Network
TITLE:=A efficient data transmission tool
DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64)
DEPENDS:=
URL:=http://www.verysync.com
endef

View File

@ -7,13 +7,13 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=trojan
PKG_VERSION:=1.15.1
PKG_VERSION:=1.16.0
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/trojan-gfw/trojan.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=0bad2988c60200c15786baf6b9ea42d66ba2109c
PKG_SOURCE_VERSION:=8606b7110fe79f8ab02d60c897f87ffb0a9b23f0
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
CMAKE_INSTALL:=1

View File

@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=soloscli
PKG_VERSION:=1.04
PKG_RELEASE:=2
PKG_RELEASE:=3
PKG_SOURCE:=solos-pci-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=@SF/openadsl

View File

@ -1,5 +1,3 @@
#!/bin/sh
uci batch <<__EOF__
delete network.wan.solos0

View File

@ -8,7 +8,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=odhcpd
PKG_RELEASE:=3
PKG_RELEASE:=4
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL=$(PROJECT_GIT)/project/odhcpd.git

View File

@ -1,6 +1,6 @@
#!/bin/sh
# Make dnsmasq reread hostfile by sending SIGHUP signal
. $IPKG_INSTROOT/lib/functions/procd.sh
. /lib/functions/procd.sh
procd_send_signal dnsmasq

View File

@ -233,8 +233,8 @@ proto_pppoe_setup() {
#By 蝈蝈:并发拨号同步的前期准备
syncppp_option=""
[ "$(uci get syncdial.config.enabled)" == "1" ] && {
ppp_if_cnt=$(cat /etc/config/network | grep -E -c "proto\s+?'pppoe'")
[ "$(uci get syncdial.config.enabled)" -eq "1" ] && {
ppp_if_cnt=$(uci show network | grep -c "\.proto=\'pppoe\'$")
syncppp_option="syncppp $ppp_if_cnt"
shellsync $ppp_if_cnt 10
}

View File

@ -12,9 +12,9 @@ PKG_RELEASE:=1
PKG_SOURCE_URL=$(PROJECT_GIT)/project/mdnsd.git
PKG_SOURCE_PROTO:=git
PKG_SOURCE_DATE:=2020-04-25
PKG_SOURCE_VERSION:=cdac0460ba50dc45735f0be2e19a5a8efc3dafe1
PKG_MIRROR_HASH:=261cb929dfc03c1f293156cfdec8c2cd1541dcdc57ae42a323f9df5d26e6f7d2
PKG_SOURCE_DATE:=2020-06-08
PKG_SOURCE_VERSION:=d13290b427487bb05581e11875af3bfe74d6da2d
PKG_MIRROR_HASH:=6cd38b41b341212359ddc723fc54ea16a2a7009519db015fb51cd2afb7324369
PKG_MAINTAINER:=John Crispin <john@phrozen.org>
PKG_LICENSE:=LGPL-2.1

View File

@ -11,12 +11,12 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=wireguard
PKG_VERSION:=1.0.20200520
PKG_VERSION:=1.0.20200611
PKG_RELEASE:=1
PKG_SOURCE:=wireguard-linux-compat-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=https://git.zx2c4.com/wireguard-linux-compat/snapshot/
PKG_HASH:=16e7ae4bef734b243428eea07f3b3c3d4721880c3ea8eb8f98628fd6ae5b77c3
PKG_HASH:=9b0478c3b1f3a7b488916e632e2fcbb1383bb1a2ef294489858ce2ba1da3246d
PKG_LICENSE:=GPL-2.0
PKG_LICENSE_FILES:=COPYING

View File

@ -8,12 +8,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=iproute2
PKG_VERSION:=5.6.0
PKG_VERSION:=5.7.0
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=@KERNEL/linux/utils/net/iproute2
PKG_HASH:=1b5b0e25ce6e23da7526ea1da044e814ad85ba761b10dd29c2b027c056b04692
PKG_HASH:=725dc7ba94aae54c6f8d4223ca055d9fb4fe89d6994b1c03bfb4411c4dd10f21
PKG_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=iptables
PKG_LICENSE:=GPL-2.0

View File

@ -0,0 +1,46 @@
From 12fafa27c7b306e6c397e858f4d5a8159500f659 Mon Sep 17 00:00:00 2001
From: Stephen Hemminger <stephen@networkplumber.org>
Date: Thu, 11 Jun 2020 09:46:46 -0700
Subject: [PATCH] devlink: update include files
Use the tool iwyu to get more complete list of includes for
all the bits used by devlink.
This should also fix build with musl libc.
Fixes: c4dfddccef4e ("fix JSON output of mon command")
Reported-off-by: Dan Robertson <dan@dlrobertson.com>
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
devlink/devlink.c | 9 ++++++++-
1 file changed, 8 insertions(+), 1 deletion(-)
--- a/devlink/devlink.c
+++ b/devlink/devlink.c
@@ -19,18 +19,25 @@
#include <limits.h>
#include <errno.h>
#include <inttypes.h>
+#include <signal.h>
+#include <time.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
#include <sys/sysinfo.h>
#define _LINUX_SYSINFO_H /* avoid collision with musl header */
#include <linux/genetlink.h>
#include <linux/devlink.h>
+#include <linux/netlink.h>
#include <libmnl/libmnl.h>
#include <netinet/ether.h>
+#include <sys/select.h>
+#include <sys/socket.h>
#include <sys/types.h>
#include "SNAPSHOT.h"
#include "list.h"
#include "mnlg.h"
-#include "json_writer.h"
+#include "json_print.h"
#include "utils.h"
#include "namespace.h"

View File

@ -7,14 +7,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=ca-certificates
PKG_VERSION:=20190110
PKG_RELEASE:=2
PKG_VERSION:=20200601
PKG_RELEASE:=1
PKG_MAINTAINER:=
PKG_SOURCE:=$(PKG_NAME)_$(PKG_VERSION).tar.xz
PKG_SOURCE_URL:=http://ftp.debian.org/debian/pool/main/c/ca-certificates
PKG_HASH:=ee4bf0f4c6398005f5b5ca4e0b87b82837ac5c3b0280a1cb3a63c47555c3a675
PKG_HASH:=43766d5a436519503dfd65ab83488ae33ab4d4ca3d0993797b58c92eb9ed4e63
PKG_BUILD_DIR:=$(BUILD_DIR)/work
PKG_INSTALL:=1
include $(INCLUDE_DIR)/package.mk

View File

@ -81,7 +81,7 @@ PROFILE_LIST = $(foreach p,$(PROFILE_NAMES), \
staging_dir/host/.prereq-build: include/prereq-build.mk
mkdir -p tmp
@$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq 2>/dev/null || { \
@$(_SINGLE)$(NO_TRACE_MAKE) -j1 -r -s -f $(TOPDIR)/include/prereq-build.mk prereq IB=1 2>/dev/null || { \
echo "Prerequisite check failed. Use FORCE=1 to override."; \
false; \
}
@ -162,6 +162,7 @@ prepare_rootfs: FORCE
build_image: FORCE
@echo
@echo Building images...
rm -rf $(BUILD_DIR)/json_info_files/
$(NO_TRACE_MAKE) -C target/linux/$(BOARD)/image install TARGET_BUILD=1 IB=1 EXTRA_IMAGE_NAME="$(EXTRA_IMAGE_NAME)" \
$(if $(USER_PROFILE),PROFILE="$(USER_PROFILE)")

View File

@ -160,6 +160,25 @@
qca,no-eeprom;
#gpio-cells = <2>;
gpio-controller;
/* all WNDR3700 variants have four antennae dedicated
* to the 2.4GHz radio. Two antennae are available for
* each chain. The following configuration is the
* default setting which taken from the vendor's wifi
* code for that radio.
*
* All possible options [GPIO6,GPIO7,GPIO8,GPIO9]:
* [0,1,0,1], [0,1,1,0], [1,0,0,1], [1,0,1,0]
*/
antenna-demux {
gpio-hog;
line-name = "fixed antenna group 1";
gpios = <6 GPIO_ACTIVE_LOW>,
<7 GPIO_ACTIVE_HIGH>,
<8 GPIO_ACTIVE_LOW>,
<9 GPIO_ACTIVE_HIGH>;
output-high;
};
};
ath9k1: wifi@0,12 {

View File

@ -32,3 +32,24 @@
read-only;
};
};
&ath9k1 {
/* The original WNDR3700(v1) variant have four antennae dedicated
* to the 5GHz radio as well. Again, two antennae are available for
* each chain to switch between. The following configuration is the
* default setting which taken from the vendor's wifi
* code for that radio.
*
* All possible options [GPIO6,GPIO7,GPIO8,GPIO9]:
* [0,1,0,1], [0,1,1,0], [1,0,0,1], [1,0,1,0]
*/
antenna-demux {
gpio-hog;
line-name = "fixed antenna group 2";
gpios = <6 GPIO_ACTIVE_LOW>,
<7 GPIO_ACTIVE_HIGH>,
<8 GPIO_ACTIVE_HIGH>,
<9 GPIO_ACTIVE_LOW>;
output-high;
};
};

View File

@ -30,7 +30,7 @@ Signed-off-by: Johan Hovold <johan@kernel.org>
--- a/drivers/usb/serial/option.c
+++ b/drivers/usb/serial/option.c
@@ -1983,7 +1983,8 @@ static const struct usb_device_id option
@@ -1987,7 +1987,8 @@ static const struct usb_device_id option
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d01, 0xff) }, /* D-Link DWM-156 (variant) */
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d02, 0xff) },
{ USB_DEVICE_INTERFACE_CLASS(0x2001, 0x7d03, 0xff) },

View File

@ -48,7 +48,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
#define INADDR_ANY ((unsigned long int) 0x00000000)
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -934,7 +934,7 @@ static int inet_abc_len(__be32 addr)
@@ -935,7 +935,7 @@ static int inet_abc_len(__be32 addr)
{
int rc = -1; /* Something else, probably a multicast. */
@ -57,7 +57,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
rc = 0;
else {
__u32 haddr = ntohl(addr);
@@ -945,6 +945,8 @@ static int inet_abc_len(__be32 addr)
@@ -946,6 +946,8 @@ static int inet_abc_len(__be32 addr)
rc = 16;
else if (IN_CLASSC(haddr))
rc = 24;

View File

@ -48,7 +48,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
#define INADDR_ANY ((unsigned long int) 0x00000000)
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -954,7 +954,7 @@ static int inet_abc_len(__be32 addr)
@@ -955,7 +955,7 @@ static int inet_abc_len(__be32 addr)
{
int rc = -1; /* Something else, probably a multicast. */
@ -57,7 +57,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
rc = 0;
else {
__u32 haddr = ntohl(addr);
@@ -965,6 +965,8 @@ static int inet_abc_len(__be32 addr)
@@ -966,6 +966,8 @@ static int inet_abc_len(__be32 addr)
rc = 16;
else if (IN_CLASSC(haddr))
rc = 24;

View File

@ -657,7 +657,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
gfar_write(&regs->rstat, gfargrp->rstat);
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3303,7 +3303,7 @@ static int ucc_geth_poll(struct napi_str
@@ -3304,7 +3304,7 @@ static int ucc_geth_poll(struct napi_str
howmany += ucc_geth_rx(ugeth, i, budget - howmany);
if (howmany < budget) {

View File

@ -48,7 +48,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
#define INADDR_ANY ((unsigned long int) 0x00000000)
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -911,7 +911,7 @@ static int inet_abc_len(__be32 addr)
@@ -912,7 +912,7 @@ static int inet_abc_len(__be32 addr)
{
int rc = -1; /* Something else, probably a multicast. */
@ -57,7 +57,7 @@ Reviewed-by: John Gilmore <gnu@toad.com>
rc = 0;
else {
__u32 haddr = ntohl(addr);
@@ -922,6 +922,8 @@ static int inet_abc_len(__be32 addr)
@@ -923,6 +923,8 @@ static int inet_abc_len(__be32 addr)
rc = 16;
else if (IN_CLASSC(haddr))
rc = 24;

View File

@ -42,7 +42,7 @@ Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
;----------------------------------------------------------------
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -437,6 +437,8 @@ static inline bool uboot_arg_invalid(uns
@@ -438,6 +438,8 @@ static inline bool uboot_arg_invalid(uns
/* We always pass 0 as magic from U-boot */
#define UBOOT_MAGIC_VALUE 0
@ -51,7 +51,7 @@ Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
void __init handle_uboot_args(void)
{
bool use_embedded_dtb = true;
@@ -477,7 +479,7 @@ ignore_uboot_args:
@@ -478,7 +480,7 @@ ignore_uboot_args:
#endif
if (use_embedded_dtb) {

View File

@ -73,7 +73,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
#include <linux/nsproxy.h>
#include <net/net_namespace.h>
#include <net/netns/generic.h>
@@ -978,8 +983,36 @@ static int pppoe_xmit(struct ppp_channel
@@ -981,8 +986,36 @@ static int pppoe_xmit(struct ppp_channel
return __pppoe_xmit(sk, skb);
}

View File

@ -42,7 +42,7 @@ Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
;----------------------------------------------------------------
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -526,7 +526,7 @@ void __init handle_uboot_args(void)
@@ -527,7 +527,7 @@ void __init handle_uboot_args(void)
ignore_uboot_args:
if (use_embedded_dtb) {
@ -51,7 +51,7 @@ Signed-off-by: Evgeniy Didin <Evgeniy.Didin@synopsys.com>
if (!machine_desc)
panic("Embedded DT invalid\n");
}
@@ -542,6 +542,8 @@ ignore_uboot_args:
@@ -543,6 +543,8 @@ ignore_uboot_args:
}
}

View File

@ -38,7 +38,7 @@ Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
;----------------------------------------------------------------
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -404,6 +404,8 @@ static inline bool uboot_arg_invalid(uns
@@ -405,6 +405,8 @@ static inline bool uboot_arg_invalid(uns
/* We always pass 0 as magic from U-boot */
#define UBOOT_MAGIC_VALUE 0
@ -47,7 +47,7 @@ Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
void __init handle_uboot_args(void)
{
bool use_embedded_dtb = true;
@@ -444,7 +446,7 @@ ignore_uboot_args:
@@ -445,7 +447,7 @@ ignore_uboot_args:
#endif
if (use_embedded_dtb) {

View File

@ -41,9 +41,7 @@ define Device/UbiFit
endef
define Device/DniImage
KERNEL_SUFFIX := -fit-uImage.itb
KERNEL = kernel-bin | gzip | fit gzip $$(DTS_DIR)/$$(DEVICE_DTS).dtb
KERNEL_NAME := Image
$(call Device/FitzImage)
NETGEAR_BOARD_ID :=
NETGEAR_HW_ID :=
IMAGES := factory.img sysupgrade.bin

View File

@ -0,0 +1,46 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 9 Jun 2020 14:08:44 +0200
Subject: essedma: Disable TCP segmentation offload for IPv6
It was noticed that the the whole MAC can hang when transferring data from
one ar40xx port (WAN ports) to the CPU and from the CPU back to another
ar40xx port (LAN ports). The CPU was doing only NATing in that process.
Usually, the problem first starts with a simple data corruption:
$ wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.4.0-amd64-netinst.iso -O /dev/null
...
Connecting to saimei.ftp.acc.umu.se (saimei.ftp.acc.umu.se)|2001:6b0:19::138|:443... connected.
...
Read error at byte 48807936/352321536 (Decryption has failed.). Retrying.
But after a short while, the whole MAC will stop to react. No traffic can
be transported anymore from the CPU port from/to the AR40xx PHY/switch and
the MAC has to be resetted.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
--- a/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
+++ b/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
@@ -972,17 +972,14 @@ static int edma_axi_probe(struct platfor
edma_netdev[i]->features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM
| NETIF_F_HW_VLAN_CTAG_TX
| NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
NETIF_F_HW_VLAN_CTAG_RX
- | NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ | NETIF_F_SG | NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->vlan_features = NETIF_F_HW_CSUM | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->wanted_features = NETIF_F_HW_CSUM | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
#ifdef CONFIG_RFS_ACCEL
edma_netdev[i]->features |= NETIF_F_RXHASH | NETIF_F_NTUPLE;

View File

@ -1,6 +1,6 @@
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -1291,6 +1291,7 @@ static const struct usb_device_id produc
@@ -1292,6 +1292,7 @@ static const struct usb_device_id produc
{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */

View File

@ -0,0 +1,46 @@
From: Sven Eckelmann <sven@narfation.org>
Date: Tue, 9 Jun 2020 14:08:44 +0200
Subject: essedma: Disable TCP segmentation offload for IPv6
It was noticed that the the whole MAC can hang when transferring data from
one ar40xx port (WAN ports) to the CPU and from the CPU back to another
ar40xx port (LAN ports). The CPU was doing only NATing in that process.
Usually, the problem first starts with a simple data corruption:
$ wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.4.0-amd64-netinst.iso -O /dev/null
...
Connecting to saimei.ftp.acc.umu.se (saimei.ftp.acc.umu.se)|2001:6b0:19::138|:443... connected.
...
Read error at byte 48807936/352321536 (Decryption has failed.). Retrying.
But after a short while, the whole MAC will stop to react. No traffic can
be transported anymore from the CPU port from/to the AR40xx PHY/switch and
the MAC has to be resetted.
Signed-off-by: Sven Eckelmann <sven@narfation.org>
--- a/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
+++ b/drivers/net/ethernet/qualcomm/essedma/edma_axi.c
@@ -972,17 +972,14 @@ static int edma_axi_probe(struct platfor
edma_netdev[i]->features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM
| NETIF_F_HW_VLAN_CTAG_TX
| NETIF_F_HW_VLAN_CTAG_RX | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 | NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
NETIF_F_HW_VLAN_CTAG_RX
- | NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ | NETIF_F_SG | NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->vlan_features = NETIF_F_HW_CSUM | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
edma_netdev[i]->wanted_features = NETIF_F_HW_CSUM | NETIF_F_SG |
- NETIF_F_TSO | NETIF_F_TSO6 |
- NETIF_F_GRO;
+ NETIF_F_TSO | NETIF_F_GRO;
#ifdef CONFIG_RFS_ACCEL
edma_netdev[i]->features |= NETIF_F_RXHASH | NETIF_F_NTUPLE;

View File

@ -1,6 +1,6 @@
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -1302,6 +1302,7 @@ static const struct usb_device_id produc
@@ -1303,6 +1303,7 @@ static const struct usb_device_id produc
{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */

View File

@ -1,6 +1,6 @@
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -1291,6 +1291,7 @@ static const struct usb_device_id produc
@@ -1292,6 +1292,7 @@ static const struct usb_device_id produc
{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */

View File

@ -1,6 +1,6 @@
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -1302,6 +1302,7 @@ static const struct usb_device_id produc
@@ -1303,6 +1303,7 @@ static const struct usb_device_id produc
{QMI_FIXED_INTF(0x03f0, 0x9d1d, 1)}, /* HP lt4120 Snapdragon X5 LTE */
{QMI_FIXED_INTF(0x22de, 0x9061, 3)}, /* WeTelecom WPD-600N */
{QMI_QUIRK_SET_DTR(0x1e0e, 0x9001, 5)}, /* SIMCom 7100E, 7230E, 7600E ++ */

View File

@ -11,12 +11,9 @@ PKG_NAME:=musl
PKG_VERSION:=1.1.24
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=ea9525c8bcf6170df59364c4bcd616de1acf8703
PKG_MIRROR_HASH:=6975c45b9bfe586ac00dbfcd1b1a13ab110af0528028ab3dee03e23e2c0763e5
PKG_SOURCE_URL:=https://git.musl-libc.org/git/musl
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.xz
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://musl.libc.org/releases/
PKG_HASH:=1370c9a812b2cf2a7d92802510cca0058cc37e66a7bedd70051f0a34015022a3
LIBC_SO_VERSION:=$(PKG_VERSION)
PATCH_DIR:=$(PATH_PREFIX)/patches

View File

@ -264,13 +264,8 @@ main (int argc, char * argv[])
hdr->magic = htonl (0x2a23245e);
hdr->header_len = htonl(header_len);
hdr->reserved[0] = (unsigned char)(region & 0xff);
hdr->reserved[1] = 1; /* Major */
hdr->reserved[2] = 1; /* Minor */
hdr->reserved[3] = 99; /* Build */
hdr->reserved[4] = 0;
hdr->reserved[5] = 0;
hdr->reserved[6] = 0;
hdr->reserved[7] = 0;
memset(&hdr->reserved[1], 99, sizeof(hdr->reserved) - 1);
message (" Board Id: %s", board_id);
message (" Region: %s", region == 1 ? "World Wide (WW)"
: (region == 2 ? "North America (NA)" : "Unknown"));