错误:该对象已被创建!

标题是 iTop 新建 teemip 的 IP Subnet Block 对象时,在空表页报出的一个莫名其妙的错误。iTop 版本是 2.7.0,理论上唯一性检查应该在对象页面展示提示信息,而不是一个空白页。

错误:该对象已被创建

搜索代码,可以知道这个信息是在 iTop 的核心词典里。

# find ./ -name "*.php" |xargs grep "错误: 该对象已被创建"
./dictionaries/zh_cn.dictionary.itop.ui.php:	'UI:Error:ObjectAlreadyCreated' => '错误: 该对象已被创建!',

继续搜索词典 Key:

# find ./ -name "*.php" |xargs grep "UI:Error:ObjectAlreadyCreated"
./dictionaries/en.dictionary.itop.ui.php:	'UI:Error:ObjectAlreadyCreated' => 'Error: the object has already been created!',
'UI:Error:ObjectAlreadyCreated' => '错误: 该对象已被创建!',
./pages/UI.php:			$oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyCreated')."</strong>\n");

可以看到是在 /pages/UI.php 中调用的,因此基本可以排除是插件问题,创建一个 Server 对象,也出现这种情况,验证了这个推测。

查看 /pages/UI.php 中相关代码:

        if (!utils::IsTransactionValid($sTransactionId, false))
        {
            $sUser = UserRights::GetUser();
            IssueLog::Error("UI.php '$operation' : invalid transaction_id ! data: user='$sUser', class='$sClass'");
            $oP->p("<strong>".Dict::S('UI:Error:ObjectAlreadyCreated')."</strong>\n");
        }

查看 iTop 错误日志:

2020-07-15 08:09:31 | Error   | UI.php 'apply_new' : invalid transaction_id ! data: user='admin', class='Server' | IssueLog

根据错误日志,搜索到相关信息[1]:

The "invalid transaction_id" is thrown in pages/UI.php if \utils::IsTransactionValid returns false.
This transaction_id is an anti-CSRF token.
By default they are stored on disk, but were in session before 2.5.2 or 2.6.0 (see transaction_storage configuration parameter).

这些 transaction_id 是存在 data/transactions 目录下。删除此目录,重新操作 iTop,报错无法创建 data/transactions 目录,检查 data 文件夹权限正常。接着在刷新 iTop,MySQL 就挂了,查看 MySQL 日志,才发现磁盘空间不够了:

mysqld: File './binlog.~rec~' not found (OS errno 28 - No space left on device)

腾出磁盘空间后,iTop 恢复正常。

参考资料

1. https://sourceforge.net/p/itop/discussion/922361/thread/4d09a3ff77/?limit=25

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注