Add one-shot mode
This commit is contained in:
parent
19590bb00a
commit
2c07214d3d
|
@ -48,6 +48,8 @@ type config struct {
|
||||||
execTimeout time.Duration
|
execTimeout time.Duration
|
||||||
// version flag
|
// version flag
|
||||||
showVersion bool
|
showVersion bool
|
||||||
|
// one-shot mode
|
||||||
|
oneShot bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -70,6 +72,7 @@ func init() {
|
||||||
flag.DurationVar(&options.execTimeout, "exec-timeout", time.Duration(60)*time.Second, "the timeout applied to commands on the exec option")
|
flag.DurationVar(&options.execTimeout, "exec-timeout", time.Duration(60)*time.Second, "the timeout applied to commands on the exec option")
|
||||||
flag.BoolVar(&options.showVersion, "version", false, "show the vault-sidekick version")
|
flag.BoolVar(&options.showVersion, "version", false, "show the vault-sidekick version")
|
||||||
flag.Var(options.resources, "cn", "a resource to retrieve and monitor from vault")
|
flag.Var(options.resources, "cn", "a resource to retrieve and monitor from vault")
|
||||||
|
flag.BoolVar(&options.oneShot, "one-shot", false, "retrieve resources from vault once and then exit")
|
||||||
}
|
}
|
||||||
|
|
||||||
// parseOptions validate the command line options and validates them
|
// parseOptions validate the command line options and validates them
|
||||||
|
|
20
main.go
20
main.go
|
@ -20,6 +20,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
|
@ -43,6 +44,10 @@ func main() {
|
||||||
}
|
}
|
||||||
glog.Infof("starting the %s, %s", prog, version)
|
glog.Infof("starting the %s, %s", prog, version)
|
||||||
|
|
||||||
|
if options.oneShot {
|
||||||
|
glog.Infof("running in one-shot mode")
|
||||||
|
}
|
||||||
|
|
||||||
// step: create a client to vault
|
// step: create a client to vault
|
||||||
vault, err := NewVaultService(options.vaultURL)
|
vault, err := NewVaultService(options.vaultURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -64,6 +69,8 @@ func main() {
|
||||||
vault.Watch(rn)
|
vault.Watch(rn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toProcess := options.resources.items
|
||||||
|
toProcessLock := &sync.Mutex{}
|
||||||
// step: we simply wait for events i.e. secrets from vault and write them to the output directory
|
// step: we simply wait for events i.e. secrets from vault and write them to the output directory
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
@ -73,6 +80,19 @@ func main() {
|
||||||
if err := processResource(evt.Resource, evt.Secret); err != nil {
|
if err := processResource(evt.Resource, evt.Secret); err != nil {
|
||||||
glog.Errorf("failed to write out the update, error: %s", err)
|
glog.Errorf("failed to write out the update, error: %s", err)
|
||||||
}
|
}
|
||||||
|
if options.oneShot {
|
||||||
|
toProcessLock.Lock()
|
||||||
|
defer toProcessLock.Unlock()
|
||||||
|
for i, r := range toProcess {
|
||||||
|
if evt.Resource == r {
|
||||||
|
toProcess = append(toProcess[:i], toProcess[i+1:]...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(toProcess) == 0 {
|
||||||
|
glog.Infof("retrieved all requested resources from vault. exiting...")
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
}
|
||||||
}(evt)
|
}(evt)
|
||||||
case <-signalChannel:
|
case <-signalChannel:
|
||||||
glog.Infof("recieved a termination signal, shutting down the service")
|
glog.Infof("recieved a termination signal, shutting down the service")
|
||||||
|
|
Reference in a new issue