2013-09-25 34 views
0

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

为了简化问题(可以considerated作为一个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?

+0

你有什么试过吗?您需要付出一些努力,编写一些代码,向我们展示您所做的以及您遇到的问题。任何人都不可能为你写一个解决方案。 –

+0

这不是一个帮助网站吗? – Eric

回答

1

我相信每个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; 
+0

谢谢!我是perl总新手,它帮助我很多。 – Eric

相关问题