Skip to content

Commit 0ca59d4

Browse files
author
Romain de Laage
committed
Add basic dynamic configuration with volume labels
1 parent d0d2fcf commit 0ca59d4

File tree

7 files changed

+166
-8
lines changed

7 files changed

+166
-8
lines changed

cmd/root.go

+2
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ func init() {
4242
rootCmd.PersistentFlags().BoolVarP(&flags.VERBOSE, "verbose", "v", false, "verbose mode")
4343
rootCmd.PersistentFlags().StringVar(&flags.RESTIC_BIN, "restic-bin", "restic", "specify custom restic binary")
4444
rootCmd.PersistentFlags().StringVar(&flags.DOCKER_IMAGE, "docker-image", "cupcakearmy/autorestic:"+internal.VERSION, "specify a custom docker image")
45+
rootCmd.PersistentFlags().StringVar(&flags.DOCKER_HOST, "docker-host", "", "specify a custom docker host")
46+
rootCmd.PersistentFlags().BoolVar(&flags.DOCKER_DISCOVERY, "docker-discovery", false, "use docker location discovery")
4547
cobra.OnInitialize(initConfig)
4648
}
4749

go.mod

+14-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.18
55
require (
66
github.com/blang/semver/v4 v4.0.0
77
github.com/buger/goterm v1.0.0
8+
github.com/docker/docker v20.10.21+incompatible
89
github.com/fatih/color v1.13.0
910
github.com/joho/godotenv v1.4.0
1011
github.com/mitchellh/go-homedir v1.1.0
@@ -14,22 +15,34 @@ require (
1415
)
1516

1617
require (
18+
github.com/Microsoft/go-winio v0.6.0 // indirect
19+
github.com/docker/distribution v2.8.1+incompatible // indirect
20+
github.com/docker/go-connections v0.4.0 // indirect
21+
github.com/docker/go-units v0.5.0 // indirect
1722
github.com/fsnotify/fsnotify v1.5.1 // indirect
23+
github.com/gogo/protobuf v1.3.2 // indirect
1824
github.com/hashicorp/hcl v1.0.0 // indirect
1925
github.com/inconshreveable/mousetrap v1.0.0 // indirect
2026
github.com/magiconair/properties v1.8.6 // indirect
2127
github.com/mattn/go-colorable v0.1.12 // indirect
2228
github.com/mattn/go-isatty v0.0.14 // indirect
2329
github.com/mitchellh/mapstructure v1.4.3 // indirect
30+
github.com/opencontainers/go-digest v1.0.0 // indirect
31+
github.com/opencontainers/image-spec v1.0.2 // indirect
2432
github.com/pelletier/go-toml v1.9.4 // indirect
2533
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 // indirect
34+
github.com/pkg/errors v0.9.1 // indirect
35+
github.com/sirupsen/logrus v1.9.0 // indirect
2636
github.com/spf13/afero v1.8.2 // indirect
2737
github.com/spf13/cast v1.4.1 // indirect
2838
github.com/spf13/jwalterweatherman v1.1.0 // indirect
2939
github.com/spf13/pflag v1.0.5 // indirect
3040
github.com/subosito/gotenv v1.2.0 // indirect
31-
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
41+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect
42+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b // indirect
43+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
3244
golang.org/x/text v0.3.7 // indirect
45+
golang.org/x/tools v0.1.12 // indirect
3346
gopkg.in/ini.v1 v1.66.4 // indirect
3447
gopkg.in/yaml.v2 v2.4.0 // indirect
3548
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect

go.sum

+31
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f
3838
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
3939
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
4040
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
41+
github.com/Microsoft/go-winio v0.6.0 h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
42+
github.com/Microsoft/go-winio v0.6.0/go.mod h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
4143
github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
4244
github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
4345
github.com/buger/goterm v1.0.0 h1:ZB6uUlY8+sjJyFGzz2WpRqX2XYPeXVgtZAOJMwOsTWM=
@@ -54,6 +56,14 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t
5456
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5557
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
5658
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
59+
github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68=
60+
github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
61+
github.com/docker/docker v20.10.21+incompatible h1:UTLdBmHk3bEY+w8qeO5KttOhy6OmXWsl/FEet9Uswog=
62+
github.com/docker/docker v20.10.21+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
63+
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
64+
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
65+
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
66+
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
5767
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
5868
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
5969
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
@@ -67,6 +77,8 @@ github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5
6777
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
6878
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
6979
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
80+
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
81+
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
7082
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
7183
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
7284
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -133,6 +145,7 @@ github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
133145
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
134146
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
135147
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
148+
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
136149
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
137150
github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
138151
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
@@ -152,10 +165,15 @@ github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG
152165
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
153166
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
154167
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
168+
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
169+
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
170+
github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
171+
github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
155172
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
156173
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
157174
github.com/pelletier/go-toml/v2 v2.0.0-beta.8 h1:dy81yyLYJDwMTifq24Oi/IslOslRrDSb3jwDggjz3Z0=
158175
github.com/pelletier/go-toml/v2 v2.0.0-beta.8/go.mod h1:r9LEWfGN8R5k0VXJ+0BkIe7MYkRdwZOjgMj2KwnJFUo=
176+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
159177
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
160178
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
161179
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -165,6 +183,8 @@ github.com/robfig/cron v1.2.0 h1:ZjScXvvxeQ63Dbyxy76Fj3AT3Ut0aKsyd2/tl3DTMuQ=
165183
github.com/robfig/cron v1.2.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k=
166184
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
167185
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
186+
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
187+
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
168188
github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo=
169189
github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
170190
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
@@ -236,6 +256,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
236256
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
237257
golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
238258
golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
259+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s=
260+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
239261
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
240262
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
241263
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -267,6 +289,8 @@ golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwY
267289
golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
268290
golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
269291
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
292+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b h1:PxfKdU9lEEDYjdIzOtC4qFWgkU2rGHdKlKowJSMN9h0=
293+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
270294
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
271295
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
272296
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -326,6 +350,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
326350
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
327351
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
328352
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
353+
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
354+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
355+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
329356
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
330357
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
331358
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -375,6 +402,7 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY
375402
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
376403
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
377404
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
405+
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
378406
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
379407
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
380408
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
@@ -383,8 +411,11 @@ golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4f
383411
golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
384412
golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
385413
golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
414+
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
386415
golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
387416
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
417+
golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU=
418+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
388419
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
389420
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
390421
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/backend.go

+3
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,9 @@ func (b Backend) ExecDocker(l Location, args []string) (int, string, error) {
169169
"--workdir", dir,
170170
"--volume", volume + ":" + dir,
171171
}
172+
if flags.DOCKER_HOST != "" {
173+
docker = append([]string{"--host", flags.DOCKER_HOST}, docker...)
174+
}
172175
// Use of docker host, not the container host
173176
if hostname, err := os.Hostname(); err == nil {
174177
docker = append(docker, "--hostname", hostname)

internal/config.go

+100-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package internal
22

33
import (
4+
"context"
45
"fmt"
56
"os"
67
"path"
@@ -11,6 +12,9 @@ import (
1112
"github.com/cupcakearmy/autorestic/internal/colors"
1213
"github.com/cupcakearmy/autorestic/internal/flags"
1314
"github.com/cupcakearmy/autorestic/internal/lock"
15+
"github.com/docker/docker/api/types/filters"
16+
"github.com/docker/docker/api/types/volume"
17+
"github.com/docker/docker/client"
1418
"github.com/joho/godotenv"
1519
"github.com/mitchellh/go-homedir"
1620
"github.com/spf13/cobra"
@@ -44,8 +48,90 @@ func exitConfig(err error, msg string) {
4448
os.Exit(1)
4549
}
4650

47-
func GetConfig() *Config {
51+
func GetDockerVolumesLocations() (map[string]Location, error) {
52+
var (
53+
cli *client.Client
54+
err error
55+
volumeListOKBody volume.VolumeListOKBody
56+
ctx context.Context
57+
)
58+
59+
volumesList := make(map[string]Location)
60+
61+
if flags.DOCKER_HOST != "" {
62+
cli, err = client.NewClientWithOpts(client.WithHost(flags.DOCKER_HOST))
63+
} else {
64+
cli, err = client.NewClientWithOpts()
65+
}
66+
if err != nil {
67+
return volumesList, fmt.Errorf("Could not create client: %s", err.Error())
68+
}
69+
defer cli.Close()
70+
71+
ctx = context.Background()
72+
volumeListOKBody, err = cli.VolumeList(ctx, filters.NewArgs())
73+
if err != nil {
74+
return volumesList, fmt.Errorf("Could not list volumes: %s", err.Error())
75+
}
76+
77+
for _, volume := range volumeListOKBody.Volumes {
78+
val, ok := volume.Labels["autorestic.enable"]
79+
if ok && (val == "1" || val == "true") {
80+
volumeTo, ok := volume.Labels["autorestic.to"]
81+
if !ok {
82+
return volumesList, fmt.Errorf("Autorestic is enabled but there is no \"autorestic.to\" label for volume %s", volume.Name)
83+
}
84+
volumeLocation := Location{
85+
name: volume.Name,
86+
From: []string{volume.Name},
87+
Type: "volume",
88+
To: strings.Split(volumeTo, ";"),
89+
}
90+
for label, value := range volume.Labels {
91+
if label == "autorestic.cron" {
92+
volumeLocation.Cron = value
93+
} else if label == "autorestic.forget" {
94+
volumeLocation.ForgetOption = LocationForgetOption(value)
95+
} else if label == "autorestic.hooks.dir" {
96+
volumeLocation.Hooks.Dir = value
97+
} else if label == "autorestic.hooks.before" {
98+
volumeLocation.Hooks.Before = []string{value}
99+
} else if label == "autorestic.hooks.after" {
100+
volumeLocation.Hooks.After = []string{value}
101+
} else if label == "autorestic.hooks.success" {
102+
volumeLocation.Hooks.Success = []string{value}
103+
} else if label == "autorestic.hooks.failure" {
104+
volumeLocation.Hooks.Failure = []string{value}
105+
} else if strings.HasPrefix(label, "autorestic.options.") {
106+
label = strings.TrimPrefix(label, "autorestic.options.")
107+
target := strings.Split(label, ".")
108+
if len(target) != 2 {
109+
fmt.Errorf("Failed to parse label \"%s\" for volume %s", volume.Name)
110+
}
48111

112+
values := strings.Split(value, ";")
113+
interfaceValues := make([]interface{}, 0)
114+
for _, v := range values {
115+
interfaceValues = append(interfaceValues, interface{}(v))
116+
}
117+
118+
if volumeLocation.Options == nil {
119+
volumeLocation.Options = make(Options)
120+
}
121+
volumeLocation.Options[target[0]] = make(OptionMap)
122+
volumeLocation.Options[target[0]][target[1]] = interfaceValues
123+
} else if strings.HasPrefix(label, "autorestic.copy.") {
124+
volumeLocation.CopyOption[strings.TrimPrefix(label, "autorestic.copy.")] = strings.Split(value, ";")
125+
}
126+
}
127+
volumesList[volume.Name] = volumeLocation
128+
}
129+
}
130+
131+
return volumesList, nil
132+
}
133+
134+
func GetConfig() *Config {
49135
if config == nil {
50136
once.Do(func() {
51137
if err := viper.ReadInConfig(); err == nil {
@@ -92,6 +178,19 @@ func GetConfig() *Config {
92178
if err := viper.UnmarshalExact(config); err != nil {
93179
exitConfig(err, "Could not parse config file!")
94180
}
181+
182+
if flags.DOCKER_DISCOVERY {
183+
if config.Locations == nil {
184+
config.Locations = make(map[string]Location)
185+
}
186+
volumeLocations, err := GetDockerVolumesLocations()
187+
if err != nil {
188+
exitConfig(err, "failed to load locations from docker")
189+
}
190+
for name, location := range volumeLocations {
191+
config.Locations[name] = location
192+
}
193+
}
95194
})
96195
}
97196
return config

internal/flags/flags.go

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package flags
22

33
var (
4-
CI bool = false
5-
VERBOSE bool = false
6-
CRON_LEAN bool = false
7-
RESTIC_BIN string
8-
DOCKER_IMAGE string
4+
CI bool = false
5+
VERBOSE bool = false
6+
CRON_LEAN bool = false
7+
RESTIC_BIN string
8+
DOCKER_IMAGE string
9+
DOCKER_HOST string = ""
10+
DOCKER_DISCOVERY bool = false
911
)

internal/utils.go

+9-1
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,15 @@ func CopyFile(from, to string) error {
104104
}
105105

106106
func CheckIfVolumeExists(volume string) bool {
107-
_, _, err := ExecuteCommand(ExecuteOptions{Command: "docker"}, "volume", "inspect", volume)
107+
docker := []string{}
108+
109+
if flags.DOCKER_HOST != "" {
110+
docker = append(docker, "--host", flags.DOCKER_HOST)
111+
}
112+
113+
docker = append(docker, "volume", "inspect", volume)
114+
115+
_, _, err := ExecuteCommand(ExecuteOptions{Command: "docker"}, docker...)
108116
return err == nil
109117
}
110118

0 commit comments

Comments
 (0)