[教學] LibreNMS 串接 LINE 通知

在現代科技世界中,網路裝置監控與通知非常重要。LibreNMS 是一個開源的網路監控系統,可以用來監控網絡設備、伺服器…等。然而,對於一些使用者而言,LibreNMS 的通知設定可能會有一些小困難。我們將在這個系列文章中介紹幾種常用的通知方式:電子郵件、LINE、Telegram、GoogleChat…等。這些通知方式都可幫助使用者即時收到監視警報和報告,以便快速回應並保護他們的系統和網絡安全。

LibreNMS 系列文:

剛好工作會用到 LINE,所以把通知轉到 LINE 去,就讓我們看看要怎麼做吧!

抓下 Pull Request 的內容

目前截稿至今,目前還沒有人把 LINE 機器人通知功能的做進去,
小弟就順手貢獻程式碼,把這個功能加上 😎。

當然 LibreNMS 整套程式授權是 GPL,想當然爾貢獻的程式碼也是 GPL,歡迎大家使用。

只是官方還沒有允許 Pull Request 的內容,
如果覺得不錯,可以幫忙在原串留個言,加速系統演進。

https://github.com/librenms/librenms/pull/14802


也因為目前小弟貢獻的程式碼尚未被合併,預設這功能「沒有包含」在官方系統裡,
需要你手動抓檔案來補

檔案在此:
https://github.com/j796160836/librenms/blob/feature_line_messaging/LibreNMS/Alert/Transport/Linemessagingapi.php

按下 Raw 得到原始檔,然後另存新檔,存成 LineMessagingAPI.php

如果跟我一樣是使用 Docker 的話,
放在目錄中,修改 docker-compose.yml 把這個檔案用掛載的方式,
類似 Hot patch 的方式把它放進去

docker-compose.yml 的 LibreNMS 設定,裡頭的 volumes 區塊,加上一句:

- ./LineMessagingAPI.php:/opt/librenms/LibreNMS/Alert/Transport/Linemessagingapi.php

(注意大小寫!)

如果你是照個之前那篇文的方式架設的話,
變成類似底下的範例:

docker-compose.yml

version: '3.5'

services:
  web:
    image: jarischaefer/docker-librenms
    restart: always
    ports:
      - '80:80'
    volumes:
      - ./librenms_data/logs:/opt/librenms/logs
      - ./librenms_data/rrd:/opt/librenms/rrd
      # Add this line
      - ./LineMessagingAPI.php:/opt/librenms/LibreNMS/Alert/Transport/Linemessagingapi.php
    environment:
      APP_KEY: base64:NA......................................SdA=
      DB_HOST: librenms_database
      DB_USER: librenms
      DB_PASS: Tuq.........tai
      DB_NAME: librenms
      POLLERS: 16
      BASE_URL: http://192.168.1.2
      TZ: Asia/Taipei
    depends_on:
      - mysql
  mysql:
    image: mariadb:10.5
    container_name: librenms_database
    restart: always
    volumes:
      - ./librenms_data/mysql:/var/lib/mysql
      - ./LineMessagingAPI.php:/opt/librenms/LibreNMS/Alert/Transport/Linemessagingapi.ph
    environment:
      TZ: Asia/Taipei
      MYSQL_ROOT_PASSWORD: Cho.........lan
      MYSQL_USER: librenms
      MYSQL_PASSWORD: Tuq.........tai
      MYSQL_DATABASE: librenms

官方 docker 架設方式也雷同,就不贅述了。

設定 LINE 開發者帳號

1. 前往Line開發者網站並註冊帳戶

https://developers.line.biz/

使用您的真人帳號來進行註冊。

2. 新增一個 Channel (頻道)

  1. 如果你沒有 Provider (供應商),請先建立一個。

  1. 創建一個 Channel (頻道),選擇 Messaging API ,然後填寫表單。

一些必填欄位說明:

  • Channel type 頻道類型:Messaging API
  • Provider 供應商:(選擇您的 Provider (供應商))
  • Company or owner’s country or region 公司或擁有者的國家或地區:(選擇您的地區)
  • Channel name 頻道名稱:(預設它將是您的 LINE機器人的名稱,送出後無法編輯)
  • Channel description 頻道描述:(預設它將是您的 LINE 機器人的描述)
  • Category 類別:(選擇適當的類別)
  • Subcategory 子類別:(選擇適當的子類別)

