Skip to content

Commit 7b7fc16

Browse files
committed
Get encrypt / decrypt working on the CLI
1 parent e15615c commit 7b7fc16

File tree

3 files changed

+39
-4
lines changed

3 files changed

+39
-4
lines changed

cmd/cli/main.go

+37-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111

1212
"github.com/theandrew168/pg2s3"
13+
"golang.org/x/term"
1314
)
1415

1516
// TODO: move env var names to package constants?
@@ -33,8 +34,6 @@ func main() {
3334
log.Fatalln(err)
3435
}
3536

36-
publicKey := os.Getenv("PG2S3_AGE_PUBLIC_KEY")
37-
3837
usage := "usage: pg2s3 backup|restore|prune"
3938
if len(os.Args) < 2 {
4039
log.Fatalln(usage)
@@ -52,7 +51,7 @@ func main() {
5251
log.Fatalln(err)
5352
}
5453
case "restore":
55-
err = restore(client, publicKey)
54+
err = restore(client)
5655
if err != nil {
5756
log.Fatalln(err)
5857
}
@@ -92,6 +91,8 @@ func confirm(message string) bool {
9291
}
9392

9493
func backup(client *pg2s3.Client, prefix string) error {
94+
publicKey := os.Getenv("PG2S3_AGE_PUBLIC_KEY")
95+
9596
// generate name for backup
9697
name, err := pg2s3.GenerateBackupName(prefix)
9798
if err != nil {
@@ -108,6 +109,18 @@ func backup(client *pg2s3.Client, prefix string) error {
108109
}
109110
defer os.Remove(path)
110111

112+
// encrypt backup (if applicable)
113+
if publicKey != "" {
114+
agePath := path + ".age"
115+
err := client.EncryptBackup(agePath, path, publicKey)
116+
if err != nil {
117+
return err
118+
}
119+
120+
name = name + ".age"
121+
path = agePath
122+
}
123+
111124
// upload backup
112125
err = client.UploadBackup(name, path)
113126
if err != nil {
@@ -118,7 +131,9 @@ func backup(client *pg2s3.Client, prefix string) error {
118131
return nil
119132
}
120133

121-
func restore(client *pg2s3.Client, publicKey string) error {
134+
func restore(client *pg2s3.Client) error {
135+
publicKey := os.Getenv("PG2S3_AGE_PUBLIC_KEY")
136+
122137
// list all backups
123138
backups, err := client.ListBackups()
124139
if err != nil {
@@ -142,6 +157,24 @@ func restore(client *pg2s3.Client, publicKey string) error {
142157
}
143158
defer os.Remove(path)
144159

160+
// decrypt backup (if applicable)
161+
if publicKey != "" {
162+
fmt.Println("enter age private key:")
163+
input, err := term.ReadPassword(int(os.Stdin.Fd()))
164+
if err != nil {
165+
return err
166+
}
167+
168+
privateKey := string(input)
169+
170+
agePath := path
171+
path = strings.TrimSuffix(path, ".age")
172+
err = client.DecryptBackup(path, agePath, privateKey)
173+
if err != nil {
174+
return err
175+
}
176+
}
177+
145178
// confirm restore before applying
146179
message := fmt.Sprintf("restore %s", latest)
147180
if !confirm(message) {

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.17
55
require (
66
filippo.io/age v1.0.0
77
github.com/minio/minio-go/v7 v7.0.14
8+
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b
89
)
910

1011
require (

go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ golang.org/x/sys v0.0.0-20210903071746-97244b99971b h1:3Dq0eVHn0uaQJmPO+/aYPI/fR
7171
golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
7272
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
7373
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
74+
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b h1:9zKuko04nR4gjZ4+DNjHqRlAJqbJETHwiNKDqTfOjfE=
7475
golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
7576
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
7677
golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k=

0 commit comments

Comments
 (0)