将 Nagios 配置拆分为多个文件

Split Nagios configuration into multiple files

NagiosQL 创建一个名为 servicetemplates.cfg 的文件。 为了更方便地分发一些选定的模板,我想将任何服务定义拆分到一个单独的文件中。 示例 servicetemplates.cfg

define service {
   name                                     imap_service
   use                                      generic_service
   check_command                            check_service_imap
   register                                 0
}

define service {
       name                                     ldapserver_ldap_service
       service_description                      LDAP
       use                                      generic_service
       check_command                            check_service_ldap
       icon_image                               ldapserver.png
       register                                 0

}

我喜欢的是某种解析器,它创建类似于模板 "name" 的文件,例如。 G。 imap_service.cfg 和 ldapserver_ldap_service.cfg。 每个文件都必须包含整个定义 (define service { ... } )

以下代码是我的解决方案,它可能并不完美,因为它需要 Nagios 对象配置的特定语法。 第一个参数必须是Nagios配置文件的文件名。

<?php
if (empty($argv[1])) {
        echo "First parameter: File to Nagios object configuration\n";
        exit(1);
}

$starttag=0;
$outfile='';
$outtext='';
$inputfile=$argv[1];
$cfgfile = file($inputfile) or exit(2);

foreach ($cfgfile as $line_num => $line) {
        # $outtext will be reset if define ... { is found
        $outtext.=$line;
        # Start tag of a new section "define ... {"
        if (preg_match("/.*define.*{/i", $line)) {
                $starttag=1;
                $outtext=$line;
        }
        # Split the line with name. The parameter after name is the later filename
        if (preg_match("/name[\s]+[\w]+/", $line) && $starttag=1) {
                $keywords=preg_split("/[\s]+/", $line);
                $outfile=$keywords[2];
                $outfile.=".cfg";
                $outfile=str_replace(' ', '_', $outfile);
        }
        # End tag of a new section "}"
        if (preg_match("/.*}/", $line) && $starttag=1) {
                $starttag=0;
                echo "Writing {$outfile}\n";
                file_put_contents($outfile, $outtext);
        }
}

echo "Read lines {$line_num} from {$inputfile}\n";
?>