diff --git a/pupy/proxy/daemon.go b/pupy/proxy/daemon.go index 4f131954..5bfd9526 100644 --- a/pupy/proxy/daemon.go +++ b/pupy/proxy/daemon.go @@ -3,6 +3,9 @@ package main import ( "crypto/tls" "net" + "net/http" + + "sync/atomic" log "github.com/sirupsen/logrus" ) @@ -37,6 +40,28 @@ func (d *Daemon) ListenAndServe() error { return nil } +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) + } + } +} + func (d *Daemon) handle(conn net.Conn) { defer conn.Close() @@ -68,7 +93,9 @@ func (d *Daemon) handle(conn net.Conn) { d.DNSCheck.Unlock() d.DNSLock.Lock() + d.onListenerEnabled() d.serveDNS(conn, brh.BindInfo) + d.onListenerDisabled() d.DNSCheck.Lock() d.DNSListener = nil d.DNSCheck.Unlock() @@ -89,17 +116,23 @@ func (d *Daemon) handle(conn net.Conn) { case TCP: log.Warning("Request: TCP handler with port:", brh.BindInfo, " client: ", client, " - start") + d.onListenerEnabled() d.serveStream(-1, conn, brh.BindInfo, d.listenAcceptTCP) + d.onListenerDisabled() log.Warning("Request: TCP handler with port:", brh.BindInfo, " client: ", client, " - complete") case KCP: log.Warning("Request: KCP handler with port:", brh.BindInfo, " client: ", client, " - start") + d.onListenerEnabled() d.serveStream(int(UDPSize-24), conn, brh.BindInfo, d.listenAcceptKCP) + d.onListenerDisabled() log.Warning("Request: KCP handler with port:", brh.BindInfo, " client: ", client, " - complete") case TLS: log.Warning("Request: SSL handler with port:", brh.BindInfo, " client: ", client, " - start") + d.onListenerEnabled() d.serveStream(-1, conn, brh.BindInfo, d.listenAcceptTLS) + d.onListenerDisabled() log.Warning("Request: SSL handler with port:", brh.BindInfo, " client: ", client, " - complete") default: diff --git a/pupy/proxy/main.go b/pupy/proxy/main.go index 382d95d9..ec324087 100644 --- a/pupy/proxy/main.go +++ b/pupy/proxy/main.go @@ -30,6 +30,9 @@ var ( ClientKey = path.Join("..", "crypto", "proxy-client.key") ClientCert = path.Join("..", "crypto", "proxy-client.crt") + OnListenerEnabledURL = "" + OnListenerDisabledURL = "" + ListenerConfig *tls.Config ) @@ -48,6 +51,10 @@ func init() { flag.StringVar(&ProxyHostname, "hostname-proxy", ProxyHostname, "Hostname for pupysh listener side (used with generate)") flag.StringVar(&loglevel, "loglevel", loglevel, "Set log level") + flag.StringVar(&OnListenerEnabledURL, "on-enabled-url", OnListenerEnabledURL, + "Send GET request when at least one client connected") + flag.StringVar(&OnListenerDisabledURL, "on-disabled-url", OnListenerDisabledURL, + "Send GET request when at least one client connected") flag.BoolVar(&generate, "generate", false, "Generate all the keys") iniflags.Parse() diff --git a/pupy/proxy/types.go b/pupy/proxy/types.go index d4e83410..730a14c8 100644 --- a/pupy/proxy/types.go +++ b/pupy/proxy/types.go @@ -71,6 +71,8 @@ type ( Listeners map[int]*Listener ListenersLock sync.Mutex + + UsersCount int32 } IPInfo struct {