2012年5月3日 星期四

Cacti + XSMS_API (SOAP) (自行客製化 Cacti + SMS )

我最近在幫我朋友在 [某知名企業] 建置網管系統,並結合手機簡訊發報功能
使用軟體為 cacti + zabbix ( open source )



































































功能差不多是這樣,只是上面這些圖是以 syslog 為出發點的架構
網管角度與方式是最大的差異吧.













































































~ 網管系統不就是這樣.大同小異...

而這家 [某知名企業] 是用 Cacti + snmp + ping + Zabbix agent 加以監控的.
架構上是差不多的,功能上也是相似的.就是網管例行功能與需求.
Cacti & Zabbix
採主動出擊的網管方式! Syslog 則是被動通知.
運作邏輯簡要說明如下:

Device ---------------------->syslog---->
網管系統----->異常通知

Device <---SNMP/Zabbix-Agent/ICMP<-------
網管系統----->異常通知

 
外面買這樣 Solution 至少以萬起跳吧!
我大約花了一個多星期才完成這個專案.
作業方式就是就在家做好了所有PluginsAPIScripts.
再透過Teamview去完成相關的設定工作與相關測試與調校作業.
其中手機簡訊API的界接是將 XSMS_API 改寫入msn2web 程式(Pank msn2web程式 Source http://pank.org/msn/web2msn.tgz)
成為 web API 介面,改寫 msn2web 上半段 php 程式 (該企業的需求僅需手機簡訊)
類似這樣的畫面.





















亞太電信企業簡訊XSMS服務平台程式開發指引手冊(Release Version 1.9)

XSMS_API_V1.9.pdf


5.1. 即時簡訊發送API

5.1.1. SOAP 介面說明
此功能提供給企業用戶透過SOAP API 傳送即時簡訊發送之需求。


5.1.1.1. 介面協議
SOAP
HTTP Method: Post
5.1.1.2.
介面URL
未加密:
http://xsms.aptg.com.tw/XSMSAP/api/APIRTRequest
加密:
https://xsms.aptg.com.tw/XSMSAP/api/APIRTRequest

6.3. PHP
範例 + 介面協議說明


$url= "xsms.aptg.com.tw";
$fp = fsockopen($url,80,$errno,$errstr,30);
if (!$fp){
echo 'Could not open connection.';
}
else{
$xmlpacket ='<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/">
<soap-env:Header/>
<soap-env:Body>
<Request>
//
企業代表號
<MDN>xxxxxxxxxx</MDN>
//
使用者帳號(企業管理者之帳號即為企業代表號)
<UID>xxxxx</UID>
//
使用者密碼
<UPASS>xxxxxxx</UPASS>
//
簡訊主旨
<Subject>API test</Subject>
//Retry
是否啟用
<Retry>Y</Retry>
//
長簡訊是否啟用
<AutoSplit>N</AutoSplit>
//
簡訊發送截止時間
//Default
為發送時間+24 小時格式為YYYYMMDDhhmm 時分截止時間最晚為發送時間+24 小時,若使用者設定超過24 小時,將以24 小時為限,不再回覆任何訊息
//<StopDateTime>N</StopDateTime>
//
簡訊本文
<Message>SMS API Test OK</Message>
<MDNList>
//
接收端手機號碼
<MSISDN>xxxxxxxxxx</MSISDN>
</MDNList>
</Request>
</soap-env:Body>
</soap-env:Envelope>';
$contentlength = strlen($xmlpacket);
$out = "POST /XSMSAP/api/APIRTRequest HTTP/1.1\r\n";
$out .= "Host: 210.200.64.111\r\n";
$out .= "Connection: close\r\n";
$out .= "Content-type: text/xml;charset=utf-8\r\n";
$out .= "Content-length: $contentlength\r\n\r\n";
$out .= "$xmlpacket";
fwrite($fp, $out);
while (!feof($fp)) {
$theOutput .= fgets($fp, 128);
}
fclose($fp);
echo $theOutput;
}
?>
下方程式請依個自需求.自行改寫之...僅供參考使用...新的web2sms取代web2msn


===================================


<?php


function counter() {
$file="counter.txt";
if (!file_exists($file)) {
$fp=fopen($file, "w");
fputs($fp, 0, 2);
fclose($fp);
}
$conts=file("$file");
$counter=$conts[0]+1;
$fp=fopen($file, "w");
fputs($fp, $counter,
;
echo $counter;
}



function SMS_API(){


/*
填入API 指令的網址 */
$fp = fsockopen("xsms.aptg.com.tw", 80, $errno, $errstr, 30);
if (!$fp)
{
echo 'Could not open connection.';
}
else
{
$xmlpacket ='<soap-env:Envelope xmlns:soap-env='http://schemas.xmlsoap.org/soap/envelope/'>
<soap-env:Header/>
<soap-env:Body>
<Request>
<MDN>0982684444</MDN>
<UID>dennischung</UID>
<UPASS>aptgxsms</UPASS>
<Subject>
亞太電信簡訊發送平台</Subject>
<Retry>Y</Retry>
<AutoSplit>N</AutoSplit>
<StopDateTime>201006021230</StopDateTime>
<Message>
這是一封來自亞太電信....</Message> 重點在這裡=====> 想辦法將web2msnmsg所接收的訊息寫在這個地方,並成為SOAP的標準格式內容等(重點)
<MDNList>
<MSISDN>0982111111</MSISDN>
重點在這裡=====> 想辦法將web2msnmsn所接收的訊息寫在這個地方,並成為SOAP的標準格式內容等(重點)
<MSISDN>0982111222</MSISDN>
<MSISDN>0982111333</MSISDN>
</MDNList>
</Request>
</soap-env:Body>
</soap-env:Envelope>';
$contentlength = strlen($xmlpacket);
$out = "POST /XSMSAP/api/APIRTRequest HTTP/1.1\r\n";
$out .= "Host: 210.200.64.111\r\n";
$out .= "Connection: close\r\n";
$out .= "Content-type: text/xml;charset=utf-8\r\n";
$out .= "Content-length: $contentlength\r\n\r\n";
$out .= "$xmlpacket";
fwrite($fp, $out);
while (!feof($fp))
{
$theOutput .= fgets($fp, 128);
}
fclose($fp);
echo $theOutput; // $theOutput is the response returned from the remote script
}
?>


if ($msn) {
$c = $msn;
$g = $msg;
$msn=trim($msn);
$id=strlen($msg);
if (strstr($msn, '0') ) {
if ($charset=='big5') $msg=iconv('big5','utf-8',$msg);
SMS_API(); ---->
這裡指的是將網頁中的 MSN-ID & MS-MSG 餵入 function SMS_API() [亞太的XSMS SOAP API 變成 SMS-ID & SMS-MSG] 並執行手機簡訊傳送! 條件是一定是要輸入 ID & MSG 才會進行手機簡訊傳送動作!

==================
這裡的邏輯是這樣子的
MSN-ID --------> SMS-ID
MSN-MSG------> SMS-MSG
變成新的 sms.index.php
==================
原來舊的 msn.index.php
msn --------> MSN-ID
msg------> MSN-MSG
======================
整個流程就是
msn--->msn-id------->sms-id
msg--->msg-msg---->sms-msg
======================

if ($cli) exit;
echo ( "<P>SOAP API Message:" . $theOutput . ".</P>" );
// echo "<script>alert('Sending SMS');</script>";
} else {
echo "<script>alert('SMS
手機門號輸入不正確!');</script>";
}
}



?>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>WEB2MSN</title>
</head>
<body onload="form1.msn.focus()">
<h3>WEB2MSN</h3>
需要加入我的 MSN bot 才能送訊息給您, 請新增 MSN 連絡人:
<font color=blue><a href=msnim:add?contact=msn@pank.org><b>msn@pank.org</b></a></font><br>
測試完後再把他刪除即可, 非常感謝!<br>

<form name=form1 method=post>
<table border=0>
<tr>
<td>
傳送給 MSN</td>
<td><input name=msn size=70 title='
傳給多個連絡人請用 , 隔開'></td>
</tr>
<tr>
<td>
訊息</td>
<td>
<textarea rows=5 name=msg cols=50 title='
請輸入訊息'>
</textarea><br>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td><input type=submit value="
傳送"></td>
</tr>
</table>
</form>
<br>
配合時間排程(crontab), 可以做到行事曆提醒功能<br>
CLI
傳訊方法<br>
wget -qO- "http://pank.org/msn/?cli=1&msn=MSN
帳號&msg=訊息"<br>
若您的系統是用 big5 編碼, 請加 charset 參數, 例如:<br>
wget -qO- "http://pank.org/msn/?cli=1&charset=big5&msn=MSN
帳號&msg=訊息"<br>
<br>
感謝 twu2 所分享的文章:
<a href=http://blog.teatime.com.tw/1/post/200>
使用 PHP 發送 MSN 訊息</a> |
<a href=http://blog.teatime.com.tw/1/post/218>msn.class.php v1.3a, a simple msnbot</a>
<hr>
<table border=0 width=100%>
<tr>
<td><a href=http://pank.org>pank.org</a></td>
<td align=right><font color=405060><? counter(); ?> Visitors</font></td>
</tr>
</table>
<p>&nbsp;</p>
</body>
</html>


===================================


Cacti
程式內容的修改請參考
Cacti plugin thold (Threshold Alert Module) + MSN
http://www.vlab.com.tw/vlabforums/viewtopic.php?t=15262

Threshold Alert Module
的程式內容會因版本不同.
所以程式有會有所不同.請特別注意!!

vi /var/www/html/cacti/plugins/thold/thold_functions.php

search [if (trim($alert_emails) != '') {]
thold_mail(....的下方新增 wget 的方式. alert_emails subjcet message 導入 sms2web MSN-Message (重點)

alert
if (trim($alert_emails) != '') {

wget ......
請參改如下的Wget CLI

warning
if (trim($warning_emails) != '') {

wget ......

==========================

Wget CLI
傳訊方法 :
wget -qO- "http://pank.org/msn/?cli=1&msn=MSN
帳號&msg=訊息"
若您的系統是用 big5 編碼, 請加 charset 參數, 例如:
wget -qO- "http://pank.org/msn/?cli=1&charset=big5&msn=MSN
帳號&msg=訊息"
===========================

================
XRCD2
==============
License Certified:
Juniper JNCIA-ER JNCIA-EX JNCIS-ES JNCIS-ER JNCIS-M

沒有留言:

張貼留言