<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[运维进行时]]></title> 
<link>https://blog.liuts.com/index.php</link> 
<description><![CDATA[互联网运维与架构]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[运维进行时]]></copyright>
<item>
<link>https://blog.liuts.com/post/157/</link>
<title><![CDATA[C++python实现动态更新nagios配置[原创]]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Sun, 03 May 2009 15:21:05 +0000</pubDate> 
<guid>https://blog.liuts.com/post/157/</guid> 
<description>
<![CDATA[ 
	功能：根据获取到的服务器信息(数据来源格式为XML)动态去更新nagios配置。<br/><strong>C++部分</strong><br/><textarea name="code" class="c" rows="15" cols="100">
***************************************************************************
 *&nbsp;&nbsp; Copyright (C) 2009 by liuts&nbsp;&nbsp; *
 *&nbsp;&nbsp; liutiansi@gmail.com*
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; This program is free software; you can redistribute it and/or modify&nbsp;&nbsp;*
 *&nbsp;&nbsp; it under the terms of the GNU General Public License as published by&nbsp;&nbsp;*
 *&nbsp;&nbsp; the Free Software Foundation; either version 2 of the License, or&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; (at your option) any later version.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; This program is distributed in the hope that it will be useful,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; but WITHOUT ANY WARRANTY; without even the implied warranty of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
 *&nbsp;&nbsp; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&nbsp;&nbsp;See the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; GNU General Public License for more details.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*
 *&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; You should have received a copy of the GNU General Public License&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; along with this program; if not, write to the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; Free Software Foundation, Inc.,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 *&nbsp;&nbsp; 59 Temple Place - Suite 330, Boston, MA&nbsp;&nbsp;02111-1307, USA.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 ***************************************************************************/
#include 
#include 
#include 
#include "tinyxml.h"
#include "tinyxml.cpp"
#include "tinystr.h"
#include "tinystr.cpp"
#include "tinyxmlparser.cpp"
#include "tinyxmlerror.cpp"
using namespace std;


class nagios_rsync &#123;

 public:
&nbsp;&nbsp;nagios_rsync(char *sys_par);
&nbsp;&nbsp;~nagios_rsync ();
&nbsp;&nbsp;string hostgroups (string hostgroup_name,string members);
&nbsp;&nbsp;string hosts (string members,string sysos);
&nbsp;&nbsp;string services (string members);
&nbsp;&nbsp;string writefile (string filename,string addstring);
&nbsp;&nbsp;string (*displayXmlDocument_class (string filename))[2];
&nbsp;&nbsp;string (*displayXmlDocument_info (string filename))[3];
&nbsp;&nbsp;void produfile();

 private:
&nbsp;&nbsp;char *sysargc;
&nbsp;&nbsp;string (*p_class)[2];
&nbsp;&nbsp;string (*p_info)[3];
&nbsp;&nbsp;bool servernum;
&nbsp;&nbsp;string service_str;
&nbsp;&nbsp;string hostgroups_str;
&nbsp;&nbsp;string server_str;
&nbsp;&nbsp;string serveros_str;
&nbsp;&nbsp;string host_str;
&nbsp;&nbsp;string ClassInfo[50][2];
&nbsp;&nbsp;string ServerInfo[800][3];
&#125;;

//构造func,传入更新标志；
nagios_rsync::nagios_rsync (char *sys_par) 
&#123;
 servernum=false;
 service_str="Switch,";
 hostgroups_str="";
 server_str="";
 serveros_str="";
 host_str="define host&#123;&#92;n";

 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;windows-server&nbsp;&nbsp;&nbsp;&nbsp;; The name of this host template&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; generic-host&nbsp;&nbsp;&nbsp;&nbsp;; This template inherits other values from the generic-host template&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;check_period&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24x7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; By default, Linux hosts are checked round the clock&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;max_check_attempts&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Check each Linux host 10 times (max)&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;check_command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; check-host-alive ; Default command to check Linux hosts&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;notification_period&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; workhours&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Linux admins hate to be woken up, so we only notify during the day&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Note that the notification_period variable is being overridden from&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; the value that is inherited from the generic-host template!&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;#notification_interval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Resend notification every 2 hours&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;notification_interval&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;780&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;notification_options&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d,u,r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; Only send notifications for specific host states&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;contact_groups&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;admins&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Notifications get sent to the admins by default&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;register&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; DONT REGISTER THIS DEFINITION - ITS NOT A REAL HOST, JUST A TEMPLATE!&#92;n";
 host_str+="&nbsp;&nbsp;&nbsp;&nbsp;notification_period&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24x7&#92;n";
 host_str+="&#125;&#92;n";
 sysargc=sys_par;
 displayXmlDocument_class("./NagiosServerClass.xml");
 displayXmlDocument_info("./NagiosServerInfo.xml");
&#125;

//类虚构func，销毁创建的指针；
nagios_rsync::~nagios_rsync ()
&#123;
 free(p_class);
 free(p_info);
 delete ClassInfo;
 delete ServerInfo;
&#125;

//生成hostgroups.cfg串方法；
string nagios_rsync::hostgroups(string hostgroup_name,string members)
&#123;
 string hostgroupsstr="";
 hostgroupsstr+="define hostgroup&#123;&#92;n";
 hostgroupsstr+="&nbsp;&nbsp;&nbsp;&nbsp;hostgroup_name&nbsp;&nbsp;&nbsp;&nbsp;"+hostgroup_name+"&#92;n";
 hostgroupsstr+="&nbsp;&nbsp;&nbsp;&nbsp;alias&#92;n";
 hostgroupsstr+="&nbsp;&nbsp;&nbsp;&nbsp;members&nbsp;&nbsp;&nbsp;&nbsp;"+members+"&#92;n";
 hostgroupsstr+="&#125;&#92;n";
 return hostgroupsstr;
&#125;

//生成hosts.cfg串方法；
string nagios_rsync::hosts(string members,string sysos)
&#123;
 string hosts="";
 hosts+="define host&#123;&#92;n";
 hosts+="&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+sysos+"&#92;n";
 hosts+="&nbsp;&nbsp;&nbsp;&nbsp;host_name&nbsp;&nbsp;"+members+"&#92;n";
 hosts+="&nbsp;&nbsp;&nbsp;&nbsp;alias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+members+"&#92;n";
 hosts+="&nbsp;&nbsp;&nbsp;&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;"+members+"&#92;n";
 hosts+="&#125;&#92;n";
 return hosts;
&#125;

//生成service.cfg串方法；
string nagios_rsync::services(string members)
&#123;
 string services="";
 services+="define service&#123;&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;use&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local-service&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;hostgroup_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "+members+"&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;service_description&nbsp;&nbsp;&nbsp;&nbsp;PING&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;check_command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;check_ping!200.0,20%!600.0,60%&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;normal_check_interval&nbsp;&nbsp;5&#92;n";
 services+="&nbsp;&nbsp;&nbsp;&nbsp;retry_check_interval&nbsp;&nbsp; 1&#92;n";
 services+="&#125;&#92;n";
 return services;
&#125;

//写配置文件方法，形参为文件名及串；
string nagios_rsync::writefile(string filename,string addstring)
&#123;
 string mainpath="/nagios/etc/"+filename;
 ofstream FileObject;
 FileObject.open(mainpath.c_str(),ios::app);
 FileObject<&nbsp;&nbsp;&nbsp;&nbsp;FileObject.close();
 return "1";
&#125;

//获取XML分类文件到指针；
string (*nagios_rsync::displayXmlDocument_class(string filename))[2]
&#123;
 TiXmlDocument doc(filename.c_str());
 doc.LoadFile();
 TiXmlElement *root_r = doc.RootElement();
 int i=0;
 for(TiXmlNode *node = root_r->FirstChild(); node; node = node->NextSibling())
 &#123;
&nbsp;&nbsp;//遍历输出子节点名称及值;
&nbsp;&nbsp;TiXmlNode *child = node->FirstChild();
&nbsp;&nbsp;int j=0;
&nbsp;&nbsp;while(child)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; ClassInfo[i][j]=child->Value();
&nbsp;&nbsp; int type = child->Type();
&nbsp;&nbsp; if (type == TiXmlNode::ELEMENT)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;ClassInfo[i][j]=child->ToElement()->GetText();
&nbsp;&nbsp; &#125;
&nbsp;&nbsp; child = node->IterateChildren(child);
&nbsp;&nbsp; j+=1;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;i+=1;
 &#125;
 p_class=ClassInfo;
&#125;

//获取XML文件服务器信息数据到指针；
string (*nagios_rsync::displayXmlDocument_info(string filename))[3]
&#123;
 TiXmlDocument doc(filename.c_str());
 doc.LoadFile();
 TiXmlElement *root_r = doc.RootElement();
 //static vector > ClassInfo(m,vector(n));
 int i=0;
 for(TiXmlNode *node = root_r->FirstChild(); node; node = node->NextSibling())
 &#123;
&nbsp;&nbsp;//遍历输出节点属性名称及值;
&nbsp;&nbsp;if (node->Type() == TiXmlNode::ELEMENT)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; for(TiXmlAttribute *attr = node->ToElement()->FirstAttribute(); attr; attr = attr->Next())
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;cout << "&nbsp;&nbsp;&nbsp;&nbsp;" << attr->Name() << " =: " << attr->Value() << endl;
&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;//遍历输出子节点名称及值;
&nbsp;&nbsp;TiXmlNode *child = node->FirstChild();
&nbsp;&nbsp;int j=0;
&nbsp;&nbsp;while(child)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; ServerInfo[i][j]=child->Value();
&nbsp;&nbsp; int type = child->Type();
&nbsp;&nbsp; if (type == TiXmlNode::ELEMENT)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo[i][j]=child->ToElement()->GetText();
&nbsp;&nbsp; &#125;
&nbsp;&nbsp; child = node->IterateChildren(child);
&nbsp;&nbsp; j+=1;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;i+=1;
 &#125;
 p_info=ServerInfo;
&#125;
//遍历处理两个指针；
void nagios_rsync::produfile()
&#123;
 int i=0;
 int j=0;
 //遍历分类指针；
 for (i=0;i<50;i++)
&nbsp;&nbsp;//过滤空元素；
&nbsp;&nbsp;if (*(*(p_class+i)+0)!="")
&nbsp;&nbsp;&#123;
&nbsp;&nbsp; //遍历主机信息指针；
&nbsp;&nbsp; for (j=0;j<800;j++)
&nbsp;&nbsp;&nbsp;&nbsp;//过滤空元素；
&nbsp;&nbsp;&nbsp;&nbsp;if (*(*(p_info+j)+0)!="")
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp; //获取主机IP，逗号分隔；
&nbsp;&nbsp;&nbsp;&nbsp; if (*(*(p_info+j)+1)==*(*(p_class+i)))
&nbsp;&nbsp;&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;server_str+= *(*(p_info+j))+",";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servernum=true;
&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp; if ((sysargc[0]=='1' or sysargc[0]=='3') and i==0)
&nbsp;&nbsp;&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取服务器IP及OS并写入hosts.cfg文件；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host_str+=hosts(*(*(p_info+j)),*(*(p_info+j)+2));
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writefile("hosts.cfg",host_str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;host_str="";
&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;else break;
&nbsp;&nbsp; //当分类成员不为空时，获取分类串，逗号分隔；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((sysargc[0]=='2' or sysargc[0]=='3') and servernum==true)
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;service_str+=*(*(p_class+i)+1)+",";
&nbsp;&nbsp; &#125;

 //获取分类名及该分类主机IP到串，忽略主机为空的分类；
&nbsp;&nbsp; if (server_str!="")
&nbsp;&nbsp; &#123;
&nbsp;&nbsp;&nbsp;&nbsp;hostgroups_str=hostgroups(*(*(p_class+i)+1),server_str);
&nbsp;&nbsp;&nbsp;&nbsp;writefile("hostgroups.cfg",hostgroups_str);
&nbsp;&nbsp;&nbsp;&nbsp;hostgroups_str="";
&nbsp;&nbsp;&nbsp;&nbsp;server_str="";
&nbsp;&nbsp; &#125;
&nbsp;&nbsp; servernum=false;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;else break;

//写入service.cfg文件；
 writefile("services.cfg",services(service_str));
&#125;

//类入 口main()，接受用户参数；
int main(int argc, char *argv[])
&#123;
 char *sysargc;
 sysargc=argv[1];
 nagios_rsync app(sysargc);
 app.produfile();
 return 0;
&#125;
</textarea><br/><strong>Python部分</strong><br/><textarea name="code" class="python" rows="15" cols="100">
# -*- coding: utf-8 -*-
#----------------------------------------------------------------------------#
# Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NagiosRsync.py&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
# Purpose:&nbsp;&nbsp;&nbsp;&nbsp; Download server's info XML File and check it md5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
# Author:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Liutiansi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #
# Email:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; liutiansi@gamil.com&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #
# Created:&nbsp;&nbsp;&nbsp;&nbsp; 2009/04/18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
# Copyright:&nbsp;&nbsp; (c) 2009&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#
#-----------------------------------------------------------------------------

import os, sys, hashlib,urllib
import string,re

class NagiosRsync():
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;#构造函数
&nbsp;&nbsp;&nbsp;&nbsp;def __init__(self,_filename):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#XML文件名
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Filename=""

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#MD5文件存放位置
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Md5Filepath=sys.path[0]+"/filemd5.txt"

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#XML文件存放位置
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.XMLFilepath=""

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#下载URL
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.FileURL=""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.Filename=_filename
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.XMLFilepath=sys.path[0]+"/ServerXML/"+self.Filename;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.FileURL="http://192.168.1.11/"+self.Filename;

&nbsp;&nbsp;&nbsp;&nbsp;#下载XML文件
&nbsp;&nbsp;&nbsp;&nbsp;def download(self):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lib=urllib.urlopen(self.FileURL).read()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f=open(self.XMLFilepath,"wb")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.write(lib)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except Exception,e:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print u"文件下载错误："+str(e)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.exit()

&nbsp;&nbsp;&nbsp;&nbsp;#读取原文件MD5值
&nbsp;&nbsp;&nbsp;&nbsp;def Getmd5(self):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmd5=open(self.Md5Filepath,"r")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for line in fmd5:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linelist=string.split(line,',')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.Filename==linelist[0]:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return linelist[1][:32]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fmd5.close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except Exception,e:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print u"打开文件错误："+str(e)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return False

&nbsp;&nbsp;&nbsp;&nbsp;#MD5验证
&nbsp;&nbsp;&nbsp;&nbsp;def md5(self,excludeLine="", includeLine=""):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""Compute md5 hash of the specified file"""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m = hashlib.md5()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd = open(self.XMLFilepath,"rb")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except IOError:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "Unable to open the file in readmode:", self.XMLFilepath
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eachLine = fd.readline()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while eachLine:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if excludeLine and eachLine.startswith(excludeLine):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.update(eachLine)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eachLine = fd.readline()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m.update(includeLine)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fd.close()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return m.hexdigest()

&nbsp;&nbsp;&nbsp;&nbsp;#更新新md5到文件
&nbsp;&nbsp;&nbsp;&nbsp;def updatefile(self,_newmd5str,_oldmd5str):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstr=""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmd5 = open(self.Md5Filepath,'r')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for line in Fmd5:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if len(line)!=0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linelist=string.split(line,',')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.Filename==linelist[0]:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstr+=linelist[0]+","+str(_newmd5str)+"&#92;n"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fstr+=line
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmd5.close()


&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmd5=open(self.Md5Filepath, 'wb')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmd5.write(fstr)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fmd5.close()

&nbsp;&nbsp;&nbsp;&nbsp;#操作方法
&nbsp;&nbsp;&nbsp;&nbsp;def run(self):
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.download()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PreviousMD5=self.Getmd5()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurrentMD5=self.md5()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if PreviousMD5!=CurrentMD5:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.updatefile(CurrentMD5,PreviousMD5)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "Found "+str(self.Filename)+"config was updated system will be reload!"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "1"&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "Config "+str(self.Filename)+" no update!"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "0"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except Exception,e:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "system run Except"+str(e)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return False

if __name__ == "__main__":
&nbsp;&nbsp;&nbsp;&nbsp;CheckResult=[]
&nbsp;&nbsp;&nbsp;&nbsp;FileName=['NagiosServerClass.xml','NagiosServerInfo.xml']
&nbsp;&nbsp;&nbsp;&nbsp;for _file in FileName:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;App=NagiosRsync(_file)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CheckResult.append(App.run())
&nbsp;&nbsp;&nbsp;&nbsp;if CheckResult[0]=="1" or CheckResult[1]=="1":
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system("./nagios_rsync 3")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if os.system("./nagios -v ./nagios.cfg&#124;grep 'Total Error'")=="":
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print "nagios config file error!please sendmail to liutiansi@gamil.com"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; os.system("/etc/init.d/nagios restart ")
</textarea><br/><br/><strong>安装方法</strong><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>tar -zxvf ty_nagios_rsync.tar.gz<br/>cd ty_nagios_rsync<br/>./configure --prefix=/usr/local/ty_nagios_rsync<br/>make && make install<br/></div></div><br/>Tags - <a href="https://blog.liuts.com/tags/nagios/" rel="tag">nagios</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/157/#blogcomment6</link>
<title><![CDATA[[评论] C++python实现动态更新nagios配置[原创]]]></title> 
<author>tony &lt;tony_2008@gmail.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Sun, 27 Dec 2009 02:25:32 +0000</pubDate> 
<guid>https://blog.liuts.com/post/157/#blogcomment6</guid> 
<description>
<![CDATA[ 
	博主懂得东西挺多，能不能将数据源XML格式说说？我想试试你的方法。
]]>
</description>
</item>
</channel>
</rss>