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}