微信运维助手 - 小优
1.起初
很久没自己做东西了,恰恰这段时间又忙着各系统的上线,自己学习的时间也少了,总之是自己越来越懒了。前端时间想写个运维方向的iOS应用,但是提交应用每年要向Apple交银子,实在不舍,也没有好的点子,就搁置了。恰好有个同学在搞互联网微信营销,于是想着能不能结合微信做点东西,于是有了这篇文章,算是个入门,高手略过。
2.CMDB信息查询服务接入微信
申请账号什么的我就不赘述了,重点在于通过微信公众账号接通自己的服务,为用户提供服务。我打算实现的功能是:用户提交一个IP,然后返回这个IP的服务器信息,包括机身码、机房位置、管理卡IP、负责人以及服务器内跑的服务等。方便运维人员不在公司的时候能够快速查询信息。
9月底和桐桐沟通开通查询CMDB的API接口,桐桐很快就搞定了。于是开始着手业务逻辑编码了。先把数据请求流程图贴出来吧:
我们要做的就是接收用户发出的指令,然后查询信息,返回给用户,处理用户信息的核心代码如下:
public function responseMsg()
{
//get post data, May be due to the different environments
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
//extract post data
if (!empty($postStr)){
/* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
the best way is to check the validity of xml by yourself */
libxml_disable_entity_loader(true);
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName;
$toUsername = $postObj->ToUserName;
$keyword = trim($postObj->Content);
$time = time();
$textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[%s]]></MsgType>
<Content><![CDATA[%s]]></Content>
<FuncFlag>0</FuncFlag>
</xml>";
if(!empty( $keyword ))
{
$msgType = "text";
$ProcessMessage = new ProcessMessage();
$contentStr = $ProcessMessage->Process($keyword);
$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
echo $resultStr;
}else{
echo "Input something...";
}
}else {
echo "";
exit;
}
}
为了保持代码逻辑性、模块性和扩展性,我另外写了一个类ProcessMessage用于处理用户提交的信息,方便后期的功能添加。代码如下:
class ProcessMessage
{
public function Process($mes)
{
//IP地址处理
if(preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/", $mes)) {
return $this->Return_IP_Info($mes);
}else{
return "Hello World";
}
}
private function Return_IP_Info($ip){
$pageContents = json_decode($res = HttpClient::quickPost('http://yuwei.baidu.com/api/server', array('ip' => $ip)));
$report = json_decode($pageContents->report_info);
$result = "主机名:".$report->hostName;
if($res == "None"){
$result = "你确定公司有这台机器么,那可能没加进CMDB";
}
return $result;
}
}
具体的实现代码如上了,如果匹配到用户提交的信息是IP地址,那么就调用 Return_IP_Info 方法,考虑到信息安全性,我们将这个方法设置为private。在这个类中我们可以扩展更多的功能,比如报警,远程执行命令等。大家可以任意发挥了。
2.Screen Shots