12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- 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)
- }
|