feat: new log system

This commit is contained in:
SunBK201 2023-12-07 23:47:12 +08:00
parent fb8d909f39
commit 1aeaad7772
31 changed files with 133 additions and 78 deletions

View File

@ -19,6 +19,9 @@ export url='https://blog.sunbk201.site/cdn' && sh -c "$(curl -kfsSl $url/install
- `-p <port>`: 端口号,默认 1080 - `-p <port>`: 端口号,默认 1080
- `-f <UA>`: 自定义 UA默认 FFF - `-f <UA>`: 自定义 UA默认 FFF
- `-b <bind addr>`: 自定义绑定监听地址,默认 127.0.0.1 - `-b <bind addr>`: 自定义绑定监听地址,默认 127.0.0.1
- `-l <log level>`: 日志等级,默认 info可选debug
默认日志位置:`/var/log/ua3f.log`
### 手动启动 ### 手动启动
```bash ```bash

10
bin/sha1sum.txt Normal file
View File

@ -0,0 +1,10 @@
0f6211146be2756456d875b08c118507 ./ua3f-0.1.0-386.tar.gz
1c3045a4dd96e5539e167377cb1714af ./ua3f-0.1.0-amd64.tar.gz
a56e07f9e99c75b7c80e182db7f469f4 ./ua3f-0.1.0-arm.tar.gz
ab08b81c4698d7e76a9a4ba8008e8787 ./ua3f-0.1.0-arm64.tar.gz
ab08b81c4698d7e76a9a4ba8008e8787 ./ua3f-0.1.0-armv8.tar.gz
1ccadf573d3d3b229c6a41af88a715cd ./ua3f-0.1.0-mips64.tar.gz
20f433bd1572ec219a18ec9fd7e9377a ./ua3f-0.1.0-mipsle-hardfloat.tar.gz
507b3477b94352638accdfa8f9f211ca ./ua3f-0.1.0-mipsle-softfloat.tar.gz
d3f018d414310a0e116674ad14b19a62 ./ua3f-0.1.0-mipsle.tar.gz
f017636a3c599c9ec0e7e8b2432c07dc ./ua3f-0.1.0-riscv64.tar.gz

BIN
bin/ua3f-0.1.0-386.tar.gz Normal file

Binary file not shown.

BIN
bin/ua3f-0.1.0-amd64.tar.gz Normal file

Binary file not shown.

BIN
bin/ua3f-0.1.0-arm.tar.gz Normal file

Binary file not shown.

BIN
bin/ua3f-0.1.0-arm64.tar.gz Normal file

Binary file not shown.

