add config
This commit is contained in:
80
cmd/gost/config.go
Normal file
80
cmd/gost/config.go
Normal 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
48
cmd/gost/gost.yml
Normal 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: {}
|
||||
|
||||
|
105
cmd/gost/main.go
105
cmd/gost/main.go
@ -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
30
cmd/gost/register.go
Normal 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"
|
||||
)
|
Reference in New Issue
Block a user