repos / pico

pico services mono repo
git clone https://github.com/picosh/pico.git

commit
6b1a9fc
parent
7a72e72
author
Eric Bower
date
2025-05-25 14:31:40 -0400 EDT
fix: linter issues
33 files changed,  +208, -126
M cmd/feeds/fetch/main.go
+3, -1
 1@@ -11,7 +11,9 @@ import (
 2 func main() {
 3 	cfg := feeds.NewConfigSite("feeds-fetch")
 4 	dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbh.Close()
 6+	defer func() {
 7+		_ = dbh.Close()
 8+	}()
 9 	fetcher := feeds.NewFetcher(dbh, cfg)
10 	fp := gofeed.NewParser()
11 	feed, err := fetcher.ParseURL(fp, "https://old.reddit.com/r/Watchexchange/.rss")
M pkg/apps/auth/api.go
+3, -1
 1@@ -830,7 +830,9 @@ func StartApiServer() {
 2 	cfg.Logger = logger
 3 
 4 	db := postgres.NewDB(cfg.DbURL, logger)
 5-	defer db.Close()
 6+	defer func() {
 7+		_ = db.Close()
 8+	}()
 9 
10 	ctx, cancel := context.WithCancel(context.Background())
11 	defer cancel()
M pkg/apps/feeds/api.go
+3, -1
 1@@ -127,7 +127,9 @@ func createStaticRoutes() []shared.Route {
 2 func StartApiServer() {
 3 	cfg := NewConfigSite("feeds-web")
 4 	db := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer db.Close()
 6+	defer func() {
 7+		_ = db.Close()
 8+	}()
 9 	logger := cfg.Logger
10 
11 	// cron daily digest
M pkg/apps/feeds/cli.go
+20, -20
  1@@ -20,7 +20,7 @@ func Middleware(dbpool db.DB, cfg *shared.ConfigSite) pssh.SSHServerMiddleware {
  2 
  3 			if user == nil {
  4 				err := fmt.Errorf("user not found")
  5-				fmt.Fprintln(sesh.Stderr(), err)
  6+				_, _ = fmt.Fprintln(sesh.Stderr(), err)
  7 				return err
  8 			}
  9 
 10@@ -31,25 +31,25 @@ func Middleware(dbpool db.DB, cfg *shared.ConfigSite) pssh.SSHServerMiddleware {
 11 
 12 			switch cmd {
 13 			case "help":
 14-				fmt.Fprintf(sesh, "Commands: [help, ls, rm, run]\r\n\r\n")
 15+				_, _ = fmt.Fprintf(sesh, "Commands: [help, ls, rm, run]\r\n\r\n")
 16 				writer := tabwriter.NewWriter(sesh, 0, 0, 1, ' ', tabwriter.TabIndent)
 17-				fmt.Fprintln(writer, "Cmd\tDesc")
 18-				fmt.Fprintf(
 19+				_, _ = fmt.Fprintln(writer, "Cmd\tDesc")
 20+				_, _ = fmt.Fprintf(
 21 					writer,
 22 					"%s\t%s\r\n",
 23 					"help", "this help text",
 24 				)
 25-				fmt.Fprintf(
 26+				_, _ = fmt.Fprintf(
 27 					writer,
 28 					"%s\t%s\r\n",
 29 					"ls", "list feed digest posts with metadata",
 30 				)
 31-				fmt.Fprintf(
 32+				_, _ = fmt.Fprintf(
 33 					writer,
 34 					"%s\t%s\r\n",
 35 					"rm {filename}", "removes feed digest post",
 36 				)
 37-				fmt.Fprintf(
 38+				_, _ = fmt.Fprintf(
 39 					writer,
 40 					"%s\t%s\r\n",
 41 					"run {filename}", "runs the feed digest post immediately, ignoring last digest time validation",
 42@@ -58,20 +58,20 @@ func Middleware(dbpool db.DB, cfg *shared.ConfigSite) pssh.SSHServerMiddleware {
 43 			case "ls":
 44 				posts, err := dbpool.FindPostsForUser(&db.Pager{Page: 0, Num: 1000}, user.ID, "feeds")
 45 				if err != nil {
 46-					fmt.Fprintln(sesh.Stderr(), err)
 47+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
 48 					return err
 49 				}
 50 
 51 				if len(posts.Data) == 0 {
 52-					fmt.Fprintln(sesh, "no posts found")
 53+					_, _ = fmt.Fprintln(sesh, "no posts found")
 54 				}
 55 
 56 				writer := tabwriter.NewWriter(sesh, 0, 0, 1, ' ', tabwriter.TabIndent)
 57-				fmt.Fprintln(writer, "Filename\tLast Digest\tNext Digest\tInterval\tFailed Attempts")
 58+				_, _ = fmt.Fprintln(writer, "Filename\tLast Digest\tNext Digest\tInterval\tFailed Attempts")
 59 				for _, post := range posts.Data {
 60 					parsed := shared.ListParseText(post.Text)
 61 					digestOption := DigestOptionToTime(*post.Data.LastDigest, parsed.DigestInterval)
 62-					fmt.Fprintf(
 63+					_, _ = fmt.Fprintf(
 64 						writer,
 65 						"%s\t%s\t%s\t%s\t%d/10\r\n",
 66 						post.Filename,
 67@@ -84,7 +84,7 @@ func Middleware(dbpool db.DB, cfg *shared.ConfigSite) pssh.SSHServerMiddleware {
 68 				return writer.Flush()
 69 			case "rm":
 70 				filename := args[1]
 71-				fmt.Fprintf(sesh, "removing digest post %s\r\n", filename)
 72+				_, _ = fmt.Fprintf(sesh, "removing digest post %s\r\n", filename)
 73 				write := false
 74 				if len(args) > 2 {
 75 					writeRaw := args[2]
 76@@ -95,37 +95,37 @@ func Middleware(dbpool db.DB, cfg *shared.ConfigSite) pssh.SSHServerMiddleware {
 77 
 78 				post, err := dbpool.FindPostWithFilename(filename, user.ID, "feeds")
 79 				if err != nil {
 80-					fmt.Fprintln(sesh.Stderr(), err)
 81+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
 82 					return err
 83 				}
 84 				if write {
 85 					err = dbpool.RemovePosts([]string{post.ID})
 86 					if err != nil {
 87-						fmt.Fprintln(sesh.Stderr(), err)
 88+						_, _ = fmt.Fprintln(sesh.Stderr(), err)
 89 					}
 90 				}
 91-				fmt.Fprintf(sesh, "digest post removed %s\r\n", filename)
 92+				_, _ = fmt.Fprintf(sesh, "digest post removed %s\r\n", filename)
 93 				if !write {
 94-					fmt.Fprintln(sesh, "WARNING: *must* append with `--write` for the changes to persist.")
 95+					_, _ = fmt.Fprintln(sesh, "WARNING: *must* append with `--write` for the changes to persist.")
 96 				}
 97 				return err
 98 			case "run":
 99 				if len(args) < 2 {
100 					err := fmt.Errorf("must provide filename of post to run")
101-					fmt.Fprintln(sesh.Stderr(), err)
102+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
103 					return err
104 				}
105 				filename := args[1]
106 				post, err := dbpool.FindPostWithFilename(filename, user.ID, "feeds")
107 				if err != nil {
108-					fmt.Fprintln(sesh.Stderr(), err)
109+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
110 					return err
111 				}
112-				fmt.Fprintf(sesh, "running feed post: %s\r\n", filename)
113+				_, _ = fmt.Fprintf(sesh, "running feed post: %s\r\n", filename)
114 				fetcher := NewFetcher(dbpool, cfg)
115 				err = fetcher.RunPost(logger, user, post, true)
116 				if err != nil {
117-					fmt.Fprintln(sesh.Stderr(), err)
118+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
119 				}
120 				return err
121 			}
M pkg/apps/feeds/cron.go
+3, -1
 1@@ -317,7 +317,9 @@ func (f *Fetcher) ParseURL(fp *gofeed.Parser, url string) (*gofeed.Feed, error)
 2 		return nil, err
 3 	}
 4 
 5-	defer resp.Body.Close()
 6+	defer func() {
 7+		_ = resp.Body.Close()
 8+	}()
 9 	body, err := io.ReadAll(resp.Body)
10 	if err != nil {
11 		return nil, err
M pkg/apps/feeds/ssh.go
+3, -1
 1@@ -32,7 +32,9 @@ func StartSshServer() {
 2 	defer cancel()
 3 
 4 	dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbh.Close()
 6+	defer func() {
 7+		_ = dbh.Close()
 8+	}()
 9 
10 	hooks := &FeedHooks{
11 		Cfg: cfg,
M pkg/apps/pastes/api.go
+3, -1
 1@@ -375,7 +375,9 @@ func createSubdomainRoutes(staticRoutes []shared.Route) []shared.Route {
 2 func StartApiServer() {
 3 	cfg := NewConfigSite("pastes-web")
 4 	db := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer db.Close()
 6+	defer func() {
 7+		_ = db.Close()
 8+	}()
 9 	logger := cfg.Logger
10 
11 	go CronDeleteExpiredPosts(cfg, db)
M pkg/apps/pastes/ssh.go
+3, -1
 1@@ -33,7 +33,9 @@ func StartSshServer() {
 2 	defer cancel()
 3 
 4 	dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbh.Close()
 6+	defer func() {
 7+		_ = dbh.Close()
 8+	}()
 9 	hooks := &FileHooks{
10 		Cfg: cfg,
11 		Db:  dbh,
M pkg/apps/pgs/cli.go
+9, -11
 1@@ -25,14 +25,14 @@ func NewTabWriter(out io.Writer) *tabwriter.Writer {
 2 
 3 func projectTable(sesh io.Writer, projects []*db.Project) {
 4 	writer := NewTabWriter(sesh)
 5-	fmt.Fprintln(writer, "Name\tLast Updated\tLinks To\tACL Type\tACL\tBlocked")
 6+	_, _ = fmt.Fprintln(writer, "Name\tLast Updated\tLinks To\tACL Type\tACL\tBlocked")
 7 
 8 	for _, project := range projects {
 9 		links := ""
10 		if project.ProjectDir != project.Name {
11 			links = project.ProjectDir
12 		}
13-		fmt.Fprintf(
14+		_, _ = fmt.Fprintf(
15 			writer,
16 			"%s\t%s\t%s\t%s\t%s\t%s\r\n",
17 			project.Name,
18@@ -43,7 +43,7 @@ func projectTable(sesh io.Writer, projects []*db.Project) {
19 			project.Blocked,
20 		)
21 	}
22-	writer.Flush()
23+	_ = writer.Flush()
24 }
25 
26 type Cmd struct {
27@@ -184,11 +184,11 @@ func (c *Cmd) help() {
28 	}
29 
30 	writer := NewTabWriter(c.Session)
31-	fmt.Fprintln(writer, "Cmd\tDescription")
32+	_, _ = fmt.Fprintln(writer, "Cmd\tDescription")
33 	for _, dat := range data {
34-		fmt.Fprintf(writer, "%s\t%s\r\n", dat[0], dat[1])
35+		_, _ = fmt.Fprintf(writer, "%s\t%s\r\n", dat[0], dat[1])
36 	}
37-	writer.Flush()
38+	_ = writer.Flush()
39 }
40 
41 func (c *Cmd) stats(cfgMaxSize uint64) error {
42@@ -217,8 +217,8 @@ func (c *Cmd) stats(cfgMaxSize uint64) error {
43 	}
44 
45 	writer := NewTabWriter(c.Session)
46-	fmt.Fprintln(writer, "Used (GB)\tQuota (GB)\tUsed (%)\tProjects (#)")
47-	fmt.Fprintf(
48+	_, _ = fmt.Fprintln(writer, "Used (GB)\tQuota (GB)\tUsed (%)\tProjects (#)")
49+	_, _ = fmt.Fprintf(
50 		writer,
51 		"%.4f\t%.4f\t%.4f\t%d\r\n",
52 		utils.BytesToGB(int(totalFileSize)),
53@@ -226,9 +226,7 @@ func (c *Cmd) stats(cfgMaxSize uint64) error {
54 		(float32(totalFileSize)/float32(storageMax))*100,
55 		len(projects),
56 	)
57-	writer.Flush()
58-
59-	return nil
60+	return writer.Flush()
61 }
62 
63 func (c *Cmd) ls() error {
M pkg/apps/pgs/ssh_test.go
+26, -9
 1@@ -59,7 +59,9 @@ func TestSshServerSftp(t *testing.T) {
 2 		t.Error(err)
 3 		return
 4 	}
 5-	defer client.Close()
 6+	defer func() {
 7+		_ = client.Close()
 8+	}()
 9 
10 	_, err = WriteFileWithSftp(cfg, client)
11 	if err != nil {
12@@ -142,7 +144,9 @@ func TestSshServerRsync(t *testing.T) {
13 		t.Error(err)
14 		return
15 	}
16-	defer conn.Close()
17+	defer func() {
18+		_ = conn.Close()
19+	}()
20 
21 	// open an SFTP session over an existing ssh connection.
22 	client, err := sftp.NewClient(conn)
23@@ -150,7 +154,9 @@ func TestSshServerRsync(t *testing.T) {
24 		cfg.Logger.Error("could not create sftp client", "err", err)
25 		panic(err)
26 	}
27-	defer client.Close()
28+	defer func() {
29+		_ = client.Close()
30+	}()
31 
32 	name, err := os.MkdirTemp("", "rsync-")
33 	if err != nil {
34@@ -229,7 +235,7 @@ func TestSshServerRsync(t *testing.T) {
35 	}
36 
37 	// remove about file
38-	os.Remove(aboutFile)
39+	_ = os.Remove(aboutFile)
40 
41 	// copy files with delete
42 	delCmd := exec.Command("rsync", "-rv", "--delete", "-e", eCmd, name+"/", "localhost:/test")
43@@ -252,7 +258,9 @@ func TestSshServerRsync(t *testing.T) {
44 	if err != nil {
45 		panic(err)
46 	}
47-	defer os.RemoveAll(dlName)
48+	defer func() {
49+		_ = os.RemoveAll(dlName)
50+	}()
51 	// download files
52 	downloadCmd := exec.Command("rsync", "-rvvv", "-e", eCmd, "localhost:/test/", dlName+"/")
53 	result, err = downloadCmd.CombinedOutput()
54@@ -351,7 +359,9 @@ func (s UserSSH) Cmd(client *ssh.Client, patch []byte, cmd string) (string, erro
55 	if err != nil {
56 		return "", err
57 	}
58-	defer session.Close()
59+	defer func() {
60+		_ = session.Close()
61+	}()
62 
63 	stdinPipe, err := session.StdinPipe()
64 	if err != nil {
65@@ -374,7 +384,10 @@ func (s UserSSH) Cmd(client *ssh.Client, patch []byte, cmd string) (string, erro
66 		}
67 	}
68 
69-	stdinPipe.Close()
70+	err = stdinPipe.Close()
71+	if err != nil {
72+		return "", err
73+	}
74 
75 	if err := session.Wait(); err != nil {
76 		return "", err
77@@ -419,7 +432,9 @@ func WriteFileWithSftp(cfg *PgsConfig, conn *ssh.Client) (*os.FileInfo, error) {
78 		cfg.Logger.Error("could not create sftp client", "err", err)
79 		return nil, err
80 	}
81-	defer client.Close()
82+	defer func() {
83+		_ = client.Close()
84+	}()
85 
86 	f, err := client.Create("test/hello.txt")
87 	if err != nil {
88@@ -450,7 +465,9 @@ func WriteFilesMultProjectsWithSftp(cfg *PgsConfig, conn *ssh.Client) (*os.FileI
89 		cfg.Logger.Error("could not create sftp client", "err", err)
90 		return nil, err
91 	}
92-	defer client.Close()
93+	defer func() {
94+		_ = client.Close()
95+	}()
96 
97 	f, err := client.Create("mult/hello.txt")
98 	if err != nil {
M pkg/apps/pgs/uploader.go
+8, -4
 1@@ -244,7 +244,9 @@ func (h *UploadAssetHandler) findDenylist(bucket sst.Bucket, project *db.Project
 2 	if err != nil {
 3 		return "", fmt.Errorf("_pgs_ignore not found")
 4 	}
 5-	defer fp.Close()
 6+	defer func() {
 7+		_ = fp.Close()
 8+	}()
 9 
10 	buf := new(strings.Builder)
11 	_, err = io.Copy(buf, fp)
12@@ -344,7 +346,9 @@ func (h *UploadAssetHandler) Write(s *pssh.SSHServerConnSession, entry *sendutil
13 		curFileSize = info.Size
14 	}
15 	if obj != nil {
16-		defer obj.Close()
17+		defer func() {
18+			_ = obj.Close()
19+		}()
20 	}
21 
22 	denylist := getDenylist(s)
23@@ -381,8 +385,8 @@ func (h *UploadAssetHandler) Write(s *pssh.SSHServerConnSession, entry *sendutil
24 	remaining := int64(storageMax) - int64(curStorageSize)
25 	sizeRemaining := min(remaining+curFileSize, fileMax)
26 	if sizeRemaining <= 0 {
27-		fmt.Fprintln(s.Stderr(), "storage quota reached")
28-		fmt.Fprintf(s.Stderr(), "\r")
29+		_, _ = fmt.Fprintln(s.Stderr(), "storage quota reached")
30+		_, _ = fmt.Fprintf(s.Stderr(), "\r")
31 		_ = s.Exit(1)
32 		_ = s.Close()
33 		return "", fmt.Errorf("storage quota reached")
M pkg/apps/pgs/web_asset_handler.go
+12, -4
 1@@ -51,7 +51,9 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
 2 		logger.Info("_redirects not found in lru cache", "key", redirectsCacheKey)
 3 		redirectFp, redirectInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_redirects"))
 4 		if err == nil {
 5-			defer redirectFp.Close()
 6+			defer func() {
 7+				_ = redirectFp.Close()
 8+			}()
 9 			if redirectInfo != nil && redirectInfo.Size > h.Cfg.MaxSpecialFileSize {
10 				errMsg := fmt.Sprintf("_redirects file is too large (%d > %d)", redirectInfo.Size, h.Cfg.MaxSpecialFileSize)
11 				logger.Error(errMsg)
12@@ -106,7 +108,9 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
13 				if err != nil {
14 					continue
15 				}
16-				defer obj.Close()
17+				defer func() {
18+					_ = obj.Close()
19+				}()
20 			}
21 			logger.Info(
22 				"redirecting request",
23@@ -177,7 +181,9 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
24 		http.Error(w, "404 not found", http.StatusNotFound)
25 		return
26 	}
27-	defer contents.Close()
28+	defer func() {
29+		_ = contents.Close()
30+	}()
31 
32 	var headers []*HeaderRule
33 
34@@ -190,7 +196,9 @@ func (h *ApiAssetHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
35 		logger.Info("_headers not found in lru cache", "key", headersCacheKey)
36 		headersFp, headersInfo, err := h.Cfg.Storage.GetObject(h.Bucket, filepath.Join(h.ProjectDir, "_headers"))
37 		if err == nil {
38-			defer headersFp.Close()
39+			defer func() {
40+				_ = headersFp.Close()
41+			}()
42 			if headersInfo != nil && headersInfo.Size > h.Cfg.MaxSpecialFileSize {
43 				errMsg := fmt.Sprintf("_headers file is too large (%d > %d)", headersInfo.Size, h.Cfg.MaxSpecialFileSize)
44 				logger.Error(errMsg)
M pkg/apps/pico/cli.go
+2, -2
 1@@ -76,7 +76,7 @@ func (c *Cmd) logs(ctx context.Context) error {
 2 				if !ok {
 3 					return
 4 				}
 5-				fmt.Fprintln(c.SshSession, log)
 6+				_, _ = fmt.Fprintln(c.SshSession, log)
 7 			}
 8 		}
 9 	}()
10@@ -127,7 +127,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
11 
12 			user, err := getUser(sesh, dbpool)
13 			if err != nil {
14-				fmt.Fprintf(sesh.Stderr(), "detected ssh command: %s\n", args)
15+				_, _ = fmt.Fprintf(sesh.Stderr(), "detected ssh command: %s\n", args)
16 				s := fmt.Errorf("error: you need to create an account before using the remote cli: %w", err)
17 				sesh.Fatal(s)
18 				return s
M pkg/apps/pico/file_handler.go
+6, -6
 1@@ -244,12 +244,12 @@ func (h *UploadHandler) ProcessAuthorizedKeys(text []byte, logger *slog.Logger,
 2 	for _, pk := range diff.Add {
 3 		key := utils.KeyForKeyText(pk.Pk)
 4 
 5-		fmt.Fprintf(s.Stderr(), "adding pubkey (%s)\n", key)
 6+		_, _ = fmt.Fprintf(s.Stderr(), "adding pubkey (%s)\n", key)
 7 		logger.Info("adding pubkey", "pubkey", key)
 8 
 9 		err = dbpool.InsertPublicKey(user.ID, key, pk.Comment, nil)
10 		if err != nil {
11-			fmt.Fprintf(s.Stderr(), "error: could not insert pubkey: %s (%s)\n", err.Error(), key)
12+			_, _ = fmt.Fprintf(s.Stderr(), "error: could not insert pubkey: %s (%s)\n", err.Error(), key)
13 			logger.Error("could not insert pubkey", "err", err.Error())
14 		}
15 	}
16@@ -257,7 +257,7 @@ func (h *UploadHandler) ProcessAuthorizedKeys(text []byte, logger *slog.Logger,
17 	for _, pk := range diff.Update {
18 		key := utils.KeyForKeyText(pk.Pk)
19 
20-		fmt.Fprintf(s.Stderr(), "updating pubkey with comment: %s (%s)\n", pk.Comment, key)
21+		_, _ = fmt.Fprintf(s.Stderr(), "updating pubkey with comment: %s (%s)\n", pk.Comment, key)
22 		logger.Info(
23 			"updating pubkey with comment",
24 			"pubkey", key,
25@@ -266,18 +266,18 @@ func (h *UploadHandler) ProcessAuthorizedKeys(text []byte, logger *slog.Logger,
26 
27 		_, err = dbpool.UpdatePublicKey(pk.ID, pk.Comment)
28 		if err != nil {
29-			fmt.Fprintf(s.Stderr(), "error: could not update pubkey: %s (%s)\n", err.Error(), key)
30+			_, _ = fmt.Fprintf(s.Stderr(), "error: could not update pubkey: %s (%s)\n", err.Error(), key)
31 			logger.Error("could not update pubkey", "err", err.Error(), "key", key)
32 		}
33 	}
34 
35 	if len(diff.Rm) > 0 {
36-		fmt.Fprintf(s.Stderr(), "removing pubkeys: %s\n", diff.Rm)
37+		_, _ = fmt.Fprintf(s.Stderr(), "removing pubkeys: %s\n", diff.Rm)
38 		logger.Info("removing pubkeys", "pubkeys", diff.Rm)
39 
40 		err = dbpool.RemoveKeys(diff.Rm)
41 		if err != nil {
42-			fmt.Fprintf(s.Stderr(), "error: could not rm pubkeys: %s\n", err.Error())
43+			_, _ = fmt.Fprintf(s.Stderr(), "error: could not rm pubkeys: %s\n", err.Error())
44 			logger.Error("could not remove pubkey", "err", err.Error())
45 		}
46 	}
M pkg/apps/pico/ssh.go
+3, -1
 1@@ -50,7 +50,9 @@ func StartSshServer() {
 2 	defer cancel()
 3 
 4 	dbpool := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbpool.Close()
 6+	defer func() {
 7+		_ = dbpool.Close()
 8+	}()
 9 
10 	handler := NewUploadHandler(
11 		dbpool,
M pkg/apps/pipe/api.go
+12, -8
 1@@ -282,7 +282,9 @@ func handlePipe() http.HandlerFunc {
 2 			return
 3 		}
 4 
 5-		defer c.Close()
 6+		defer func() {
 7+			_ = c.Close()
 8+		}()
 9 
10 		clientInfo := shared.NewPicoPipeClient()
11 		topic, _ := url.PathUnescape(shared.GetField(r, 0))
12@@ -326,7 +328,7 @@ func handlePipe() http.HandlerFunc {
13 			if err != nil {
14 				logger.Error("pipe remove error", "topic", topic, "info", clientInfo, "err", err.Error())
15 			}
16-			c.Close()
17+			_ = c.Close()
18 		}()
19 
20 		var wg sync.WaitGroup
21@@ -334,8 +336,8 @@ func handlePipe() http.HandlerFunc {
22 
23 		go func() {
24 			defer func() {
25-				p.Close()
26-				c.Close()
27+				_ = p.Close()
28+				_ = c.Close()
29 				wg.Done()
30 			}()
31 
32@@ -356,8 +358,8 @@ func handlePipe() http.HandlerFunc {
33 
34 		go func() {
35 			defer func() {
36-				p.Close()
37-				c.Close()
38+				_ = p.Close()
39+				_ = c.Close()
40 				wg.Done()
41 			}()
42 
43@@ -415,7 +417,9 @@ func createMainRoutes(staticRoutes []shared.Route) []shared.Route {
44 func StartApiServer() {
45 	cfg := NewConfigSite("pipe-web")
46 	db := postgres.NewDB(cfg.DbURL, cfg.Logger)
47-	defer db.Close()
48+	defer func() {
49+		_ = db.Close()
50+	}()
51 	logger := cfg.Logger
52 
53 	staticRoutes := createStaticRoutes()
54@@ -443,7 +447,7 @@ func StartApiServer() {
55 
56 	go func() {
57 		for {
58-			_, err := fmt.Fprint(pingSession, "%s", fmt.Sprintf("%s: pipe-web ping\n", time.Now().UTC().Format(time.RFC3339)))
59+			_, err := fmt.Fprintf(pingSession, "%s: pipe-web ping\n", time.Now().UTC().Format(time.RFC3339))
60 			if err != nil {
61 				logger.Error("pipe ping error", "err", err.Error())
62 			}
M pkg/apps/pipe/cli.go
+15, -15
  1@@ -25,7 +25,7 @@ func flagSet(cmdName string, sesh *pssh.SSHServerConnSession) *flag.FlagSet {
  2 	cmd := flag.NewFlagSet(cmdName, flag.ContinueOnError)
  3 	cmd.SetOutput(sesh)
  4 	cmd.Usage = func() {
  5-		fmt.Fprintf(cmd.Output(), "Usage: %s <topic> [args...]\nArgs:\n", cmdName)
  6+		_, _ = fmt.Fprintf(cmd.Output(), "Usage: %s <topic> [args...]\nArgs:\n", cmdName)
  7 		cmd.PrintDefaults()
  8 	}
  9 	return cmd
 10@@ -156,7 +156,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 11 			args := sesh.Command()
 12 
 13 			if len(args) == 0 {
 14-				fmt.Fprintln(sesh, helpStr(toSshCmd(handler.Cfg)))
 15+				_, _ = fmt.Fprintln(sesh, helpStr(toSshCmd(handler.Cfg)))
 16 				return next(sesh)
 17 			}
 18 
 19@@ -201,7 +201,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 20 
 21 			cmd := strings.TrimSpace(args[0])
 22 			if cmd == "help" {
 23-				fmt.Fprintln(sesh, helpStr(toSshCmd(handler.Cfg)))
 24+				_, _ = fmt.Fprintln(sesh, helpStr(toSshCmd(handler.Cfg)))
 25 				return next(sesh)
 26 			} else if cmd == "ls" {
 27 				if userName == "public" {
 28@@ -234,7 +234,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 29 				}
 30 
 31 				if len(channels) == 0 && len(waitingChannels) == 0 {
 32-					fmt.Fprintln(sesh, "no pubsub channels found")
 33+					_, _ = fmt.Fprintln(sesh, "no pubsub channels found")
 34 				} else {
 35 					var outputData string
 36 					if len(channels) > 0 || len(waitingChannels) > 0 {
 37@@ -403,7 +403,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 38 				}
 39 
 40 				if !*clean {
 41-					fmt.Fprintf(
 42+					_, _ = fmt.Fprintf(
 43 						sesh,
 44 						"subscribe to this channel:\n  ssh %s sub %s%s\n",
 45 						toSshCmd(handler.Cfg),
 46@@ -436,7 +436,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 47 						}
 48 
 49 						if !*clean {
 50-							fmt.Fprintln(sesh, termMsg)
 51+							_, _ = fmt.Fprintln(sesh, termMsg)
 52 						}
 53 
 54 						ready := make(chan struct{})
 55@@ -482,7 +482,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 56 									logger.Error("error exiting session", "err", err)
 57 								}
 58 
 59-								sesh.Close()
 60+								_ = sesh.Close()
 61 							}
 62 						}
 63 
 64@@ -507,7 +507,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 65 				}
 66 
 67 				if !*clean {
 68-					fmt.Fprintln(sesh, "sending msg ...")
 69+					_, _ = fmt.Fprintln(sesh, "sending msg ...")
 70 				}
 71 
 72 				err = pubsub.Pub(
 73@@ -521,11 +521,11 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 74 				)
 75 
 76 				if !*clean {
 77-					fmt.Fprintln(sesh, "msg sent!")
 78+					_, _ = fmt.Fprintln(sesh, "msg sent!")
 79 				}
 80 
 81 				if err != nil && !*clean {
 82-					fmt.Fprintln(sesh.Stderr(), err)
 83+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
 84 				}
 85 			} else if cmd == "sub" {
 86 				subCmd := flagSet("sub", sesh)
 87@@ -590,7 +590,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 88 					} else if !*public {
 89 						name = toTopic(userName, withoutUser)
 90 					} else {
 91-						fmt.Fprintln(sesh.Stderr(), "access denied")
 92+						_, _ = fmt.Fprintln(sesh.Stderr(), "access denied")
 93 						return err
 94 					}
 95 				}
 96@@ -606,7 +606,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
 97 				)
 98 
 99 				if err != nil && !*clean {
100-					fmt.Fprintln(sesh.Stderr(), err)
101+					_, _ = fmt.Fprintln(sesh.Stderr(), err)
102 				}
103 			} else if cmd == "pipe" {
104 				pipeCmd := flagSet("pipe", sesh)
105@@ -684,7 +684,7 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
106 				}
107 
108 				if isCreator && !*clean {
109-					fmt.Fprintf(
110+					_, _ = fmt.Fprintf(
111 						sesh,
112 						"subscribe to this topic:\n  ssh %s sub %s%s\n",
113 						toSshCmd(handler.Cfg),
114@@ -704,11 +704,11 @@ func Middleware(handler *CliHandler) pssh.SSHServerMiddleware {
115 				)
116 
117 				if readErr != nil && !*clean {
118-					fmt.Fprintln(sesh.Stderr(), "error reading from pipe", readErr)
119+					_, _ = fmt.Fprintln(sesh.Stderr(), "error reading from pipe", readErr)
120 				}
121 
122 				if writeErr != nil && !*clean {
123-					fmt.Fprintln(sesh.Stderr(), "error writing to pipe", writeErr)
124+					_, _ = fmt.Fprintln(sesh.Stderr(), "error writing to pipe", writeErr)
125 				}
126 			}
127 
M pkg/apps/pipe/ssh.go
+3, -1
 1@@ -29,7 +29,9 @@ func StartSshServer() {
 2 	defer cancel()
 3 
 4 	dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbh.Close()
 6+	defer func() {
 7+		_ = dbh.Close()
 8+	}()
 9 
10 	cfg.Port = port
11 	cfg.PortOverride = portOverride
M pkg/apps/prose/api.go
+3, -1
 1@@ -926,7 +926,9 @@ func createSubdomainRoutes(staticRoutes []shared.Route) []shared.Route {
 2 func StartApiServer() {
 3 	cfg := NewConfigSite("prose-web")
 4 	dbpool := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbpool.Close()
 6+	defer func() {
 7+		_ = dbpool.Close()
 8+	}()
 9 	logger := cfg.Logger
10 
11 	var st storage.StorageServe
M pkg/apps/prose/ssh.go
+3, -1
 1@@ -35,7 +35,9 @@ func StartSshServer() {
 2 	defer cancel()
 3 
 4 	dbh := postgres.NewDB(cfg.DbURL, cfg.Logger)
 5-	defer dbh.Close()
 6+	defer func() {
 7+		_ = dbh.Close()
 8+	}()
 9 
10 	hooks := &MarkdownHooks{
11 		Cfg: cfg,
M pkg/db/postgres/storage.go
+3, -1
 1@@ -371,7 +371,9 @@ func (me *PsqlDB) RegisterUser(username, pubkey, comment string) (*db.User, erro
 2 	if err != nil {
 3 		return nil, err
 4 	}
 5-	defer stmt.Close()
 6+	defer func() {
 7+		_ = stmt.Close()
 8+	}()
 9 
10 	var id string
11 	err = stmt.QueryRow(lowerName).Scan(&id)
M pkg/pobj/storage/fs.go
+4, -1
 1@@ -135,7 +135,10 @@ func (s *StorageFS) PutObject(bucket Bucket, fpath string, contents io.Reader, e
 2 		return "", 0, err
 3 	}
 4 
 5-	f.Close()
 6+	err = f.Close()
 7+	if err != nil {
 8+		return "", 0, err
 9+	}
10 
11 	if entry.Mtime > 0 {
12 		uTime := time.Unix(entry.Mtime, 0)
M pkg/pssh/server.go
+13, -7
 1@@ -152,8 +152,8 @@ func (s *SSHServerConnSession) Exit(code int) error {
 2 }
 3 
 4 func (s *SSHServerConnSession) Fatal(err error) {
 5-	fmt.Fprintln(s.Stderr(), err)
 6-	fmt.Fprintf(s.Stderr(), "\r")
 7+	_, _ = fmt.Fprintln(s.Stderr(), err)
 8+	_, _ = fmt.Fprintf(s.Stderr(), "\r")
 9 	_ = s.Exit(1)
10 	_ = s.Close()
11 }
12@@ -172,7 +172,9 @@ func (s *SSHServerConnSession) Pty() (*Pty, <-chan Window, bool) {
13 var _ context.Context = &SSHServerConnSession{}
14 
15 func (sc *SSHServerConn) Handle(chans <-chan ssh.NewChannel, reqs <-chan *ssh.Request) error {
16-	defer sc.Close()
17+	defer func() {
18+		_ = sc.Close()
19+	}()
20 
21 	for {
22 		select {
23@@ -293,7 +295,7 @@ func (s *SSHServer) ListenAndServe() error {
24 			go func() {
25 				<-s.Ctx.Done()
26 				s.Logger.Info("Prometheus server shutting down")
27-				srv.Close()
28+				_ = srv.Close()
29 			}()
30 
31 			s.Logger.Info("Starting Prometheus server", "addr", s.Config.PromListenAddr)
32@@ -317,11 +319,13 @@ func (s *SSHServer) ListenAndServe() error {
33 	}
34 
35 	s.Listener = listen
36-	defer s.Listener.Close()
37+	defer func() {
38+		_ = s.Listener.Close()
39+	}()
40 
41 	go func() {
42 		<-s.Ctx.Done()
43-		s.Close()
44+		_ = s.Close()
45 	}()
46 
47 	var retErr error
48@@ -352,7 +356,9 @@ func (s *SSHServer) ListenAndServe() error {
49 }
50 
51 func (s *SSHServer) HandleConn(conn net.Conn) error {
52-	defer conn.Close()
53+	defer func() {
54+		_ = conn.Close()
55+	}()
56 
57 	sshConn, chans, reqs, err := ssh.NewServerConn(conn, s.Config.ServerConfig)
58 	if err != nil {
M pkg/pssh/server_test.go
+5, -3
 1@@ -167,7 +167,9 @@ func TestSSHServerHandleConn(t *testing.T) {
 2 
 3 	// Create a mock connection
 4 	client, server_conn := net.Pipe()
 5-	defer client.Close()
 6+	defer func() {
 7+		_ = client.Close()
 8+	}()
 9 
10 	// Start HandleConn in a goroutine
11 	errChan := make(chan error, 1)
12@@ -190,8 +192,8 @@ func TestSSHServerHandleConn(t *testing.T) {
13 	}
14 
15 	// Close connections to ensure HandleConn returns
16-	client.Close()
17-	server_conn.Close()
18+	_ = client.Close()
19+	_ = server_conn.Close()
20 
21 	// Wait for HandleConn to return
22 	select {
M pkg/send/pipe/pipe.go
+1, -1
1@@ -51,7 +51,7 @@ func Middleware(writeHandler utils.CopyFromClientHandler, ext string) pssh.SSHSe
2 			}
3 
4 			if result != "" {
5-				_, err := fmt.Fprint(session, "%s\r\n", result)
6+				_, err := fmt.Fprintf(session, "%s\r\n", result)
7 				if err != nil {
8 					utils.ErrorHandler(session, err)
9 				}
M pkg/send/protocols/rsync/rsync.go
+5, -5
 1@@ -157,7 +157,7 @@ func (h *handler) Remove(willReceive []*rsyncutils.ReceiverFile) error {
 2 
 3 	for _, file := range toDelete {
 4 		errs = append(errs, h.writeHandler.Delete(h.session, &utils.FileEntry{Filepath: path.Join("/", h.root, file)}))
 5-		_, err = fmt.Fprint(h.session.Stderr(), "deleting %s\r\n", file)
 6+		_, err = fmt.Fprintf(h.session.Stderr(), "deleting %s\r\n", file)
 7 		errs = append(errs, err)
 8 	}
 9 
10@@ -193,25 +193,25 @@ func Middleware(writeHandler utils.CopyFromClientHandler) pssh.SSHServerMiddlewa
11 
12 			optsCtx, err := rsyncopts.ParseArguments(cmdFlags[1:], true)
13 			if err != nil {
14-				fmt.Fprintf(session.Stderr(), "error parsing rsync arguments: %s\r\n", err.Error())
15+				_, _ = fmt.Fprintf(session.Stderr(), "error parsing rsync arguments: %s\r\n", err.Error())
16 				return err
17 			}
18 
19 			if optsCtx.Options.Compress() {
20 				err := fmt.Errorf("compression is currently unsupported")
21-				fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
22+				_, _ = fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
23 				return err
24 			}
25 
26 			if optsCtx.Options.AlwaysChecksum() {
27 				err := fmt.Errorf("checksum is currently unsupported")
28-				fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
29+				_, _ = fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
30 				return err
31 			}
32 
33 			if len(optsCtx.RemainingArgs) != 2 {
34 				err := fmt.Errorf("missing source and destination arguments")
35-				fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
36+				_, _ = fmt.Fprintf(session.Stderr(), "error: %s\r\n", err.Error())
37 				return err
38 			}
39 
M pkg/send/protocols/sftp/handler.go
+4, -4
 1@@ -149,28 +149,28 @@ type handlererr struct {
 2 func (f *handlererr) Filecmd(r *sftp.Request) error {
 3 	err := f.Handler.Filecmd(r)
 4 	if err != nil {
 5-		fmt.Fprintln(f.Handler.session.Stderr(), err)
 6+		_, _ = fmt.Fprintln(f.Handler.session.Stderr(), err)
 7 	}
 8 	return err
 9 }
10 func (f *handlererr) Filelist(r *sftp.Request) (sftp.ListerAt, error) {
11 	result, err := f.Handler.Filelist(r)
12 	if err != nil {
13-		fmt.Fprintln(f.Handler.session.Stderr(), err)
14+		_, _ = fmt.Fprintln(f.Handler.session.Stderr(), err)
15 	}
16 	return result, err
17 }
18 func (f *handlererr) Filewrite(r *sftp.Request) (io.WriterAt, error) {
19 	result, err := f.Handler.Filewrite(r)
20 	if err != nil {
21-		fmt.Fprintln(f.Handler.session.Stderr(), err)
22+		_, _ = fmt.Fprintln(f.Handler.session.Stderr(), err)
23 	}
24 	return result, err
25 }
26 func (f *handlererr) Fileread(r *sftp.Request) (io.ReaderAt, error) {
27 	result, err := f.Handler.Fileread(r)
28 	if err != nil {
29-		fmt.Fprintln(f.Handler.session.Stderr(), err)
30+		_, _ = fmt.Fprintln(f.Handler.session.Stderr(), err)
31 	}
32 	return result, err
33 }
M pkg/send/protocols/sftp/sftp.go
+3, -3
 1@@ -31,13 +31,13 @@ func Middleware(writeHandler utils.CopyFromClientHandler) pssh.SSHServerMiddlewa
 2 			defer func() {
 3 				if r := recover(); r != nil {
 4 					logger.Error("error running sftp middleware", "err", r)
 5-					fmt.Fprintln(session, "error running sftp middleware, check the flags you are using")
 6+					_, _ = fmt.Fprintln(session, "error running sftp middleware, check the flags you are using")
 7 				}
 8 			}()
 9 
10 			err := writeHandler.Validate(session)
11 			if err != nil {
12-				fmt.Fprintln(session.Stderr(), err)
13+				_, _ = fmt.Fprintln(session.Stderr(), err)
14 				return err
15 			}
16 
17@@ -59,7 +59,7 @@ func Middleware(writeHandler utils.CopyFromClientHandler) pssh.SSHServerMiddlewa
18 
19 			err = requestServer.Serve()
20 			if err != nil && !errors.Is(err, io.EOF) {
21-				fmt.Fprintln(session.Stderr(), err)
22+				_, _ = fmt.Fprintln(session.Stderr(), err)
23 				logger.Error("Error serving sftp subsystem", "err", err)
24 			}
25 
M pkg/send/protocols/sftp/writer.go
+4, -2
 1@@ -70,6 +70,8 @@ func (f fakeWrite) Close() error {
 2 		nMsg := fmt.Sprintf("%s\r\n", msg)
 3 		_, err = f.handler.session.Stderr().Write([]byte(nMsg))
 4 	}
 5-	f.buf.Close()
 6-	return err
 7+	if err != nil {
 8+		return err
 9+	}
10+	return f.buf.Close()
11 }
M pkg/shared/storage/fs_test.go
+3, -1
 1@@ -21,7 +21,9 @@ func TestFsAdapter(t *testing.T) {
 2 	if err != nil {
 3 		t.Fatal(err)
 4 	}
 5-	defer os.RemoveAll(f)
 6+	defer func() {
 7+		_ = os.RemoveAll(f)
 8+	}()
 9 
10 	st, err := NewStorageFS(logger, f)
11 	if err != nil {
M pkg/tui/tuns.go
+3, -1
 1@@ -444,7 +444,9 @@ func fetch(fqdn, auth string) (map[string]*TunsClient, error) {
 2 	if err != nil {
 3 		return mapper, err
 4 	}
 5-	defer resp.Body.Close()
 6+	defer func() {
 7+		_ = resp.Body.Close()
 8+	}()
 9 
10 	var data TunsClientApi
11 	err = json.NewDecoder(resp.Body).Decode(&data)
M pkg/tunkit/ptun.go
+9, -5
 1@@ -66,10 +66,12 @@ func LocalForwardHandler(handler Tunnel) pssh.SSHServerChannelMiddleware {
 2 			downConn, err := handler.CreateConn(ctx)
 3 			if err != nil {
 4 				log.Error("unable to connect to conn", "err", err)
 5-				ch.Close()
 6+				_ = ch.Close()
 7 				return
 8 			}
 9-			defer downConn.Close()
10+			defer func() {
11+				_ = downConn.Close()
12+			}()
13 
14 			var wg sync.WaitGroup
15 			wg.Add(2)
16@@ -78,8 +80,8 @@ func LocalForwardHandler(handler Tunnel) pssh.SSHServerChannelMiddleware {
17 				defer wg.Done()
18 				defer func() {
19 					_ = ch.CloseWrite()
20+					_ = downConn.Close()
21 				}()
22-				defer downConn.Close()
23 				_, err := io.Copy(ch, downConn)
24 				if err != nil {
25 					if !errors.Is(err, net.ErrClosed) {
26@@ -89,8 +91,10 @@ func LocalForwardHandler(handler Tunnel) pssh.SSHServerChannelMiddleware {
27 			}()
28 			go func() {
29 				defer wg.Done()
30-				defer ch.Close()
31-				defer downConn.Close()
32+				defer func() {
33+					_ = ch.Close()
34+					_ = downConn.Close()
35+				}()
36 				_, err := io.Copy(downConn, ch)
37 				if err != nil {
38 					if !errors.Is(err, net.ErrClosed) {
M pkg/tunkit/web-handler.go
+8, -2
 1@@ -62,9 +62,15 @@ func (wt *WebTunnelHandler) CreateListener(ctx *pssh.SSHServerConnSession) (net.
 2 		return nil, err
 3 	}
 4 
 5-	tempFile.Close()
 6+	err = tempFile.Close()
 7+	if err != nil {
 8+		return nil, err
 9+	}
10 	address := tempFile.Name()
11-	os.Remove(address)
12+	err = os.Remove(address)
13+	if err != nil {
14+		return nil, err
15+	}
16 
17 	connListener, err := net.Listen("unix", address)
18 	if err != nil {