mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-12-30 01:37:04 +08:00
临时提交
This commit is contained in:
81
internal/nodes/listener.go
Normal file
81
internal/nodes/listener.go
Normal file
@@ -0,0 +1,81 @@
|
||||
package nodes
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type Listener struct {
|
||||
group *configs.ServerGroup
|
||||
locker sync.RWMutex
|
||||
}
|
||||
|
||||
func NewListener() *Listener {
|
||||
return &Listener{}
|
||||
}
|
||||
|
||||
func (this *Listener) Reload(group *configs.ServerGroup) {
|
||||
this.locker.Lock()
|
||||
defer this.locker.Unlock()
|
||||
this.group = group
|
||||
}
|
||||
|
||||
func (this *Listener) FullAddr() string {
|
||||
if this.group != nil {
|
||||
return this.group.FullAddr()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func (this *Listener) Listen() error {
|
||||
if this.group == nil {
|
||||
return nil
|
||||
}
|
||||
protocol := this.group.Protocol()
|
||||
switch protocol {
|
||||
case configs.ProtocolHTTP:
|
||||
return this.listenHTTP()
|
||||
case configs.ProtocolHTTPS:
|
||||
return this.ListenHTTPS()
|
||||
case configs.ProtocolTCP:
|
||||
return this.listenTCP()
|
||||
case configs.ProtocolTLS:
|
||||
return this.listenTLS()
|
||||
case configs.ProtocolUnix:
|
||||
return this.listenUnix()
|
||||
case configs.ProtocolUDP:
|
||||
return this.listenUDP()
|
||||
default:
|
||||
return errors.New("unknown protocol '" + protocol + "'")
|
||||
}
|
||||
}
|
||||
|
||||
func (this *Listener) Close() error {
|
||||
// TODO 需要实现
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) listenHTTP() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) ListenHTTPS() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) listenTCP() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) listenTLS() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) listenUnix() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (this *Listener) listenUDP() error {
|
||||
return nil
|
||||
}
|
||||
63
internal/nodes/listener_manager.go
Normal file
63
internal/nodes/listener_manager.go
Normal file
@@ -0,0 +1,63 @@
|
||||
package nodes
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
||||
"github.com/iwind/TeaGo/lists"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
"sync"
|
||||
)
|
||||
|
||||
var sharedListenerManager = NewListenerManager()
|
||||
|
||||
type ListenerManager struct {
|
||||
listenersMap map[string]*Listener // addr => *Listener
|
||||
locker sync.Mutex
|
||||
}
|
||||
|
||||
func NewListenerManager() *ListenerManager {
|
||||
return &ListenerManager{
|
||||
listenersMap: map[string]*Listener{},
|
||||
}
|
||||
}
|
||||
|
||||
func (this *ListenerManager) Start(node *configs.NodeConfig) error {
|
||||
this.locker.Lock()
|
||||
defer this.locker.Unlock()
|
||||
|
||||
// 所有的新地址
|
||||
groupAddrs := []string{}
|
||||
for _, group := range node.AvailableGroups() {
|
||||
addr := group.FullAddr()
|
||||
groupAddrs = append(groupAddrs, addr)
|
||||
}
|
||||
|
||||
// 停掉老的
|
||||
for _, listener := range this.listenersMap {
|
||||
addr := listener.FullAddr()
|
||||
if !lists.ContainsString(groupAddrs, addr) {
|
||||
logs.Println("[LISTENER_MANAGER]close '" + addr + "'")
|
||||
_ = listener.Close()
|
||||
}
|
||||
}
|
||||
|
||||
// 启动新的或修改老的
|
||||
for _, group := range node.AvailableGroups() {
|
||||
addr := group.FullAddr()
|
||||
listener, ok := this.listenersMap[addr]
|
||||
if ok {
|
||||
logs.Println("[LISTENER_MANAGER]reload '" + addr + "'")
|
||||
listener.Reload(group)
|
||||
} else {
|
||||
logs.Println("[LISTENER_MANAGER]listen '" + addr + "'")
|
||||
listener = NewListener()
|
||||
listener.Reload(group)
|
||||
err := listener.Listen()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
this.listenersMap[addr] = listener
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
55
internal/nodes/listener_manager_test.go
Normal file
55
internal/nodes/listener_manager_test.go
Normal file
@@ -0,0 +1,55 @@
|
||||
package nodes
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestListenerManager_Listen(t *testing.T) {
|
||||
manager := NewListenerManager()
|
||||
err := manager.Start(&configs.NodeConfig{
|
||||
Servers: []*configs.ServerConfig{
|
||||
{
|
||||
IsOn: true,
|
||||
HTTP: &configs.HTTPProtocolConfig{
|
||||
IsOn: true,
|
||||
Listen: []string{"127.0.0.1:1234"},
|
||||
},
|
||||
},
|
||||
{
|
||||
IsOn: true,
|
||||
HTTP: &configs.HTTPProtocolConfig{
|
||||
IsOn: true,
|
||||
Listen: []string{"127.0.0.1:1235"},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = manager.Start(&configs.NodeConfig{
|
||||
Servers: []*configs.ServerConfig{
|
||||
{
|
||||
IsOn: true,
|
||||
HTTP: &configs.HTTPProtocolConfig{
|
||||
IsOn: true,
|
||||
Listen: []string{"127.0.0.1:1234"},
|
||||
},
|
||||
},
|
||||
{
|
||||
IsOn: true,
|
||||
HTTP: &configs.HTTPProtocolConfig{
|
||||
IsOn: true,
|
||||
Listen: []string{"127.0.0.1:1236"},
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
t.Log("all ok")
|
||||
}
|
||||
26
internal/nodes/node.go
Normal file
26
internal/nodes/node.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package nodes
|
||||
|
||||
import (
|
||||
"github.com/TeaOSLab/EdgeNode/internal/configs"
|
||||
"github.com/iwind/TeaGo/logs"
|
||||
)
|
||||
|
||||
var sharedNodeConfig *configs.NodeConfig = nil
|
||||
|
||||
type Node struct {
|
||||
}
|
||||
|
||||
func NewNode() *Node {
|
||||
return &Node{}
|
||||
}
|
||||
|
||||
func (this *Node) Start() {
|
||||
nodeConfig, err := configs.SharedNodeConfig()
|
||||
if err != nil {
|
||||
logs.Println("[NODE]start failed: read node config failed: " + err.Error())
|
||||
return
|
||||
}
|
||||
sharedNodeConfig = nodeConfig
|
||||
|
||||
logs.PrintAsJSON(nodeConfig)
|
||||
}
|
||||
11
internal/nodes/node_test.go
Normal file
11
internal/nodes/node_test.go
Normal file
@@ -0,0 +1,11 @@
|
||||
package nodes
|
||||
|
||||
import (
|
||||
_ "github.com/iwind/TeaGo/bootstrap"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestNode(t *testing.T) {
|
||||
node := NewNode()
|
||||
node.Start()
|
||||
}
|
||||
4
internal/nodes/origin_server.go
Normal file
4
internal/nodes/origin_server.go
Normal file
@@ -0,0 +1,4 @@
|
||||
package nodes
|
||||
|
||||
type OriginServer struct {
|
||||
}
|
||||
4
internal/nodes/request.go
Normal file
4
internal/nodes/request.go
Normal file
@@ -0,0 +1,4 @@
|
||||
package nodes
|
||||
|
||||
type Request struct {
|
||||
}
|
||||
Reference in New Issue
Block a user