<?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/206/</link>
<title><![CDATA[实现真实的机柜模拟图[原创]]]></title> 
<author>刘天斯 &lt;liutiansi@gmail.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Fri, 09 Jul 2010 02:42:04 +0000</pubDate> 
<guid>https://blog.liuts.com/post/206/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般能反映机房设备位置、结构我们都喜欢通过网络拓扑图来展现，但个人感觉还不够直观、明了的表现出自己想要的结果(自己太挑剔了，呵呵)。因此写一个生成真实机柜模拟图平台，实现与真实服务器外观、服务状态、空闲位置等信息。<br/><strong>在线效果图</strong><br/><a href="http://blog.liuts.com/idc/" target="_blank">http://blog.liuts.com/idc/</a><br/><strong>系统截图</strong><br/>1、平台显示某一排截图<br/><a href="https://blog.liuts.com/attachment.php?fid=136" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=136" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="750"/></a><br/><br/>2、平台显示某台服务器详细信息截图<br/><a href="https://blog.liuts.com/attachment.php?fid=135" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=135" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="750"/></a><br/><br/>3、状态说明<br/><a href="https://blog.liuts.com/attachment.php?fid=134" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=134" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>2U服务器正常状态<br/><br/><a href="https://blog.liuts.com/attachment.php?fid=133" target="_blank"><img src="https://blog.liuts.com/attachment.php?fid=133" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>2U服务器当机状态<br/><br/><strong>系统原理</strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过获取运维平台的服务器信息(包括位置、操作系统、机型等)，格式为XML，通过c++的tinyxml来解析并渲染成比较美观的HTML格式。当机的信息通过Nagios来获取。这样就可以生成非常人性化的展现平台了：）<br/><br/><strong>系统代码Servermap.cpp</strong><br/><textarea name="code" class="c" rows="15" cols="100">
/***************************************************************************
 *&nbsp;&nbsp; Copyright (C) 2010 by Liu Tiansi&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; *
 *&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, CN.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *
 ***************************************************************************/


#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include "tinyxml.h"
#include "tinyxml.cpp"
#include "tinystr.h"
#include "tinystr.cpp"
#include "tinyxmlparser.cpp"
#include "tinyxmlerror.cpp"

using namespace std;

class servermap &#123;

&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;servermap( string *serverrow,string _idctype);
&nbsp;&nbsp;&nbsp;&nbsp;~servermap();
&nbsp;&nbsp;&nbsp;&nbsp;string int2str( int num);
&nbsp;&nbsp;&nbsp;&nbsp;void Getdownserver ();
&nbsp;&nbsp;&nbsp;&nbsp;string writefile (string filename);
&nbsp;&nbsp;&nbsp;&nbsp;string GetServerCondition (string ip,string servertype);
&nbsp;&nbsp;&nbsp;&nbsp;string (*displayXmlDocument_info (string filename))[5];
&nbsp;&nbsp;&nbsp;&nbsp;void ProduRow();
&nbsp;&nbsp;&nbsp;&nbsp;void ProduCurrServer();

&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;string idctype;
&nbsp;&nbsp;&nbsp;&nbsp;string (*p_info)[5];&nbsp;&nbsp;// 所有的服务器信息指针(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string (*pserver_info)[5];&nbsp;&nbsp;// 当前机房的服务器信息指针(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string ServerInfo[800][5];&nbsp;&nbsp;// 所有的服务器信息数组(从XML文件中遍历);
&nbsp;&nbsp;&nbsp;&nbsp;string ServerInfo_CurrServer[300][5];&nbsp;&nbsp;//当前机房数组，从ServerInfo中过滤出来;
&nbsp;&nbsp;&nbsp;&nbsp;string ServerDownIP[50];&nbsp;&nbsp;&nbsp;&nbsp;//当服务器清单；
&nbsp;&nbsp;&nbsp;&nbsp;int ServerInfoNumber;&nbsp;&nbsp;//获取所有信息的有效行;
&nbsp;&nbsp;&nbsp;&nbsp;string *CurrServer_row;&nbsp;&nbsp;//指向当前机房数组的指针;
&nbsp;&nbsp;&nbsp;&nbsp;int CurrServerInfoNumber;&nbsp;&nbsp;//获取当前机房信息的有效行;
&nbsp;&nbsp;&nbsp;&nbsp;string HTMLstr;&nbsp;&nbsp;&nbsp;&nbsp;//存储HTML串;
&#125;;

