make zpool status output scriptable

时间:2017-08-20 17:02:50

标签: bash freebsd zfs

如何将 zpool status -v 的输出转换为可用的内容,数据按行以数据形式匹配,而不是愚蠢的" visual"它使用的输出,使用标准的类似unix的实用程序,它是可编写脚本的东西吗?我有一个python脚本做了一些可以接受的东西,但python 3完全打破了它,而我并没有修复它只是为了让一些新版本的python再次破坏它。 (拧紧后让脚本运行没有错误,它什么都不返回:)。

基本上这个空格键混乱:

              pool: data
             state: ONLINE
            status: Some supported features are not enabled on the pool. The pool can
                    still be used, but some features are unavailable.
            action: Enable all features using 'zpool upgrade'. Once this is done,
                    the pool may no longer be accessible by software that does not support
                    the features. See zpool-features(7) for details.
              scan: scrub repaired 0 in 4h52m with 0 errors on Fri Aug 18 04:52:47 2017
            config:

                    NAME                                            STATE     READ WRITE CKSUM
                    data                                            ONLINE       0     0     0
                      mirror-0                                      ONLINE       0     0     0
                        gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE       0     0     0
                        gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
                        gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE       0     0     0
                      mirror-1                                      ONLINE       0     0     0
                        gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
                        gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
                        gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
                      mirror-2                                      ONLINE       0     0     0
                        gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE       0     0     0
                        gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
                        gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
                    cache
                      gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8    ONLINE       0     0     0

            errors: No known data errors

使用实际的,如下所示:

            NAME                                                            STATE   READ    WRITE   CKSUM
            data                                                            ONLINE  0       0       0
            data    mirror-0                                                ONLINE  0       0       0
            data    mirror-0    gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE  0       0       0
            data    mirror-0    gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE  0       0       0
            data    mirror-0    gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-1                                                ONLINE  0       0       0
            data    mirror-1    gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE  0       0       0
            data    mirror-1    gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-1    gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-2                                                ONLINE  0       0       0
            data    mirror-2    gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE  0       0       0
            data    mirror-2    gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE  0       0       0
            data    mirror-2    gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE  0       0       0
            data    cache
            data    cache       gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8  ONLINE  0   0   0

我可以使用perl来删除和重新排列,但是我可以通过与mirror / raidz123 / stripe / cache一起使用的方式动态匹配行。

            datadata                                            ONLINE       0     0     0
            data  mirror-0                                      ONLINE       0     0     0
            data    gptid/6dfb7dbe-68c5-11e6-982d-00e04c68f511  ONLINE       0     0     0
            data    gptid/27f40ebe-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
            data    gptid/9244318f-c1b4-11e6-a31d-0cc47ae2abe8  ONLINE       0     0     0
            data  mirror-1                                      ONLINE       0     0     0
            data    gptid/1993f2d7-8f1b-11e4-94f8-3085a9405b85  ONLINE       0     0     0
            data    gptid/529e2c88-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
            data    gptid/53a09a3e-f1d1-11e6-89c3-0cc47ae2abe8  ONLINE       0     0     0
            data  mirror-2                                      ONLINE       0     0     0
            data    gptid/51f3b377-6a20-11e6-be8c-00e04c68f511  ONLINE       0     0     0
            data    gptid/9fb54bde-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
            data    gptid/9eebde32-1e2d-11e7-a83e-0cc47ae2abe8  ONLINE       0     0     0
            datacache
            data  gptid/63db5172-20bd-11e7-b561-0cc47ae2abe8    ONLINE       0     0     0

这是生成上述代码的代码。

            zpool status -v data | sed '/   data/, $!d' | grep -v errors: > /tmp/diskslistzpoolstatusdata
            perl -pi -e 's/^\n$//' /tmp/diskslistzpoolstatusdata  #remove blank lines
            perl -pi -e 's/\t$//' /tmp/diskslistzpoolstatusdata
            perl -p -i -e 's/\t//g' /tmp/diskslistzpoolstatusdata
            perl -pi -e 's/^/data/' /tmp/diskslistzpoolstatusdata

额外:

包括每个gptid的灌浆摘要和错误行

            NAME                                                            STATE   READ    WRITE   CKSUM
            misc                                                            ONLINE  0       0       0
            misc    mirror-0                                                ONLINE  0       0       0
            misc    mirror-0    gptid/aefbaf6e-e004-11e6-8f42-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors
            misc    mirror-0    gptid/affc3cac-e004-11e6-8f42-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors
            misc    cache       gptid/3139819b-20bd-11e7-b561-0cc47ae2abe8  ONLINE  0       0       0       0err/4h52m/0err/Fri Aug 18 04:52:47 2017    No known data errors

2 个答案:

答案 0 :(得分:0)

遗憾的是,没有可用的集成解决方案。您有两种选择:

  1. 使用您选择的语言自行解析。您已经提取了基本信息。布局是相对静态的,因为vdevs和池不能嵌套(池包含vdevs,永远不会池自己),顺序得到尊重(vdev A后没有设备来自vdev B),关键字很少并且是固定的(镜像-N, raidzX-N等),输出很小(通常少于几百行)。这意味着你只需要遍历每一行,阅读你需要的信息,将它存储在嵌套对象或简单的数组中,然后转到下一行。

  2. 直接调用相应的C函数以获取不可读形式的状态并转换输出。要执行此操作,请查看status_callback(zpool_handle_t *zhp, void *data),其中all { {1}} - 从池数据生成输出。您可以镜像此函数以将输出转换为您喜欢的格式而不是缩进格式,然后从脚本中调用您的迷你应用程序来为您提供数据。

  3. 如果您熟悉C,我认为选项2会更快。在性能方面它并不重要,因为数据很小(即使在大型系统上),并且调用很可能非常罕见(因为池布局不经常更改)。

答案 1 :(得分:0)

使用-H选项删除标题。