Feature: add process_path to script metadata

This commit is contained in:
yaling888 2022-05-09 06:13:26 +08:00
parent 13d19ff101
commit 160e630f03
6 changed files with 37 additions and 21 deletions

View File

@ -256,6 +256,7 @@ interface Metadata {
network: string // tcp network: string // tcp
host: string host: string
process_name: string process_name: string
process_path: string
src_ip: string src_ip: string
src_port: int src_port: int
dst_ip: string dst_ip: string

View File

@ -267,6 +267,7 @@ RuleProvider_match(RuleProviderObject *self, PyObject *args)
.type = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "type")), // PyDict_GetItemString() Return value: Borrowed reference. .type = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "type")), // PyDict_GetItemString() Return value: Borrowed reference.
.network = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "network")), .network = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "network")),
.process_name = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "process_name")), .process_name = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "process_name")),
.process_path = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "process_path")),
.host = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "host")), .host = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "host")),
.src_ip = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "src_ip")), .src_ip = PyUnicode_AsUTF8(PyDict_GetItemString(tmp, "src_ip")),
.src_port = (unsigned short)PyLong_AsUnsignedLong(PyDict_GetItemString(tmp, "src_port")), .src_port = (unsigned short)PyLong_AsUnsignedLong(PyDict_GetItemString(tmp, "src_port")),
@ -584,6 +585,7 @@ const char *call_main(
const char *type, const char *type,
const char *network, const char *network,
const char *process_name, const char *process_name,
const char *process_path,
const char *host, const char *host,
const char *src_ip, const char *src_ip,
unsigned short src_port, unsigned short src_port,
@ -605,6 +607,7 @@ const char *call_main(
PyObject *p_type = PyUnicode_FromString(type); //Return value: New reference. PyObject *p_type = PyUnicode_FromString(type); //Return value: New reference.
PyObject *p_network = PyUnicode_FromString(network); //Return value: New reference. PyObject *p_network = PyUnicode_FromString(network); //Return value: New reference.
PyObject *p_process_name = PyUnicode_FromString(process_name); //Return value: New reference. PyObject *p_process_name = PyUnicode_FromString(process_name); //Return value: New reference.
PyObject *p_process_path = PyUnicode_FromString(process_path); //Return value: New reference.
PyObject *p_host = PyUnicode_FromString(host); //Return value: New reference. PyObject *p_host = PyUnicode_FromString(host); //Return value: New reference.
PyObject *p_src_ip = PyUnicode_FromString(src_ip); //Return value: New reference. PyObject *p_src_ip = PyUnicode_FromString(src_ip); //Return value: New reference.
PyObject *p_src_port = PyLong_FromUnsignedLong((unsigned long)src_port); //Return value: New reference. PyObject *p_src_port = PyLong_FromUnsignedLong((unsigned long)src_port); //Return value: New reference.
@ -614,6 +617,7 @@ const char *call_main(
PyDict_SetItemString(metadataDict, "type", p_type); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "type", p_type); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "network", p_network); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "network", p_network); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "process_name", p_process_name); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "process_name", p_process_name); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "process_path", p_process_path); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "host", p_host); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "host", p_host); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "src_ip", p_src_ip); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "src_ip", p_src_ip); //Parameter value: New reference.
PyDict_SetItemString(metadataDict, "src_port", p_src_port); //Parameter value: New reference. PyDict_SetItemString(metadataDict, "src_port", p_src_port); //Parameter value: New reference.
@ -623,6 +627,7 @@ const char *call_main(
Py_DECREF(p_type); Py_DECREF(p_type);
Py_DECREF(p_network); Py_DECREF(p_network);
Py_DECREF(p_process_name); Py_DECREF(p_process_name);
Py_DECREF(p_process_path);
Py_DECREF(p_host); Py_DECREF(p_host);
Py_DECREF(p_src_ip); Py_DECREF(p_src_ip);
Py_DECREF(p_src_port); Py_DECREF(p_src_port);
@ -668,6 +673,7 @@ int call_shortcut(PyObject *shortcut_fn,
const char *type, const char *type,
const char *network, const char *network,
const char *process_name, const char *process_name,
const char *process_path,
const char *host, const char *host,
const char *src_ip, const char *src_ip,
unsigned short src_port, unsigned short src_port,
@ -677,10 +683,11 @@ int call_shortcut(PyObject *shortcut_fn,
PyObject *args; PyObject *args;
PyObject *result; PyObject *result;
args = Py_BuildValue("{s:O, s:s, s:s, s:s, s:s, s:H, s:s, s:H}", args = Py_BuildValue("{s:O, s:s, s:s, s:s, s:s, s:s, s:H, s:s, s:H}",
"ctx", clash_context, "ctx", clash_context,
"network", network, "network", network,
"process_name", process_name, "process_name", process_name,
"process_path", process_path,
"host", host, "host", host,
"src_ip", src_ip, "src_ip", src_ip,
"src_port", src_port, "src_port", src_port,
@ -727,9 +734,9 @@ void finalize_Python() {
Py_CLEAR(clash_module); Py_CLEAR(clash_module);
Py_FinalizeEx(); Py_FinalizeEx();
// clash_module = NULL; clash_module = NULL;
// main_fn = NULL; main_fn = NULL;
// clash_context = NULL; clash_context = NULL;
} }
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */

View File

@ -186,6 +186,7 @@ func CallPyMainFunction(mtd *constant.Metadata) (string, error) {
_type := C.CString(mtd.Type.String()) _type := C.CString(mtd.Type.String())
network := C.CString(mtd.NetWork.String()) network := C.CString(mtd.NetWork.String())
processName := C.CString(mtd.Process) processName := C.CString(mtd.Process)
processPath := C.CString(mtd.ProcessPath)
host := C.CString(mtd.Host) host := C.CString(mtd.Host)
srcPortGo, _ := strconv.ParseUint(mtd.SrcPort, 10, 16) srcPortGo, _ := strconv.ParseUint(mtd.SrcPort, 10, 16)
@ -208,6 +209,7 @@ func CallPyMainFunction(mtd *constant.Metadata) (string, error) {
C.free(unsafe.Pointer(_type)) C.free(unsafe.Pointer(_type))
C.free(unsafe.Pointer(network)) C.free(unsafe.Pointer(network))
C.free(unsafe.Pointer(processName)) C.free(unsafe.Pointer(processName))
C.free(unsafe.Pointer(processPath))
C.free(unsafe.Pointer(host)) C.free(unsafe.Pointer(host))
C.free(unsafe.Pointer(srcIp)) C.free(unsafe.Pointer(srcIp))
C.free(unsafe.Pointer(dstIp)) C.free(unsafe.Pointer(dstIp))
@ -217,7 +219,7 @@ func CallPyMainFunction(mtd *constant.Metadata) (string, error) {
gilState := PyGILState_Ensure() gilState := PyGILState_Ensure()
defer PyGILState_Release(gilState) defer PyGILState_Release(gilState)
cRs := C.call_main(_type, network, processName, host, srcIp, srcPort, dstIp, dstPort) cRs := C.call_main(_type, network, processName, processPath, host, srcIp, srcPort, dstIp, dstPort)
rs := C.GoString(cRs) rs := C.GoString(cRs)
if rs == "-1" { if rs == "-1" {
@ -241,6 +243,7 @@ func CallPyShortcut(fn *PyObject, mtd *constant.Metadata) (bool, error) {
_type := C.CString(mtd.Type.String()) _type := C.CString(mtd.Type.String())
network := C.CString(mtd.NetWork.String()) network := C.CString(mtd.NetWork.String())
processName := C.CString(mtd.Process) processName := C.CString(mtd.Process)
processPath := C.CString(mtd.ProcessPath)
host := C.CString(mtd.Host) host := C.CString(mtd.Host)
srcPortGo, _ := strconv.ParseUint(mtd.SrcPort, 10, 16) srcPortGo, _ := strconv.ParseUint(mtd.SrcPort, 10, 16)
@ -263,6 +266,7 @@ func CallPyShortcut(fn *PyObject, mtd *constant.Metadata) (bool, error) {
C.free(unsafe.Pointer(_type)) C.free(unsafe.Pointer(_type))
C.free(unsafe.Pointer(network)) C.free(unsafe.Pointer(network))
C.free(unsafe.Pointer(processName)) C.free(unsafe.Pointer(processName))
C.free(unsafe.Pointer(processPath))
C.free(unsafe.Pointer(host)) C.free(unsafe.Pointer(host))
C.free(unsafe.Pointer(srcIp)) C.free(unsafe.Pointer(srcIp))
C.free(unsafe.Pointer(dstIp)) C.free(unsafe.Pointer(dstIp))
@ -272,7 +276,7 @@ func CallPyShortcut(fn *PyObject, mtd *constant.Metadata) (bool, error) {
gilState := PyGILState_Ensure() gilState := PyGILState_Ensure()
defer PyGILState_Release(gilState) defer PyGILState_Release(gilState)
cRs := C.call_shortcut(toc(fn), _type, network, processName, host, srcIp, srcPort, dstIp, dstPort) cRs := C.call_shortcut(toc(fn), _type, network, processName, processPath, host, srcIp, srcPort, dstIp, dstPort)
rs := int(cRs) rs := int(cRs)
if rs == -1 { if rs == -1 {

View File

@ -9,6 +9,7 @@ struct Metadata {
const char *type; /* type socks5/http */ const char *type; /* type socks5/http */
const char *network; /* network tcp/udp */ const char *network; /* network tcp/udp */
const char *process_name; const char *process_name;
const char *process_path;
const char *host; const char *host;
const char *src_ip; const char *src_ip;
unsigned short src_port; unsigned short src_port;
@ -43,6 +44,7 @@ const char *call_main(
const char *type, const char *type,
const char *network, const char *network,
const char *process_name, const char *process_name,
const char *process_path,
const char *host, const char *host,
const char *src_ip, const char *src_ip,
unsigned short src_port, unsigned short src_port,
@ -53,6 +55,7 @@ int call_shortcut(PyObject *shortcut_fn,
const char *type, const char *type,
const char *network, const char *network,
const char *process_name, const char *process_name,
const char *process_path,
const char *host, const char *host,
const char *src_ip, const char *src_ip,
unsigned short src_port, unsigned short src_port,

View File

@ -85,17 +85,16 @@ func ruleProviderCallbackFn(cProviderName *C.char, cMetadata *C.struct_Metadata)
//_type := C.GoString(cMetadata._type) //_type := C.GoString(cMetadata._type)
//network := C.GoString(cMetadata.network) //network := C.GoString(cMetadata.network)
processName := C.GoString(cMetadata.process_name) processName := C.GoString(cMetadata.process_name)
processPath := C.GoString(cMetadata.process_path)
host := C.GoString(cMetadata.host) host := C.GoString(cMetadata.host)
srcIp := C.GoString(cMetadata.src_ip) srcIp := C.GoString(cMetadata.src_ip)
srcPort := strconv.Itoa(int(cMetadata.src_port)) srcPort := strconv.Itoa(int(cMetadata.src_port))
dstIp := C.GoString(cMetadata.dst_ip) dstIp := C.GoString(cMetadata.dst_ip)
dstPort := strconv.Itoa(int(cMetadata.dst_port)) dstPort := strconv.Itoa(int(cMetadata.dst_port))
dst, err := netip.ParseAddr(dstIp)
addrType := constant.AtypDomainName addrType := constant.AtypDomainName
if err == nil { if h, err := netip.ParseAddr(host); err == nil {
if dst.Is4() { if h.Is4() {
addrType = constant.AtypIPv4 addrType = constant.AtypIPv4
} else { } else {
addrType = constant.AtypIPv6 addrType = constant.AtypIPv6
@ -103,15 +102,17 @@ func ruleProviderCallbackFn(cProviderName *C.char, cMetadata *C.struct_Metadata)
} }
src, _ := netip.ParseAddr(srcIp) src, _ := netip.ParseAddr(srcIp)
dst, _ := netip.ParseAddr(dstIp)
metadata := &constant.Metadata{ metadata := &constant.Metadata{
Process: processName, AddrType: addrType,
SrcIP: src, SrcIP: src,
DstIP: dst, DstIP: dst,
SrcPort: srcPort, SrcPort: srcPort,
DstPort: dstPort, DstPort: dstPort,
AddrType: addrType,
Host: host, Host: host,
Process: processName,
ProcessPath: processPath,
} }
providerName := C.GoString(cProviderName) providerName := C.GoString(cProviderName)

View File

@ -909,20 +909,20 @@ time = ClashTime()
return fmt.Errorf("initialized rule SCRIPT failure, shortcut [%s] code invalid syntax", k) return fmt.Errorf("initialized rule SCRIPT failure, shortcut [%s] code invalid syntax", k)
} }
content += "def " + strings.ToLower(k) + "(ctx, network, process_name, host, src_ip, src_port, dst_ip, dst_port):\n return " + v + "\n\n" content += "def " + strings.ToLower(k) + "(ctx, network, process_name, process_path, host, src_ip, src_port, dst_ip, dst_port):\n return " + v + "\n\n"
} }
err := os.WriteFile(C.Path.Script(), []byte(content), 0o644) err := os.WriteFile(C.Path.Script(), []byte(content), 0o644)
if err != nil { if err != nil {
return fmt.Errorf("initialized script module failure, %s", err.Error()) return fmt.Errorf("initialized script module failure, %w", err)
} }
if err = S.Py_Initialize(C.Path.GetExecutableFullPath(), C.Path.ScriptDir()); err != nil { if err = S.Py_Initialize(C.Path.GetExecutableFullPath(), C.Path.ScriptDir()); err != nil {
return fmt.Errorf("initialized script module failure, %s", err.Error()) return fmt.Errorf("initialized script module failure, %w", err)
} }
if err = S.LoadMainFunction(); err != nil { if err = S.LoadMainFunction(); err != nil {
return fmt.Errorf("initialized script module failure, %s", err.Error()) return fmt.Errorf("initialized script module failure, %w", err)
} }
log.Infoln("Start initial script module successful, version: %s", S.Py_GetVersion()) log.Infoln("Start initial script module successful, version: %s", S.Py_GetVersion())