bettercap/session/session_core_handlers.go
2018-01-08 09:09:27 +01:00

159 lines
3.5 KiB
Go

package session
import (
"fmt"
"sort"
"strconv"
"strings"
"time"
"github.com/evilsocket/bettercap-ng/core"
)
func (s *Session) helpHandler(args []string, sess *Session) error {
fmt.Println()
fmt.Printf("Basic commands:\n\n")
for _, h := range s.CoreHandlers {
fmt.Printf(" "+core.Bold("%"+strconv.Itoa(s.HelpPadding)+"s")+" : %s\n", h.Name, h.Description)
}
sort.Slice(s.Modules, func(i, j int) bool {
return s.Modules[i].Name() < s.Modules[j].Name()
})
for _, m := range s.Modules {
fmt.Println()
status := ""
if m.Running() {
status = core.Green("active")
} else {
status = core.Red("not active")
}
fmt.Printf("%s [%s]\n", m.Name(), status)
fmt.Println(core.Dim(m.Description()) + "\n")
for _, h := range m.Handlers() {
fmt.Printf(h.Help(s.HelpPadding))
}
params := m.Parameters()
if len(params) > 0 {
fmt.Printf("\n Parameters\n\n")
for _, p := range params {
fmt.Printf(p.Help(s.HelpPadding))
}
fmt.Println()
}
}
return nil
}
func (s *Session) activeHandler(args []string, sess *Session) error {
for _, m := range s.Modules {
if m.Running() == false {
continue
}
fmt.Printf("[%s] %s (%s)\n", core.Green("active"), m.Name(), core.Dim(m.Description()))
params := m.Parameters()
if len(params) > 0 {
for _, p := range params {
_, p.Value = s.Env.Get(p.Name)
fmt.Printf(" %s: '%s'\n", p.Name, core.Yellow(p.Value))
}
fmt.Println()
}
}
return nil
}
func (s *Session) exitHandler(args []string, sess *Session) error {
s.Active = false
s.Input.Close()
return nil
}
func (s *Session) sleepHandler(args []string, sess *Session) error {
if secs, err := strconv.Atoi(args[0]); err == nil {
time.Sleep(time.Duration(secs) * time.Second)
return nil
} else {
return err
}
}
func (s *Session) getHandler(args []string, sess *Session) error {
key := args[0]
if key == "*" {
prev_ns := ""
fmt.Println()
for _, k := range s.Env.Sorted() {
ns := ""
toks := strings.Split(k, ".")
if len(toks) > 0 {
ns = toks[0]
}
if ns != prev_ns {
fmt.Println()
prev_ns = ns
}
fmt.Printf(" %"+strconv.Itoa(s.Env.Padding)+"s: '%s'\n", k, s.Env.Storage[k])
}
fmt.Println()
} else if found, value := s.Env.Get(key); found == true {
fmt.Println()
fmt.Printf(" %s: '%s'\n", key, value)
fmt.Println()
} else {
return fmt.Errorf("%s not found", key)
}
return nil
}
func (s *Session) setHandler(args []string, sess *Session) error {
key := args[0]
value := args[1]
if value == "\"\"" {
value = ""
}
s.Env.Set(key, value)
return nil
}
func (s *Session) registerCoreHandlers() {
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("help",
"^(help|\\?)$",
"Display list of available commands.",
s.helpHandler))
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("active",
"^active$",
"Show information about active modules.",
s.activeHandler))
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("exit",
"^(q|quit|e|exit)$",
"Close the session and exit.",
s.exitHandler))
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("sleep SECONDS",
"^sleep\\s+(\\d+)$",
"Sleep for the given amount of seconds.",
s.sleepHandler))
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("get NAME",
"^get\\s+(.+)",
"Get the value of variable NAME, use * for all.",
s.getHandler))
s.CoreHandlers = append(s.CoreHandlers, NewCommandHandler("set NAME VALUE",
"^set\\s+([^\\s]+)\\s+(.+)",
"Set the VALUE of variable NAME.",
s.setHandler))
}