天天看點

cacti實作微信告警功能

背景

近來受朋友所托,為他實作cacti的微信告警功能,但是在印象之中,cacti的thold插件貌似隻有郵件告警功能吧?于是花了點時間在網絡上搜尋了相關資訊,發現cacti的微信告警的資訊着實很少,唯一看似可用的文章嘗試了下卻無法成功,在那篇文章的基礎上,我修改了一下微信腳本的代碼,測試成功了。故在此整理一下,供各位參看。

原理

由于cacti的thold插件本身并沒有微信告警功能,隻有郵件功能,是以本文章的微信告警功能其實是有取巧的性質。原理就是在thold插件觸發郵件告警的時候,同時運作微信發送消息的腳本,利用微信公衆号的api發送告警内容。

配置(cacti目錄為/usr/local/cacti)

1:安裝cacti的thold與settings插件。

thold依賴setting插件,先安裝settings插件:

插件下載下傳位址:http://docs.cacti.net/plugin:settings

1

2

<code># cp settings-v0.71-1.tgz /usr/local/cacti/plugins</code>

<code># tar -zxvf settings-v0.71-1.tgz</code>

安裝thold插件:

插件下載下傳位址:http://docs.cacti.net/plugin:thold

<code># cp thold-v0.5.0.tgz /usr/local/cacti/plugins</code>

<code># tar -zxvf thold-v0.5.0.tgz</code>

使插件生效:

3

4

5

6

7

8

9

10

11

12

<code># vi /usr/local/cacti/include/config.php </code>

<code>$database_type = </code><code>"mysql"</code><code>;</code>

<code>$database_default = </code><code>"cacti"</code><code>;</code>

<code>$database_hostname = </code><code>"localhost"</code><code>;</code>

<code>$database_username = </code><code>"cacti"</code><code>;</code>

<code>$database_password = </code><code>"cacti123456"</code><code>;</code>

<code>$database_port = </code><code>"3306"</code><code>;</code>

<code>$database_ssl = </code><code>false</code><code>;</code>

<code>#添加如下資訊</code>

<code>$plugins[] = </code><code>'settings'</code><code>;</code>

<code>$plugins[] = </code><code>'thold'</code><code>;</code>

進入cacti,在console--Configuration--Plugin Management中開啟插件即可。

<a href="https://s4.51cto.com/wyfs02/M02/99/8F/wKiom1lJ1CWwYLs4AABzBDw_P2I410.png" target="_blank"></a>

2:配置微信告警觸發與微信告警腳本

在thold插件程式中,觸發郵件告警的部分,添加運作微信告警的代碼。

13

14

15

16

17

18

19

20

21

22

23

24

<code># vi /usr/local/cacti/plugins/thold/thold_functions.php</code>

<code> </code><code>$message = str_replace(</code><code>'&lt;GRAPH&gt;'</code><code>, </code><code>"&lt;br&gt;&lt;img src='"</code> <code>. $val['</code><code>file</code><code>'] . "'</code><code>&gt;&lt;br&gt;Could not </code><code>open</code><code>!&lt;br&gt;" . $val[</code><code>'file'</code><code>], $message);</code>

<code>                        </code><code>}</code>

<code>                </code><code>}</code>

<code>        </code><code>}</code>

<code>          </code> 

<code>   </code><code>########找到相關代碼位置,添加如下代碼__start##################### </code>

<code>        </code><code>$msg_wx = strip_tags(str_replace(</code><code>'&lt;br&gt;'</code><code>, </code><code>"\n"</code><code>, $message));       </code><code>//</code><code>删除message中的html标簽,并将&lt;br&gt;替換為換行符\n</code>

<code>        </code><code>$msg_wx = trim($msg_wx);                         </code><code>//</code><code>整理msg_wx字元串</code>

<code>        </code><code>$msg_wx = iconv( </code><code>"GB2312//IGNORE"</code><code>, </code><code>"UTF-8"</code><code>, $msg_wx);         </code><code>//</code><code>轉換編碼為utf-8,防止亂碼</code>

<code>        </code><code>$sub_wx = iconv( </code><code>"GB2312//IGNORE"</code><code>, </code><code>"UTF-8"</code><code>, $subject);         </code><code>//</code><code>轉換編碼為utf-8,防止亂碼</code>

