feat: opkg support

This commit is contained in:
SunBK201 2024-03-24 18:45:12 +08:00
parent 6a26597ced
commit 13d877cbc0
15 changed files with 426 additions and 30 deletions

View File

@ -13,7 +13,7 @@ UA3F 是新一代 HTTP User-Agent 修改方法,对外作为一个 SOCK5 服务
opkg update
opkg install curl libcurl luci-compat
export url='https://blog.sunbk201.site/cdn' && sh -c "$(curl -kfsSl $url/install.sh)"
service ua3f.service reload
service ua3f reload
```
## 使用
@ -35,15 +35,15 @@ UA3F 已支持 LuCI Web 页面,可以打开 Services -> UA3F 进行相关配
# 启动 UA3F
uci set ua3f.enabled.enabled=1
uci commit ua3f
service ua3f.service start
service ua3f start
```
关闭或重启 UA3F 命令:
```sh
# 关闭 UA3F
service ua3f.service stop
service ua3f stop
# 重启 UA3F
service ua3f.service restart
service ua3f restart
```
配置 UA3
@ -64,14 +64,14 @@ reload_config
### 手动启动
```sh
sudo -u nobody /root/ua3f
sudo -u nobody /usr/bin/ua3f
```
shellclash/shellcrash 用户建议使用以下命令启动:
```sh
sudo -u shellclash /root/ua3f
sudo -u shellclash /usr/bin/ua3f
# 如果上面命令报错执行下面该命令
sudo -u shellcrash /root/ua3f
sudo -u shellcrash /usr/bin/ua3f
```
### Clash 的配置建议

View File

