OpenRasp源码分析(一)–Raspcloud

0x01 概述

查看Raspcloud中关于mongoDB的源码,了解涉及mongoDB的内容后,将其替换成es数据库

0x02 Mongo.go

主要分为以下几个部分:导入包、设置全局变量、初始化数据库、会话管理和数据库操作。

重点看一下数据库操作的内容。

计数:返回指定集合中所有文档的数量。

func Count(collection string) (int, error) {
    newSession := NewSession()
    defer newSession.Close()
    return newSession.DB(DbName).C(collection).Count() 
}

创建索引:

func CreateIndex(collection string, index *mgo.Index) error {
    newSession := NewSession()
    defer newSession.Close()
    return newSession.DB(DbName).C(collection).EnsureIndex(*index) 
}

插入文档:

func Insert(collection string, doc interface{}) error {
    newSession := NewSession()
    defer newSession.Close()
    return newSession.DB(DbName).C(collection).Insert(doc) // 向集合中插入新文档
}

更新:

func UpsertId(collection string, id interface{}, doc interface{}) error {
    newSession := NewSession()
    defer newSession.Close()
    _, err := newSession.DB(DbName).C(collection).UpsertId(id, doc) 
    return err
}

查询全部文档:

func FindAll(collection string, query interface{}, result interface{}, skip int, limit int, sortFields ...string) (count int, err error) {
    newSession := NewSession()
    defer newSession.Close()
    count, err = newSession.DB(DbName).C(collection).Find(query).Count() 
    if err != nil {
        return
    }
    err = newSession.DB(DbName).C(collection).Find(query).Skip(skip).Limit(limit).Sort(sortFields...).All(result) 
    return
}

不再一一列举

0x03 具体查看使用了mongoDB的内容

plugin.go:

这里使用了 mongo 包的 FindOne 函数,用于在 app 集合中查询 selected_plugin_id 为 pluginId 的文档,返回找到的文档并存入 app 变量。

kafka:

mongo.FindId(kafkaAddrCollectionName, appId, &kafka):

调用 mongo 包的 FindId 方法,通过 appId 在 kafkaAddrCollectionName 集合中查找文档,找到的文档会存入 kafka 变量中。

使用 mongo.UpsertId 执行数据库的 upsert 操作:根据 appId 是否存在进行更新或者插入操作。

调用 mongo.Count 函数来获取 appCollectionName 集合中的文档数量。

0x04 暂停

具体看了rasp-cloud中的代码,发现涉及到mongoDB的地方远远超出我的想象,是否能够将mongoDB全部替换为es。

0x05 后续

做一个测试项目,包含mongo.go、elasticsearch.go和部分使用了mongo的代码,尝试是否可以将其中的mongo替换成elasticsearch.go。

上一篇
下一篇