然後按送出建立它。

  1. 到 Channel 的 "Messaging API" 頁籤,這裡列出了一些你需要注意的重要值。
  • Bot basic IDQR code 是您的 LINE 機器人的 ID 和 QR code。
  • Channel access token (long-lived),通行 token ,效力等同於密碼,這將在 LibreNMS 中使用,請妥善保管。

  1. 使用您的真實 LINE 帳號加你建立的 LINE機器人為好友。

3. 設置 webhook 以獲取「收件人ID」

這邊講的「收件人ID」是指,你未來希望系統要把訊息發送到哪裡
它可以是

  • 聊天群組(要抓取 groupID
  • 個人私訊(要抓取 userID

以下是獲取「收件人ID」的步驟。

使用以下 NodeJS 程式和 ngrok 轉送臨時 https 連線。
以下步驟是在 Mac 底下操作。Linux 也適用這些步驟。

LINE-bot-RecipientFetcher

抓取程式

git clone https://github.com/j796160836/LINE-bot-RecipientFetcher.git

切換到該資料夾

cd LINE-bot-RecipientFetcher

執行程式

$ node index.js

使用 ngrok 將該連接埠暴露到網路上

ngrok http 3000

到 Channel (頻道) 中的 "Messaging API" 頁籤,
將 Webhook URL 填寫 ngork 所產生的網址 https://<your ngrok domain>/webhook

4. 獲取「收件人ID」

如果您想讓 LINE 機器人向自己(或者目標發送對象)發送訊息,這是獲取 userID 的步驟。

  • 使用您的真實帳戶(或者目標發送對象)向您的 LINE 機器人發送訊息

範例資料:

{"type":"user","userId":"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee"}

如果您想讓 LINE 機器人向一個群組發送訊息,這是獲取 groupID 的步驟。

  • 將您的LINE機器人添加到群組中
  • 使用您的真實帳戶在群組中發訊息

程式會把 groupID 印出來,這個就是收件人ID,請保管好。

範例資料:

{"type":"group","groupId":"Ce51xxxxxxxxxxxxxxxxxxxxxxxxxx6ef","userId":"U527xxxxxxxxxxxxxxxxxxxxxxxxxc0ee"} ```

LibreNMS 的通知設定

接下來回到 LibreNMS 繼續做設定。

1. 設定 Alert transport (通知管道)

Alerting > Alert Transports 頁面,新增一個 Alert transport (通知管道)。

  • Transport name 傳輸名稱:Line
  • Trsansport type 傳輸類型:Line Messanging API
  • Access token 存取權杖:(您的頻道存取權杖)
  • Recipient 收件人ID:_(填入剛剛抓的 userIDMARKDOWN_HASH2df121e268641afe58606b37a6e37a50MARKDOWNHASH )

2. 在 Alert rules (監控規則) 中掛上 Alert transport (通知管道)

Alerts > Alert rules 設定警告通知規則,

在想要通知的規則上按編輯,
(以預設通知 Device Down! Due to no ICMP response 為例)

Transports 的地方加上這個通知管道。

可以在 Alert rules 設定好通知的:

  • Max alert 通知數:最多要通知幾次
  • Delay 延遲:問題發生後,延遲多久再來通知,
    過濾掉時好時壞跳來跳去的情況
  • Interval 間隔:通知間隔,意指通知後隔多久再通知,該值會配合 Max alert 來使用。

例如:
Max alert: 3 / Delay: 30m / Interval: 5m
白話文就是:先延遲 30 分鐘再通知,通知共 3 次,每 5 分鐘通知一次

這邊可以依照需求來設定通知次數與頻繁度。

如果剛剛 Default Alert 有設定 ON 的話,應該所有規則都會出現才對。

測試

最後,你需要測試他們的通知設置是否正確。可以通過觸發警報或手動測試通知來完成這個步驟。

手動觸發測試

Alerts > Alert Transports 中,設定這個通知管道、通知方式。

就會收到測試訊息

以上,就是設定的所有內容,希望這個教學對您有幫助。

參考資料