diff --git a/caplets/netmon.cap b/caplets/netmon.cap new file mode 100644 index 00000000..d6d2ba50 --- /dev/null +++ b/caplets/netmon.cap @@ -0,0 +1,4 @@ +net.recon on +net.probe on +clear +ticker on diff --git a/main.go b/main.go index 70ac7c27..13c0b043 100644 --- a/main.go +++ b/main.go @@ -22,6 +22,7 @@ func main() { fmt.Printf(core.Bold("%s v%s\n\n"), core.Name, core.Version) sess.Register(modules.NewEventsStream(sess)) + sess.Register(modules.NewTicker(sess)) sess.Register(modules.NewMacChanger(sess)) sess.Register(modules.NewProber(sess)) sess.Register(modules.NewDiscovery(sess)) diff --git a/modules/ticker.go b/modules/ticker.go new file mode 100644 index 00000000..bb419274 --- /dev/null +++ b/modules/ticker.go @@ -0,0 +1,109 @@ +package modules + +import ( + "time" + + "github.com/evilsocket/bettercap-ng/log" + "github.com/evilsocket/bettercap-ng/session" +) + +type Ticker struct { + session.SessionModule + Period time.Duration + Commands []string +} + +func NewTicker(s *session.Session) *Ticker { + t := &Ticker{ + SessionModule: session.NewSessionModule("ticker", s), + } + + t.AddParam(session.NewStringParameter("ticker.commands", + "clear; net.show", + "", + "List of commands separated by a ;")) + + t.AddParam(session.NewIntParameter("ticker.period", + "1", + "Ticker period in seconds")) + + t.AddHandler(session.NewModuleHandler("ticker on", "", + "Start the ticker.", + func(args []string) error { + return t.Start() + })) + + t.AddHandler(session.NewModuleHandler("ticker off", "", + "Stop the ticker.", + func(args []string) error { + return t.Stop() + })) + + return t +} + +func (t *Ticker) Name() string { + return "ticker" +} + +func (t *Ticker) Description() string { + return "A module to execute one or more commands every given amount of seconds." +} + +func (t *Ticker) Author() string { + return "Simone Margaritelli " +} + +func (t *Ticker) Configure() error { + var err error + var commands string + var period int + + if err, commands = t.StringParam("ticker.commands"); err != nil { + return err + } + t.Commands = session.ParseCommands(commands) + + if err, period = t.IntParam("ticker.period"); err != nil { + return err + } + + t.Period = time.Duration(period) * time.Second + + return nil +} + +func (t *Ticker) Start() error { + if t.Running() == true { + return session.ErrAlreadyStarted + } else if err := t.Configure(); err != nil { + return err + } + + t.SetRunning(true) + go func() { + log.Info("Ticker running with period %ds.", t.Period) + tick := time.Tick(t.Period) + for _ = range tick { + if t.Running() == false { + break + } + + for _, cmd := range t.Commands { + if err := t.Session.Run(cmd); err != nil { + log.Error("%s", err) + } + } + } + }() + + return nil +} + +func (t *Ticker) Stop() error { + if t.Running() == false { + return session.ErrAlreadyStopped + } + t.SetRunning(false) + return nil +}