aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go89
1 files changed, 89 insertions, 0 deletions
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..090331f
--- /dev/null
+++ b/main.go
@@ -0,0 +1,89 @@
+// SPDX-FileCopyrightText: © 2020 Grégoire Duchêne <gduchene@awhk.org>
+// SPDX-License-Identifier: ISC
+
+package main
+
+import (
+ "context"
+ "flag"
+ "log"
+ "net"
+ "net/http"
+ "os"
+ "os/signal"
+ "time"
+
+ "github.com/gorilla/handlers"
+ "github.com/gorilla/mux"
+ "golang.org/x/sys/unix"
+
+ "go.awhk.org/fwdsms/pkg/twilio"
+)
+
+var cfgFilename = flag.String("c", "/etc/fwdsms.yaml", "configuration file")
+
+func main() {
+ flag.Parse()
+ log.SetFlags(0)
+ fd, err := os.Open(*cfgFilename)
+ if err != nil {
+ log.Fatalf("Could not open the configuration file: %v.", err)
+ }
+ cfg, err := loadConfig(fd)
+ if err != nil {
+ log.Fatalf("Could not load the configuration: %v.", err)
+ }
+
+ done := make(chan os.Signal, 1)
+ signal.Notify(done, os.Interrupt, unix.SIGTERM)
+
+ sms := make(chan twilio.SMS)
+
+ r := mux.NewRouter()
+ r.Path(cfg.Twilio.Endpoint).
+ Methods(http.MethodPost).
+ Handler(handlers.ProxyHeaders(&twilio.Filter{
+ AuthToken: []byte(cfg.Twilio.AuthToken),
+ Handler: &twilio.SMSTee{
+ Chan: sms,
+ 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)
+ }
+ }
+ if err = srv.Serve(l); err != nil && err != http.ErrServerClosed {
+ log.Fatalf("Failed to serve HTTP: %v.", err)
+ }
+ }()
+
+ mailer := newMailer(cfg, sms)
+ ctx, cancel := context.WithCancel(context.Background())
+ go mailer.start(ctx)
+
+ <-done
+ cancel()
+ ctx, cancel = context.WithTimeout(context.Background(), time.Second)
+ defer cancel()
+ if err := srv.Shutdown(ctx); err != nil && err != http.ErrServerClosed {
+ log.Fatalf("Failed to properly shut down the HTTP server: %v.", err)
+ }
+}