流处理大量的东西到OVA

时间:2013-12-11 17:41:59

标签: bash sed stream pipe

因此,我们的一位开发人员需要我批量处理大量信息并将其处理成OVA以供下载。这是一个使用long方法(即写入文件系统)的简单过程,但开发人员需要一个更清晰,更简化的解决方案,可以更好地扩展。因此,他们要求我对整个过程进行简化,这些过程很难实现。有人可以给我一些指示。以下是需要完成的步骤:

  1. 从webserver获取输入(Webserver最终将这些作为流传递。)
    • 随机密码
    • XML文件
  2. 修改文件系统上的启动脚本(即插入服务器生成的随机密码)
  3. 创建XML文件和启动脚本
  4. 计算ISO
  5. 的SHA1总和
  6. 将OV1的ISO总和附加到OVF目录中的清单文件
  7. 从OVF目录创建OVA
  8. 这是一个示例目录结构(我在/为了简单起见概述了这一点)

    /--
      |
      |--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,因为mkiosf只会在/ ISO中找到它的iso。我甚至不知道你是否可以将这样的东西传递给mkisofs。管道有时候很奇怪。

    接下来,我认为mkisofs是可以的,因为我没有指定文件输出,因此它应该输出到将传递给sha1sum的stdout,但是这是我看到的下一个问题。我需要在添加SHA1总和之前在文件中附加一些额外的文本,这有点会中断流。

    最后,我看到的最后一个问题是如何将所有内容传递给OVA而不先写入文件系统(写入manifest.mf)。

    哦,我应该首先提到的最后一个大问题是config.xml文件。现在我只是将它作为一个文件处理。开发人员也想将它作为流传递给这个脚本。我不知道如何处理它。

    非常感谢任何帮助。这些概念有点超出我的知识。

    谢谢!

    更新12/11/13美国东部时间下午2:11

    立即单独测试每个部分。将在下面报告调查结果。

    更新12/11/13美国东部时间下午2:14

    以下作品:

    cat /ISO/boot.sh | sed "s%DEFAULT%RANDOM%"
    

    并生成以下输出:

    RANDOM="RANDOM"
    

    完全符合预期。

    你是正确的NeronLeVelu,我将不得不稍后回来并在生成真正的随机密码时更仔细地查看sed。即。确保正确的字符被转义。但是现在,我只是测试逻辑。我会担心正则表达式并在以后逃避。我们还没有决定随机密码。它只是暂时的,很可能是字母数字。

    转到下一部分。仍然不确定如何从sed(stdout)获取输出并使用它包含在ISO创建中而不实际创建一个写入文件系统的文件。没有写入文件系统可能无法实现。更多内容即将推出

1 个答案:

答案 0 :(得分: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。这将在生成错误时在运行时提供帮助