152 lines
4.8 KiB
Go
152 lines
4.8 KiB
Go
package main
|
|
|
|
import (
|
|
utils "anytunnel/at-common"
|
|
"fmt"
|
|
"net"
|
|
"time"
|
|
|
|
logger "github.com/snail007/mini-logger"
|
|
)
|
|
|
|
const SERVER_CONN_IDLE_MINUTES = 24 * 60
|
|
|
|
var (
|
|
control utils.Author
|
|
err error
|
|
serverListeners = NewListenerMap()
|
|
serverListenerConns = NewServerUserConnPool()
|
|
ipConnCounter IPConnCounter
|
|
)
|
|
|
|
func init() {
|
|
poster()
|
|
initConfig()
|
|
initLog()
|
|
ipConnCounter = NewIPConnCounter(cfg.GetInt("max"), 3600)
|
|
}
|
|
func main() {
|
|
defer func() {
|
|
e := recover()
|
|
if e != nil {
|
|
log.Errorf("Exit ERR:%s", e)
|
|
}
|
|
logger.Flush()
|
|
}()
|
|
control, err = utils.NewAuthor(cfg.GetString("token"), cfg.GetString("host"), cfg.GetInt("port.control"), utils.CSTYPE_SERVER)
|
|
if err != nil {
|
|
log.Debugf("create author fail : %s", err)
|
|
return
|
|
}
|
|
|
|
control.Channel.SetMsgErrorHandler(func(channel *utils.MessageChannel, msg interface{}, err error) {
|
|
log.Warnf("message pre-process error , ERRR:%s", err)
|
|
})
|
|
control.Channel.RegMsg(utils.MSG_SERVER_STATUS_PORT, new(utils.MsgServerStatusPort), func(channel *utils.MessageChannel, msg interface{}) {
|
|
msgServerStatusPort := msg.(*utils.MsgServerStatusPort)
|
|
log.Debugf("MSG_SERVER_STATUS_PORT revecived , TunnleID:%d", msgServerStatusPort.TunnelID)
|
|
var network, addr string
|
|
var ok bool
|
|
if msgServerStatusPort.Protocol == utils.TUNNEL_PROTOCOL_TCP {
|
|
var listener *net.Listener
|
|
listener, ok = serverListeners.Get(msgServerStatusPort.TunnelID)
|
|
network = (*listener).Addr().Network()
|
|
addr = (*listener).Addr().String()
|
|
} else {
|
|
var listener *net.UDPConn
|
|
listener, ok = serverListeners.GetUDP(msgServerStatusPort.TunnelID)
|
|
network = (*listener).LocalAddr().Network()
|
|
addr = (*listener).LocalAddr().String()
|
|
}
|
|
rmsg := ""
|
|
if !ok {
|
|
rmsg = "listener not exists"
|
|
utils.Response(channel, false, rmsg)
|
|
log.Debugf("Tunnle %d status fail ,err:%s", msgServerStatusPort.TunnelID, rmsg)
|
|
return
|
|
}
|
|
utils.Response(channel, true, fmt.Sprintf("%s:%s", network, addr))
|
|
log.Debugf("Tunnle %d status success", msgServerStatusPort.TunnelID)
|
|
return
|
|
})
|
|
|
|
control.Channel.RegMsg(utils.MSG_SERVER_CLOSE_PORT, new(utils.MsgServerClosePort), func(channel *utils.MessageChannel, msg interface{}) {
|
|
msgServerClosePort := msg.(*utils.MsgServerClosePort)
|
|
log.Debugf("MSG_SERVER_CLOSE_PORT revecived , TunnleID:%d", msgServerClosePort.TunnelID)
|
|
var ok bool
|
|
var err error
|
|
if msgServerClosePort.Protocol == utils.TUNNEL_PROTOCOL_TCP {
|
|
var listener *net.Listener
|
|
listener, ok = serverListeners.Get(msgServerClosePort.TunnelID)
|
|
if ok {
|
|
err = (*listener).Close()
|
|
}
|
|
} else {
|
|
var listener *net.UDPConn
|
|
listener, ok = serverListeners.GetUDP(msgServerClosePort.TunnelID)
|
|
if ok {
|
|
err = (*listener).Close()
|
|
}
|
|
}
|
|
rmsg := ""
|
|
if !ok {
|
|
rmsg = "listener not exists"
|
|
utils.Response(channel, false, rmsg)
|
|
log.Debugf("Tunnle %d closed fail ,err:%s", msgServerClosePort.TunnelID, rmsg)
|
|
return
|
|
}
|
|
if err != nil {
|
|
utils.Response(channel, false, err.Error())
|
|
log.Debugf("Tunnle %d closed fail ,err:%s", msgServerClosePort.TunnelID, err)
|
|
return
|
|
}
|
|
utils.Response(channel, true, "")
|
|
log.Debugf("Tunnle %d closed success", msgServerClosePort.TunnelID)
|
|
return
|
|
})
|
|
control.Channel.RegMsg(utils.MSG_SERVER_OPEN_PORT, new(utils.MsgServerOpenPort), func(channel *utils.MessageChannel, msg interface{}) {
|
|
msgServerOpenPort := msg.(*utils.MsgServerOpenPort)
|
|
//log.Debugf("MSG_SERVER_OPEN_PORT revecived [%s:%d], tunnleID : %d", msgServerOpenPort.BindIP, msgServerOpenPort.BindPort, msgServerOpenPort.TunnelID)
|
|
var ok bool
|
|
if msgServerOpenPort.Protocol == utils.TUNNEL_PROTOCOL_TCP {
|
|
_, ok = serverListeners.Get(msgServerOpenPort.TunnelID)
|
|
} else {
|
|
_, ok = serverListeners.GetUDP(msgServerOpenPort.TunnelID)
|
|
}
|
|
if ok {
|
|
serverListeners.Delete(msgServerOpenPort.TunnelID)
|
|
time.Sleep(time.Millisecond * 300)
|
|
}
|
|
var sc utils.ServerChannel
|
|
var err error
|
|
var addr net.Addr
|
|
if msgServerOpenPort.Protocol == utils.TUNNEL_PROTOCOL_TCP {
|
|
sc, err = openPort(*msgServerOpenPort)
|
|
addr = (*sc.Listener).Addr()
|
|
} else {
|
|
sc, err = openUDPPort(*msgServerOpenPort)
|
|
addr = (*sc.UDPListener).LocalAddr()
|
|
}
|
|
if err != nil {
|
|
log.Warnf("open %s port fail ,ERR:%s", msgServerOpenPort.ProtocolString(), err)
|
|
utils.Response(channel, false, err.Error())
|
|
return
|
|
}
|
|
utils.Response(channel, true, "")
|
|
log.Infof("open %s port success , info %s", msgServerOpenPort.ProtocolString(), addr)
|
|
return
|
|
})
|
|
control.Channel.DoServe(func(err error) {
|
|
//log.Fatalf("offline , disconnected from cluster , %s", err)
|
|
log.Fatalf("offline , disconnected from cluster")
|
|
})
|
|
err = control.DoControlAuth()
|
|
if err != nil {
|
|
log.Fatalf("login fail : %s", err)
|
|
return
|
|
}
|
|
//log.Infof("login success %s - %s", control.Channel.LocalAddr(), control.Channel.RemoteAddr())
|
|
log.Infof("login success")
|
|
select {}
|
|
}
|