@ -1,39 +1,69 @@
#!/bin/sh
project_name="ua3f"
release_version="0.3.1"
release_version="0.4.0"
target=cmd/ua3f.go
dist=./dist
release_dir=./bin
rm -rf $release_dir/*
rm -rf $dist/*
mkdir -p $release_dir
mkdir -p $dist/bin
cd $(dirname $0)
gofmt -w ./
for goarch in "amd64" "arm" "arm64" "mipsle" "mips64" "riscv64" "386"; do
obj_name=$project_name
obj_name=$project_name-$release_version-$goarch
GOOS=linux GOARCH=$goarch go build -trimpath -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-$goarch.tar.gz $obj_name
rm -f $obj_name
GOOS=linux GOARCH=$goarch go build -trimpath -ldflags="-s -w" -o $obj_name $target
cp $obj_name $dist/bin
mv $obj_name $project_name
tar -zcf $release_dir/$project_name-$release_version-$goarch.tar.gz $project_name
rm -f $project_name
done
GOOS=linux GOARCH="mipsle" GOMIPS=softfloat go build -trimpath -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-mipsle-softfloat.tar.gz $obj_name
rm -f $obj_name
GOOS=linux GOARCH="mipsle" GOMIPS=hardfloat go build -trimpath -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-mipsle-hardfloat.tar.gz $obj_name
rm -f $obj_name
# mipsle-softfloat
obj_name=$project_name-$release_version-mipsle-softfloat
GOOS=linux GOARCH="mipsle" GOMIPS=softfloat go build -trimpath -ldflags="-s -w" -o $obj_name $target
cp $obj_name $dist/bin
mv $obj_name $project_name
tar -zcf $release_dir/$project_name-$release_version-mipsle-softfloat.tar.gz $project_name
rm -f $project_name
GOOS=linux GOARCH="arm" GOARM=7 go build -trimpath -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-armv7.tar.gz $obj_name
rm -f $obj_name
# mipsle-hardfloat
obj_name=$project_name-$release_version-mipsle-hardfloat
GOOS=linux GOARCH="mipsle" GOMIPS=hardfloat go build -trimpath -ldflags="-s -w" -o $obj_name $target
cp $obj_name $dist/bin
mv $obj_name $project_name
tar -zcf $release_dir/$project_name-$release_version-mipsle-hardfloat.tar.gz $project_name
rm -f $project_name
# armv7
obj_name=$project_name-$release_version-armv7
GOOS=linux GOARCH="arm" GOARM=7 go build -trimpath -ldflags="-s -w" -o $obj_name $target
cp $obj_name $dist/bin
mv $obj_name $project_name
tar -zcf $release_dir/$project_name-$release_version-armv7.tar.gz $project_name
rm -f $project_name
# armv8
cp $release_dir/$project_name-$release_version-arm64.tar.gz $release_dir/$project_name-$release_version-armv8.tar.gz
cp $dist/bin/$project_name-$release_version-arm64 $dist/bin/$project_name-$release_version-armv8
cd $release_dir
for file in ./*; do
md5 -r $file >>sha1sum.txt
done
cd ..
opkg_template=./opkg
ipkg_build=ipkg-build.sh
for goarch in "amd64" "arm" "arm64" "mipsle" "mips64" "riscv64" "386" "mipsle-softfloat" "mipsle-hardfloat" "armv7" "armv8"; do
obj_name=$project_name-$release_version-$goarch
mv $dist/bin/$obj_name $opkg_template/usr/bin/ua3f
sh $ipkg_build $opkg_template
mv $project_name"_"$release_version-1_all.ipk $dist/$project_name"_"$release_version-1_$goarch.ipk
done

View File

@ -17,7 +17,7 @@ import (
"github.com/sirupsen/logrus"
)
var version = "0.3.1"
var version = "0.4.0"
var payloadByte []byte
var cache *expirable.LRU[string, string]
var HTTP_METHOD = []string{"GET", "POST", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE", "CONNECT"}

View File

@ -20,7 +20,7 @@ ckcmd() {
cd /root
getcpucore
version=0.3.1
version=0.4.0
ua3f_tar=ua3f-$version-$cpucore.tar.gz
if id -u shellclash >/dev/null 2>&1; then
@ -55,17 +55,21 @@ if [ $? -ne 0 ]; then
exit 1
fi
tar zxf $ua3f_tar && rm -f $ua3f_tar
chmod +x ua3f
mv ua3f /usr/bin/ua3f
chmod +x /usr/bin/ua3f
if [ -f "/etc/init.d/ua3f.service" ]; then
rm "/etc/init.d/ua3f.service"
fi
if [ -f "/etc/init.d/ua3f" ]; then
rm "/etc/init.d/ua3f"
fi
wget https://blog.sunbk201.site/cdn/ua3f.service
if [ $? -ne 0 ]; then
echo "Download ua3f.service Failed, Please Retry."
exit 1
fi
mv ua3f.service /etc/init.d/ && chmod +x /etc/init.d/ua3f.service
mv ua3f.service /etc/init.d/ua3f && chmod +x /etc/init.d/ua3f
/etc/init.d/ua3f.service enable
wget https://blog.sunbk201.site/cdn/ua3f.uci
@ -99,4 +103,4 @@ fi
rm /tmp/luci-modulecache/* >/dev/null 2>&1
rm /tmp/luci-indexcache* >/dev/null 2>&1
service ua3f.service reload >/dev/null 2>&1
service ua3f reload >/dev/null 2>&1

202
ipkg-build.sh Executable file
View File

@ -0,0 +1,202 @@
#!/bin/sh
# ipkg-build -- construct a .ipk from a directory
# Carl Worth <cworth@east.isi.edu>
# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001
# 2003-04-25 rea@sr.unh.edu
# Updated to work on Familiar Pre0.7rc1, with busybox tar.
# Note it Requires: binutils-ar (since the busybox ar can't create)
# For UID debugging it needs a better "find".
set -e
version=1.0
FIND="$(command -v find)"
FIND="${FIND:-$(command -v gfind)}"
TAR="${TAR:-$(command -v gtar)}"
# try to use fixed source epoch
if [ -n "$PKG_SOURCE_DATE_EPOCH" ]; then
TIMESTAMP=$(date --date="@$PKG_SOURCE_DATE_EPOCH")
elif [ -n "$SOURCE_DATE_EPOCH" ]; then
TIMESTAMP=$(date --date="@$SOURCE_DATE_EPOCH")
else
TIMESTAMP=$(date)
fi
ipkg_extract_value() {
sed -e "s/^[^:]*:[[:space:]]*//"
}
required_field() {
field=$1
grep "^$field:" <"$CONTROL/control" | ipkg_extract_value
}
pkg_appears_sane() {
local pkg_dir="$1"
local owd="$PWD"
cd "$pkg_dir"
PKG_ERROR=0
pkg="$(required_field Package)"
version="$(required_field Version | sed 's/Version://; s/^.://g;')"
arch="$(required_field Architecture)"
if echo "$pkg" | grep '[^a-zA-Z0-9_.+-]'; then
echo "*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])" >&2
PKG_ERROR=1
fi
if [ -f "$CONTROL/conffiles" ]; then
rm -f "$CONTROL/conffiles.resolved"
for cf in $($FIND $(sed -e "s!^/!$pkg_dir/!" "$CONTROL/conffiles") -type f); do
echo "${cf#$pkg_dir}" >>"$CONTROL/conffiles.resolved"
done
rm "$CONTROL"/conffiles
if [ -f "$CONTROL"/conffiles.resolved ]; then
LC_ALL=C sort -o "$CONTROL"/conffiles "$CONTROL"/conffiles.resolved
rm "$CONTROL"/conffiles.resolved
chmod 0644 "$CONTROL"/conffiles
fi
fi
cd "$owd"
return $PKG_ERROR
}
resolve_file_mode_id() {
local var=$1 type=$2 name=$3 id
case "$name" in
root)
id=0
;;
*[!0-9]*)
id=$(sed -ne "s#^$type $name \\([0-9]\\+\\)\\b.*\$#\\1#p" "$TOPDIR/tmp/.packageusergroup" 2>/dev/null)
;;
*)
id=$name
;;
esac
export "$var=$id"
[ -n "$id" ]
}
###
# ipkg-build "main"
###
file_modes=""
usage="Usage: $0 [-v] [-h] [-m] <pkg_directory> [<destination_directory>]"
while getopts "hvm:" opt; do
case $opt in
v)
echo "$version"
exit 0
;;
h) echo "$usage" >&2 ;;
m) file_modes=$OPTARG ;;
\?) echo "$usage" >&2 ;;
esac
done
shift $((OPTIND - 1))
# continue on to process additional arguments
case $# in
1)
dest_dir=$PWD
;;
2)
dest_dir=$2
if [ "$dest_dir" = "." ] || [ "$dest_dir" = "./" ]; then
dest_dir=$PWD
fi
;;
*)
echo "$usage" >&2
exit 1
;;
esac
pkg_dir="$(realpath "$1")"
if [ ! -d "$pkg_dir" ]; then
echo "*** Error: Directory $pkg_dir does not exist" >&2
exit 1
fi
# CONTROL is second so that it takes precedence
CONTROL=
[ -d "$pkg_dir"/CONTROL ] && CONTROL=CONTROL
if [ -z "$CONTROL" ]; then
echo "*** Error: Directory $pkg_dir has no CONTROL subdirectory." >&2
exit 1
fi
if ! pkg_appears_sane "$pkg_dir"; then
echo >&2
echo "ipkg-build: Please fix the above errors and try again." >&2
exit 1
fi
tmp_dir=$dest_dir/IPKG_BUILD.$$
mkdir "$tmp_dir"
echo $CONTROL >"$tmp_dir"/tarX
cd "$pkg_dir"
for file_mode in $file_modes; do
case $file_mode in
/*:*:*:*) ;;
*)
echo "ERROR: file modes must use absolute path and contain user:group:mode"
echo "$file_mode"
exit 1
;;
esac
mode=${file_mode##*:}
path=${file_mode%:*}
group=${path##*:}
path=${path%:*}
user=${path##*:}
path=${path%:*}
if ! resolve_file_mode_id uid user "$user"; then
echo "ERROR: unable to resolve uid of $user" >&2
exit 1
fi
if ! resolve_file_mode_id gid group "$group"; then
echo "ERROR: unable to resolve gid of $group" >&2
exit 1
fi
chown "$uid:$gid" "$pkg_dir/$path"
chmod "$mode" "$pkg_dir/$path"
done
$TAR -X "$tmp_dir"/tarX --format=gnu --numeric-owner --sort=name -cpf - --mtime="$TIMESTAMP" . | gzip -n - >"$tmp_dir"/data.tar.gz
installed_size=$(zcat <"$tmp_dir"/data.tar.gz | wc -c)
sed -i -e "s/^Installed-Size: .*/Installed-Size: $installed_size/" \
"$pkg_dir"/$CONTROL/control
(cd "$pkg_dir"/$CONTROL && $TAR --format=gnu --numeric-owner --sort=name -cf - --mtime="$TIMESTAMP" . | gzip -n - >"$tmp_dir"/control.tar.gz)
rm "$tmp_dir"/tarX
echo "2.0" >"$tmp_dir"/debian-binary
pkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk
rm -f "$pkg_file"
(cd "$tmp_dir" && $TAR --format=gnu --numeric-owner --sort=name -cf - --mtime="$TIMESTAMP" ./debian-binary ./data.tar.gz ./control.tar.gz | gzip -n - >"$pkg_file")
rm "$tmp_dir"/debian-binary "$tmp_dir"/data.tar.gz "$tmp_dir"/control.tar.gz
rmdir "$tmp_dir"
echo "Packaged contents of $pkg_dir into $pkg_file"

