main.go

 1//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
 2// +build darwin dragonfly freebsd linux netbsd openbsd solaris
 3
 4package main
 5
 6import (
 7	"context"
 8	"fmt"
 9	"log"
10	"net"
11	"os"
12	"os/signal"
13	"syscall"
14	"time"
15
16	"github.com/charmbracelet/soft-serve/config"
17	"github.com/charmbracelet/soft-serve/server"
18)
19
20const (
21	port = 22
22	gid  = 1000
23	uid  = 1000
24)
25
26var (
27	addr = fmt.Sprintf(":%d", port)
28)
29
30func main() {
31	// To listen on port 22 we need root privileges
32	ls, err := net.Listen("tcp", addr)
33	if err != nil {
34		log.Fatalf("Can't listen: %s", err)
35	}
36	// We don't need root privileges any more
37	if err := syscall.Setgid(gid); err != nil {
38		log.Fatalf("Setgid error: %s", err)
39	}
40	if err := syscall.Setuid(uid); err != nil {
41		log.Fatalf("Setuid error: %s", err)
42	}
43	cfg := config.DefaultConfig()
44	cfg.Port = port
45	s := server.NewServer(cfg)
46
47	done := make(chan os.Signal, 1)
48	signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
49
50	log.Printf("Starting SSH server on %s:%d", cfg.BindAddr, cfg.Port)
51	go func() {
52		if err := s.Serve(ls); err != nil {
53			log.Fatalln(err)
54		}
55	}()
56
57	<-done
58
59	log.Printf("Stopping SSH server on %s:%d", cfg.BindAddr, cfg.Port)
60	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
61	defer func() { cancel() }()
62	if err := s.Shutdown(ctx); err != nil {
63		log.Fatalln(err)
64	}
65}