备注:本博客编写时,系统本身已经完成,本博客为补档内容。
当时搞 Virus Scan 搞到自闭了嘛(就是被连续封号 10 小时那段时间),然后看到 seafevents 里面还包含了审计系统,那就顺便弄了啦。
老问题,还是 isPro 限制的,前面说了无数次了,这里就不说了。
放开前端界面以后,发现所有界面都爆权限错误(403),看 Web 控制台输出发现是 403 错误,而 seahub 后台也报告了相应错误。
根据 urls.py 中指向的 View,又看到了跟病毒扫描接口里面一模一样的 IsProVersion
类限制,总共有 5 处,全部删掉。
permission_classes = (IsAdminUser, IsProVersion)
现在接口也可以访问了,但是打开以后,所有的数据都为 0。我尝试登录用户,创建文件,但是依然是 0。看来,不能那么草率进行简单处理了。
经过我的研究,公布我所了解到的信息:
从我们收集到的信息,不难得出以下结论:
其实感觉没有对它原本的机制做太多修改,只是确认了操作方式。不过在调试过程中,发现其他数据在经过正确操作以后,都能够正常使用了,唯独占用空间的统计一直不行。翻看日志发现:
[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 数据库中找对应的表格,但是。。。前面的 RepoSize
和 VirtualRepo
也找不到。。。但是下面那个 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 的管理界面上,发现使用量也正常显示了:
OK,审计系统也完成了。