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
- `-f <UA>`: 自定义 UA默认 FFF
- `-b <bind addr>`: 自定义绑定监听地址,默认 127.0.0.1
- `-l <log level>`: 日志等级,默认 info可选debug
默认日志位置:`/var/log/ua3f.log`
### 手动启动
```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
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/*
mkdir -p $release_dir
@ -14,15 +15,15 @@ gofmt -w ./
for goarch in "amd64" "arm" "arm64" "mipsle" "mips64" "riscv64" "386"; do
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
rm -f $obj_name
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
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
rm -f $obj_name

View File

@ -6,37 +6,39 @@ import (
"flag"
"fmt"
"io"
"log/syslog"
"net"
"strings"
"time"
"ua3f/http"
"ua3f/log"
"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 cache *expirable.LRU[string, string]
func main() {
var payload string
var addr string
var port int
var loglevel string
flag.StringVar(&addr, "b", "127.0.0.1", "bind address (default: 127.0.0.1)")
flag.IntVar(&port, "p", 1080, "port")
flag.StringVar(&payload, "f", "FFF", "User-Agent")
flag.StringVar(&loglevel, "l", "info", "Log level (default: info)")
flag.Parse()
logger, err := syslog.Dial("", "", syslog.LOG_INFO, "UA3F")
if err != nil {
fmt.Println("syslog error:", err)
return
}
log.SetLogConf(loglevel)
printAndLog("UA3F v"+version, logger, syslog.LOG_INFO)
printAndLog(fmt.Sprintf("Port: %d", port), logger, syslog.LOG_INFO)
printAndLog(fmt.Sprintf("User-Agent: %s", payload), logger, syslog.LOG_INFO)
logrus.Info("UA3F v" + version)
logrus.Info(fmt.Sprintf("Port: %d", port))
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)
@ -44,32 +46,30 @@ func main() {
server, err := net.Listen("tcp", fmt.Sprintf("%s:%d", addr, port))
if err != nil {
printAndLog(fmt.Sprintf("Listen failed: %v", err), logger, syslog.LOG_ERR)
logrus.Fatal("Listen failed: ", err)
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 {
client, err := server.Accept()
if err != nil {
printAndLog(fmt.Sprintf("Accept failed: %v", err), logger, syslog.LOG_ERR)
logrus.Error("Accept failed: ", err)
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)
}
}
func process(client net.Conn) {
logger, _ := syslog.Dial("", "", syslog.LOG_INFO, "UA3F")
if err := Socks5Auth(client); err != nil {
printAndLog(fmt.Sprintf("auth error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("Auth failed: ", err)
client.Close()
return
}
target, err := Socks5Connect(client)
if err != nil {
printAndLog(fmt.Sprintf("connect error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("Connect failed: ", err)
client.Close()
return
}
@ -171,11 +171,10 @@ func Socks5Forward(client, target net.Conn) {
}
func CopyPileline(dst io.Writer, src io.Reader) {
logger, _ := syslog.Dial("", "", syslog.LOG_INFO, "UA3F")
buf := make([]byte, 1024*8)
nr, err := src.Read(buf)
if err != nil && err != io.EOF {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("read error: ", err)
return
}
hint := string(buf[0:7])
@ -194,13 +193,13 @@ func CopyPileline(dst io.Writer, src io.Reader) {
return
}
for {
parser := NewHTTPParser()
parser := http.NewHTTPParser()
httpBodyOffset, err := parser.Parse(buf[0:nr])
for err == ErrMissingData {
for err == http.ErrMissingData {
var m int
m, err = src.Read(buf[nr:])
if err != nil {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("read error: ", err)
break
}
nr += m
@ -208,7 +207,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
}
value, start, end := parser.FindHeader([]byte("User-Agent"))
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++ {
buf[i] = 32
}
@ -219,7 +218,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
buf[start+i] = payloadByte[i]
}
} 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])
io.Copy(dst, src)
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)])
if ew != nil {
printAndLog(fmt.Sprintf("write error: %v", ew), logger, syslog.LOG_ERR)
logrus.Error("write error: ", ew)
break
}
if httpBodyOffset+bodyLen > nr {
@ -240,12 +239,12 @@ func CopyPileline(dst io.Writer, src io.Reader) {
for left > 0 {
m, err := src.Read(buf[0:left])
if err != nil {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("read error: ", err)
break
}
_, ew := dst.Write(buf[0:m])
if ew != nil {
printAndLog(fmt.Sprintf("write error: %v", ew), logger, syslog.LOG_ERR)
logrus.Error("write error: ", ew)
break
}
left -= m
@ -261,7 +260,7 @@ func CopyPileline(dst io.Writer, src io.Reader) {
m, err := src.Read(buf[nr:])
nr += m
if err != nil && err != io.EOF {
printAndLog(fmt.Sprintf("read error: %v", err), logger, syslog.LOG_ERR)
logrus.Error("read error: ", err)
break
}
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
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/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 (
"bytes"

View File

@ -16,13 +16,14 @@ getcpucore() {
cd /root
getcpucore
version=0.0.4
version=0.1.0
ua3f_tar=ua3f-$version-$cpucore.tar.gz
if [ -f "ua3f" ]; then
rm "ua3f"
fi
chmod ugo+w /var/log
if [ -f "/var/log/ua3f.log" ]; then
rm "/var/log/ua3f.log"
fi
@ -31,7 +32,7 @@ if [ -f "$ua3f_tar" ]; then
rm "$ua3f_tar"
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
echo "Download UA3F Failed, Please Retry."
exit 1
@ -42,7 +43,7 @@ chmod +x ua3f
if [ -f "ua3f.service" ]; then
rm "ua3f.service"
fi
wget https://fastly.jsdelivr.net/gh/SunBK201/UA3F@master/ua3f.service
wget https://blog.sunbk201.site/cdn/ua3f.service
if [ $? -ne 0 ]; then
echo "Download ua3f.service Failed, Please Retry."
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() {
echo "ua3f is starting"
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
sudo -u nobody /root/ua3f >/var/log/ua3f.log 2>&1 &
sudo -u nobody /root/ua3f >/dev/null 2>&1 &
else
/root/ua3f >/var/log/ua3f.log 2>&1 &
/root/ua3f >/dev/null 2>&1 &
fi
}