diff --git a/session/environment.go b/session/environment.go index 049591f8..358b61a6 100644 --- a/session/environment.go +++ b/session/environment.go @@ -9,12 +9,16 @@ import ( "github.com/evilsocket/bettercap-ng/core" ) +type SetCallback func(newValue string) + type Environment struct { sync.Mutex Padding int `json:"-"` Storage map[string]string `json:"storage"` - sess *Session + + cbs map[string]SetCallback + sess *Session } func NewEnvironment(s *Session) *Environment { @@ -22,6 +26,7 @@ func NewEnvironment(s *Session) *Environment { Padding: 0, Storage: make(map[string]string), sess: s, + cbs: make(map[string]SetCallback), } return env @@ -36,6 +41,18 @@ func (env *Environment) Has(name string) bool { return found } +func (env *Environment) SetCallback(name string, cb SetCallback) { + env.Lock() + defer env.Unlock() + env.cbs[name] = cb +} + +func (env *Environment) WithCallback(name, value string, cb SetCallback) string { + ret := env.Set(name, value) + env.SetCallback(name, cb) + return ret +} + func (env *Environment) Set(name, value string) string { env.Lock() defer env.Unlock() @@ -43,6 +60,10 @@ func (env *Environment) Set(name, value string) string { old, _ := env.Storage[name] env.Storage[name] = value + if cb, hasCallback := env.cbs[name]; hasCallback == true { + cb(value) + } + env.sess.Events.Log(core.DEBUG, "env.change: %s -> '%s'", name, value) width := len(name) diff --git a/session/events.go b/session/events.go index 6fdd6f7b..91dec096 100644 --- a/session/events.go +++ b/session/events.go @@ -54,6 +54,18 @@ func NewEventPool(debug bool, silent bool) *EventPool { } } +func (p *EventPool) SetSilent(s bool) { + p.Lock() + defer p.Unlock() + p.silent = s +} + +func (p *EventPool) SetDebug(d bool) { + p.Lock() + defer p.Unlock() + p.debug = d +} + func (p *EventPool) Add(tag string, data interface{}) { p.Lock() defer p.Unlock() diff --git a/session/session.go b/session/session.go index 3be80196..97e952e8 100644 --- a/session/session.go +++ b/session/session.go @@ -272,6 +272,30 @@ func (s *Session) setupEnv() { s.Env.Set("iface.mac", s.Interface.HwAddress) s.Env.Set("gateway.address", s.Gateway.IpAddress) s.Env.Set("gateway.mac", s.Gateway.HwAddress) + + dbg := "false" + if *s.Options.Debug { + dbg = "true" + } + s.Env.WithCallback("log.debug", dbg, func(newValue string) { + newDbg := false + if newValue == "true" { + newDbg = true + } + s.Events.SetDebug(newDbg) + }) + + silent := "false" + if *s.Options.Silent { + silent = "true" + } + s.Env.WithCallback("log.silent", silent, func(newValue string) { + newSilent := false + if newValue == "true" { + newSilent = true + } + s.Events.SetSilent(newSilent) + }) } func (s *Session) Start() error {