【问题标题】:Stream processing lots of stuff to OVA将大量内容流式处理到 OVA
【发布时间】:2013-12-29 20:15:15
【问题描述】:

因此,我们的一位开发人员需要我批量处理一堆信息并将其处理成 OVA 以供下载。这是一个使用 long 方法(即写入文件系统)的简单过程,但开发人员需要一个更清洁、流线型的解决方案,可以更好地扩展。因此,他们要求我流式传输整个过程,这被证明是困难的。有人可以给我一些方向。以下是需要完成的步骤:

  1. 从网络服务器获取输入(网络服务器最终会将这些作为流传递。)
    • 随机密码
    • XML 文件
  2. 修改文件系统上的启动脚本(即插入服务器生成的随机密码)
  3. 创建 XML 文件的 ISO 和启动脚本
  4. 计算 ISO 的 SHA1 和
  5. 将 ISO 的 SHA1 和附加到 OVF 目录中的清单文件
  6. 从 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// 的替换部分中,您不能有 & \ 和未转义的模式分隔符。 (字母数字值没问题)
  • 吃完午饭回来。我将继续在上面的帖子中附加更新。感谢您的帮助。

标签: bash sed stream pipe


【解决方案1】:
# for the password if it contain & \ and separator used in your sed (default is /)
Password4Sed="`echo \"${PASSWORD} | sed \"s/[\\/&]/\\\\&/g\"`"


# no need of a cat with a sed
sed "s/DEFAULT/${Password4Sed}/"/ISO/boot.sh > /tmp/mkisofs.input

从此输入中休息并进行一些测试以验证每个步骤,例如空 crc 值或 mkisofs.input。这将有助于在运行时发生生产错误

【讨论】:

  • 嗯,好的,试图消化你的部分答案。感谢您的帮助。
猜你喜欢
  • 2012-11-09
  • 2018-04-04
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多