diff options
author | We-unite <3205135446@qq.com> | 2024-08-13 10:53:24 +0800 |
---|---|---|
committer | We-unite <3205135446@qq.com> | 2024-08-13 10:53:24 +0800 |
commit | dfdb18f83f7a957f99196369d97827d6209eeb9a (patch) | |
tree | 2ac5234a8322ba0ee52bc87fcdd93d56161ab67c /listener | |
parent | 3e49a044d22635157916651f0acb5a062397b34b (diff) | |
download | godo-dfdb18f83f7a957f99196369d97827d6209eeb9a.tar.gz godo-dfdb18f83f7a957f99196369d97827d6209eeb9a.zip |
Filtering process data from mongodb
First of all, fix sth in listener to fit the function of filter. Ori-
ginally, listener mark the /usr/bin/containerd process id with star,
but the children in db is updated by ppid, which is pid of parent but
not tgid, so the stared pid has no children. To Fix this, we add all
the pid of /usr/bin/containerd into the db, and set their ptgid/tgid,
so that they're just normal process as others. Maybe we should finish
the info of these processes? haha.
Then, the filter of pid. There're some designed steps to do, and their
methods are as follows:
- Initially, because of the multithreading execution of listener,
there may be several entries for the same process, and we should
merge them. Extract data from database into a slice, and use a map
to record process info. Iterate the slice, if the pid is in the
map, then merge them, else insert into the map.
- Then, we should build process tree, but what we have is pid. So
use another data structure, iterate merged process map, and build
a map from tgid to a slice of processes. Find out the star. Build
a map from pid to its tgid.
- BFS. Design a simple queue, and build the tree from the root(stared
tgid), record all the visited tgid in another map. That's just the
tree.
As usual, let's talk about the remaining issues:
- Some pids did not recieve exit message. Check the exit time of
its tgid, or even its ppid.
- Optimize the data structure, record the tree by itself. Now the
tree is recorded by not only the last helloTree map from tgid to
slice but the map from pid to tgid. It's hard to store in the
database. Design a better ds, so the viewer can build the tree
quickly from the data in db.
- For future file filter, the close time, the same file for the same
pid, and the pathName of a file, should be paid mych attention.
Fighting!
Diffstat (limited to '')
-rw-r--r-- | listener/deal.go | 47 |
1 files changed, 33 insertions, 14 deletions
diff --git a/listener/deal.go b/listener/deal.go index 8f77431..8225224 100644 --- a/listener/deal.go +++ b/listener/deal.go | |||
@@ -3,6 +3,7 @@ package main | |||
3 | import ( | 3 | import ( |
4 | "fmt" | 4 | "fmt" |
5 | "os" | 5 | "os" |
6 | "strconv" | ||
6 | "syscall" | 7 | "syscall" |
7 | "time" | 8 | "time" |
8 | 9 | ||
@@ -17,27 +18,45 @@ const ( | |||
17 | ) | 18 | ) |
18 | 19 | ||
19 | var pidCol, fdCol, fileCol mongoClient | 20 | var pidCol, fdCol, fileCol mongoClient |
20 | var err error | 21 | |
22 | func initPidCol() (err error) { | ||
23 | // TODO: 这里是否需要补全一下进程信息? | ||
24 | dirs, err := os.ReadDir(fmt.Sprintf("/proc/%d/task", containerdPid)) | ||
25 | if err != nil { | ||
26 | return err | ||
27 | } | ||
28 | for _, file := range dirs { | ||
29 | pid, _ := strconv.Atoi(file.Name()) | ||
30 | process := Process{ | ||
31 | Ppid: 1, | ||
32 | ParentTgid: 1, | ||
33 | Pid: pid, | ||
34 | Tgid: containerdPid, | ||
35 | Cwd: "/", | ||
36 | Children: make([]int, 0), | ||
37 | Execve: make([]Exec, 0), | ||
38 | Args: make([]string, 0), | ||
39 | } | ||
40 | if pid == containerdPid { | ||
41 | process.Star = true | ||
42 | } | ||
43 | err = pidCol.InsertOne(process) | ||
44 | } | ||
45 | return nil | ||
46 | } | ||
21 | 47 | ||
22 | func deal() { | 48 | func deal() { |
23 | defer wg.Done() | 49 | defer wg.Done() |
24 | var cooked Event | 50 | var cooked Event |
25 | var ok bool | 51 | var ok bool |
52 | var err error | ||
26 | 53 | ||
27 | if err = pidCol.init(dbName, pidColName); err != nil { | 54 | if err = pidCol.init(dbName, pidColName); err != nil { |
28 | fmt.Fprintf(os.Stderr, "Error while initing the mongodb: %v\n", err) | 55 | fmt.Fprintf(os.Stderr, "Error while initing the mongodb: %v\n", err) |
29 | return | 56 | return |
30 | } | 57 | } |
31 | err = pidCol.InsertOne(Process{ | 58 | if err = initPidCol(); err != nil { |
32 | Ppid: 1, | 59 | fmt.Fprintf(os.Stderr, "Err while initing pidcol: %v\n", err) |
33 | Pid: containerdPid, | ||
34 | Cwd: "/", | ||
35 | Children: make([]int, 0), | ||
36 | Star: true, | ||
37 | }) | ||
38 | if err != nil { | ||
39 | fmt.Fprintf(os.Stderr, "Error while initing the mongodb: %v\n", err) | ||
40 | return | ||
41 | } | 60 | } |
42 | 61 | ||
43 | if err = fdCol.init(dbName, fdColName); err != nil { | 62 | if err = fdCol.init(dbName, fdColName); err != nil { |
@@ -96,7 +115,7 @@ func deletePid(cooked Event) { | |||
96 | func dealNewPid(cooked Event) { | 115 | func dealNewPid(cooked Event) { |
97 | // 自身是否已经记录 | 116 | // 自身是否已经记录 |
98 | var docRes []Process | 117 | var docRes []Process |
99 | err = pidCol.Finddoc(bson.M{"pid": cooked.pid}, &docRes) | 118 | err := pidCol.Finddoc(bson.M{"pid": cooked.pid}, &docRes) |
100 | if err != nil { | 119 | if err != nil { |
101 | fmt.Fprintf(os.Stderr, "Err finding: %v\n", err) | 120 | fmt.Fprintf(os.Stderr, "Err finding: %v\n", err) |
102 | return | 121 | return |
@@ -136,7 +155,7 @@ func dealNewPid(cooked Event) { | |||
136 | } | 155 | } |
137 | } | 156 | } |
138 | 157 | ||
139 | err := pidCol.UpdateOne(bson.M{"pid": cooked.ppid}, bson.M{ | 158 | err = pidCol.UpdateOne(bson.M{"pid": cooked.ppid}, bson.M{ |
140 | "$push": bson.M{ | 159 | "$push": bson.M{ |
141 | "children": cooked.pid, | 160 | "children": cooked.pid, |
142 | }, | 161 | }, |
@@ -149,7 +168,7 @@ func dealNewPid(cooked Event) { | |||
149 | func dealExecve(cooked Event) { | 168 | func dealExecve(cooked Event) { |
150 | var docRes []Process | 169 | var docRes []Process |
151 | // 首先检查进程是否存在,如不存在则为之创建 | 170 | // 首先检查进程是否存在,如不存在则为之创建 |
152 | err = pidCol.Finddoc(bson.M{"pid": cooked.pid}, &docRes) | 171 | err := pidCol.Finddoc(bson.M{"pid": cooked.pid}, &docRes) |
153 | if err != nil { | 172 | if err != nil { |
154 | return | 173 | return |
155 | } | 174 | } |