diff options
author | We-unite <3205135446@qq.com> | 2024-08-01 16:52:46 +0800 |
---|---|---|
committer | We-unite <3205135446@qq.com> | 2024-08-02 19:11:13 +0800 |
commit | f29dff60ef36ef9903df4f767393bcba2ac3ce83 (patch) | |
tree | d2d05791c237428c98c4796d9bc965baa40208be | |
parent | 3efeef969ebc344c993ce0fc46f557c7d8560525 (diff) | |
download | godo-f29dff60ef36ef9903df4f767393bcba2ac3ce83.tar.gz godo-f29dff60ef36ef9903df4f767393bcba2ac3ce83.zip |
Open is well, but we're back to original question.
It's the check(cooked Event) function that causes fileopen crushed,
and now I'am sorry to say that i've forgot why i add this function,
maybe to check ppid and pid in database in just one function but not
the head of each function. However, the check in each function isn't
deleted. I discover it by comparing source code with 5d244e3. In
theory this would only result in the increase of delay. How does it
affect on the fileopen and causes failure? No one knows.
The same to kernel connector. If we still add delay while pid exits,
the connector will say "Error recv: no enough buffer space", but if
we delete the delay, all modules work well. What actually makes the
delay in pid exit causes no enouth buffer of connector? How outra-
geous it is!
Now I've come back to the original question: when i start and use
docker quickly(`start && exec && exit` in just one command), the file
open/write/close is faithfully recorded; but if i use interactive
shell and use vim to change file in docker, nothing happens.
Why? Why? Why?
-rw-r--r-- | connector/hello.c | 9 | ||||
-rw-r--r-- | src/deal.go | 35 | ||||
-rw-r--r-- | src/godo.go | 2 |
3 files changed, 9 insertions, 37 deletions
diff --git a/connector/hello.c b/connector/hello.c index 5240c15..c0fc633 100644 --- a/connector/hello.c +++ b/connector/hello.c | |||
@@ -8,11 +8,10 @@ | |||
8 | #include <signal.h> | 8 | #include <signal.h> |
9 | #include <linux/netlink.h> | 9 | #include <linux/netlink.h> |
10 | #include <linux/connector.h> | 10 | #include <linux/connector.h> |
11 | // #include <linux/cn_proc.h> | 11 | #include <linux/cn_proc.h> |
12 | #include <unistd.h> | 12 | #include <unistd.h> |
13 | #include <errno.h> | 13 | #include <errno.h> |
14 | #include <time.h> | 14 | #include <time.h> |
15 | #include "cn_proc.h" | ||
16 | 15 | ||
17 | typedef struct __attribute__((aligned(NLMSG_ALIGNTO))) | 16 | typedef struct __attribute__((aligned(NLMSG_ALIGNTO))) |
18 | { | 17 | { |
@@ -55,16 +54,16 @@ void Now() | |||
55 | 54 | ||
56 | void printEvent() | 55 | void printEvent() |
57 | { | 56 | { |
58 | union unnamed *procEvent = &proc_msg.proc_ev.event_data; | 57 | // union unnamed *procEvent = &proc_msg.proc_ev.event_data; |
59 | switch (proc_msg.proc_ev.what) | 58 | switch (proc_msg.proc_ev.what) |
60 | { | 59 | { |
61 | case PROC_EVENT_FORK: | 60 | case PROC_EVENT_FORK: |
62 | Now(); | 61 | Now(); |
63 | printf("Fork\t%6d\t%6d\t%6d\t%6d\n", procEvent->fork.parent_pid, procEvent->fork.parent_tgid, procEvent->fork.child_pid, procEvent->fork.child_tgid); | 62 | printf("Fork\t%6d\t%6d\t%6d\t%6d\n", proc_msg.proc_ev.event_data.fork.parent_pid, proc_msg.proc_ev.event_data.fork.parent_tgid, proc_msg.proc_ev.event_data.fork.child_pid, proc_msg.proc_ev.event_data.fork.child_tgid); |
64 | break; | 63 | break; |
65 | case PROC_EVENT_EXIT: | 64 | case PROC_EVENT_EXIT: |
66 | Now(); | 65 | Now(); |
67 | printf("Exit\t%6d\t%6d\t%6d\t%6d\n", procEvent->exit.process_pid, procEvent->exit.process_tgid, procEvent->exit.exit_code, procEvent->exit.exit_signal); | 66 | printf("Exit\t%6d\t%6d\t%6d\t%6d\n", proc_msg.proc_ev.event_data.exit.process_pid, proc_msg.proc_ev.event_data.exit.process_tgid, proc_msg.proc_ev.event_data.exit.exit_code, proc_msg.proc_ev.event_data.exit.exit_signal); |
68 | break; | 67 | break; |
69 | case PROC_EVENT_EXEC: | 68 | case PROC_EVENT_EXEC: |
70 | default: | 69 | default: |
diff --git a/src/deal.go b/src/deal.go index 3119fff..ae69003 100644 --- a/src/deal.go +++ b/src/deal.go | |||
@@ -55,31 +55,25 @@ func deal() { | |||
55 | break | 55 | break |
56 | } | 56 | } |
57 | 57 | ||
58 | // fmt.Printf("%v\n", cooked) | ||
59 | |||
60 | switch cooked.tag { | 58 | switch cooked.tag { |
61 | case NEWPID: | 59 | case NEWPID: |
62 | dealNewPid(cooked) | 60 | dealNewPid(cooked) |
63 | case EXECVE: | 61 | case EXECVE: |
64 | check(cooked) | ||
65 | dealExecve(cooked) | 62 | dealExecve(cooked) |
66 | case PIDEXIT: | 63 | case PIDEXIT: |
67 | check(cooked) | ||
68 | deletePid(cooked) | 64 | deletePid(cooked) |
69 | case FILEOPEN: | 65 | case FILEOPEN: |
70 | check(cooked) | ||
71 | fileOpen(cooked) | 66 | fileOpen(cooked) |
72 | case FILEWRITE: | 67 | case FILEWRITE: |
73 | check(cooked) | ||
74 | fileWrite(cooked) | 68 | fileWrite(cooked) |
75 | case FILECLOSE: | 69 | case FILECLOSE: |
76 | check(cooked) | ||
77 | fileClose(cooked) | 70 | fileClose(cooked) |
78 | } | 71 | } |
79 | } | 72 | } |
80 | } | 73 | } |
81 | 74 | ||
82 | func deletePid(cooked Event) { | 75 | func deletePid(cooked Event) { |
76 | // TODO: 是否还需要延时? | ||
83 | // time.Sleep(1 * time.Second) | 77 | // time.Sleep(1 * time.Second) |
84 | mongoMutex.Lock() | 78 | mongoMutex.Lock() |
85 | // 先从老爹那里销户 | 79 | // 先从老爹那里销户 |
@@ -197,6 +191,7 @@ func dealExecve(cooked Event) { | |||
197 | } | 191 | } |
198 | 192 | ||
199 | func fileOpen(cooked Event) { | 193 | func fileOpen(cooked Event) { |
194 | fmt.Printf("Open: %6d\t%6d\t%s\n", cooked.ppid, cooked.pid, cooked.pathName) | ||
200 | // 查看是否记录了该进程 | 195 | // 查看是否记录了该进程 |
201 | res, err := pidCol.Finddoc(bson.M{"pid": cooked.pid}) | 196 | res, err := pidCol.Finddoc(bson.M{"pid": cooked.pid}) |
202 | if err != nil { | 197 | if err != nil { |
@@ -228,6 +223,7 @@ func fileOpen(cooked Event) { | |||
228 | } | 223 | } |
229 | 224 | ||
230 | func fileClose(cooked Event) { | 225 | func fileClose(cooked Event) { |
226 | fmt.Printf("Close: %6d\t%6d\t%s\n", cooked.ppid, cooked.pid, cooked.pathName) | ||
231 | // 直接看文件表有无记录 | 227 | // 直接看文件表有无记录 |
232 | res, err := fdCol.Finddoc(bson.M{ | 228 | res, err := fdCol.Finddoc(bson.M{ |
233 | "pid": cooked.pid, | 229 | "pid": cooked.pid, |
@@ -248,6 +244,7 @@ func fileClose(cooked Event) { | |||
248 | } | 244 | } |
249 | 245 | ||
250 | func fileWrite(cooked Event) { | 246 | func fileWrite(cooked Event) { |
247 | fmt.Printf("Write: %6d\t%6d\t%s\n", cooked.ppid, cooked.pid, cooked.pathName) | ||
251 | // 直接看文件表有无记录 | 248 | // 直接看文件表有无记录 |
252 | res, err := fdCol.Finddoc(bson.M{ | 249 | res, err := fdCol.Finddoc(bson.M{ |
253 | "pid": cooked.pid, | 250 | "pid": cooked.pid, |
@@ -266,27 +263,3 @@ func fileWrite(cooked Event) { | |||
266 | "close_timestamp": bson.M{"$exists": false}, | 263 | "close_timestamp": bson.M{"$exists": false}, |
267 | }, bson.M{"$push": bson.M{"written": cooked.timestamp}}) | 264 | }, bson.M{"$push": bson.M{"written": cooked.timestamp}}) |
268 | } | 265 | } |
269 | |||
270 | func check(cooked Event) { | ||
271 | // 检查进程是否需要记录 | ||
272 | // 有无父进程在观察中 | ||
273 | docRes, err = pidCol.Finddoc(bson.M{"pid": cooked.ppid}) | ||
274 | if err != nil || len(docRes) != 1 { | ||
275 | return | ||
276 | } | ||
277 | |||
278 | // 自身是否已经记录 | ||
279 | docRes, err = pidCol.Finddoc(bson.M{"pid": cooked.pid}) | ||
280 | if err != nil { | ||
281 | fmt.Printf("Err finding: %v\n", err) | ||
282 | return | ||
283 | } | ||
284 | if len(docRes) == 0 { | ||
285 | pidCol.InsertOne(bson.M{ | ||
286 | "ppid": cooked.ppid, | ||
287 | "pid": cooked.pid, | ||
288 | "children": []bson.M{}, | ||
289 | "start_timestamp": cooked.timestamp, | ||
290 | }) | ||
291 | } | ||
292 | } | ||
diff --git a/src/godo.go b/src/godo.go index c332c86..cbd9e0a 100644 --- a/src/godo.go +++ b/src/godo.go | |||
@@ -147,7 +147,7 @@ func checkProc(pCooked *Event) { | |||
147 | fileName := fmt.Sprintf("/proc/%d/cmdline", pCooked.pid) | 147 | fileName := fmt.Sprintf("/proc/%d/cmdline", pCooked.pid) |
148 | fd, err := os.Open(fileName) | 148 | fd, err := os.Open(fileName) |
149 | if err != nil { | 149 | if err != nil { |
150 | fmt.Printf("Err opening file %s: %v\n", fileName, err) | 150 | fmt.Printf("Err: %v\n", err) |
151 | return | 151 | return |
152 | } | 152 | } |
153 | 153 | ||