| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 1 | package main |
| 2 | |
| 3 | import ( |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 4 | "context" |
| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 5 | "fmt" |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 6 | "os" |
| Lorenz Brun | 5d503b3 | 2023-04-11 13:20:23 +0200 | [diff] [blame] | 7 | "regexp" |
| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 8 | |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 9 | "golang.org/x/sys/unix" |
| 10 | |
| Lorenz Brun | 5d503b3 | 2023-04-11 13:20:23 +0200 | [diff] [blame] | 11 | "source.monogon.dev/metropolis/pkg/bootparam" |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 12 | "source.monogon.dev/metropolis/pkg/logtree" |
| 13 | "source.monogon.dev/metropolis/pkg/supervisor" |
| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 14 | ) |
| 15 | |
| Lorenz Brun | 5d503b3 | 2023-04-11 13:20:23 +0200 | [diff] [blame] | 16 | var validTTYRegexp = regexp.MustCompile(`^[a-zA-Z0-9]+$`) |
| 17 | |
| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 18 | func main() { |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 19 | setupMounts() |
| 20 | |
| Lorenz Brun | 5d503b3 | 2023-04-11 13:20:23 +0200 | [diff] [blame] | 21 | // Set up logger for the Agent. Parse consoles from the kernel command line |
| 22 | // as well as adding the two standard tty0/ttyS0 consoles. |
| 23 | consoles := make(map[string]bool) |
| 24 | cmdline, err := os.ReadFile("/proc/cmdline") |
| 25 | if err == nil { |
| 26 | params, _, err := bootparam.Unmarshal(string(cmdline)) |
| 27 | if err == nil { |
| 28 | consoles = params.Consoles() |
| 29 | } |
| 30 | } |
| 31 | consoles["tty0"] = true |
| 32 | consoles["ttyS0"] = true |
| 33 | |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 34 | lt := logtree.New() |
| Tim Windelschmidt | 13b83f7 | 2024-04-11 23:10:16 +0200 | [diff] [blame^] | 35 | for path := range consoles { |
| 36 | f, err := os.OpenFile("/dev/"+path, os.O_WRONLY, 0) |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 37 | if err != nil { |
| 38 | continue |
| 39 | } |
| 40 | reader, err := lt.Read("", logtree.WithChildren(), logtree.WithStream()) |
| 41 | if err != nil { |
| 42 | panic(fmt.Errorf("could not set up root log reader: %v", err)) |
| 43 | } |
| Tim Windelschmidt | 13b83f7 | 2024-04-11 23:10:16 +0200 | [diff] [blame^] | 44 | go func() { |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 45 | for { |
| 46 | p := <-reader.Stream |
| 47 | fmt.Fprintf(f, "%s\n", p.String()) |
| 48 | } |
| Tim Windelschmidt | 13b83f7 | 2024-04-11 23:10:16 +0200 | [diff] [blame^] | 49 | }() |
| Lorenz Brun | aadeb79 | 2023-03-27 15:53:56 +0200 | [diff] [blame] | 50 | } |
| 51 | |
| 52 | sCtx := context.Background() |
| 53 | supervisor.New(sCtx, agentRunnable, supervisor.WithExistingLogtree(lt)) |
| 54 | select {} |
| 55 | } |
| 56 | |
| 57 | func mkdirAndMount(dir, fs string, flags uintptr) error { |
| 58 | if err := os.MkdirAll(dir, 0o755); err != nil { |
| 59 | return fmt.Errorf("could not make %s: %w", dir, err) |
| 60 | } |
| 61 | if err := unix.Mount(fs, dir, fs, flags, ""); err != nil { |
| 62 | return fmt.Errorf("could not mount %s on %s: %w", fs, dir, err) |
| 63 | } |
| 64 | return nil |
| 65 | } |
| 66 | |
| 67 | // setupMounts sets up basic mounts like sysfs, procfs, devtmpfs and cgroups. |
| 68 | // This should be called early during init as a lot of processes depend on this |
| 69 | // being available. |
| 70 | func setupMounts() error { |
| 71 | // Set up target filesystems. |
| 72 | for _, el := range []struct { |
| 73 | dir string |
| 74 | fs string |
| 75 | flags uintptr |
| 76 | }{ |
| 77 | {"/sys", "sysfs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV}, |
| 78 | {"/sys/kernel/tracing", "tracefs", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV}, |
| 79 | {"/sys/fs/pstore", "pstore", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV}, |
| 80 | {"/proc", "proc", unix.MS_NOEXEC | unix.MS_NOSUID | unix.MS_NODEV}, |
| 81 | {"/dev", "devtmpfs", unix.MS_NOEXEC | unix.MS_NOSUID}, |
| 82 | {"/dev/pts", "devpts", unix.MS_NOEXEC | unix.MS_NOSUID}, |
| 83 | } { |
| 84 | if err := mkdirAndMount(el.dir, el.fs, el.flags); err != nil { |
| 85 | return err |
| 86 | } |
| 87 | } |
| 88 | return nil |
| Lorenz Brun | 6294854 | 2023-01-10 13:28:44 +0000 | [diff] [blame] | 89 | } |