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