Eric Bower
·
2025-07-21
main.go
1package main
2
3import (
4 "os"
5 "strings"
6
7 "github.com/picosh/pico/pkg/apps/pgs"
8 pgsdb "github.com/picosh/pico/pkg/apps/pgs/db"
9 "github.com/picosh/pico/pkg/shared"
10 "github.com/picosh/pico/pkg/shared/storage"
11 "github.com/picosh/utils"
12 "golang.org/x/crypto/ssh"
13)
14
15func main() {
16 dbURL := utils.GetEnv("DATABASE_URL", "./data/pgs.sqlite3")
17 logger := shared.CreateLogger("pgs-standalone", false)
18 dbpool, err := pgsdb.NewSqliteDB(dbURL, logger)
19 if err != nil {
20 panic(err)
21 }
22 adapter := storage.GetStorageTypeFromEnv()
23 st, err := storage.NewStorage(logger, adapter)
24 if err != nil {
25 panic(err)
26 }
27 pubsub := pgs.NewPubsubChan()
28 defer func() {
29 _ = pubsub.Close()
30 }()
31 cfg := pgs.NewPgsConfig(logger, dbpool, st, pubsub)
32 killCh := make(chan error)
33
34 // first time user experience flow
35 args := os.Args
36 if len(args) > 1 && args[1] == "init" {
37 if len(args) < 4 {
38 panic("must provide username and pubkey")
39 }
40
41 userName := args[2]
42 pubkeyRaw := strings.Join(args[3:], " ")
43 key, comment, _, _, err := ssh.ParseAuthorizedKey([]byte(pubkeyRaw))
44 if err != nil {
45 logger.Error("parse pubkey", "err", err)
46 return
47 }
48 pubkey := utils.KeyForKeyText(key)
49 logger.Info("init cli", "userName", userName, "pubkey", pubkey)
50
51 err = dbpool.RegisterAdmin(userName, pubkey, comment)
52 if err != nil {
53 panic(err)
54 }
55 logger.Info("Admin user created. You can now start using pgs!")
56 return
57 }
58
59 go pgs.StartApiServer(cfg)
60 pgs.StartSshServer(cfg, killCh)
61}