mirror of
https://github.com/bettercap/bettercap.git
synced 2024-11-03 04:00:07 -08:00
64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package caplets
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/evilsocket/islazy/fs"
|
|
)
|
|
|
|
type Script struct {
|
|
Path string `json:"path"`
|
|
Size int64 `json:"size"`
|
|
Code []string `json:"code"`
|
|
}
|
|
|
|
func newScript(path string, size int64) Script {
|
|
return Script{
|
|
Path: path,
|
|
Size: size,
|
|
Code: make([]string, 0),
|
|
}
|
|
}
|
|
|
|
type Caplet struct {
|
|
Script
|
|
Name string `json:"name"`
|
|
Scripts []Script `json:"scripts"`
|
|
}
|
|
|
|
func NewCaplet(name string, path string, size int64) Caplet {
|
|
return Caplet{
|
|
Script: newScript(path, size),
|
|
Name: name,
|
|
Scripts: make([]Script, 0),
|
|
}
|
|
}
|
|
|
|
func (cap *Caplet) Eval(argv []string, lineCb func(line string) error) error {
|
|
if argv == nil {
|
|
argv = []string{}
|
|
}
|
|
// the caplet might include other files (include directive, proxy modules, etc),
|
|
// temporarily change the working directory
|
|
return fs.Chdir(filepath.Dir(cap.Path), func() error {
|
|
for _, line := range cap.Code {
|
|
// skip empty lines and comments
|
|
if line == "" || line[0] == '#' {
|
|
continue
|
|
}
|
|
// replace $0 with argv[0], $1 with argv[1] and so on
|
|
for i, arg := range argv {
|
|
what := fmt.Sprintf("$%d", i)
|
|
line = strings.Replace(line, what, arg, -1)
|
|
}
|
|
|
|
if err := lineCb(line); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|