diff --git a/cmd/podsync/main.go b/cmd/podsync/main.go index 04a939e..1fccb2d 100644 --- a/cmd/podsync/main.go +++ b/cmd/podsync/main.go @@ -2,16 +2,16 @@ package main import ( "context" - "fmt" - "net/http" "os" "os/signal" "syscall" "github.com/jessevdk/go-flags" log "github.com/sirupsen/logrus" + "golang.org/x/sync/errgroup" "github.com/mxpv/podsync/pkg/config" + "github.com/mxpv/podsync/pkg/web" ) type Opts struct { @@ -28,6 +28,8 @@ func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() + group, ctx := errgroup.WithContext(ctx) + // Parse args opts := Opts{} _, err := flags.Parse(&opts) @@ -46,32 +48,35 @@ func main() { log.WithError(err).Fatal("failed to load configuration file") } - // Create web server - port := cfg.Server.Port - if port == 0 { - port = 8080 - } + srv := web.New(cfg) - srv := http.Server{ - Addr: fmt.Sprintf(":%d", port), - } - - log.Debugf("using address %s", srv.Addr) - - // Run listener - go func() { + group.Go(func() error { log.Infof("running listener at %s", srv.Addr) - if err := srv.ListenAndServe(); err != nil { - log.WithError(err).Error("failed to listen") + return srv.ListenAndServe() + }) + + group.Go(func() error { + // Shutdown web server + defer func() { + log.Info("shutting down web server") + if err := srv.Shutdown(ctx); err != nil { + log.WithError(err).Error("server shutdown failed") + } + }() + + for { + select { + case <-ctx.Done(): + return ctx.Err() + case <-stop: + cancel() + return nil + } } - }() + }) - <-stop - - log.Info("shutting down") - - if err := srv.Shutdown(ctx); err != nil { - log.WithError(err).Error("server shutdown failed") + if err := group.Wait(); err != nil && err != context.Canceled { + log.WithError(err).Error("wait error") } log.Info("gracefully stopped") diff --git a/go.mod b/go.mod index 6b8a48d..07ec320 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/vmihailenco/msgpack v4.0.4+incompatible golang.org/x/net v0.0.0-20190311183353-d8887717615a golang.org/x/oauth2 v0.0.0-20180620175406-ef147856a6dd - golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect + golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 golang.org/x/sys v0.0.0-20190311152110-c8c8c57fd1e1 // indirect google.golang.org/api v0.0.0-20180718221112-efcb5f25ac56 google.golang.org/appengine v1.1.0 // indirect diff --git a/pkg/web/server.go b/pkg/web/server.go new file mode 100644 index 0000000..9d4a2df --- /dev/null +++ b/pkg/web/server.go @@ -0,0 +1,31 @@ +package web + +import ( + "fmt" + "net/http" + + log "github.com/sirupsen/logrus" + + "github.com/mxpv/podsync/pkg/config" +) + +type Server struct { + http.Server +} + +func New(cfg *config.Config) *Server { + port := cfg.Server.Port + if port == 0 { + port = 8080 + } + + srv := Server{} + + srv.Addr = fmt.Sprintf(":%d", port) + log.Debugf("using address: %s", srv.Addr) + + fs := http.FileServer(http.Dir(cfg.Server.DataDir)) + http.Handle("/", fs) + + return &srv +}