0

在使用 Nagios V1 的现有项目上,我们需要将其升级到 Nagios V3。除了在两个版本之间发生更改的状态文件 (status.dat) 之外,一切都很好。有太多的 perl 脚本使用旧的状态文件格式来改变它们。相反,我想编写一个 perl 代码,将状态文件从新格式转换为旧格式:

为了简化问题(可以被认为是一个 perl 问题):

输入文件是这样的:

hoststatus {
    key1=val1
    key2=val2
    key3=val3
        }
hoststatus {
    key1=val4
    key2=val5
    key3=val6
        }
servicestatus {
    key11=val11
    key12=val12
    key13=val13
        }
servicestatus {
    key11=val14
    key12=val15
    key13=val16
        }

并且应该转换成这个文件:

HOST;val1;val3;val2
HOST;val4;val6;val5
SERVICE;val13;val11;val12
SERVICE;val16;val14;val15

Note the values are written following a chosen keys order. In the above listing :
"key1,key3,key2" for hoststatus blocks
"key13,key11,key12" for servicestatus blocks

如何在 Perl 中编写代码?

4

1 回答 1

1

我假设每个 hoststatus 和 servicestatus 块总是只包含 3 个键值,并且新的顺序对于 HOST 总是 1st、3rd、2nd,对于 SERVICE 总是 3rd、1st、2nd

#!/usr/bin/perl
use warnings;
use strict;

open (my $IN,'<','status.dat') or die "$!";
my $type;
my @v;
while (<$IN>) {
    chomp;
    if (/(.+)status/) {
        $type=uc $1;
    }
    elsif (/=(.+)/) {
        push @v,$1;
    }
    elsif (/\}/) {
        if ($type eq 'HOST') {
            print join(';',$type,$v[0],$v[2],$v[1]),"\n";
        }
        elsif ($type eq 'SERVICE') {
            print join(';',$type,$v[2],$v[0],$v[1]),"\n";
        }
        undef @v;
    }
}
close $IN;
于 2013-09-25T22:54:56.597 回答