diff options
| -rw-r--r-- | config_example.yaml | 2 | ||||
| -rw-r--r-- | go.mod | 1 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | main.go | 62 | ||||
| -rw-r--r-- | systemd/fwdsms.service | 1 | ||||
| -rw-r--r-- | systemd/fwdsms.socket | 11 |
6 files changed, 57 insertions, 22 deletions
diff --git a/config_example.yaml b/config_example.yaml index 8da39e3..180933d 100644 --- a/config_example.yaml +++ b/config_example.yaml @@ -15,6 +15,6 @@ smtp: password: some password twilio: - address: /run/fwdsms/socket + address: 127.0.0.1:8080 authToken: some token endpoint: / @@ -6,6 +6,7 @@ require ( github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/stretchr/testify v1.7.0 + go.awhk.org/gosdd v0.2.0 golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) @@ -11,6 +11,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +go.awhk.org/gosdd v0.2.0 h1:fNqC+9LtwfwUxDDq0d8cIoFllbzZmi8+fUIlew5D7vc= +go.awhk.org/gosdd v0.2.0/go.mod h1:9LeQ9cX4ZghIWv6kF9ljk83NzsZJqQR3/R61DbsU3YI= golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b h1:lAZ0/chPUDWwjqosYR0X4M490zQhMsiJ4K3DbA7o+3g= golang.org/x/sys v0.0.0-20210218155724-8ebf48af031b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= @@ -18,6 +18,7 @@ import ( "golang.org/x/sys/unix" "go.awhk.org/fwdsms/pkg/twilio" + "go.awhk.org/gosdd" ) var cfgFilename = flag.String("c", "/etc/fwdsms.yaml", "configuration file") @@ -49,29 +50,18 @@ func main() { Handler: twilio.EmptyResponseHandler, }, })) + srv := http.Server{Handler: r} go func() { - var ( - l net.Listener - err error - ) - if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' { - if l, err = net.Listen("unix", cfg.Twilio.Address); err != nil { - log.Fatalf("Could not set up UNIX listener: %v.", err) - } - if err = os.Chmod(cfg.Twilio.Address, 0666); err != nil { - log.Fatalf("Could not set up permissions on UNIX socket: %v.", err) - } - } else { - if cfg.Twilio.Address == "" { - cfg.Twilio.Address = ":8080" - } - if l, err = net.Listen("tcp", cfg.Twilio.Address); err != nil { - log.Fatalf("Could not set up TCP listener: %v.", err) - } + ln, err := listenSD() + if err != nil { + log.Fatalf("Failed to listen on systemd socket: %s.", err) + } + if ln == nil { + ln = listenEnv(cfg) } - if err = srv.Serve(l); err != nil && err != http.ErrServerClosed { - log.Fatalf("Failed to serve HTTP: %v.", err) + if err = srv.Serve(ln); err != nil && err != http.ErrServerClosed { + log.Fatalf("Failed to serve HTTP: %s.", err) } }() @@ -87,3 +77,35 @@ func main() { log.Fatalf("Failed to properly shut down the HTTP server: %v.", err) } } + +func listenEnv(cfg *Config) net.Listener { + if cfg.Twilio.Address != "" && cfg.Twilio.Address[0] == '/' { + ln, err := net.Listen("unix", cfg.Twilio.Address) + if err != nil { + log.Fatalf("Could not set up UNIX listener: %s.", err) + } + if err := os.Chmod(cfg.Twilio.Address, 0666); err != nil { + log.Fatalf("Could not set up permissions on UNIX socket: %s.", err) + } + return ln + } + ln, err := net.Listen("tcp", cfg.Twilio.Address) + if err != nil { + log.Fatalf("Could not set up TCP listener: %s.", err) + } + return ln +} + +func listenSD() (net.Listener, error) { + fds, err := gosdd.SDListenFDs(true) + if err != nil { + if err == gosdd.ErrNoSDSupport { + return nil, nil + } + return nil, err + } + if len(fds) == 0 { + return nil, nil + } + return net.FileListener(fds[0]) +} diff --git a/systemd/fwdsms.service b/systemd/fwdsms.service index a095805..3f3af29 100644 --- a/systemd/fwdsms.service +++ b/systemd/fwdsms.service @@ -7,7 +7,6 @@ Description=SMS-to-email Forwarder [Service] ExecStart=fwdsms DynamicUser=true -RuntimeDirectory=fwdsms [Install] WantedBy=multi-user.target diff --git a/systemd/fwdsms.socket b/systemd/fwdsms.socket new file mode 100644 index 0000000..8914600 --- /dev/null +++ b/systemd/fwdsms.socket @@ -0,0 +1,11 @@ +# SPDX-FileCopyrightText: © 2021 Grégoire Duchêne <gduchene@awhk.org> +# SPDX-License-Identifier: ISC + +[Unit] +Description=fwdsms Socket + +[Socket] +ListenStream=%t/fwdsms + +[Install] +WantedBy=sockets.target |
