git-pr
created pr with
16.1
added 16.2
1: 3bd44da ! 1: 9002592 chore(pgs): add validation to project names
added 16.3
1: 9002592 = 1: 9002592 chore(pgs): add validation to project names
-: ------- > 2: cd17cf4 chore: update pobj
-: ------- > 3: a00def2 chore: complete impl
changed pr name to
feat: private obj store service
added 16.4
1: 9002592 = 1: 9002592 chore(pgs): add validation to project names
2: cd17cf4 = 2: cd17cf4 chore: update pobj
3: a00def2 = 3: a00def2 chore: complete impl
-: ------- > 4: 0ed7dc9 chore: update pobj
-: ------- > 5: 8ff1131 working!
added 16.5
1: 9002592 = 1: 9002592 chore(pgs): add validation to project names
2: cd17cf4 = 2: cd17cf4 chore: update pobj
3: a00def2 = 3: a00def2 chore: complete impl
4: 0ed7dc9 = 4: 0ed7dc9 chore: update pobj
5: 8ff1131 = 5: 8ff1131 working!
-: ------- > 6: 0c8ad0d chore(obj): prep service def
cmds
checkout latest patchset:
ssh pr.pico.sh print 16 | git am -3checkout any patchset in a patch request:
ssh pr.pico.sh print 16.[rev] | git am -3add changes to patch request:
git format-patch main --stdout | ssh pr.pico.sh pr add 16
Patchset
16.5
chore(pgs): add validation to project names
Eric Bower
→ chore: update pobj
2024-08-18T15:27:37ZEric Bower
chore: complete impl
2024-08-18T15:57:19ZEric Bower
chore: update pobj
2024-08-18T16:02:22ZEric Bower
working!
2024-08-18T16:33:25ZEric Bower
chore(obj): prep service def
2024-08-18T16:37:25ZEric Bower
2024-08-19T02:01:14Z
chore: update pobj
Eric Bower
2024-08-18T15:57:19ZSemantic diff summary
5 added,
0 modified,
0 signature changed,
0 removed
across 2 analyzed files
(2 files skipped: unsupported file type)
+20
-1
go.mod
#
| ... | ... | @@ -32,7 +32,7 @@ require ( | |
| 32 | 32 | github.com/muesli/reflow v0.3.0 | |
| 33 | 33 | github.com/muesli/termenv v0.15.2 | |
| 34 | 34 | github.com/neurosnap/go-exif-remove v0.0.0-20221010134343-50d1e3c35577 | |
| 35 | - | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a | |
| 35 | + | github.com/picosh/pobj v0.0.0-20240818155605-c7df7b892bf5 | |
| 36 | 36 | github.com/picosh/send v0.0.0-20240709135413-81b1dd703a11 | |
| 37 | 37 | github.com/picosh/tunkit v0.0.0-20240709033345-8315d4f3cd0e | |
| 38 | 38 | github.com/sabhiram/go-gitignore v0.0.0-20210923224102-525f6e181f06 |
| ... | ... | @@ -57,6 +57,25 @@ require ( | |
| 57 | 57 | github.com/andybalholm/cascadia v1.3.2 // indirect | |
| 58 | 58 | github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect | |
| 59 | 59 | github.com/atotto/clipboard v0.1.4 // indirect | |
| 60 | + | github.com/aws/aws-sdk-go-v2 v1.30.4 // indirect | |
| 61 | + | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 // indirect | |
| 62 | + | github.com/aws/aws-sdk-go-v2/config v1.27.28 // indirect | |
| 63 | + | github.com/aws/aws-sdk-go-v2/credentials v1.17.28 // indirect | |
| 64 | + | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 // indirect | |
| 65 | + | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.11 // indirect | |
| 66 | + | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 // indirect | |
| 67 | + | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 // indirect | |
| 68 | + | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect | |
| 69 | + | github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 // indirect | |
| 70 | + | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 // indirect | |
| 71 | + | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 // indirect | |
| 72 | + | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 // indirect | |
| 73 | + | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 // indirect | |
| 74 | + | github.com/aws/aws-sdk-go-v2/service/s3 v1.59.0 // indirect | |
| 75 | + | github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 // indirect | |
| 76 | + | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 // indirect | |
| 77 | + | github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 // indirect | |
| 78 | + | github.com/aws/smithy-go v1.20.4 // indirect | |
| 60 | 79 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect | |
| 61 | 80 | github.com/aymerick/douceur v0.2.0 // indirect | |
| 62 | 81 | github.com/beorn7/perks v1.0.1 // indirect |
+40
-0
go.sum
#
| ... | ... | @@ -21,6 +21,44 @@ github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhP | |
| 21 | 21 | github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw= | |
| 22 | 22 | github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= | |
| 23 | 23 | github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= | |
| 24 | + | github.com/aws/aws-sdk-go-v2 v1.30.4 h1:frhcagrVNrzmT95RJImMHgabt99vkXGslubDaDagTk8= | |
| 25 | + | github.com/aws/aws-sdk-go-v2 v1.30.4/go.mod h1:CT+ZPWXbYrci8chcARI3OmI/qgd+f6WtuLOoaIA8PR0= | |
| 26 | + | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4 h1:70PVAiL15/aBMh5LThwgXdSQorVr91L127ttckI9QQU= | |
| 27 | + | github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.4/go.mod h1:/MQxMqci8tlqDH+pjmoLu1i0tbWCUP1hhyMRuFxpQCw= | |
| 28 | + | github.com/aws/aws-sdk-go-v2/config v1.27.28 h1:OTxWGW/91C61QlneCtnD62NLb4W616/NM1jA8LhJqbg= | |
| 29 | + | github.com/aws/aws-sdk-go-v2/config v1.27.28/go.mod h1:uzVRVtJSU5EFv6Fu82AoVFKozJi2ZCY6WRCXj06rbvs= | |
| 30 | + | github.com/aws/aws-sdk-go-v2/credentials v1.17.28 h1:m8+AHY/ND8CMHJnPoH7PJIRakWGa4gbfbxuY9TGTUXM= | |
| 31 | + | github.com/aws/aws-sdk-go-v2/credentials v1.17.28/go.mod h1:6TF7dSc78ehD1SL6KpRIPKMA1GyyWflIkjqg+qmf4+c= | |
| 32 | + | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12 h1:yjwoSyDZF8Jth+mUk5lSPJCkMC0lMy6FaCD51jm6ayE= | |
| 33 | + | github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.12/go.mod h1:fuR57fAgMk7ot3WcNQfb6rSEn+SUffl7ri+aa8uKysI= | |
| 34 | + | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.11 h1:FEDZD/Axt5tKSkPAs967KZ++MkvYdBqr0a+cetRbjLM= | |
| 35 | + | github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.11/go.mod h1:dvlsbA32KfvCzqwTiX7maABgFek2RyUuYEJ3kyn/PmQ= | |
| 36 | + | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16 h1:TNyt/+X43KJ9IJJMjKfa3bNTiZbUP7DeCxfbTROESwY= | |
| 37 | + | github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.16/go.mod h1:2DwJF39FlNAUiX5pAc0UNeiz16lK2t7IaFcm0LFHEgc= | |
| 38 | + | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16 h1:jYfy8UPmd+6kJW5YhY0L1/KftReOGxI/4NtVSTh9O/I= | |
| 39 | + | github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.16/go.mod h1:7ZfEPZxkW42Afq4uQB8H2E2e6ebh6mXTueEpYzjCzcs= | |
| 40 | + | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= | |
| 41 | + | github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= | |
| 42 | + | github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16 h1:mimdLQkIX1zr8GIPY1ZtALdBQGxcASiBd2MOp8m/dMc= | |
| 43 | + | github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.16/go.mod h1:YHk6owoSwrIsok+cAH9PENCOGoH5PU2EllX4vLtSrsY= | |
| 44 | + | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4 h1:KypMCbLPPHEmf9DgMGw51jMj77VfGPAN2Kv4cfhlfgI= | |
| 45 | + | github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.4/go.mod h1:Vz1JQXliGcQktFTN/LN6uGppAIRoLBR2bMvIMP0gOjc= | |
| 46 | + | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18 h1:GckUnpm4EJOAio1c8o25a+b3lVfwVzC9gnSBqiiNmZM= | |
| 47 | + | github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.18/go.mod h1:Br6+bxfG33Dk3ynmkhsW2Z/t9D4+lRqdLDNCKi85w0U= | |
| 48 | + | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18 h1:tJ5RnkHCiSH0jyd6gROjlJtNwov0eGYNz8s8nFcR0jQ= | |
| 49 | + | github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.18/go.mod h1:++NHzT+nAF7ZPrHPsA+ENvsXkOO8wEu+C6RXltAG4/c= | |
| 50 | + | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16 h1:jg16PhLPUiHIj8zYIW6bqzeQSuHVEiWnGA0Brz5Xv2I= | |
| 51 | + | github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.16/go.mod h1:Uyk1zE1VVdsHSU7096h/rwnXDzOzYQVl+FNPhPw7ShY= | |
| 52 | + | github.com/aws/aws-sdk-go-v2/service/s3 v1.59.0 h1:Cso4Ev/XauMVsbwdhYEoxg8rxZWw43CFqqaPB5w3W2c= | |
| 53 | + | github.com/aws/aws-sdk-go-v2/service/s3 v1.59.0/go.mod h1:BSPI0EfnYUuNHPS0uqIo5VrRwzie+Fp+YhQOUs16sKI= | |
| 54 | + | github.com/aws/aws-sdk-go-v2/service/sso v1.22.5 h1:zCsFCKvbj25i7p1u94imVoO447I/sFv8qq+lGJhRN0c= | |
| 55 | + | github.com/aws/aws-sdk-go-v2/service/sso v1.22.5/go.mod h1:ZeDX1SnKsVlejeuz41GiajjZpRSWR7/42q/EyA/QEiM= | |
| 56 | + | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5 h1:SKvPgvdvmiTWoi0GAJ7AsJfOz3ngVkD/ERbs5pUnHNI= | |
| 57 | + | github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.5/go.mod h1:20sz31hv/WsPa3HhU3hfrIet2kxM4Pe0r20eBZ20Tac= | |
| 58 | + | github.com/aws/aws-sdk-go-v2/service/sts v1.30.4 h1:iAckBT2OeEK/kBDyN/jDtpEExhjeeA/Im2q4X0rJZT8= | |
| 59 | + | github.com/aws/aws-sdk-go-v2/service/sts v1.30.4/go.mod h1:vmSqFK+BVIwVpDAGZB3CoCXHzurt4qBE8lf+I/kRTh0= | |
| 60 | + | github.com/aws/smithy-go v1.20.4 h1:2HK1zBdPgRbjFOHlfeQZfpC4r72MOb9bZkiFwggKO+4= | |
| 61 | + | github.com/aws/smithy-go v1.20.4/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= | |
| 24 | 62 | github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= | |
| 25 | 63 | github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= | |
| 26 | 64 | github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= |
| ... | ... | @@ -224,6 +262,8 @@ github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc h1:bvcsoO | |
| 224 | 262 | github.com/picosh/go-rsync-receiver v0.0.0-20240709135253-1daf4b12a9fc/go.mod h1:i0iR3W4GSm1PuvVxB9OH32E5jP+CYkVb2NQSe0JCtlo= | |
| 225 | 263 | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a h1:Cr1xODiyd/SjjBRtYA9VX6Do3D+w+DansQzkb4NGeyA= | |
| 226 | 264 | github.com/picosh/pobj v0.0.0-20240709135546-27097077b26a/go.mod h1:VIkR1MZBvxSK2OO47jikxikAO/sKb/vTmXX5ZuYTIvo= | |
| 265 | + | github.com/picosh/pobj v0.0.0-20240818155605-c7df7b892bf5 h1:gYoKG14iOjlYYCTiyFiOgybrqAOpnAqe6YU5QXnn8+A= | |
| 266 | + | github.com/picosh/pobj v0.0.0-20240818155605-c7df7b892bf5/go.mod h1:tPv/ydMnuXlGVpWUMvBlcWlyn/xu9PsVPdncYibweWY= | |
| 227 | 267 | github.com/picosh/send v0.0.0-20240709135413-81b1dd703a11 h1:ElTyYxJPPfAz+NLRL9qy+SQ9UYaSGlWXWl2yYrLPzCU= | |
| 228 | 268 | github.com/picosh/send v0.0.0-20240709135413-81b1dd703a11/go.mod h1:RAgLDK3LrDK6pNeXtU9tjo28obl5DxShcTUk2nm/KCM= | |
| 229 | 269 | github.com/picosh/senpai v0.0.0-20240503200611-af89e73973b0 h1:pBRIbiCj7K6rGELijb//dYhyCo8A3fvxW5dijrJVtjs= |
+27
-0
obj/config.go
#
| ... | ... | @@ -0,0 +1,27 @@ | |
| 1 | + | package obj | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "github.com/picosh/pico/shared" | |
| 5 | + | ) | |
| 6 | + | ||
| 7 | + | func NewConfigSite() *shared.ConfigSite { | |
| 8 | + | debug := shared.GetEnv("OBJ_DEBUG", "0") | |
| 9 | + | storageDir := shared.GetEnv("OBJ_STORAGE_DIR", ".storage") | |
| 10 | + | minioURL := shared.GetEnv("MINIO_URL", "") | |
| 11 | + | minioUser := shared.GetEnv("MINIO_ROOT_USER", "") | |
| 12 | + | minioPass := shared.GetEnv("MINIO_ROOT_PASSWORD", "") | |
| 13 | + | dbURL := shared.GetEnv("DATABASE_URL", "") | |
| 14 | + | ||
| 15 | + | cfg := shared.ConfigSite{ | |
| 16 | + | Debug: debug == "1", | |
| 17 | + | DbURL: dbURL, | |
| 18 | + | StorageDir: storageDir, | |
| 19 | + | MinioURL: minioURL, | |
| 20 | + | MinioUser: minioUser, | |
| 21 | + | MinioPass: minioPass, | |
| 22 | + | Space: "obj", | |
| 23 | + | Logger: shared.CreateLogger(debug == "1"), | |
| 24 | + | } | |
| 25 | + | ||
| 26 | + | return &cfg | |
| 27 | + | } |
+99
-0
obj/ssh.go
#
| ... | ... | @@ -0,0 +1,99 @@ | |
| 1 | + | package obj | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "context" | |
| 5 | + | "fmt" | |
| 6 | + | "log/slog" | |
| 7 | + | "os" | |
| 8 | + | "os/signal" | |
| 9 | + | "path/filepath" | |
| 10 | + | "syscall" | |
| 11 | + | "time" | |
| 12 | + | ||
| 13 | + | "github.com/charmbracelet/wish" | |
| 14 | + | "github.com/picosh/pico/db" | |
| 15 | + | "github.com/picosh/pico/db/postgres" | |
| 16 | + | "github.com/picosh/pico/filehandlers/util" | |
| 17 | + | "github.com/picosh/pico/shared" | |
| 18 | + | "github.com/picosh/pico/shared/storage" | |
| 19 | + | "github.com/picosh/pobj" | |
| 20 | + | "github.com/picosh/send/send/utils" | |
| 21 | + | ) | |
| 22 | + | ||
| 23 | + | type AssetNamesPriv struct { | |
| 24 | + | DBPool db.DB | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | var _ pobj.AssetNames = &AssetNamesPriv{} | |
| 28 | + | var _ pobj.AssetNames = (*AssetNamesPriv)(nil) | |
| 29 | + | ||
| 30 | + | func (an *AssetNamesPriv) BucketName(userName string) string { | |
| 31 | + | user, _ := an.DBPool.FindUserForName(userName) | |
| 32 | + | return shared.GetAssetBucketName(user.ID) | |
| 33 | + | } | |
| 34 | + | func (an *AssetNamesPriv) ObjectName(entry *utils.FileEntry) string { | |
| 35 | + | return filepath.Join("pico-private", entry.Filepath) | |
| 36 | + | } | |
| 37 | + | ||
| 38 | + | func StartSshServer() { | |
| 39 | + | logger := slog.Default() | |
| 40 | + | host := pobj.GetEnv("OBJ_SSH_HOST", "0.0.0.0") | |
| 41 | + | port := pobj.GetEnv("OBJ_SSH_PORT", "2222") | |
| 42 | + | cfg := NewConfigSite() | |
| 43 | + | dbpool := postgres.NewDB(cfg.DbURL, cfg.Logger) | |
| 44 | + | defer dbpool.Close() | |
| 45 | + | ||
| 46 | + | var st storage.StorageServe | |
| 47 | + | var err error | |
| 48 | + | if cfg.MinioURL == "" { | |
| 49 | + | st, err = storage.NewStorageFS(cfg.StorageDir) | |
| 50 | + | } else { | |
| 51 | + | st, err = storage.NewStorageMinio(cfg.MinioURL, cfg.MinioUser, cfg.MinioPass) | |
| 52 | + | } | |
| 53 | + | ||
| 54 | + | assetNames := &AssetNamesPriv{ | |
| 55 | + | DBPool: dbpool, | |
| 56 | + | } | |
| 57 | + | objcfg := &pobj.Config{ | |
| 58 | + | Logger: logger, | |
| 59 | + | Storage: st, | |
| 60 | + | AssetNames: assetNames, | |
| 61 | + | } | |
| 62 | + | ||
| 63 | + | handler := pobj.NewUploadAssetHandler(objcfg) | |
| 64 | + | ||
| 65 | + | sshAuth := util.NewSshAuthHandler(dbpool, logger, cfg) | |
| 66 | + | s, err := wish.NewServer( | |
| 67 | + | wish.WithAddress(fmt.Sprintf("%s:%s", host, port)), | |
| 68 | + | wish.WithHostKeyPath("ssh_data/term_info_ed25519"), | |
| 69 | + | wish.WithPublicKeyAuth(sshAuth.PubkeyAuthHandler), | |
| 70 | + | pobj.WithProxy(handler), | |
| 71 | + | ) | |
| 72 | + | if err != nil { | |
| 73 | + | logger.Error(err.Error()) | |
| 74 | + | return | |
| 75 | + | } | |
| 76 | + | ||
| 77 | + | done := make(chan os.Signal, 1) | |
| 78 | + | signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) | |
| 79 | + | logger.Info( | |
| 80 | + | "starting SSH server", | |
| 81 | + | "host", host, | |
| 82 | + | "port", port, | |
| 83 | + | ) | |
| 84 | + | go func() { | |
| 85 | + | if err = s.ListenAndServe(); err != nil { | |
| 86 | + | logger.Error(err.Error()) | |
| 87 | + | } | |
| 88 | + | }() | |
| 89 | + | ||
| 90 | + | <-done | |
| 91 | + | logger.Info("stopping SSH server") | |
| 92 | + | ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) | |
| 93 | + | defer func() { | |
| 94 | + | cancel() | |
| 95 | + | }() | |
| 96 | + | if err := s.Shutdown(ctx); err != nil { | |
| 97 | + | logger.Error(err.Error()) | |
| 98 | + | } | |
| 99 | + | } |