Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将nagios状态文件转换为旧格式的Perl代码?_Perl_Nagios - Fatal编程技术网

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

将nagios状态文件转换为旧格式的Perl代码?,perl,nagios,Perl,Nagios,在使用Nagios V1的现有项目上,我们需要将其升级到Nagios V3。 除了在两个版本之间更改的状态文件(status.dat)之外,一切正常。 使用旧状态文件格式的perl脚本太多,无法更改它们。相反,我想编写一段perl代码,将状态文件从新格式转换为旧格式: 为了简化问题(可以将其视为perl问题): 输入文件如下所示: hoststatus { key1=val1 key2=val2 key3=val3 } hoststatus { k

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

我假设每个hoststatus&servicestatus块始终只包含3个键值,并且新的顺序始终是主机的第1、第3、第2个,服务的第3、第1、第2个

#!/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;
#/usr/bin/perl
使用警告;
严格使用;

打开(我的$IN,'你尝试了什么?你需要付出一些努力,编写一些代码,向我们展示你做了什么以及你遇到了什么问题。不太可能有人会为你编写解决方案。这不是一个帮助网站吗?谢谢!我是perl新手,它对我帮助很大。