Merge branch 'feat/sd-notify' into 'main'

feat(proxy): add sd_notify support

See merge request tpo/anti-censorship/pluggable-transports/snowflake!610
This commit is contained in:
Jill 2025-08-20 22:30:35 +02:00
commit a2989f7c22
4 changed files with 43 additions and 0 deletions

1
go.mod
View file

@ -7,6 +7,7 @@ require (
github.com/aws/aws-sdk-go-v2/config v1.30.2
github.com/aws/aws-sdk-go-v2/credentials v1.18.5
github.com/aws/aws-sdk-go-v2/service/sqs v1.38.5
github.com/coreos/go-systemd/v22 v22.5.0
github.com/golang/mock v1.6.0
github.com/gorilla/websocket v1.5.3
github.com/miekg/dns v1.1.65

3
go.sum
View file

@ -39,11 +39,14 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=

View file

@ -822,6 +822,8 @@ func (sf *SnowflakeProxy) Start() error {
}
tokens = newTokens(sf.Capacity)
sdnotifyStatus("Checking NAT type...")
err = sf.checkNATType(config, sf.NATProbeURL)
if err != nil {
// non-fatal error. Log it and continue
@ -830,6 +832,9 @@ func (sf *SnowflakeProxy) Start() error {
}
sf.EventDispatcher.OnNewSnowflakeEvent(event.EventOnCurrentNATTypeDetermined{CurNATType: getCurrentNATType()})
sdnotifyStatus(fmt.Sprintf("NAT type: %s", getCurrentNATType()))
sdnotifyReady()
NatRetestTask := task.Periodic{
Interval: sf.NATTypeMeasurementInterval,
Execute: func() error {
@ -846,6 +851,16 @@ func (sf *SnowflakeProxy) Start() error {
defer NatRetestTask.Close()
}
WatchdogTask := task.Periodic{
Interval: 5 * time.Minute,
Execute: func() error {
sdnotifyWatchdog()
return nil
},
}
WatchdogTask.Start()
defer WatchdogTask.Close()
ticker := time.NewTicker(sf.PollInterval)
defer ticker.Stop()
@ -864,6 +879,7 @@ func (sf *SnowflakeProxy) Start() error {
// Stop closes all existing connections and shuts down the Snowflake.
func (sf *SnowflakeProxy) Stop() {
sdnotifyStopping()
close(sf.shutdown)
}

23
proxy/lib/systemd.go Normal file
View file

@ -0,0 +1,23 @@
package snowflake_proxy
import (
"fmt"
sdnotify "github.com/coreos/go-systemd/v22/daemon"
)
func sdnotifyReady() {
sdnotify.SdNotify(false, sdnotify.SdNotifyReady)
}
func sdnotifyStopping() {
sdnotify.SdNotify(false, sdnotify.SdNotifyStopping)
}
func sdnotifyStatus(status string) {
sdnotify.SdNotify(false, fmt.Sprintf("STATUS=%s", status))
}
func sdnotifyWatchdog() {
sdnotify.SdNotify(false, sdnotify.SdNotifyWatchdog)
}