【网盘项目日志】20210531:Seafile 审计系统开发日志

备注:本博客编写时,系统本身已经完成,本博客为补档内容。

文章目录

    • 书接上回
    • 前端问题
    • 权限问题
    • 第一次调试
    • 研究机制
    • 第二次调试

书接上回

当时搞 Virus Scan 搞到自闭了嘛(就是被连续封号 10 小时那段时间),然后看到 seafevents 里面还包含了审计系统,那就顺便弄了啦。

前端问题

老问题,还是 isPro 限制的,前面说了无数次了,这里就不说了。

权限问题

放开前端界面以后,发现所有界面都爆权限错误(403),看 Web 控制台输出发现是 403 错误,而 seahub 后台也报告了相应错误。

根据 urls.py 中指向的 View,又看到了跟病毒扫描接口里面一模一样的 IsProVersion 类限制,总共有 5 处,全部删掉。

permission_classes = (IsAdminUser, IsProVersion)

第一次调试

现在接口也可以访问了,但是打开以后,所有的数据都为 0。我尝试登录用户,创建文件,但是依然是 0。看来,不能那么草率进行简单处理了。

研究机制

经过我的研究,公布我所了解到的信息:

  1. seafevents 除了可以运行定时任务,还可以接受来自 seahub 的 “events”。例如,有用户登录了,有用户下载文件了,等等。
  2. seafevents 中的审计系统存储逻辑是(以上传文件为例):事件系统监听,当有用户上传文件时,系统会先将相关数据信息存储在 seafevents 进程中的一个变量中,然后每隔 1 小时将变量中的内容集中存入数据库中。
  3. seafevents 收集的行为:用户登录、用户上传文件、下载文件、通过公开链接上传文件、通过公开链接下载文件、同步客户端上传文件、同步客户端下载文件。
  4. 与用户活跃度(Traffic)相关的行为:所有上传和下载行为,不包括用户登录

从我们收集到的信息,不难得出以下结论:

  1. 要使审计系统正常运行,必须时刻运行 seafevents 进程。
  2. 审计系统类似于一套带有 Cache 机制的数据存取,这是 Seafile 考虑到了频繁向数据库插入导致的性能问题。但是,定时插入系统导致审计数据并非实时更新,而且在 seafevents 进程意外退出时,其未保存的数据将全部丢失。

第二次调试

其实感觉没有对它原本的机制做太多修改,只是确认了操作方式。不过在调试过程中,发现其他数据在经过正确操作以后,都能够正常使用了,唯独占用空间的统计一直不行。翻看日志发现:

[2021-05-30 15:59:23,237] [WARNING] [TotalStorageCounter] Failed to get total storage occupation: OrgRepo

我很疑惑啊,不过我找到了引发问题的代码段:

try:
    RepoSize = SeafBase.classes.RepoSize
    VirtualRepo= SeafBase.classes.VirtualRepo
    OrgRepo = SeafBase.classes.OrgRepo

    q = self.seafdb_session.query(func.sum(RepoSize.size).label("size"),
                                  OrgRepo.org_id).outerjoin(VirtualRepo,\
                                  RepoSize.repo_id==VirtualRepo.repo_id).outerjoin(OrgRepo,\
                                  RepoSize.repo_id==OrgRepo.repo_id).filter(\
                                  VirtualRepo.repo_id == None).group_by(OrgRepo.org_id)
    results = q.all()
except Exception as e:
    self.seafdb_session.close()
    self.edb_session.close()
    logging.warning('[TotalStorageCounter] Failed to get total storage occupation: %s', e)
    return

我添加了一些中间结果,发现,下面这条语句:

OrgRepo = SeafBase.classes.OrgRepo

没有被正常执行,抛出了异常。我没有见过这种写法,而且用 IDEA 直接定位是无法找到东西的。但是结合上下文,我推断这条语句是用来在数据库中定位到指定数据表的。不过一开始我形成了一些思维定势,我直接去 seahub 数据库中找对应的表格,但是。。。前面的 RepoSizeVirtualRepo 也找不到。。。但是下面那个 query 语句又让我坚信它一定与数据库对应。

经过了一段时间查找,我发现原来它应该在 seafile 数据库中。。。不管怎么说应该还算好解决,因为在 pro 的软件包里面也附带了 seafile 数据库的定义。于是我直接在 C 代码的运行检查中添加了以下代码:

sql = "CREATE TABLE IF NOT EXISTS OrgRepo ("
      "org_id int, "
      "repo_id char(36), "
      "user varchar(255), "
      "PRIMARY KEY (org_id,repo_id), "
      "UNIQUE (repo_id))"
      "ENGINE=INNODB;";
if (seaf_db_query (db, sql) < 0)
    return -1;

编译,重新运行,数据表就会被自动建立好了,再次运行 seafevents 脚本,OrgRepo 的警告输出也消失了。到 seahub 的管理界面上,发现使用量也正常显示了:

【网盘项目日志】20210531:Seafile 审计系统开发日志_第1张图片

OK,审计系统也完成了。

你可能感兴趣的:(山东大学网盘开发)