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			done := make(chan os.Signal, 1)
29			lch := make(chan error, 1)
30			go func() {
31				defer close(lch)
32				defer close(done)
33				lch <- s.Start()
34			}()
35
36			signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
37			<-done
38
39			log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
40			ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
41			defer cancel()
42			if err := s.Shutdown(ctx); err != nil {
43				return err
44			}
45
46			// wait for serve to finish
47			return <-lch
48		},
49	}
50)