aboutsummaryrefslogtreecommitdiffstats
path: root/listener
diff options
context:
space:
mode:
authorWe-unite <3205135446@qq.com>2024-08-13 10:53:24 +0800
committerWe-unite <3205135446@qq.com>2024-08-13 10:53:24 +0800
commitdfdb18f83f7a957f99196369d97827d6209eeb9a (patch)
tree2ac5234a8322ba0ee52bc87fcdd93d56161ab67c /listener
parent3e49a044d22635157916651f0acb5a062397b34b (diff)
downloadgodo-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.go47
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
3import ( 3import (
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
19var pidCol, fdCol, fileCol mongoClient 20var pidCol, fdCol, fileCol mongoClient
20var err error 21
22func 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
22func deal() { 48func 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) {
96func dealNewPid(cooked Event) { 115func 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) {
149func dealExecve(cooked Event) { 168func 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 }