diff --git a/.github/conf/.goreleaser.yml b/.github/conf/.goreleaser.yml index 0bc5137..ecd783f 100644 --- a/.github/conf/.goreleaser.yml +++ b/.github/conf/.goreleaser.yml @@ -5,7 +5,7 @@ builds: - binary: client env: - CGO_ENABLED=0 - main: ./main.go + main: ./cmd/main.go goos: - linux - windows diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 89059dd..97f41d0 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,5 +17,5 @@ jobs: with: go-version: 1.21 - name: Build - run: go build --ldflags "-s -w -X github.com/DVKunion/SeaMoon/pkg/consts.Version=${{github.ref_name}}" main.go + run: go build --ldflags "-s -w -X github.com/DVKunion/SeaMoon/pkg/consts.Version=${{github.ref_name}}" cmd/main.go diff --git a/Dockerfile b/Dockerfile index 11d4f21..08b6def 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,7 +5,7 @@ COPY .. /src WORKDIR /src ENV CGO_ENABLED 0 ENV VERSION=${VERSION} -RUN go build -ldflags "-X github.com/DVKunion/SeaMoon/server/consts.Version=${VERSION}" -o /tmp/seamoon main.go +RUN go build -ldflags "-X github.com/DVKunion/SeaMoon/server/consts.Version=${VERSION}" -o /tmp/seamoon cmd/main.go RUN chmod +x /tmp/seamoon # run stage FROM alpine:3.19 diff --git a/pkg/client/client.go b/cmd/client/client.go similarity index 84% rename from pkg/client/client.go rename to cmd/client/client.go index 7e736b6..2283056 100644 --- a/pkg/client/client.go +++ b/cmd/client/client.go @@ -1,39 +1,27 @@ package client import ( - "bufio" "context" "html/template" "io" "log/slog" - "net" "net/http" "os" "github.com/gin-gonic/gin" - "github.com/DVKunion/SeaMoon/pkg/consts" - "github.com/DVKunion/SeaMoon/static" - _ "net/http/pprof" -) - -type Client struct { - net.Conn - br *bufio.Reader -} -func (c *Client) Read(b []byte) (int, error) { - return c.br.Read(b) -} + "github.com/DVKunion/SeaMoon/cmd/client/static" + "github.com/DVKunion/SeaMoon/pkg/consts" +) func Serve(ctx context.Context, verbose bool, debug bool) { ctx, cancel := context.WithCancel(ctx) defer cancel() sg := NewSigGroup() - go Controller(sg, verbose, debug) - go HttpController(ctx, sg) - go Socks5Controller(ctx, sg) + go API(sg, verbose, debug) + go Control(ctx, sg) Config().Load(sg) <-sg.WatchChannel @@ -44,7 +32,7 @@ func Serve(ctx context.Context, verbose bool, debug bool) { sg.wg.Wait() } -func Controller(sg *SigGroup, verbose bool, debug bool) { +func API(sg *SigGroup, verbose bool, debug bool) { slog.Info(consts.CONTROLLER_START, "addr", Config().Control.ConfigAddr) if consts.Version != "dev" || !debug { diff --git a/pkg/client/config.go b/cmd/client/config.go similarity index 88% rename from pkg/client/config.go rename to cmd/client/config.go index 5fa836e..419bb34 100644 --- a/pkg/client/config.go +++ b/cmd/client/config.go @@ -8,6 +8,7 @@ import ( "github.com/BurntSushi/toml" "github.com/DVKunion/SeaMoon/pkg/consts" + "github.com/DVKunion/SeaMoon/pkg/transfer" ) type clientConfig struct { @@ -17,6 +18,16 @@ type clientConfig struct { Socks5 proxyConfig `toml:"socks5"` } +func (c *clientConfig) Addr(t transfer.Type) string { + switch t { + case transfer.HTTP: + return c.Http.ListenAddr + case transfer.SOCKS5: + return c.Socks5.ListenAddr + } + return "" +} + type controlConfig struct { ConfigAddr string `toml:"addr"` LogPath string `toml:"logPath"` diff --git a/cmd/client/control.go b/cmd/client/control.go new file mode 100644 index 0000000..a0bab28 --- /dev/null +++ b/cmd/client/control.go @@ -0,0 +1,83 @@ +package client + +import ( + "context" + "errors" + "log/slog" + "net" + "strings" + + "github.com/DVKunion/SeaMoon/pkg/consts" + "github.com/DVKunion/SeaMoon/pkg/network" + "github.com/DVKunion/SeaMoon/pkg/service" + "github.com/DVKunion/SeaMoon/pkg/transfer" + "github.com/DVKunion/SeaMoon/pkg/tunnel" +) + +func Control(ctx context.Context, sg *SigGroup) { + c, cancel := context.WithCancel(ctx) + defer cancel() + for { + select { + case t := <-sg.StartChannel: + slog.Info(consts.LISTEN_START, "type", t) + sg.wg.Add(1) + go func() { + if err := doListen(c, t); err != nil { + slog.Error(consts.LISTEN_ERROR, "type", t, "err", err) + } + }() + sg.wg.Done() + case t := <-sg.StopChannel: + slog.Info(consts.LISTEN_STOP, "type", t) + cancel() + } + } +} + +func doListen(ctx context.Context, t transfer.Type) error { + server, err := net.Listen("tcp", Config().Addr(t)) + if err != nil { + return err + } + var proxyAddr string + var proxyType tunnel.Type + for _, p := range Config().ProxyAddr { + if strings.HasPrefix(p, "ws://") { + proxyAddr = strings.TrimPrefix(p, "ws://") + proxyType = tunnel.WST + break + } + if strings.HasPrefix(p, "grpc://") { + proxyAddr = p + proxyType = tunnel.GRT + break + } + } + if proxyAddr == "" || proxyType == "" { + return errors.New(consts.PROXY_ADDR_ERROR) + } + go listen(ctx, server, proxyAddr, proxyType, t) + <-ctx.Done() + return nil +} + +func listen(ctx context.Context, server net.Listener, pa string, pt tunnel.Type, t transfer.Type) { + defer server.Close() + for { + conn, err := server.Accept() + if err != nil { + slog.Error(consts.ACCEPT_ERROR, "err", err) + } + if srv, ok := service.Factory[pt]; ok { + destConn, err := srv.Conn(ctx, t, service.WithAddr(pa)) + if err != nil { + slog.Error(consts.CONNECT_RMOET_ERROR, "err", err) + continue + } + if err := network.Transport(conn, destConn); err != nil { + slog.Error(consts.CONNECT_TRANS_ERROR, "err", err) + } + } + } +} diff --git a/pkg/client/signal.go b/cmd/client/signal.go similarity index 66% rename from pkg/client/signal.go rename to cmd/client/signal.go index 2687017..e3b11bd 100644 --- a/pkg/client/signal.go +++ b/cmd/client/signal.go @@ -5,34 +5,23 @@ import ( "os/signal" "sync" "syscall" -) - -type ControlSignal int8 -const ( - HttpProxyStartSignal ControlSignal = iota + 1 - HttpProxyStopSignal - SocksProxyStartSignal - SocksProxyStopSignal + "github.com/DVKunion/SeaMoon/pkg/transfer" ) type SigGroup struct { - wg *sync.WaitGroup - WatchChannel chan os.Signal - HttpStartChannel chan ControlSignal - HttpStopChannel chan ControlSignal - SocksStartChannel chan ControlSignal - SocksStopChannel chan ControlSignal + wg *sync.WaitGroup + WatchChannel chan os.Signal + StartChannel chan transfer.Type + StopChannel chan transfer.Type } func NewSigGroup() *SigGroup { sg := &SigGroup{ new(sync.WaitGroup), make(chan os.Signal, 1), - make(chan ControlSignal, 1), - make(chan ControlSignal, 1), - make(chan ControlSignal, 1), - make(chan ControlSignal, 1), + make(chan transfer.Type, 1), + make(chan transfer.Type, 1), } signal.Notify(sg.WatchChannel, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) return sg @@ -42,7 +31,7 @@ func (sg *SigGroup) StartHttpProxy() { if Config().Http.Status == "active" { return } - sg.HttpStartChannel <- HttpProxyStartSignal + sg.StartChannel <- transfer.HTTP Config().Http.Status = "active" } @@ -50,7 +39,7 @@ func (sg *SigGroup) StopHttpProxy() { if Config().Http.Status == "inactive" { return } - sg.HttpStopChannel <- HttpProxyStopSignal + sg.StopChannel <- transfer.HTTP Config().Http.Status = "inactive" } @@ -58,7 +47,7 @@ func (sg *SigGroup) StartSocksProxy() { if Config().Socks5.Status == "active" { return } - sg.SocksStartChannel <- SocksProxyStartSignal + sg.StartChannel <- transfer.SOCKS5 Config().Socks5.Status = "active" } @@ -66,7 +55,7 @@ func (sg *SigGroup) StopSocksProxy() { if Config().Socks5.Status == "inactive" { return } - sg.SocksStopChannel <- SocksProxyStopSignal + sg.StopChannel <- transfer.SOCKS5 Config().Socks5.Status = "inactive" } diff --git a/static/embed.go b/cmd/client/static/embed.go similarity index 100% rename from static/embed.go rename to cmd/client/static/embed.go diff --git a/static/public/css/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2 b/cmd/client/static/public/css/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2 similarity index 100% rename from static/public/css/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2 rename to cmd/client/static/public/css/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2 diff --git a/static/public/css/S6uyw4BMUTPHjx4wXiWtFCc.woff2 b/cmd/client/static/public/css/S6uyw4BMUTPHjx4wXiWtFCc.woff2 similarity index 100% rename from static/public/css/S6uyw4BMUTPHjx4wXiWtFCc.woff2 rename to cmd/client/static/public/css/S6uyw4BMUTPHjx4wXiWtFCc.woff2 diff --git a/static/public/css/brand-icons.eot b/cmd/client/static/public/css/brand-icons.eot similarity index 100% rename from static/public/css/brand-icons.eot rename to cmd/client/static/public/css/brand-icons.eot diff --git a/static/public/css/brand-icons.svg b/cmd/client/static/public/css/brand-icons.svg similarity index 100% rename from static/public/css/brand-icons.svg rename to cmd/client/static/public/css/brand-icons.svg diff --git a/static/public/css/brand-icons.ttf b/cmd/client/static/public/css/brand-icons.ttf similarity index 100% rename from static/public/css/brand-icons.ttf rename to cmd/client/static/public/css/brand-icons.ttf diff --git a/static/public/css/brand-icons.woff b/cmd/client/static/public/css/brand-icons.woff similarity index 100% rename from static/public/css/brand-icons.woff rename to cmd/client/static/public/css/brand-icons.woff diff --git a/static/public/css/brand-icons.woff2 b/cmd/client/static/public/css/brand-icons.woff2 similarity index 100% rename from static/public/css/brand-icons.woff2 rename to cmd/client/static/public/css/brand-icons.woff2 diff --git a/static/public/css/font.css b/cmd/client/static/public/css/font.css similarity index 94% rename from static/public/css/font.css rename to cmd/client/static/public/css/font.css index 1147a47..201796a 100644 --- a/static/public/css/font.css +++ b/cmd/client/static/public/css/font.css @@ -3,7 +3,7 @@ font-family: 'Lato'; font-style: normal; font-weight: 400; - src: url(/static/public/css/S6uyw4BMUTPHjx4wXiWtFCc.woff2) format('woff2'); + src: url(S6uyw4BMUTPHjx4wXiWtFCc.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } @@ -12,7 +12,7 @@ font-family: 'Lato'; font-style: normal; font-weight: 700; - src: url(/static/public/css/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2) format('woff2'); + src: url(S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } diff --git a/static/public/css/icon.min.css b/cmd/client/static/public/css/icon.min.css similarity index 100% rename from static/public/css/icon.min.css rename to cmd/client/static/public/css/icon.min.css diff --git a/static/public/css/icons.eot b/cmd/client/static/public/css/icons.eot similarity index 100% rename from static/public/css/icons.eot rename to cmd/client/static/public/css/icons.eot diff --git a/static/public/css/icons.otf b/cmd/client/static/public/css/icons.otf similarity index 100% rename from static/public/css/icons.otf rename to cmd/client/static/public/css/icons.otf diff --git a/static/public/css/icons.svg b/cmd/client/static/public/css/icons.svg similarity index 100% rename from static/public/css/icons.svg rename to cmd/client/static/public/css/icons.svg diff --git a/static/public/css/icons.ttf b/cmd/client/static/public/css/icons.ttf similarity index 100% rename from static/public/css/icons.ttf rename to cmd/client/static/public/css/icons.ttf diff --git a/static/public/css/icons.woff b/cmd/client/static/public/css/icons.woff similarity index 100% rename from static/public/css/icons.woff rename to cmd/client/static/public/css/icons.woff diff --git a/static/public/css/icons.woff2 b/cmd/client/static/public/css/icons.woff2 similarity index 100% rename from static/public/css/icons.woff2 rename to cmd/client/static/public/css/icons.woff2 diff --git a/static/public/css/index.css b/cmd/client/static/public/css/index.css similarity index 100% rename from static/public/css/index.css rename to cmd/client/static/public/css/index.css diff --git a/static/public/css/outline-icons.eot b/cmd/client/static/public/css/outline-icons.eot similarity index 100% rename from static/public/css/outline-icons.eot rename to cmd/client/static/public/css/outline-icons.eot diff --git a/static/public/css/outline-icons.svg b/cmd/client/static/public/css/outline-icons.svg similarity index 100% rename from static/public/css/outline-icons.svg rename to cmd/client/static/public/css/outline-icons.svg diff --git a/static/public/css/outline-icons.ttf b/cmd/client/static/public/css/outline-icons.ttf similarity index 100% rename from static/public/css/outline-icons.ttf rename to cmd/client/static/public/css/outline-icons.ttf diff --git a/static/public/css/outline-icons.woff b/cmd/client/static/public/css/outline-icons.woff similarity index 100% rename from static/public/css/outline-icons.woff rename to cmd/client/static/public/css/outline-icons.woff diff --git a/static/public/css/outline-icons.woff2 b/cmd/client/static/public/css/outline-icons.woff2 similarity index 100% rename from static/public/css/outline-icons.woff2 rename to cmd/client/static/public/css/outline-icons.woff2 diff --git a/static/public/css/semantic.min.css b/cmd/client/static/public/css/semantic.min.css similarity index 100% rename from static/public/css/semantic.min.css rename to cmd/client/static/public/css/semantic.min.css diff --git a/static/public/img/favicon.ico b/cmd/client/static/public/img/favicon.ico similarity index 100% rename from static/public/img/favicon.ico rename to cmd/client/static/public/img/favicon.ico diff --git a/static/public/img/logo.png b/cmd/client/static/public/img/logo.png similarity index 100% rename from static/public/img/logo.png rename to cmd/client/static/public/img/logo.png diff --git a/static/public/js/index.js b/cmd/client/static/public/js/index.js similarity index 100% rename from static/public/js/index.js rename to cmd/client/static/public/js/index.js diff --git a/static/public/js/jquery-3.1.1.min.js b/cmd/client/static/public/js/jquery-3.1.1.min.js similarity index 100% rename from static/public/js/jquery-3.1.1.min.js rename to cmd/client/static/public/js/jquery-3.1.1.min.js diff --git a/static/public/js/semantic.min.js b/cmd/client/static/public/js/semantic.min.js similarity index 100% rename from static/public/js/semantic.min.js rename to cmd/client/static/public/js/semantic.min.js diff --git a/static/templates/index.html b/cmd/client/static/templates/index.html similarity index 95% rename from static/templates/index.html rename to cmd/client/static/templates/index.html index 8a2cd60..d650455 100644 --- a/static/templates/index.html +++ b/cmd/client/static/templates/index.html @@ -119,12 +119,12 @@