//构造func,传入排数及机房类型；
servermap::servermap( string *Serverrow,string _idctype)
&#123;
&nbsp;&nbsp;idctype=_idctype;
&nbsp;&nbsp;//初始化HTML头；
&nbsp;&nbsp;HTMLstr="<html>&#92;n<head>&#92;n<meta http-equiv=&#92;"Content-Type&#92;" content=&#92;"text/html; charset=utf-8&#92;"&nbsp;&nbsp;content=&#92;"5&#92;">&#92;n<title>服务器模拟状态图</title>&#92;n";
&nbsp;&nbsp;HTMLstr+="<script src='/js/server_top.js' language='javascript'></script>&#92;n";
&nbsp;&nbsp;
&nbsp;&nbsp;//机房排数组；
&nbsp;&nbsp;CurrServer_row=Serverrow;
&nbsp;&nbsp;ServerInfoNumber=0;
&nbsp;&nbsp;CurrServerInfoNumber=0;

&nbsp;&nbsp;//获取当前服务器清单；
&nbsp;&nbsp;Getdownserver();

&nbsp;&nbsp;//遍历所有服务器信息；
&nbsp;&nbsp;displayXmlDocument_info("ServerInfoAll.xml");

&nbsp;&nbsp;//简化当前机房服务器清单；
&nbsp;&nbsp;ProduCurrServer();
&#125;

//类虚构func，销毁创建的指针；
servermap::~servermap()
&#123;
&nbsp;&nbsp;//clear mem;
&#125;

