【发布时间】:2013-12-29 20:15:15
【问题描述】:
因此,我们的一位开发人员需要我批量处理一堆信息并将其处理成 OVA 以供下载。这是一个使用 long 方法(即写入文件系统)的简单过程,但开发人员需要一个更清洁、流线型的解决方案,可以更好地扩展。因此,他们要求我流式传输整个过程,这被证明是困难的。有人可以给我一些方向。以下是需要完成的步骤:
- 从网络服务器获取输入(网络服务器最终会将这些作为流传递。)
- 随机密码
- XML 文件
- 修改文件系统上的启动脚本(即插入服务器生成的随机密码)
- 创建 XML 文件的 ISO 和启动脚本
- 计算 ISO 的 SHA1 和
- 将 ISO 的 SHA1 和附加到 OVF 目录中的清单文件
- 从 OVF 目录创建 OVA
这是一个示例目录结构(为了简单起见,我在 / 中对此进行了概述)
/--
|
|--ISO/
| |
| |--boot.sh (Where the random password gets inserted)
| |--config.xml (This is handed from the web server. Needs to stream from server)
|
|--OVF/
|
|--disk.vmdk
|--ovf.xml
|--manifest.mf (Contains SHA1 of all files in OVF directory)
|--boot.iso (This file will exist once created from ISO directory)
这是我目前的情况(我会在之后解释问题。是的......有很多问题):
cat /ISO/boot.sh | sed "s%DEFAULT%RANDOM%" | mkisofs /ISO/* | echo "SHA1(boot.iso)= " && sha1sum >> manifest.mf | tar -cvf success.ova /OVF/*
注意 在 boot.sh 中有一个设置为 DEFAULT 的变量,如下所示(仅用于测试目的):
PASSWORD="DEFAULT"
注意 清单文件中的一行应该是这样的:
SHA1(boot.iso)= 5fbc0d70 BLAH BLAH BLAH a91c9121bb
所以我以前从未尝试在一个流中编写完整的脚本。通常我会一边写一边写文件系统。我看到的第一个问题是 sed 正在替换字符串,但是它传递给 mkisofs 的内容不会被使用,因为 mkiosfs 只会对它在 /ISO 中找到的内容进行 iso 处理。我什至不知道你是否可以将类似的东西传递给 mkisofs。管道有时很奇怪。
接下来,我认为 mkisofs 是可以的,因为我没有指定文件输出,因此它应该输出到 stdout,然后传递给 sha1sum,但这是我看到的下一个问题。在添加 SHA1 总和之前,我需要在文件中附加一些额外的文本,这会中断流。
最后,我看到的最后一个问题是如何在不先写入文件系统(写入 manifest.mf)的情况下将所有要 tar 的内容传递到 OVA 中。
哦,我应该首先提到的最后一个大问题是 config.xml 文件。现在我把它当作一个文件来处理。开发人员也想将它作为流传递给这个脚本。我不知道如何处理。
任何帮助将不胜感激。这些概念有点超出我的知识范围。
谢谢!
更新 12/11/13 下午 2:11 EST
现在单独测试每个部分。将很快在下面报告调查结果。
美国东部时间 2013 年 12 月 11 日下午 2:14 更新
以下作品:
cat /ISO/boot.sh | sed "s%DEFAULT%RANDOM%"
并产生以下输出:
RANDOM="RANDOM"
完全符合预期。
您是正确的 NeronLeVelu,当生成真正的随机密码时,我将不得不稍后再回来仔细查看 sed。 IE。确保正确的字符被转义。不过现在,我只是在测试逻辑。以后我会担心正则表达式和转义。我们甚至还没有决定随机密码。这只是暂时的,很可能是字母数字。
进入下一部分。仍然不确定如何从 sed (stdout) 获取输出并将其包含在 ISO 创建中,而无需实际创建写入文件系统的文件。不写入文件系统可能是不可能的。更多内容即将推出
【问题讨论】:
-
相当多。我建议将您的问题分解为非常简单的测试以向自己证明,例如“如果您可以将类似的东西传递给 mkisofs”。如果它不适用于您能想到的最简单的情况,那么您必须先解决该问题,然后再尝试使其复杂化。根据需要重复。 +1 for well fmtd and explain question,但我没有时间尝试解析所有这些。祝你好运!
-
如果您可以更好地定义“开发人员”的含义,将会有所帮助。只是更快?和/或类似线程的方法(一次多个作业),和/或 ?? .....只需阅读有关 XML 文件作为流的部分。同样,另一个原因是尽可能地分解它并尝试证明基本想法是可行的。如果您可以做到
cat file.xml | stream_process并且stream_process可以解析出xml 文件的开头和结尾,那么您就有希望了。祝你好运。 -
他们想要流式传输这个,因为它可能需要在某些时候扩展到大量请求。请记住,这旨在为客户自定义打包 OVA。打包后,它会显示它以供下载。需要流式传输以帮助扩展到大量请求。
-
Sed 对多项任务有“一些”限制,在您的情况下,请确保密码不是正则表达式模式,意味着其他内容。在 s// 的替换部分中,您不能有 & \ 和未转义的模式分隔符。 (字母数字值没问题)
-
吃完午饭回来。我将继续在上面的帖子中附加更新。感谢您的帮助。