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