78 lines
1.3 KiB
Go
78 lines
1.3 KiB
Go
package common
|
|
|
|
import (
|
|
"github.com/Dreamacro/clash/component/js"
|
|
C "github.com/Dreamacro/clash/constant"
|
|
"github.com/gofrs/uuid"
|
|
)
|
|
|
|
type Script struct {
|
|
*Base
|
|
adapter string
|
|
name string
|
|
}
|
|
|
|
func (s *Script) RuleType() C.RuleType {
|
|
return C.Script
|
|
}
|
|
|
|
func (s *Script) Match(metadata *C.Metadata) bool {
|
|
res := false
|
|
js.Run(s.name, map[string]any{
|
|
"metadata": C.JSRuleMetadata{
|
|
Host: metadata.Host,
|
|
Network: metadata.NetWork.String(),
|
|
Type: metadata.Type.String(),
|
|
SrcIP: metadata.SrcIP.String(),
|
|
SrcPort: metadata.SrcPort,
|
|
DstPort: metadata.DstPort,
|
|
Uid: metadata.Uid,
|
|
Process: metadata.Process,
|
|
ProcessPath: metadata.ProcessPath,
|
|
},
|
|
}, func(a any, err error) {
|
|
if err != nil {
|
|
res = false
|
|
}
|
|
|
|
r, ok := a.(bool)
|
|
if !ok {
|
|
res = false
|
|
}
|
|
res = r
|
|
})
|
|
|
|
return res
|
|
}
|
|
|
|
func (s *Script) Adapter() string {
|
|
return s.adapter
|
|
}
|
|
|
|
func (s *Script) Payload() string {
|
|
return s.adapter
|
|
}
|
|
|
|
func (s *Script) ShouldResolveIP() bool {
|
|
return false
|
|
}
|
|
|
|
func NewScript(script string, adapter string) (*Script, error) {
|
|
name, err := uuid.NewV4()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := js.NewJS(name.String(), script); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Script{
|
|
Base: &Base{},
|
|
adapter: adapter,
|
|
name: name.String(),
|
|
}, nil
|
|
}
|
|
|
|
var _ C.Rule = (*Script)(nil)
|