pupy/services/proxy/daemon.go

177 lines
3.7 KiB
Go
Raw Normal View History

2018-01-29 15:41:53 +00:00
package main
import (
2018-01-30 13:44:55 +00:00
"crypto/tls"
2018-01-29 15:41:53 +00:00
"net"
"net/http"
2018-01-30 18:11:54 +00:00
"time"
"sync/atomic"
2018-01-30 14:58:30 +00:00
log "github.com/sirupsen/logrus"
2018-01-29 15:41:53 +00:00
)
func NewDaemon(addr string) *Daemon {
return &Daemon{
Addr: addr,
Listeners: make(map[int]*Listener),
}
}
func (d *Daemon) ListenAndServe() error {
listener, err := net.Listen("tcp", d.Addr)
if err != nil {
2018-01-30 14:58:30 +00:00
log.Error("Listen error: ", err)
2018-01-29 15:41:53 +00:00
return err
}
for {
conn, err := listener.Accept()
2018-01-30 14:58:30 +00:00
log.Debug("HANDLE INCOMING CONNECTION")
2018-01-29 15:41:53 +00:00
if err != nil {
2018-01-30 14:58:30 +00:00
log.Error("Accept error: ", err)
2018-01-29 15:41:53 +00:00
return err
}
2018-01-30 18:35:39 +00:00
conn.(*net.TCPConn).SetKeepAlive(true)
conn.(*net.TCPConn).SetKeepAlivePeriod(1 * time.Minute)
conn.(*net.TCPConn).SetNoDelay(true)
conn = tls.Server(conn, ListenerConfig)
2018-01-29 15:41:53 +00:00
go d.handle(conn)
}
}
func (d *Daemon) onListenerEnabled() {
if atomic.AddInt32(&d.UsersCount, 1) == 1 && OnListenerEnabledURL != "" {
response, err := http.Get(OnListenerEnabledURL)
if err != nil {
log.Error("Register failed: ", err)
} else {
log.Info("Register:", OnListenerEnabledURL, ": ", response.Status)
}
}
}
func (d *Daemon) onListenerDisabled() {
if atomic.AddInt32(&d.UsersCount, -1) == 0 && OnListenerDisabledURL != "" {
response, err := http.Get(OnListenerDisabledURL)
if err != nil {
log.Error("Register failed: ", err)
} else {
log.Info("Register:", OnListenerDisabledURL, ": ", response.Status)
}
}
}
2018-01-29 15:41:53 +00:00
func (d *Daemon) handle(conn net.Conn) {
defer conn.Close()
brh := &BindRequestHeader{}
err := RecvMessage(conn, brh)
2018-01-29 15:41:53 +00:00
if err != nil {
2018-01-30 14:58:30 +00:00
log.Error("Couldn't read bind request: ", err)
2018-01-29 15:41:53 +00:00
return
}
2018-01-30 14:58:30 +00:00
log.Debug(brh)
2018-01-29 15:41:53 +00:00
/* Check PSK */
2018-01-30 14:58:30 +00:00
log.Debug("PROTOCOL CODE: ", brh.Protocol)
2018-01-29 15:41:53 +00:00
2018-01-30 15:09:18 +00:00
client := conn.RemoteAddr().String()
2018-01-29 15:41:53 +00:00
switch brh.Protocol {
case DNS:
/* Check DNS Already served */
d.DNSCheck.Lock()
if d.DNSListener != nil {
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: DNS Handler for domain:", brh.BindInfo,
" client: ", client, " - request shutdown",
)
d.DNSListener.sendEmptyMessage()
2018-01-29 15:41:53 +00:00
d.DNSListener.Shutdown()
2018-01-31 18:35:14 +00:00
} else {
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: DNS Handler for domain:", brh.BindInfo,
" client: ", client, " - wait for availability",
)
2018-01-29 15:41:53 +00:00
}
d.DNSCheck.Unlock()
d.DNSLock.Lock()
d.onListenerEnabled()
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: DNS Handler for domain:", brh.BindInfo,
" client: ", client, " - start",
)
2018-01-29 15:41:53 +00:00
d.serveDNS(conn, brh.BindInfo)
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: DNS Handler for domain:", brh.BindInfo,
" client: ", client, " - complete",
)
d.onListenerDisabled()
2018-01-29 15:41:53 +00:00
d.DNSLock.Unlock()
2018-01-30 14:10:54 +00:00
case INFO:
ip := GetOutboundIP()
if CheckExternalBindHostIP() {
ip = ExternalBindHost
}
2018-01-30 15:09:18 +00:00
log.Warning("Request: External IP:", ip)
2018-01-30 14:58:30 +00:00
2018-01-30 14:10:54 +00:00
SendMessage(conn, &IPInfo{
IP: ip,
})
2018-01-29 15:41:53 +00:00
case TCP:
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: TCP handler with port:", brh.BindInfo,
" client: ", client, " - start",
)
d.onListenerEnabled()
2018-01-30 13:44:55 +00:00
d.serveStream(-1, conn, brh.BindInfo, d.listenAcceptTCP)
d.onListenerDisabled()
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: TCP handler with port:", brh.BindInfo,
" client: ", client, " - complete",
)
2018-01-30 14:58:30 +00:00
2018-01-29 15:41:53 +00:00
case KCP:
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: KCP handler with port:", brh.BindInfo,
" client: ", client, " MTU:", brh.MTU, " - start",
)
d.onListenerEnabled()
2019-10-03 16:37:11 +00:00
d.serveStream(brh.MTU, conn, brh.BindInfo, d.listenAcceptKCP)
d.onListenerDisabled()
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: KCP handler with port:", brh.BindInfo,
" client: ", client, " - complete",
)
2018-01-30 14:58:30 +00:00
2018-01-30 13:44:55 +00:00
case TLS:
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: SSL handler with port:", brh.BindInfo,
" client: ", client, " - start",
)
d.onListenerEnabled()
2018-01-30 13:44:55 +00:00
d.serveStream(-1, conn, brh.BindInfo, d.listenAcceptTLS)
d.onListenerDisabled()
2019-10-03 16:37:11 +00:00
log.Warning(
"Request: SSL handler with port:", brh.BindInfo,
" client: ", client, " - complete",
)
2018-01-30 13:44:55 +00:00
2018-01-29 15:41:53 +00:00
default:
2018-01-30 14:58:30 +00:00
log.Error("Unknown protocol", brh.Protocol)
2018-01-29 15:41:53 +00:00
}
}