From a61050ee4b0def6c2109e358a75b9af4093b7d2a Mon Sep 17 00:00:00 2001
From: Pavel Vorobyov
Date: Thu, 26 Sep 2019 16:06:17 +0300
Subject: [PATCH] passmgr reload when turned off/on
---
cli/cli.go | 3 ++-
cli/handlers.go | 9 ++++++++-
passmgr/passmgr.go | 44 ++++++++++++++++++++++++++++++++++++++++----
3 files changed, 50 insertions(+), 6 deletions(-)
diff --git a/cli/cli.go b/cli/cli.go
index 5860534..da978ec 100644
--- a/cli/cli.go
+++ b/cli/cli.go
@@ -440,6 +440,7 @@ func doOnOff(propName string, propRef *bool, args []string) bool {
term.Warnf("%s is %s\n", propName, value)
return false
}
+ prev := *propRef
switch args[0] {
case "on":
*propRef = true
@@ -449,7 +450,7 @@ func doOnOff(propName string, propRef *bool, args []string) bool {
term.Errorf("Invalid %s vaue. Please use either \"on\" or \"off\"\n", propName)
return false
}
- return true
+ return prev != *propRef
}
func (c *Cli) setRaiseType(rt string) {
diff --git a/cli/handlers.go b/cli/handlers.go
index adc6fb9..cfd217e 100644
--- a/cli/handlers.go
+++ b/cli/handlers.go
@@ -9,7 +9,6 @@ import (
"syscall"
"github.com/viert/xc/passmgr"
-
"github.com/viert/xc/remote"
"github.com/viert/xc/term"
)
@@ -50,6 +49,7 @@ func (c *Cli) setupCmdHandlers() {
c.handlers["p_runscript"] = c.doPRunScript
c.handlers["use_password_manager"] = c.doUsePasswordManager
c.handlers["distribute_type"] = c.doDistributeType
+ c.handlers["_passmgr_debug"] = c.doPassmgrDebug
commands := make([]string, len(c.handlers))
i := 0
@@ -299,6 +299,9 @@ func (c *Cli) doUsePasswordManager(name string, argsLine string, args ...string)
term.Errorf("Password manager is not ready\n")
c.usePasswordMgr = false
}
+ if c.usePasswordMgr {
+ passmgr.Reload()
+ }
remote.SetUsePasswordManager(c.usePasswordMgr)
}
}
@@ -463,3 +466,7 @@ func (c *Cli) doCRunScript(name string, argsLine string, args ...string) {
func (c *Cli) doPRunScript(name string, argsLine string, args ...string) {
c.dorunscript(emParallel, argsLine)
}
+
+func (c *Cli) doPassmgrDebug(name string, argsLine string, args ...string) {
+ passmgr.PrintDebug()
+}
diff --git a/passmgr/passmgr.go b/passmgr/passmgr.go
index e7092ec..d0ca34b 100644
--- a/passmgr/passmgr.go
+++ b/passmgr/passmgr.go
@@ -5,6 +5,7 @@ import (
"plugin"
"github.com/viert/xc/log"
+ "github.com/viert/xc/term"
)
const (
@@ -13,15 +14,21 @@ const (
)
var (
- p *plugin.Plugin
- initialized bool
- pluginInit func(map[string]string, func(string, ...interface{})) error
- pluginAcquire func(string) string
+ p *plugin.Plugin
+ initialFilename string
+ initialOptions map[string]string
+ initialized bool
+ pluginInit func(map[string]string, func(string, ...interface{})) error
+ pluginAcquire func(string) string
)
// Load loads a password manager library
func Load(filename string, options map[string]string) error {
var err error
+
+ initialFilename = filename
+ initialOptions = options
+
p, err = plugin.Open(filename)
if err != nil {
return err
@@ -63,3 +70,32 @@ func GetPass(hostname string) string {
func Ready() bool {
return initialized
}
+
+// Reload reloads previously initialized plugin
+func Reload() error {
+ term.Warnf("Reloading password manager from %s\n", initialFilename)
+ return Load(initialFilename, initialOptions)
+}
+
+// PrintDebug proxies a call to plugin's PrintDebug function if it exists
+func PrintDebug() {
+ if !initialized {
+ term.Errorf("password manager is not initialized\n")
+ return
+ }
+
+ printsym, err := p.Lookup("PrintDebug")
+ if err != nil {
+ term.Errorf("the password manager doesn't have PrintDebug() handler\n")
+ return
+ }
+
+ printfunc, ok := printsym.(func())
+ if !ok {
+ term.Errorf("the passwordd manager PrintDebug() handler has invalid signature (must be func())\n")
+ return
+ }
+ term.Warnf("running password manager PrintDebug()\n")
+ printfunc()
+ fmt.Println()
+}