serve.go

 1package main
 2
 3import (
 4	"context"
 5	"fmt"
 6	"os"
 7	"os/signal"
 8	"syscall"
 9	"time"
10
11	"github.com/charmbracelet/log"
12
13	"github.com/charmbracelet/soft-serve/server"
14	"github.com/charmbracelet/soft-serve/server/config"
15	"github.com/spf13/cobra"
16)
17
18var (
19	serveCmd = &cobra.Command{
20		Use:   "serve",
21		Short: "Start the server",
22		Long:  "Start the server",
23		Args:  cobra.NoArgs,
24		RunE: func(cmd *cobra.Command, args []string) error {
25			cfg := config.DefaultConfig()
26			s := server.NewServer(cfg)
27
28			log.Print("Starting SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
29
30			done := make(chan os.Signal, 1)
31			lch := make(chan error, 1)
32			go func() {
33				defer close(lch)
34				defer close(done)
35				lch <- s.Start()
36			}()
37
38			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
39			<-done
40
41			log.Print("Stopping SSH server", "addr", fmt.Sprintf("%s:%d", cfg.BindAddr, cfg.Port))
42			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
43			defer cancel()
44			if err := s.Shutdown(ctx); err != nil {
45				return err
46			}
47
48			// wait for serve to finish
49			return <-lch
50		},
51	}
52)