@@ -10,6 +10,7 @@ import (
10
10
"strings"
11
11
12
12
"github.com/theandrew168/pg2s3"
13
+ "golang.org/x/term"
13
14
)
14
15
15
16
// TODO: move env var names to package constants?
@@ -33,8 +34,6 @@ func main() {
33
34
log .Fatalln (err )
34
35
}
35
36
36
- publicKey := os .Getenv ("PG2S3_AGE_PUBLIC_KEY" )
37
-
38
37
usage := "usage: pg2s3 backup|restore|prune"
39
38
if len (os .Args ) < 2 {
40
39
log .Fatalln (usage )
@@ -52,7 +51,7 @@ func main() {
52
51
log .Fatalln (err )
53
52
}
54
53
case "restore" :
55
- err = restore (client , publicKey )
54
+ err = restore (client )
56
55
if err != nil {
57
56
log .Fatalln (err )
58
57
}
@@ -92,6 +91,8 @@ func confirm(message string) bool {
92
91
}
93
92
94
93
func backup (client * pg2s3.Client , prefix string ) error {
94
+ publicKey := os .Getenv ("PG2S3_AGE_PUBLIC_KEY" )
95
+
95
96
// generate name for backup
96
97
name , err := pg2s3 .GenerateBackupName (prefix )
97
98
if err != nil {
@@ -108,6 +109,18 @@ func backup(client *pg2s3.Client, prefix string) error {
108
109
}
109
110
defer os .Remove (path )
110
111
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
+
111
124
// upload backup
112
125
err = client .UploadBackup (name , path )
113
126
if err != nil {
@@ -118,7 +131,9 @@ func backup(client *pg2s3.Client, prefix string) error {
118
131
return nil
119
132
}
120
133
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
+
122
137
// list all backups
123
138
backups , err := client .ListBackups ()
124
139
if err != nil {
@@ -142,6 +157,24 @@ func restore(client *pg2s3.Client, publicKey string) error {
142
157
}
143
158
defer os .Remove (path )
144
159
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
+
145
178
// confirm restore before applying
146
179
message := fmt .Sprintf ("restore %s" , latest )
147
180
if ! confirm (message ) {
0 commit comments