用于将nagios状态文件转换为旧格式的Perl代码?

时间:2013-09-25 22:22:45

标签: perl nagios

在使用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中编写代码?

1 个答案:

答案 0 :(得分:1)

我认为每个主机状态& servicestatus块总是只包含3个键值,新订单总是第一个,第三个,第二个为HOST,第三个,第一个,第二个为SERVICE

#!/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;