mirror of
https://github.com/bettercap/bettercap.git
synced 2024-11-03 04:00:07 -08:00
95 lines
1.9 KiB
Go
95 lines
1.9 KiB
Go
package session
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"regexp"
|
|
"strconv"
|
|
"sync"
|
|
|
|
"github.com/evilsocket/islazy/str"
|
|
"github.com/evilsocket/islazy/tui"
|
|
|
|
"github.com/bettercap/readline"
|
|
)
|
|
|
|
const (
|
|
IPv4Validator = `^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$`
|
|
IPv6Validator = `^[:a-fA-F0-9]{6,}$`
|
|
IPValidator = `^[\.:a-fA-F0-9]{6,}$`
|
|
)
|
|
|
|
type ModuleHandler struct {
|
|
*sync.Mutex
|
|
|
|
Name string
|
|
Description string
|
|
Parser *regexp.Regexp
|
|
Completer *readline.PrefixCompleter
|
|
exec func(args []string) error
|
|
}
|
|
|
|
func NewModuleHandler(name string, expr string, desc string, exec func(args []string) error) ModuleHandler {
|
|
h := ModuleHandler{
|
|
Mutex: &sync.Mutex{},
|
|
Name: name,
|
|
Description: desc,
|
|
Parser: nil,
|
|
exec: exec,
|
|
}
|
|
|
|
if expr != "" {
|
|
h.Parser = regexp.MustCompile(expr)
|
|
}
|
|
|
|
return h
|
|
}
|
|
|
|
func (h *ModuleHandler) Complete(name string, cb func(prefix string) []string) {
|
|
h.Completer = readline.PcItem(name, readline.PcItemDynamic(func(prefix string) []string {
|
|
prefix = str.Trim(prefix[len(name):])
|
|
return cb(prefix)
|
|
}))
|
|
}
|
|
|
|
func (h *ModuleHandler) Help(padding int) string {
|
|
return fmt.Sprintf(" "+tui.Bold("%"+strconv.Itoa(padding)+"s")+" : %s\n", h.Name, h.Description)
|
|
}
|
|
|
|
func (h *ModuleHandler) Parse(line string) (bool, []string) {
|
|
if h.Parser == nil {
|
|
if line == h.Name {
|
|
return true, nil
|
|
}
|
|
return false, nil
|
|
}
|
|
result := h.Parser.FindStringSubmatch(line)
|
|
if len(result) == h.Parser.NumSubexp()+1 {
|
|
return true, result[1:]
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func (h *ModuleHandler) Exec(args []string) error {
|
|
h.Lock()
|
|
defer h.Unlock()
|
|
return h.exec(args)
|
|
}
|
|
|
|
type JSONModuleHandler struct {
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
Parser string `json:"parser"`
|
|
}
|
|
|
|
func (h ModuleHandler) MarshalJSON() ([]byte, error) {
|
|
j := JSONModuleHandler{
|
|
Name: h.Name,
|
|
Description: h.Description,
|
|
}
|
|
if h.Parser != nil {
|
|
j.Parser = h.Parser.String()
|
|
}
|
|
return json.Marshal(j)
|
|
}
|