感谢 Guo, Jiahua,Vanabel 和 Yifan Gao 的 bug report。

问题于 4 天前 https://gitlab.lug.ustc.edu.cn/boj/freeshell/commit/ef13f452080e4613423559040ccae0d365ef9dbe 中引入,当时添加了 IPv4 的 DNS 解析,因此把函数名 get_node_dns_name 改成了 get_node_v6_dns_name,并新加了 get_node_v4_dns_name 函数。可能是由于敲错了命令,只在 nodes.inc.php 和 admin.php 中做了替换,但 activate.php 和 manage.php 中未做替换,结果新建虚拟机的激活操作和复制虚拟机操作会遇到 undefined function,操作失败。

Freeshell 系统从开始就存在三大问题,我一直懒得去重构代码:

  1. 函数没有为测试留下接口,也就谈不上自动测试了,提交了有问题的代码也不能发现。这次 bug 应该是这个原因。
  2. 大多数操作都没有检查返回值,例如即使虚拟机创建失败,也会发送创建成功的邮件。
  3. 操作没有加锁,例如在重装 freeshell 的过程中执行复制操作,天知道会发生什么。

Update:4月17日为 freeshell 控制面板中可能出现同步问题操作进行了加锁,并检查 SSH 的返回值,能够检查通信失败问题,但返回值检查仍不完整。