pico-user-logs.diff

· erock's pastes · raw

expires: 2025-01-02

  1diff --git a/pico/cli.go b/pico/cli.go
  2index 613873d..f4e079f 100644
  3--- a/pico/cli.go
  4+++ b/pico/cli.go
  5@@ -1,6 +1,8 @@
  6 package pico
  7 
  8 import (
  9+	"bufio"
 10+	"encoding/json"
 11 	"fmt"
 12 	"log/slog"
 13 	"strings"
 14@@ -34,12 +36,13 @@ func getUser(s ssh.Session, dbpool db.DB) (*db.User, error) {
 15 }
 16 
 17 type Cmd struct {
 18-	User    *db.User
 19-	Session shared.CmdSession
 20-	Log     *slog.Logger
 21-	Dbpool  db.DB
 22-	Write   bool
 23-	Styles  common.Styles
 24+	User       *db.User
 25+	SshSession ssh.Session
 26+	Session    shared.CmdSession
 27+	Log        *slog.Logger
 28+	Dbpool     db.DB
 29+	Write      bool
 30+	Styles     common.Styles
 31 }
 32 
 33 func (c *Cmd) output(out string) {
 34@@ -62,6 +65,54 @@ func (c *Cmd) notifications() error {
 35 	return nil
 36 }
 37 
 38+func (c *Cmd) logs() error {
 39+	sshClient, err := shared.CreateSSHClient(
 40+		shared.GetEnv("PICO_SENDLOG_ENDPOINT", "send.pico.sh:22"),
 41+		shared.GetEnv("PICO_SENDLOG_KEY", "ssh_data/term_info_ed25519"),
 42+		shared.GetEnv("PICO_SENDLOG_PASSPHRASE", ""),
 43+		shared.GetEnv("PICO_SENDLOG_REMOTE_HOST", "send.pico.sh"),
 44+		shared.GetEnv("PICO_SENDLOG_USER", "pico"),
 45+	)
 46+	if err != nil {
 47+		return err
 48+	}
 49+
 50+	session, err := sshClient.NewSession()
 51+	if err != nil {
 52+		return err
 53+	}
 54+
 55+	stdoutPipe, err := session.StdoutPipe()
 56+	if err != nil {
 57+		return err
 58+	}
 59+
 60+	err = session.Start("sub log-sink -k")
 61+	if err != nil {
 62+		return err
 63+	}
 64+
 65+	scanner := bufio.NewScanner(stdoutPipe)
 66+	for scanner.Scan() {
 67+		line := scanner.Text()
 68+		parsedData := map[string]any{}
 69+
 70+		err := json.Unmarshal([]byte(line), &parsedData)
 71+		if err != nil {
 72+			continue
 73+		}
 74+
 75+		if userId, ok := parsedData["userId"]; ok {
 76+			if userID, ok := userId.(string); ok {
 77+				if userID == c.User.ID {
 78+					wish.Println(c.SshSession, line)
 79+				}
 80+			}
 81+		}
 82+	}
 83+	return scanner.Err()
 84+}
 85+
 86 type CliHandler struct {
 87 	DBPool db.DB
 88 	Logger *slog.Logger
 89@@ -113,11 +164,12 @@ func WishMiddleware(handler *CliHandler) wish.Middleware {
 90 			}
 91 
 92 			opts := Cmd{
 93-				Session: sesh,
 94-				User:    user,
 95-				Log:     log,
 96-				Dbpool:  dbpool,
 97-				Write:   false,
 98+				Session:    sesh,
 99+				SshSession: sesh,
100+				User:       user,
101+				Log:        log,
102+				Dbpool:     dbpool,
103+				Write:      false,
104 			}
105 
106 			cmd := strings.TrimSpace(args[0])
107@@ -125,6 +177,9 @@ func WishMiddleware(handler *CliHandler) wish.Middleware {
108 				if cmd == "help" {
109 					opts.help()
110 					return
111+				} else if cmd == "logs" {
112+					opts.logs()
113+					return
114 				} else if cmd == "pico+" {
115 					opts.plus()
116 					return
117diff --git a/shared/sendlog.go b/shared/sendlog.go
118index 75136b4..596fcbd 100644
119--- a/shared/sendlog.go
120+++ b/shared/sendlog.go
121@@ -138,7 +138,7 @@ func (c *SendLogWriter) Open() error {
122 	c.Done = make(chan struct{})
123 	c.Messages = make(chan []byte, c.BufferSize)
124 
125-	sshClient, err := createSSHClient(
126+	sshClient, err := CreateSSHClient(
127 		GetEnv("PICO_SENDLOG_ENDPOINT", "send.pico.sh:22"),
128 		GetEnv("PICO_SENDLOG_KEY", "ssh_data/term_info_ed25519"),
129 		GetEnv("PICO_SENDLOG_PASSPHRASE", ""),
130@@ -248,7 +248,7 @@ func (c *SendLogWriter) Reconnect() {
131 	}()
132 }
133 
134-func createSSHClient(remoteHost string, keyLocation string, keyPassphrase string, remoteHostname string, remoteUser string) (*ssh.Client, error) {
135+func CreateSSHClient(remoteHost string, keyLocation string, keyPassphrase string, remoteHostname string, remoteUser string) (*ssh.Client, error) {
136 	if !strings.Contains(remoteHost, ":") {
137 		remoteHost += ":22"
138 	}