add config

This commit is contained in:
ginuerzh
2021-10-29 13:35:44 +08:00
parent 3351aa5974
commit 16ddfba1d1
36 changed files with 1024 additions and 207 deletions

80
cmd/gost/config.go Normal file
View File

@ -0,0 +1,80 @@
package main
import (
"github.com/go-gost/gost/pkg/chain"
"github.com/go-gost/gost/pkg/components/connector"
"github.com/go-gost/gost/pkg/components/dialer"
"github.com/go-gost/gost/pkg/components/handler"
"github.com/go-gost/gost/pkg/components/listener"
"github.com/go-gost/gost/pkg/config"
"github.com/go-gost/gost/pkg/registry"
"github.com/go-gost/gost/pkg/service"
)
func buildService(cfg *config.Config) (services []*service.Service) {
if cfg == nil || len(cfg.Services) == 0 {
return
}
chains := buildChain(cfg)
for _, svc := range cfg.Services {
s := &service.Service{}
ln := registry.GetListener(svc.Listener.Type)(listener.AddrOption(svc.Addr))
ln.Init(listener.Metadata(svc.Listener.Metadata))
s.WithListener(ln)
var chain *chain.Chain
for _, ch := range chains {
if svc.Chain == ch.Name {
chain = ch
break
}
}
h := registry.GetHandler(svc.Handler.Type)(handler.ChainOption(chain))
h.Init(handler.Metadata(svc.Handler.Metadata))
s.WithHandler(h)
services = append(services, s)
}
return
}
func buildChain(cfg *config.Config) (chains []*chain.Chain) {
if cfg == nil || len(cfg.Chains) == 0 {
return nil
}
for _, ch := range cfg.Chains {
c := &chain.Chain{
Name: ch.Name,
}
for _, hop := range ch.Hops {
group := &chain.NodeGroup{}
for _, v := range hop.Nodes {
node := chain.NewNode(v.Name, v.Addr)
tr := &chain.Transport{}
cr := registry.GetConnector(v.Connector.Type)()
cr.Init(connector.Metadata(v.Connector.Metadata))
tr.WithConnector(cr)
d := registry.GetDialer(v.Dialer.Type)()
d.Init(dialer.Metadata(v.Dialer.Metadata))
tr.WithDialer(d)
node.WithTransport(tr)
group.AddNode(node)
}
c.AddNodeGroup(group)
}
chains = append(chains, c)
}
return
}

48
cmd/gost/gost.yml Normal file
View File

@ -0,0 +1,48 @@
log:
level: info # debug, info, warn, error, fatal
format: text # text, json
services:
- url: "http://gost:gost@:8000"
addr: ":8000"
handler:
type: http
metadata:
proxyAgent: "gost/3.0"
listener:
type: tcp
metadata:
keepAlive: 15s
username: gost
password: gost
chain: chain01
chains:
- name: chain01
# chain level load balancing
lb:
strategy: round
filters:
- filter1
hops:
- name: level01
# hop level load balancing
lb:
strategy: rand
filters:
- filter1
nodes:
- name: node01
addr: ":8080"
url: "http://gost:gost@:8080"
connector:
type: http
metadata:
userAgent: "gost/3.0"
username: gost
password: gost
dialer:
type: tcp
metadata: {}

View File

@ -1,99 +1,22 @@
package main
import (
"bufio"
"log"
"net/http"
"net/http/httputil"
"time"
"github.com/go-gost/gost/pkg/chain"
"github.com/go-gost/gost/pkg/components/connector"
httpc "github.com/go-gost/gost/pkg/components/connector/http"
tcpd "github.com/go-gost/gost/pkg/components/dialer/tcp"
"github.com/go-gost/gost/pkg/components/handler"
httph "github.com/go-gost/gost/pkg/components/handler/http"
"github.com/go-gost/gost/pkg/components/listener"
tcpl "github.com/go-gost/gost/pkg/components/listener/tcp"
"github.com/go-gost/gost/pkg/service"
"golang.org/x/net/context"
"github.com/go-gost/gost/pkg/config"
"github.com/go-gost/gost/pkg/logger"
)
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
log := logger.NewLogger("main")
log.EnableJSONOutput(true)
testChain()
testHTTPHandler()
}
func testHTTPHandler() {
ln := tcpl.NewListener()
if err := ln.Init(listener.Metadata{
"addr": ":1080",
}); err != nil {
log.Fatal(err)
}
chain := createChain()
h := httph.NewHandler(
handler.ChainOption(chain),
)
svc := (&service.Service{}).
WithListener(ln).
WithHandler(h)
log.Fatal(svc.Run())
}
func createChain() *chain.Chain {
c := httpc.NewConnector()
c.Init(connector.Metadata{
//"userAgent": "gost-client-3",
"username": "admin",
"password": "123456",
})
tr := (&chain.Transport{}).
WithDialer(tcpd.NewDialer()).
WithConnector(c)
node := chain.NewNode("local", "localhost:8080").
WithTransport(tr)
ch := &chain.Chain{}
ch.AddNodeGroup(chain.NewNodeGroup(node))
return ch
}
func testChain() {
chain := createChain()
r := chain.GetRoute()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
conn, err := r.Dial(ctx, "tcp", "www.google.com:80")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
log.Println(conn.LocalAddr(), conn.RemoteAddr())
req, err := http.NewRequest("GET", "http://www.google.com", nil)
if err != nil {
log.Fatal(err)
}
if err := req.Write(conn); err != nil {
log.Fatal(err)
}
data, _ := httputil.DumpRequest(req, true)
log.Println(string(data))
resp, err := http.ReadResponse(bufio.NewReader(conn), req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
data, _ = httputil.DumpResponse(resp, true)
log.Println(string(data))
cfg := &config.Config{}
if err := cfg.Load(); err != nil {
log.Fatal(err)
}
services := buildService(cfg)
for _, svc := range services {
go svc.Run()
}
select {}
}

30
cmd/gost/register.go Normal file
View File

@ -0,0 +1,30 @@
package main
import (
// Register connectors
_ "github.com/go-gost/gost/pkg/components/connector/http"
_ "github.com/go-gost/gost/pkg/components/connector/ss"
// Register dialers
_ "github.com/go-gost/gost/pkg/components/dialer/tcp"
// Register handlers
_ "github.com/go-gost/gost/pkg/components/handler/http"
_ "github.com/go-gost/gost/pkg/components/handler/ss"
_ "github.com/go-gost/gost/pkg/components/handler/ssu"
// Register listeners
_ "github.com/go-gost/gost/pkg/components/listener/ftcp"
_ "github.com/go-gost/gost/pkg/components/listener/http2"
_ "github.com/go-gost/gost/pkg/components/listener/http2/h2"
_ "github.com/go-gost/gost/pkg/components/listener/kcp"
_ "github.com/go-gost/gost/pkg/components/listener/obfs/http"
_ "github.com/go-gost/gost/pkg/components/listener/obfs/tls"
_ "github.com/go-gost/gost/pkg/components/listener/quic"
_ "github.com/go-gost/gost/pkg/components/listener/tcp"
_ "github.com/go-gost/gost/pkg/components/listener/tls"
_ "github.com/go-gost/gost/pkg/components/listener/tls/mux"
_ "github.com/go-gost/gost/pkg/components/listener/udp"
_ "github.com/go-gost/gost/pkg/components/listener/ws"
_ "github.com/go-gost/gost/pkg/components/listener/ws/mux"
)