3

(平台:Linux,特别是 Fedora 和 Red Hat Enterprise Linux 6)

我有一个用 Python 编写的集成测试,它执行以下操作:

  • 创建一个临时目录
  • 告诉 Web 服务(在 apache 下运行)运行将文件复制到该目录的 rsync 作业
  • 检查文件是否已正确复制(即配置已正确从客户端传递到通过 Web 服务的 rsync 调用)
  • (试图)删除临时目录

目前,最后一步失败了,因为 rsync 正在创建文件并将其所有权设置为 apache 用户的所有权,因此测试用例没有删除文件的必要权限。

这个服务器故障问题很好地解释了为什么在集成测试设置的情况下清理步骤当前失败。

我目前所做的:我只是不删除测试清理中的临时目录,因此这些集成测试会留下需要/tmp手动清除的虚拟文件。

我目前考虑的主要解决方案是添加一个 setuid 脚本专门用于处理测试套件的清理操作。这应该可行,但我希望其他人可以提出更优雅的解决方案。具体来说,如果集成测试客户端中不需要关心 apache 进程的 uid,我会非常喜欢它。

我考虑过但由于各种原因拒绝的方法:

  • 以 root 身份运行测试用例。这确实有效,但需要以 root 身份运行测试套件相当难看。
  • 在测试套件创建的目录上设置粘性位。据我所知,rsync 忽略了这一点,因为它设置为从远程服务器复制标志。但是,即使将设置调整为仅复制执行位似乎也无济于事,所以我仍然不确定为什么这不起作用。
  • 将测试用户添加到 apache 组。由于 rsync 在没有组写权限的情况下创建文件,这没有帮助。
  • 以测试用户身份运行 Apache 实例并对其进行测试。这有一些优点(因为集成测试不需要 apache 已经在运行),但缺点是我将无法针对已使用生产设置预配置的 Apache 实例运行集成测试确保这些是正确的。因此,即使我最终可能会将此功能添加到测试套件中,但它不会替代更直接地解决当前问题。

我真的不想做的另一件事是更改传递给 rsync 的设置,以便测试套件可以正确清理临时目录。这是服务守护进程的集成测试,所以我想使用尽可能接近生产的配置。

4

2 回答 2

1

将测试用户添加到 apache 组(或 httpd 组,以对文件具有组所有权的为准)。

于 2012-05-20T20:37:27.333 回答
1

在该服务器故障问题的答案的帮助下,我能够使用setfacl.

为集成测试创建临时目录的代码现在执行以下操作(它是unittest.TestCase实例的一部分,因此引用addCleanup):

local_path = tempfile.mkdtemp().decode("utf-8")
self.addCleanup(shutil.rmtree, local_path)
acl = "d:u:{0}:rwX".format(os.geteuid())
subprocess.check_call(["setfacl", "-m", acl, local_path])

前两行只是创建临时目录并确保它在测试结束时被删除。

最后两行是新部分,并为目录设置默认 ACL,以便测试用户始终具有读/写访问权限,并且还将对设置了执行位的任何内容具有执行权限。

于 2012-05-21T07:08:03.717 回答