BIN
bin/ua3f-0.1.0-armv8.tar.gz Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,9 +1,10 @@
#!/bin/sh #!/bin/sh
project_name="ua3f" project_name="ua3f"
release_version="0.0.4" release_version="0.1.0"
target=cmd/ua3f.go
release_dir=./release release_dir=./bin
rm -rf $release_dir/* rm -rf $release_dir/*
mkdir -p $release_dir mkdir -p $release_dir
@ -14,15 +15,15 @@ gofmt -w ./
for goarch in "amd64" "arm" "arm64" "mipsle" "mips64" "riscv64" "386"; do for goarch in "amd64" "arm" "arm64" "mipsle" "mips64" "riscv64" "386"; do
obj_name=$project_name obj_name=$project_name
GOOS=linux GOARCH=$goarch go build -ldflags="-s -w" GOOS=linux GOARCH=$goarch go build -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-$goarch.tar.gz $obj_name tar -zcf $release_dir/$project_name-$release_version-$goarch.tar.gz $obj_name
rm -f $obj_name rm -f $obj_name
done done
GOOS=linux GOARCH="mipsle" GOMIPS=softfloat go build -ldflags="-s -w" GOOS=linux GOARCH="mipsle" GOMIPS=softfloat go build -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-mipsle-softfloat.tar.gz $obj_name tar -zcf $release_dir/$project_name-$release_version-mipsle-softfloat.tar.gz $obj_name
rm -f $obj_name rm -f $obj_name
GOOS=linux GOARCH="mipsle" GOMIPS=hardfloat go build -ldflags="-s -w" GOOS=linux GOARCH="mipsle" GOMIPS=hardfloat go build -ldflags="-s -w" $target
tar -zcf $release_dir/$project_name-$release_version-mipsle-hardfloat.tar.gz $obj_name tar -zcf $release_dir/$project_name-$release_version-mipsle-hardfloat.tar.gz $obj_name
rm -f $obj_name rm -f $obj_name

View File

@ -6,37 +6,39 @@ import (
"flag" "flag"
"fmt" "fmt"
"io" "io"
"log/syslog"
"net" "net"
"strings" "strings"
"time" "time"
"ua3f/http"
"ua3f/log"
"github.com/hashicorp/golang-lru/v2/expirable" "github.com/hashicorp/golang-lru/v2/expirable"
"github.com/sirupsen/logrus"
) )
var version = "0.0.4" var version = "0.1.0"
var payloadByte []byte var payloadByte []byte
var cache *expirable.LRU[string, string] var cache *expirable.LRU[string, string]
func main() { func main() {
var payload string var payload string
var addr string var addr string
var port int var port int
var loglevel string
flag.StringVar(&addr, "b", "127.0.0.1", "bind address (default: 127.0.0.1)") flag.StringVar(&addr, "b", "127.0.0.1", "bind address (default: 127.0.0.1)")
flag.IntVar(&port, "p", 1080, "port") flag.IntVar(&port, "p", 1080, "port")
flag.StringVar(&payload, "f", "FFF", "User-Agent") flag.StringVar(&payload, "f", "FFF", "User-Agent")
flag.StringVar(&loglevel, "l", "info", "Log level (default: info)")
flag.Parse() flag.Parse()
logger, err := syslog.Dial("", "", syslog.LOG_INFO, "UA3F") log.SetLogConf(loglevel)
if err != nil {
fmt.Println("syslog error:", err)
return
}
printAndLog("UA3F v"+version, logger, syslog.LOG_INFO) logrus.Info("UA3F v" + version)
printAndLog(fmt.Sprintf("Port: %d", port), logger, syslog.LOG_INFO) logrus.Info(fmt.Sprintf("Port: %d", port))
printAndLog(fmt.Sprintf("User-Agent: %s", payload), logger, syslog.LOG_INFO) logrus.Info(fmt.Sprintf("User-Agent: %s", payload))
logrus.Info(fmt.Sprintf("Log level: %s", loglevel))
cache = expirable.NewLRU[string, string](100, nil, time.Second*600) cache = expirable.NewLRU[string, string](100, nil, time.Second*600)
@ -44,32 +46,30 @@ func main() {
server, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port)) server, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port))
if err != nil { if err != nil {
printAndLog(fmt.Sprintf("Listen failed: %v", err), logger, syslog.LOG_ERR) logrus.Fatal("Listen failed: ", err)
return return
} }
printAndLog(fmt.Sprintf("Listen on %s:%d", addr, port), logger, syslog.LOG_INFO) logrus.Info(fmt.Sprintf("Listen on %s:%d", addr, port))
for { for {
client, err := server.Accept() client, err := server.Accept()
if err != nil { if err != nil {
printAndLog(fmt.Sprintf("Accept failed: %v", err), logger, syslog.LOG_ERR) logrus.Error("Accept failed: ", err)
continue continue
} }
// printAndLog(fmt.Sprintf("Accept %s", client.RemoteAddr().String()), logger, syslog.LOG_DEBUG) logrus.Debug(fmt.Sprintf("Accept %s", client.RemoteAddr().String()))
go process(client) go process(client)
} }
} }
func process(client net.Conn) { func process(client net.Conn) {
logger, _ := syslog.Dial("", "", syslog.LOG_INFO, "UA3F")
if err := Socks5Auth(client); err != nil { if err := Socks5Auth(client); err != nil {
printAndLog(fmt.Sprintf("auth error: %v", err), logger, syslog.LOG_ERR) logrus.Error("Auth failed: ", err)
client.Close() client.Close()
return return
} }
target, err := Socks5Connect(client) target, err := Socks5Connect(client)
if err != nil { if err != nil {
printAndLog(fmt.Sprintf("connect error: %v", err), logger, syslog.LOG_ERR) logrus.Error("Connect failed: ", err)
client.Close() client.Close()
return return
} }
@ -171,11 +171,10 @@ func Socks5Forward(client, target net.Conn) {
} }
func CopyPileline(dst io.Writer, src io.Reader) { func CopyPileline(dst io.Writer, src io.Reader) {
logger, _ := syslog.Dial("", "", syslog.LOG_INFO, "UA3F")
buf := make([]byte, 1024*8) buf := make([]byte, 1024*8)
nr, err := src.Read(buf) nr, err := src.Read(buf)
if err != nil && err != io.EOF { if err != nil && err != io.EOF {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR) logrus.Error("read error: ", err)
return return
} }
hint := string(buf[0:7]) hint := string(buf[0:7])
@ -194,13 +193,13 @@ func CopyPileline(dst io.Writer, src io.Reader) {
return return
} }
for { for {
parser := NewHTTPParser() parser := http.NewHTTPParser()
httpBodyOffset, err := parser.Parse(buf[0:nr]) httpBodyOffset, err := parser.Parse(buf[0:nr])
for err == ErrMissingData { for err == http.ErrMissingData {
var m int var m int
m, err = src.Read(buf[nr:]) m, err = src.Read(buf[nr:])
if err != nil { if err != nil {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR) logrus.Error("read error: ", err)
break break
} }
nr += m nr += m
@ -208,7 +207,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
} }
value, start, end := parser.FindHeader([]byte("User-Agent")) value, start, end := parser.FindHeader([]byte("User-Agent"))
if value != nil && end > start { if value != nil && end > start {
printAndLog(fmt.Sprintf("[%s] Hit User-Agent: %s", string(parser.Host()), string(value)), logger, syslog.LOG_INFO) logrus.Debug(fmt.Sprintf("[%s] Hit User-Agent: %s", string(parser.Host()), string(value)))
for i := start; i < end; i++ { for i := start; i < end; i++ {
buf[i] = 32 buf[i] = 32
} }
@ -219,7 +218,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
buf[start+i] = payloadByte[i] buf[start+i] = payloadByte[i]
} }
} else { } else {
printAndLog(fmt.Sprintf("[%s] Not found User-Agent", string(parser.Host())), logger, syslog.LOG_INFO) logrus.Debug(fmt.Sprintf("[%s] Not found User-Agent", string(parser.Host())))
dst.Write(buf[0:nr]) dst.Write(buf[0:nr])
io.Copy(dst, src) io.Copy(dst, src)
cache.Add(string(dst.(*net.TCPConn).RemoteAddr().String()), string(dst.(*net.TCPConn).RemoteAddr().String())) cache.Add(string(dst.(*net.TCPConn).RemoteAddr().String()), string(dst.(*net.TCPConn).RemoteAddr().String()))
@ -232,7 +231,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
_, ew := dst.Write(buf[0:min(httpBodyOffset+bodyLen, nr)]) _, ew := dst.Write(buf[0:min(httpBodyOffset+bodyLen, nr)])
if ew != nil { if ew != nil {
printAndLog(fmt.Sprintf("write error: %v", ew), logger, syslog.LOG_ERR) logrus.Error("write error: ", ew)
break break
} }
if httpBodyOffset+bodyLen > nr { if httpBodyOffset+bodyLen > nr {
@ -240,12 +239,12 @@ func CopyPileline(dst io.Writer, src io.Reader) {
for left > 0 { for left > 0 {
m, err := src.Read(buf[0:left]) m, err := src.Read(buf[0:left])
if err != nil { if err != nil {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR) logrus.Error("read error: ", err)
break break
} }
_, ew := dst.Write(buf[0:m]) _, ew := dst.Write(buf[0:m])
if ew != nil { if ew != nil {
printAndLog(fmt.Sprintf("write error: %v", ew), logger, syslog.LOG_ERR) logrus.Error("write error: ", ew)
break break
} }
left -= m left -= m
@ -261,7 +260,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
m, err := src.Read(buf[nr:]) m, err := src.Read(buf[nr:])
nr += m nr += m
if err != nil && err != io.EOF { if err != nil && err != io.EOF {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR) logrus.Error("read error: ", err)
break break
} }
if err == io.EOF { if err == io.EOF {
@ -269,29 +268,3 @@ func CopyPileline(dst io.Writer, src io.Reader) {
} }
} }
} }
func printAndLog(mes string, logger *syslog.Writer, level syslog.Priority) {
fmt.Println(mes)
var err error
switch level {
case syslog.LOG_INFO:
err = logger.Info(mes)
case syslog.LOG_ERR:
err = logger.Err(mes)
case syslog.LOG_DEBUG:
err = logger.Debug(mes)
case syslog.LOG_WARNING:
err = logger.Warning(mes)
case syslog.LOG_CRIT:
err = logger.Crit(mes)
case syslog.LOG_ALERT:
err = logger.Alert(mes)
case syslog.LOG_EMERG:
err = logger.Emerg(mes)
case syslog.LOG_NOTICE:
err = logger.Notice(mes)
}
if err != nil {
fmt.Println("syslog error:", err)
}
}

7
go.mod
View File

@ -2,4 +2,9 @@ module ua3f
go 1.21.3 go 1.21.3
require github.com/hashicorp/golang-lru/v2 v2.0.7 require (
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/sirupsen/logrus v1.9.3
)
require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect

15
go.sum
View File

@ -1,2 +1,17 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@ -1,4 +1,4 @@
package main package http
import ( import (
"bytes" "bytes"

View File

@ -16,13 +16,14 @@ getcpucore() {
cd /root cd /root
getcpucore getcpucore
version=0.0.4 version=0.1.0
ua3f_tar=ua3f-$version-$cpucore.tar.gz ua3f_tar=ua3f-$version-$cpucore.tar.gz
if [ -f "ua3f" ]; then if [ -f "ua3f" ]; then
rm "ua3f" rm "ua3f"
fi fi
chmod ugo+w /var/log
if [ -f "/var/log/ua3f.log" ]; then if [ -f "/var/log/ua3f.log" ]; then
rm "/var/log/ua3f.log" rm "/var/log/ua3f.log"
fi fi
@ -31,7 +32,7 @@ if [ -f "$ua3f_tar" ]; then
rm "$ua3f_tar" rm "$ua3f_tar"
fi fi
wget https://fastly.jsdelivr.net/gh/SunBK201/UA3F@master/release/$ua3f_tar wget https://blog.sunbk201.site/cdn/bin/$ua3f_tar
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Download UA3F Failed, Please Retry." echo "Download UA3F Failed, Please Retry."
exit 1 exit 1
@ -42,7 +43,7 @@ chmod +x ua3f
if [ -f "ua3f.service" ]; then if [ -f "ua3f.service" ]; then
rm "ua3f.service" rm "ua3f.service"
fi fi
wget https://fastly.jsdelivr.net/gh/SunBK201/UA3F@master/ua3f.service wget https://blog.sunbk201.site/cdn/ua3f.service
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
echo "Download ua3f.service Failed, Please Retry." echo "Download ua3f.service Failed, Please Retry."
exit 1 exit 1

57
log/log.go Normal file
View File

@ -0,0 +1,57 @@
package log
import (
"bytes"
"fmt"
"io"
"log"
"os"
"strings"
"github.com/sirupsen/logrus"
)
type uctFormatter struct {
}
func (formatter *uctFormatter) Format(entry *logrus.Entry) ([]byte, error) {
var b *bytes.Buffer
if entry.Buffer != nil {
b = entry.Buffer
} else {
b = &bytes.Buffer{}
}
formatTime := entry.Time.Format("2006-01-02 15:04:05")
b.WriteString(fmt.Sprintf("[%s][%s]: %s\n", formatTime, strings.ToUpper(entry.Level.String()), entry.Message))
return b.Bytes(), nil
}
func SetLogConf(level string) {
writer1 := &bytes.Buffer{}
writer2 := os.Stdout
writer3, err := os.OpenFile("/var/log/ua3f.log", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("create file ua3f.log failed: %v", err)
}
logrus.SetOutput(io.MultiWriter(writer1, writer2, writer3))
formatter := &uctFormatter{}
logrus.SetFormatter(formatter)
switch level {
case "trace":
logrus.SetLevel(logrus.TraceLevel)
case "debug":
logrus.SetLevel(logrus.DebugLevel)
case "info":
logrus.SetLevel(logrus.InfoLevel)
case "warn":
logrus.SetLevel(logrus.WarnLevel)
case "error":
logrus.SetLevel(logrus.ErrorLevel)
case "fatal":
logrus.SetLevel(logrus.FatalLevel)
case "panic":
logrus.SetLevel(logrus.PanicLevel)
default:
logrus.SetLevel(logrus.InfoLevel)
}
}

View File

@ -1,10 +0,0 @@
c193d47ab124a413aa0cad6134f5508a ./ua3f-0.0.4-386.tar.gz
37a300930fb0873390cf7b8ab2817f1b ./ua3f-0.0.4-amd64.tar.gz
f3a3d43b455df35179772d15cde3a291 ./ua3f-0.0.4-arm.tar.gz
6be6c6a6229e18592daec12623d4dbdb ./ua3f-0.0.4-arm64.tar.gz
6be6c6a6229e18592daec12623d4dbdb ./ua3f-0.0.4-armv8.tar.gz
89c18c10213a7d11d61a6a8366f22bef ./ua3f-0.0.4-mips64.tar.gz
4ebe443346a1492f593e2c62463173d9 ./ua3f-0.0.4-mipsle-hardfloat.tar.gz
05b0c57efd2d4574ac18d1315064c7bd ./ua3f-0.0.4-mipsle-softfloat.tar.gz
31204fa862df995c27319189b22e11a3 ./ua3f-0.0.4-mipsle.tar.gz
aa024d81e901e962b3038dd2b746e9e1 ./ua3f-0.0.4-riscv64.tar.gz

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -5,11 +5,11 @@ START=99
start() { start() {
echo "ua3f is starting" echo "ua3f is starting"
if id -u shellclash >/dev/null 2>&1; then if id -u shellclash >/dev/null 2>&1; then
sudo -u shellclash /root/ua3f >/var/log/ua3f.log 2>&1 & sudo -u shellclash /root/ua3f >/dev/null 2>&1 &
elif id -u nobody >/dev/null 2>&1; then elif id -u nobody >/dev/null 2>&1; then
sudo -u nobody /root/ua3f >/var/log/ua3f.log 2>&1 & sudo -u nobody /root/ua3f >/dev/null 2>&1 &
else else
/root/ua3f >/var/log/ua3f.log 2>&1 & /root/ua3f >/dev/null 2>&1 &
fi fi
} }