//整形转字符串方法；
 string servermap::int2str( int num)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (num == 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return " 0 ";
&nbsp;&nbsp;&nbsp;&nbsp;string str = "" ;
&nbsp;&nbsp;&nbsp;&nbsp;int num_ = num > 0 ? num : - 1 * num;

&nbsp;&nbsp;&nbsp;&nbsp;while (num_)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = ( char )(num_ % 10 + 48 ) + str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; num_ /= 10 ;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;if (num < 0 )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str = " - " + str;
&nbsp;&nbsp;&nbsp;&nbsp;return str;
&#125;

//返回服务器状态图片；
string servermap::GetServerCondition (string ip,string servertype)
&#123;
&nbsp;&nbsp;bool Obtaining=false;
&nbsp;&nbsp;for (int i=0;i<50;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (ServerDownIP[i]==ip)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Obtaining=true;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;

&nbsp;&nbsp;if (servertype=="1U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "1u_down.gif";
&nbsp;&nbsp;else return "1u_normal.gif";

&nbsp;&nbsp;if (servertype=="2U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "2u_down.gif";
&nbsp;&nbsp;else return "2u_normal.gif";

&nbsp;&nbsp;if (servertype=="6U")
&nbsp;&nbsp;if (Obtaining)
&nbsp;&nbsp;&nbsp;&nbsp;return "ta_down.gif";
&nbsp;&nbsp;else return "ta_normal.gif";
&#125;

//获取当机服务器清单，从文件中获取；
void servermap::Getdownserver()
&#123;
&nbsp;&nbsp;string mainpath="/ServerDownlist";
&nbsp;&nbsp;string ip;
&nbsp;&nbsp;ifstream FileObject;
&nbsp;&nbsp;FileObject.open(mainpath.c_str(),ios::in);
&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(getline(FileObject,ip))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;ServerDownIP[i]=ip;
&nbsp;&nbsp;&nbsp;&nbsp;i+=1;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp; FileObject.close();
&#125;

//写配置文件方法，形参为文件名；
string servermap::writefile(string filename)
&#123;
&nbsp;&nbsp;string mainpath="/www/webroot/"+filename;
&nbsp;&nbsp;ofstream FileObject;
&nbsp;&nbsp;FileObject.open(mainpath.c_str(),ios::out);
&nbsp;&nbsp;FileObject<<HTMLstr<<endl;
&nbsp;&nbsp;&nbsp;&nbsp; FileObject.close();
&nbsp;&nbsp;return "1";
&#125;


//获取XML文件服务器信息数据到指针；
string (* servermap::displayXmlDocument_info(string filename))[5]
&#123;
&nbsp;&nbsp;TiXmlDocument doc(filename.c_str());
&nbsp;&nbsp;doc.LoadFile();
&nbsp;&nbsp;TiXmlElement *root_r = doc.RootElement();
&nbsp;&nbsp;//static vector<vector<string> > ClassInfo(m,vector<string>(n));
&nbsp;&nbsp;int i=0;
&nbsp;&nbsp;for(TiXmlNode *node = root_r->FirstChild(); node; node = node->NextSibling())
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;//输出元素节点名称;
&nbsp;&nbsp;&nbsp;&nbsp;//cout << node->Value() << endl;

&nbsp;&nbsp;&nbsp;&nbsp;//遍历输出节点属性名称及值;
&nbsp;&nbsp;&nbsp;&nbsp;if (node->Type() == TiXmlNode::ELEMENT)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(TiXmlAttribute *attr = node->ToElement()->FirstAttribute(); attr; attr = attr->Next())
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout << "&nbsp;&nbsp;&nbsp;&nbsp;" << attr->Name() << " =: " << attr->Value() << endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;//遍历输出子节点名称及值;
&nbsp;&nbsp;&nbsp;&nbsp;TiXmlNode *child = node->FirstChild();
&nbsp;&nbsp;&nbsp;&nbsp;int j=0;
&nbsp;&nbsp;&nbsp;&nbsp;while(child)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int type = child->Type();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (type == TiXmlNode::ELEMENT)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo[i][j]=child->ToElement()->GetText();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;child = node->IterateChildren(child);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;i+=1;

&nbsp;&nbsp;&#125;
&nbsp;&nbsp;ServerInfoNumber=i;
&nbsp;&nbsp;p_info=ServerInfo;
&nbsp;&nbsp;//free(ClassInfo);
&#125;

//生成当前机房数组;
void servermap::ProduCurrServer()
&#123;
&nbsp;&nbsp;const char * strtmp;
&nbsp;&nbsp;string strswap,stradd,Position0,Position1,Position2,Position3;

&nbsp;&nbsp;for (int i=0;i<10;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (CurrServer_row[i]=="")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;for (int j=0;j<ServerInfoNumber;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strswap=*(*(p_info+j)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtmp=strswap.c_str();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position0=strtmp[0];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position1=strtmp[1];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position2=strtmp[2];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Position3=strtmp[3];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stradd=Position0+Position1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stradd=Position0+Position1+Position2+Position3;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (stradd==CurrServer_row[i])
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CurrServerInfoNumber+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][0]=*(*(p_info+j)+0);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][1]=*(*(p_info+j)+1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][2]=*(*(p_info+j)+2);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][3]=*(*(p_info+j)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerInfo_CurrServer[CurrServerInfoNumber][4]=*(*(p_info+j)+4);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;pserver_info=ServerInfo_CurrServer;
&#125;

//生成服务器拓扑状态图；
void servermap::ProduRow()
&#123;
&nbsp;&nbsp;string point_moddle_key="-0";
&nbsp;&nbsp;string point_moddle="";
&nbsp;&nbsp;string point_last="";
&nbsp;&nbsp;string point_all="";
&nbsp;&nbsp;string substrServer="";
&nbsp;&nbsp;string DIVstr="";
&nbsp;&nbsp;int allservercount=0;
&nbsp;&nbsp;//所有机柜循环体;
&nbsp;&nbsp;for (int i=0;i<10;i++)
&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;if (CurrServer_row[i]=="")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;

&nbsp;&nbsp;&nbsp;&nbsp;//当前排循环体;
&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div align=center>"+CurrServer_row[i].substr(0,2)+"排</div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div align=center>"+CurrServer_row[i].substr(2,2)+"排</div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<table width='1024' border='0' cellpadding='1' cellspacing='3' bgcolor='#ffffff' class='jjtable'>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr align='center' valign='top'>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;for (int j=1;j<=7;j++)
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_moddle=point_moddle_key+int2str(j);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<td width='147' bgcolor='#eeeeee' background=&#92;"/images/serverico/jg.gif&#92;" >&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HTMLstr+="<td width='147' style=&#92;"BACKGROUND: url(/images/serverico/jg.gif) #edf6fb repeat-y 0px 0px;&#92;">&#92;n"&nbsp;&nbsp;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<table width='99%' height='440'&nbsp;&nbsp;border='0' cellpadding='1' cellspacing='0'>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;<td height='30' align='center' valign='bottom'&nbsp;&nbsp;class='jgtable'><font class=jgtitle>0"+int2str(j)+"</font></td></tr>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当前列循环体;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int k=1;k<=10;k++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (k==10)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_last="-10";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_last=point_moddle_key+int2str(k);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;point_all=CurrServer_row[i]+point_moddle+point_last;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;<td height='30' align='center' valign='bottom' class='jgtable'>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int m=0;m<=CurrServerInfoNumber;m++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//过滤空元素；
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//cout<<point_all<<"=="<<*(*(pserver_info+j)+3)<<endl;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=*(*(pserver_info+m)+3);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (idctype=="idc")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=substrServer.substr(0,8);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;substrServer=substrServer.substr(0,10);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (point_all==substrServer)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="IP:"+*(*(pserver_info+m)+0)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="操作系统:"+*(*(pserver_info+m)+2)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="位置:"+*(*(pserver_info+m)+3)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr+="机型:"+*(*(pserver_info+m)+4)+"<br/>";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (*(*(pserver_info+m)+4)=="1U")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"1U")+"' width='127' height='12' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (*(*(pserver_info+m)+4)=="2U")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"2U")+"' width='127' height='24' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;HTMLstr+="<img src='/images/serverico/"+GetServerCondition(*(*(pserver_info+m)+0),"6U")+"'&nbsp;&nbsp;height='76' style=&#92;"vertical-align:bottom;&#92;" onmouseover=&#92;"displayDIV('operate"+int2str(allservercount)+"'); return false&#92;" onmouseout=&#92;"hiddenDIV('operate"+int2str(allservercount)+"'); return false&#92;">";

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<div id=&#92;"operate"+int2str(allservercount)+"&#92;" style=&#92;"filter:Alpha(opacity=90);display:none;position:absolute; width:200px;BORDER-RIGHT: 2px outset; BORDER-TOP: 1px outset; BACKGROUND: #ffffff; BORDER-LEFT: 1px outset; BORDER-BOTTOM: 2px outset; text-align:left;&#92;"><table cellpadding=&#92;"3&#92;" cellspacing=&#92;"1&#92;"><tr><td>"+DIVstr+"</td></tr></table></div>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allservercount+=1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DIVstr="";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp</td>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="&nbsp;&nbsp;</tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+=" </table>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</td>&#92;n";

&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</tr>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="</table>&#92;n";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLstr+="<p> </p>&#92;n";
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;HTMLstr+="<script src='/js/server_down.js' language='javascript'></script>&#92;n";
&#125;

//类入 口main()，接受用户参数；
int main()
&#123;
&nbsp;&nbsp;string * row;
&nbsp;&nbsp;string idctype="";

&nbsp;&nbsp;//定义机柜排号;
&nbsp;&nbsp;string IDCA[10]=&#123;"01","02","03","04","05","06"&#125;;
&nbsp;&nbsp;string IDCC[10]=&#123;"18","19","20"&#125;;

&nbsp;&nbsp;
&nbsp;&nbsp;//IDC A
&nbsp;&nbsp;idctype="idc";
&nbsp;&nbsp;row=IDCA;
&nbsp;&nbsp;servermap appa(row,idctype);
&nbsp;&nbsp;appa.ProduRow();
&nbsp;&nbsp;appa.writefile("idca.html");
&nbsp;&nbsp;//IDC C
&nbsp;&nbsp;idctype="idc";
&nbsp;&nbsp;row=IDCC;
&nbsp;&nbsp;servermap appc(row,idctype);
&nbsp;&nbsp;appc.ProduRow();
&nbsp;&nbsp;appc.writefile("idcc.html");

&nbsp;&nbsp;//free(p);
&nbsp;&nbsp;return 0;
&#125;
</textarea><br/><strong>XML数据格式</strong><br/><textarea name="code" class="xml" rows="15" cols="100">
<?xml version="1.0" ?><wml>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.1</ip>
&nbsp;&nbsp;<classid>18</classid>
&nbsp;&nbsp;<os>windows-server</os>
&nbsp;&nbsp;<locate>CC06-05-08</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.2</ip>
&nbsp;&nbsp;<classid>19</classid>
&nbsp;&nbsp;<os>linux-server</os>
&nbsp;&nbsp;<locate>CC06-05-07-R</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
<serverinfo>
&nbsp;&nbsp;<ip>192.168.0.3</ip>
&nbsp;&nbsp;<classid>20</classid>
&nbsp;&nbsp;<os>windows-server</os>
&nbsp;&nbsp;<locate>CC06-04-07</locate>
&nbsp;&nbsp;<body&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type>6U</bodytype>
</serverinfo>
</wml>
</textarea><br/><br/>如大家有什么疑问或感兴趣的话题可以通过weibo与我交流：<a href="http://t.qq.com/yorkoliu" target="_blank">http://t.qq.com/yorkoliu</a><br/>Tags - <a href="https://blog.liuts.com/tags/%25E6%25A8%25A1%25E6%258B%259F%25E6%259C%25BA%25E6%259F%259C/" rel="tag">模拟机柜</a> , <a href="https://blog.liuts.com/tags/c%252B%252B/" rel="tag">c++</a>
]]>
</description>
</item><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/154/</link>
<title><![CDATA[编译C++的错误提示]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Fri, 17 Apr 2009 15:13:24 +0000</pubDate> 
<guid>https://blog.liuts.com/post/154/</guid> 
<description>
<![CDATA[ 
	<strong>config.h</strong><br/><textarea name="code" class="c" rows="15" cols="100">
#ifndef _CONFIG
#define _CONFIG

#include 
#include 

using namespace std;

class CConfig
&#123;
public:
explicit CConfig(const char* xmlFileName)
:mXmlConfigFile(xmlFileName),mRootElem(0)
&#123;
//加载配置文件
mXmlConfigFile.LoadFile();

//得到配置文件的根结点
mRootElem=mXmlConfigFile.RootElement();
&#125;

public:
//得到nodeName结点的值
string GetValue(const string& nodeName);

private:
//禁止默认构造函数被调用
//CMmsConfig();

private:
TiXmlDocument mXmlConfigFile;
TiXmlElement* mRootElem;

&#125;;
#endif
</textarea><br/><strong>main.cpp</strong><br/><textarea name="code" class="c" rows="15" cols="100">
#include 
#include "config.h"
using namespace std;

string CConfig::GetValue(const string& nodeName)
&#123;
if(!mRootElem)
&#123;
cout<<"读取根结点出错"< return "";
&#125;

TiXmlElement* pElem=mRootElem->FirstChildElement(nodeName.c_str());
if(!pElem)
&#123;
cout<<"读取"< return "";
&#125;

return pElem->GetText();

&#125;

int main()
&#123;
CConfig xmlConfig("XmlConfig.xml");

//获取Author的值
string author = xmlConfig.GetValue("Author");
cout<<"Author:"< 
//获取Site的值
string site = xmlConfig.GetValue("Site");
cout<<"Site:"< 
//获取Desc的值
string desc = xmlConfig.GetValue("Desc");
cout<<"Desc:"<
return 0;
&#125;
</textarea><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"><br/>./configure通过，make时提示：<br/>............<br/>nagios_rsync.o: In function `~TiXmlDocument':<br/>src/tinyxml.h:1401: undefined reference to `vtable for TiXmlDocument'<br/>src/tinyxml.h:1401: undefined reference to `TiXmlNode::~TiXmlNode()'<br/>nagios_rsync.o: In function `CConfig':<br/>src/config.h:33: undefined reference to `TiXmlDocument::TiXmlDocument(char const*)'<br/>src/config.h:36: undefined reference to `TiXmlDocument::LoadFile(TiXmlEncoding)'<br/>nagios_rsync.o: In function `TiXmlNode::FirstChildElement(char const*)':<br/>src/tinyxml.h:673: undefined reference to `TiXmlNode::FirstChildElement(char const*) const'<br/>collect2: ld returned 1 exit status<br/>make: *** [nagios_rsync] Error 1<br/>*** Exited with status: 2 ***<br/></div></div><br/>因为用到tinyxml包，程序找不到其它相关模块。<br/>在config.h中添加：<br/><textarea name="code" class="c" rows="15" cols="100">
#include <TINYXML.CPP>
#include <TINYSTR.H>
#include <TINYSTR.CPP>
#include <TINYXMLPARSER.CPP>
#include <TINYXMLERROR.CPP>
</textarea><br/>就正常了。 <br/>Tags - <a href="https://blog.liuts.com/tags/%25E7%25BC%2596%25E8%25AF%2591c%252B%252B/" rel="tag">编译c++</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/153/</link>
<title><![CDATA[C++中TinyXml的编程模型]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Tue, 14 Apr 2009 15:11:01 +0000</pubDate> 
<guid>https://blog.liuts.com/post/153/</guid> 
<description>
<![CDATA[ 
	<strong>一、TinyXml安装</strong><br/>http://jaist.dl.sourceforge.net/sourceforge/tinyxml/tinyxml_2_5_3.tar.gz<br/>tar -zxvf tinyxml_2_5_3.tar.gz<br/>cd tinyxml_2_5_3<br/>make<br/><br/><strong>二、文档位置</strong><br/>tinyxml_2_5_3/docs<br/><br/><strong>三、例子</strong><br/>xmltest.cpp<br/><br/><strong>四、类之间的关系</strong><br/>TinyXml实现的时DOM访问模型，因此提供了一系列的类对应XML文件中的各个节点。主要类间的关系如下图所示：<br/><a href="http://www.grinninglizard.com/tinyxmldocs/classTiXmlNode.png" target="_blank"><img src="http://www.grinninglizard.com/tinyxmldocs/classTiXmlNode.png" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" align="left"/></a><br/>TiXmlBase：其他类的基类，是个抽象类<br/>TiXmlNode：表示一个节点，包含节点的一般方法，如访问自节点、兄弟节点、编辑自身、编辑子节电<br/>TiXmlDocument：表示整个XML文档，不对应其中某个特定的节点。<br/>TiXmlElement：表示元素节点，可以包含子节点和TiXmlAttribute<br/>TiXmlComment：表示注释<br/>TiXmlDeclaration：表示声明<br/>TiXmlText：表示文本节点<br/>TiXmlUnknown：表示未知节点，通常是出错了<br/>TiXmlAttribute：表示一个元素的属性<br/><br/>下面是一个简单的例子：<br/><textarea name="code" class="xml" rows="15" cols="100">
<?xml version="1.0" encoding="utf-8" ?>
<!-This is only a sample-->
<BOOK>
<NAME>TinyXml How To</NAME>
<PRICE unit="”RMB”">20</PRICE>
<DESCRIPTION>Some words…</DESCRIPTION>
</ book>
</textarea><br/>整个文档，对应TiXmlDocument<br/>book,name,price, description，都对应TiXmlElement<br/>第一行对应一个TiXmlDeclaration<br/>第二行对应一个TiXmlComment<br/>“TinyXml How To”对应一个TiXmlText<br/>unit则是price的一个TiXmlAttribute<br/>这些类与XML文件中的相应元素都有很好的对应关系，因此相信参照TinyXml的文档，可以很容易的掌握各个方法的使用。<br/>Tags - <a href="https://blog.liuts.com/tags/tinyxml/" rel="tag">tinyxml</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/145/</link>
<title><![CDATA[初学者学习C++的50条忠告]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Thu, 22 Jan 2009 14:41:17 +0000</pubDate> 
<guid>https://blog.liuts.com/post/145/</guid> 
<description>
<![CDATA[ 
	1.把C++当成一门新的语言学习（和C没啥关系！真的。）；<br/>2.看《Thinking In C++》，不要看《C++变成死相》；<br/>3.看《The C++ Programming Language》和《Inside The C++ Object Model》，不要因为他们很难而我们自己是初学者所以就不看；<br/>4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境，而我们要学的是一门语言；<br/>5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单，或者可以引伸出很多知识点；<br/>6.会用Visual C++，并不说明你会C++；<br/>7.学class并不难，template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书；<br/>8.如果不是天才的话，想学编程就不要想玩游戏——你以为你做到了，其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住：学C++是为了编游戏的；<br/><br/>9.看Visual C++的书，是学不了C++语言的；<br/>10.浮躁的人容易说：XX语言不行了，应该学YY；——是你自己不行了吧！？<br/>11.浮躁的人容易问：我到底该学什么；——别问，学就对了；<br/>12.浮躁的人容易问：XX有钱途吗；——建议你去抢银行；<br/>13.浮躁的人容易说：我要中文版！我英文不行！——不行？学呀！<br/>14.浮躁的人容易问：XX和YY哪个好；——告诉你吧，都好——只要你学就行；<br/>15.浮躁的人分两种：a）只观望而不学的人；b）只学而不坚持的人；<br/>16.把时髦的技术挂在嘴边，还不如把过时的技术记在心里；<br/>17.C++不仅仅是支持面向对象的程序设计语言；<br/>18.学习编程最好的方法之一就是阅读源代码；<br/>19.在任何时刻都不要认为自己手中的书已经足够了；<br/>20.请阅读《The Standard C++ Bible》（中文版：标准C++宝典），掌握C++标准；<br/>21.看得懂的书，请仔细看；看不懂的书，请硬着头皮看；<br/>22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍；<br/>23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》；<br/>24.不要停留在集成开发环境的摇篮上，要学会控制集成开发环境，还要学会用命令行方式处理程序； 25.和别人一起讨论有意义的C++知识点，而不是争吵XX行不行或者YY与ZZ哪个好；<br/>26.请看《程序设计实践》，并严格的按照其要求去做；<br/>27.不要因为C和C++中有一些语法和关键字看上去相同，就认为它们的意义和作用完全一样；<br/>28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言，你一定不会把C和Z语言联系得那么紧密；<br/>29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已；<br/>30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++；<br/>31.学习编程的秘诀是：编程，编程，再编程；<br/>32.请留意下列书籍：《C++面向对象高效编程（C++ Effective Object-Oriented Software Construction）》《面向对象软件构造（Object-Oriented Software Construction）》《设计模式（Design Patterns）》《The Art of Computer Programming》；<br/>33.记住：面向对象技术不只是C++专有的；<br/>34.请把书上的程序例子亲手输入到电脑上实践，即使配套光盘中有源代码；<br/>35.把在书中看到的有意义的例子扩充；<br/>36.请重视C++中的异常处理技术，并将其切实的运用到自己的程序中；<br/>37.经常回顾自己以前写过的程序，并尝试重写，把自己学到的新知识运用进去；<br/>38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路；<br/>39.C++语言和C++的集成开发环境要同时学习和掌握；<br/>40.既然决定了学C++，就请坚持学下去，因为学习程序设计语言的目的是掌握程序设计技术，而程序设计技术是跨语言的；<br/>41.就让C++语言的各种平台和开发环境去激烈的竞争吧，我们要以学习C++语言本身为主；<br/>42.当你写C++程序写到一半却发现自己用的方法很拙劣时，请不要马上停手；请尽快将余下的部分粗略的完成以保证这个设计的完整性，然后分析自己的错误并重新设计和编写（参见43）；<br/>43.别心急，设计C++的class确实不容易；自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的；<br/>44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的，而不是一次记住的；<br/>45.每学到一个C++难点的时候，尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了；<br/>46.记录下在和别人交流时发现的自己忽视或不理解的知识点；<br/>47.请不断的对自己写的程序提出更高的要求，哪怕你的程序版本号会变成Version 100.XX；<br/>48.保存好你写过的所有的程序——那是你最好的积累之一；<br/>49.请不要做浮躁的人；<br/>50.请热爱C++!<br/><br/>Tags - <a href="https://blog.liuts.com/tags/%25E5%25BF%25A0%25E5%2591%258A/" rel="tag">忠告</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/144/</link>
<title><![CDATA[c++中结构体和联合体的区别]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Sun, 22 Jun 2008 14:39:24 +0000</pubDate> 
<guid>https://blog.liuts.com/post/144/</guid> 
<description>
<![CDATA[ 
	<strong>结构体</strong>是把若干个数据类型组合到一起,相当于形成一个结构类型,这样的结构体变量就拥有结构体所包含的所有的数据类型。<br/>结构体所占用的内存单元是它里面包含数据类型所占内存单元的总和。<br/><br/><strong>联合体</strong>是为了节省内存而设置的,若干个不同数据类型共用一组内存单元。<br/>联合体所占的内存单元是它所包含的数据类型中占用内存单元最大的那个数据类型所占用的内存单元的值。<br/><textarea name="code" class="c" rows="15" cols="100">
union&nbsp;&nbsp; test1
&nbsp;&nbsp;&#123;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;&nbsp; a;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp; b;&nbsp;&nbsp; 
&nbsp;&nbsp;&#125;&nbsp;&nbsp; 
&nbsp;&nbsp;sizeof(test1)==sizeof(long)&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;struct&nbsp;&nbsp;test2
&nbsp;&nbsp;&#123;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;&nbsp; a;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;&nbsp; b;&nbsp;&nbsp; 
&nbsp;&nbsp;&#125;&nbsp;&nbsp; 
&nbsp;&nbsp;sizeof(test2)==sizeof(long)+sizeof(char)
</textarea><br/>Tags - <a href="https://blog.liuts.com/tags/%25E7%25BB%2593%25E6%259E%2584%25E4%25BD%2593/" rel="tag">结构体</a> , <a href="https://blog.liuts.com/tags/%25E8%2581%2594%25E5%2590%2588%25E4%25BD%2593/" rel="tag">联合体</a>
]]>
</description>
</item><item>
<link>https://blog.liuts.com/post/143/</link>
<title><![CDATA[window平台开发C++利器]]></title> 
<author>root &lt;admin@yourname.com&gt;</author>
<category><![CDATA[C/C++]]></category>
<pubDate>Thu, 22 May 2008 14:34:04 +0000</pubDate> 
<guid>https://blog.liuts.com/post/143/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;虽然不比MicroSoft Visual C++ 6.0强大，但基本的功能都很全了，是基于G++的编译器的，跟Linux平台下一样。目前最新正式版为dev-c++ 4.9.9.2，值得推荐：）<br/><a href="http://img.download.pchome.net/05/84/1337_800x600.jpg" target="_blank"><img src="http://img.download.pchome.net/05/84/1337_800x600.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" align="left"/></a><br/>Tags - <a href="https://blog.liuts.com/tags/dev-c%252B%252B/" rel="tag">dev-c++</a>
]]>
</description>
</item>
</channel>
</rss>