<code>        </code><code>$file_title  = </code><code>'/tmp/title.txt'</code><code>;                     </code><code>//</code><code>要寫入檔案的檔案名(可以是任意檔案名),如果檔案不存在,将會建立一個</code>

<code>        </code><code>$file_message  = </code><code>'/tmp/message.txt'</code><code>;                  </code><code>//</code><code>要寫入檔案的檔案名(可以是任意檔案名),如果檔案不存在,将會建立一個</code>

<code>        </code><code>if</code><code>($f  = file_put_contents($file_title, $sub_wx))           </code><code>//</code><code>将subject參數的值儲存到file_title中</code>

<code>        </code><code>if</code><code>($f  = file_put_contents($file_message,  $msg_wx))         </code><code>//</code><code>将msg_wx參數的值儲存到file_message中</code>

<code>        </code><code>shell_exec(</code><code>"/etc/wechat.sh"</code><code>);                       </code><code>//</code><code>運作wechat.sh檔案,進行微信報警操作。</code>

<code>   </code><code>#################end#################################</code>

<code>        </code> 

<code>        </code><code>$text = array(</code><code>'text'</code> <code>=&gt; </code><code>''</code><code>, </code><code>'html'</code> <code>=&gt; </code><code>''</code><code>);</code>

<code>        </code><code>if</code> <code>($filename == </code><code>''</code><code>) {</code>

<code>                </code><code>$message = str_replace(</code><code>'&lt;br&gt;'</code><code>,  </code><code>"\n"</code><code>, $message);</code>

<code>                </code><code>$message = str_replace(</code><code>'&lt;BR&gt;'</code><code>,  </code><code>"\n"</code><code>, $message);</code>

<code>                </code><code>$message = str_replace(</code><code>'&lt;/BR&gt;'</code><code>, </code><code>"\n"</code><code>, $message);</code>

<code>                </code><code>$text[</code><code>'text'</code><code>] = strip_tags($message);</code>

觸發微信消息腳本:(提前申請微信企業号,并配置好相關資訊,可參考博文http://icenycmh.blog.51cto.com/4077647/1909527)

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

<code># vi /etc/wechat.sh </code>

<code>#微信企業号的CropID</code>

<code>CropID=</code><code>'xxxxxxxxxxxxxxx'</code>

<code>#企業号中發送告警的應用</code>

<code>Secret=</code><code>'xxxxxxxxxxxxxxxxxxxxxxxxxxx'</code>

<code>GURL=</code><code>"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CropID&amp;corpsecret=$Secret"</code>

<code>Gtoken=$(</code><code>/usr/bin/curl</code> <code>-s -G $GURL |  </code><code>awk</code> <code>-F </code><code>"[\":,]"</code> <code>'{print $15}'</code><code>)</code>

<code>PURL=</code><code>"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Gtoken"</code>

<code>function</code> <code>body() {</code>

<code>local</code> <code>int AppID=1</code>

<code>#Appid 填寫企業号中建立的報警APP的ID</code>

<code>local</code> <code>UserID=</code><code>"@all"</code>

<code>#此處填寫報警接收使用者,全部報警可留白</code>

<code>local</code> <code>PartyID=</code><code>"@all"</code>

<code>local</code> <code>TagID=</code><code>"@all"</code>

<code>Ent=$</code><code>'\n'</code>

<code>Date=$(</code><code>date</code> <code>'+%Y年%m月%d日 %H:%M:%S\n\n'</code><code>)</code>

<code>#應cactifans群内要求,添加Cacti微信報警日期參數</code>

<code>Tit=$(</code><code>cat</code> <code>/tmp/title</code><code>.txt)</code>

<code>#讀取/tmp/title檔案中内容到變量Tit</code>

<code>Msg=$Date$Tit$Ent$(</code><code>cat</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code> <code>'s/%//g'</code><code>)</code>

<code>#拼接msg主體檔案,包含日期,主題,報警内容.并删除報警内容中的'%'号.</code>

<code>Url=$(</code><code>grep</code>  <code>"http"</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code>  <code>'s/URL: //g'</code><code>)</code>

<code>#擷取message.txt中的url行内容</code>

<code>Pic_tmp=$(</code><code>grep</code>  <code>"http"</code> <code>/tmp/message</code><code>.txt|</code><code>sed</code>  <code>'s/URL: //g'</code><code>|</code><code>sed</code> <code>'s/\/graph.php/\/graph_image.php/g'</code><code>)</code>

<code>if</code> <code>[ ! -n </code><code>"$Pic_tmp"</code> <code>] ;</code><code>then</code>

<code>Pic=</code><code>""</code>

<code>else</code>

<code>Pic=$Pic_tmp$</code><code>'&amp;graph_height=130&amp;graph_width=500&amp;t='</code><code>$Date</code>

<code>fi</code>

<code>#根據url行内容修改為添加Pic參數</code>

<code>#另感謝cactifans群 深圳-動動 提供的方法,在此修改圖檔大小,防止圖像顯示不全,并判斷圖檔檔案是否存在。防止當機出現圖檔報警</code>

<code>printf</code> <code>'{\n'</code>

<code>printf</code> <code>'\t"touser": "'</code><code>"$UserID</code><code>"\""</code><code>,\n"</code>

<code>printf</code> <code>'\t"toparty": "'</code><code>"$PartyID</code><code>"\""</code><code>,\n"</code>

<code>printf</code> <code>'\t"totag": "'</code><code>"$TagID</code><code>"\""</code><code>,\n"</code>

<code>printf</code> <code>'\t"msgtype": "news",\n'</code>

<code>printf</code> <code>'\t"agentid": "'</code><code>" $AppID </code><code>"\""</code><code>,\n"</code>

<code>printf</code> <code>'\t"news": {\n'</code>

<code>printf</code> <code>'\t"articles": [\n'</code>

<code>printf</code> <code>'\t\t"title": "'</code><code>"$Tit</code><code>"\","</code><code>\n"</code>

<code>printf</code> <code>'\t\t"description": "'</code><code>"$Msg</code><code>"\","</code><code>\n"</code>

<code>printf</code> <code>'\t\t"url": "'</code><code>"$Url</code><code>"\","</code><code>\n"</code>

<code>printf</code> <code>'\t\t"picurl": "'</code><code>"$Pic</code><code>"\","</code><code>\n"</code>

<code>printf</code> <code>'\t}\n'</code>

<code>printf</code> <code>'\t]\n'</code>

<code>printf</code> <code>'}\n'</code>

<code>}</code>

<code>curl -l -H </code><code>"Content-type: application/json"</code> <code>-X POST -d </code><code>"$(body )"</code> <code>$PURL</code>

測試一下微信腳本是否可用:

<code>#在/tmp/title.txt和/tmp/message.txt中随便填寫一些内容,運作微信腳本:</code>

<code># echo 123 &gt; /tmp/title.txt</code>

<code># echo 456 &gt; /tmp/message.txt</code>

<code># sh /etc/wechat.sh</code>

如果收到微信資訊,則微信腳本可用,内容如下:

3:配置cacti郵件告警,并配置主機當機狀态告警:(不配置郵件應該也可以,隻是可以更直覺的發現觸發郵件告警的時候,同時觸發了微信告警)

配置郵件相關資訊與DNS:

模拟主機當機,檢視告警:

5:cacti流量監控告警配置

建立一個告警模闆,規定網口進入流量超過30M就觸發告警。(具體流量監控配置不在這裡闡述)

<a href="https://s4.51cto.com/wyfs02/M00/99/91/wKioL1lJ3BuSNzRTAAKQAr99Xos324.png" target="_blank"></a>

把這個模闆應用到某個主機端口上,如果流暢超過30M,則觸發告警,告警如下:

<a href="https://s5.51cto.com/wyfs02/M01/99/91/wKioL1lJ3QHSn32gAAKDLylKP58787.png" target="_blank"></a>

可以看到,不止能收到文本告警,就連當下接口的流量圖都可以收到,說明這個微信告警的功能還是挺強大滴~~~

注意:

如果流量告警中無法顯示流量圖,可以做如下修改:

<code>#取消cacti的圖像驗證配置</code>

<code># vi /usr/local/cacti/graph_image.php     </code>

<code>#include("./include/auth.php");         #添加注釋</code>

<code>include_once(</code><code>"./lib/rrd.php"</code><code>);</code>

<code>include(</code><code>"./include/global.php"</code><code>);        </code><code>#添加這一行</code>

本文轉自 icenycmh 51CTO部落格,原文連結:http://blog.51cto.com/icenycmh/1940443,如需轉載請自行聯系原作者