View File

@ -3,7 +3,7 @@ local uci = require("luci.model.uci").cursor()
ua3f = Map("ua3f",
"UA3F",
[[
<a href="https://github.com/SunBK201/UA3F" target="_blank">Version: 0.3.1</a>
<a href="https://github.com/SunBK201/UA3F" target="_blank">Version: 0.4.0</a>
<br>
Across the Campus we can reach every corner in the world.
]]
@ -51,7 +51,7 @@ log.rows = 30
local apply = luci.http.formvalue("cbi.apply")
if apply then
io.popen("/etc/init.d/ua3f.service restart")
io.popen("/etc/init.d/ua3f restart")
end
return ua3f

11
opkg/CONTROL/control Normal file
View File

@ -0,0 +1,11 @@
Package: ua3f
Version: 0.4.0-1
Depends: libc, luci-compat
Source: /feed/openwrt
SourceName: UA3F
License: GPL-3.0-only
Section: net
SourceDateEpoch: 1711267200
Architecture: all
Installed-Size: 2181120
Description: Implementation of the new generation of HTTP User-Agent modification methodology.

11
opkg/CONTROL/control-e Normal file
View File

@ -0,0 +1,11 @@
Package: ua3f
Version: 0.4.0-1
Depends: libc, luci-compat
Source: /feed/openwrt
SourceName: UA3F
License: GPL-3.0-only
Section: net
SourceDateEpoch: 1711267200
Architecture: all
Installed-Size: 2181120
Description: Implementation of the new generation of HTTP User-Agent modification methodology.

5
opkg/CONTROL/postinst Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
[ "${IPKG_NO_SCRIPT}" = "1" ] && exit 0
[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0
. ${IPKG_INSTROOT}/lib/functions.sh
default_postinst $0 $@

4
opkg/CONTROL/prerm Executable file
View File

@ -0,0 +1,4 @@
#!/bin/sh
[ -s ${IPKG_INSTROOT}/lib/functions.sh ] || exit 0
. ${IPKG_INSTROOT}/lib/functions.sh
default_prerm $0 $@

8
opkg/etc/config/ua3f Normal file
View File

@ -0,0 +1,8 @@
config 'ua3f' 'enabled'
option enabled '0'
config 'ua3f' 'main'
option port '1080'
option bind '127.0.0.1'
option ua 'FFF'
option log_level 'info'

59
opkg/etc/init.d/ua3f Executable file
View File

@ -0,0 +1,59 @@
#!/bin/sh /etc/rc.common
USE_PROCD=1
START=99
NAME="ua3f"
PROG="/usr/bin/$NAME"
start_service() {
config_load "$NAME"
local enabled
config_get_bool enabled "enabled" "enabled" "0"
if [ "$enabled" -ne "1" ]; then
return 1
fi
local port
local bind
local ua
local log_level
config_get port "main" "port" "1080"
config_get bind "main" "bind" "127.0.0.1"
config_get ua "main" "ua" "FFF"
config_get log_level "main" "log_level" "info"
chmod o+w /var/log
procd_open_instance "$NAME"
procd_set_param command "$PROG"
procd_append_param command -b "$bind"
procd_append_param command -p $port
procd_append_param command -f "$ua"
procd_append_param command -l $log_level
procd_set_param respawn
procd_set_param stdout 1
procd_set_param stderr 1
if id -u shellclash >/dev/null 2>&1; then
procd_set_param user shellclash
elif id -u shellcrash >/dev/null 2>&1; then
procd_set_param user shellcrash
elif id -u nobody >/dev/null 2>&1; then
procd_set_param user nobody
fi
procd_close_instance
}
reload_service() {
stop
start
}
service_triggers() {
procd_add_reload_trigger "$NAME"
}

View File

@ -0,0 +1,5 @@
module("luci.controller.ua3f", package.seeall)
function index()
entry({ "admin", "services", "ua3f" }, cbi("ua3f"), "UA3F", 1)
end

View File

@ -0,0 +1,57 @@
local uci = require("luci.model.uci").cursor()
ua3f = Map("ua3f",
"UA3F",
[[
<a href="https://github.com/SunBK201/UA3F" target="_blank">Version: 0.4.0</a>
<br>
Across the Campus we can reach every corner in the world.
]]
)
enable = ua3f:section(NamedSection, "enabled", "ua3f", "Status")
main = ua3f:section(NamedSection, "main", "ua3f", "Settings")
enable:option(Flag, "enabled", "Enabled")
status = enable:option(DummyValue, "status", "Status")
status.rawhtml = true
status.cfgvalue = function(self, section)
local pid = luci.sys.exec("pidof ua3f")
if pid == "" then
return "<span style='color:red'>" .. "Stopped" .. "</span>"
else
return "<span style='color:green'>" .. "Running" .. "</span>"
end
end
main:tab("general", "General Settings")
main:tab("log", "Log")
port = main:taboption("general", Value, "port", "Port")
port.placeholder = "1080"
bind = main:taboption("general", Value, "bind", "Bind Address")
bind:value("127.0.0.1")
bind:value("0.0.0.0")
ua = main:taboption("general", Value, "ua", "User-Agent")
ua.placeholder = "FFF"
log_level = main:taboption("general", ListValue, "log_level", "Log Level")
log_level:value("debug")
log_level:value("info")
log_level:value("warn")
log_level:value("error")
log_level:value("fatal")
log_level:value("panic")
log = main:taboption("log", TextValue, "")
log.readonly = true
log.cfgvalue = function(self, section)
return luci.sys.exec("cat /var/log/ua3f.log")
end
log.rows = 30
local apply = luci.http.formvalue("cbi.apply")
if apply then
io.popen("/etc/init.d/ua3f restart")
end
return ua3f

View File

@ -5,7 +5,7 @@ USE_PROCD=1
START=99
NAME="ua3f"
PROG="/root/$NAME"
PROG="/usr/bin/$NAME"
start_service() {
config_load "$NAME"