2019年3月7日 星期四

[經驗分享]LibreNMS 的 Address & Ports 頁面無法正常顯示問題



我所使用的 LibreNMS,自某天開始忽然有幾個功能開起來內容都是空空如也,而這幾個功能都是我使用頻率相當高的頁面,無法顯示內容對我來說影響甚大。









問題原因

我發現在以下這幾個頁面,原本應該顯示資料表格的都變成了空白,如圖本文標題圖片一樣。

  • IPv4 Address
  • IPv6 Address
  • MAC Address
  • ARP Address
  • All Ports


我以為是更新了某個版本才發生,所以到 LibreNMS 官方討論區提出問題,而開發團隊也很快給出建議,請我查看 librenms.log 與開啟瀏覽器的開發者工具 AJAX 部份,看看是否有線索。

librenms.log 部份看起來並無異常,在瀏覽器開發者工具上,有發現可疑的部份:


瀏覽器開發者工具發現問題 (1)




瀏覽器開發者工具發現問題 (2)


看到這裡,我已經意會到問題是出在上面兩張圖中第一圖的打叉處,在「ups2」這個後面被斷行,導致相關指令碼異常無法繼續執行。因此造成資料其實都有載入到使用者的瀏覽器端,但後面資料無法被顯示的問題。

關於斷行的證據,還可以參考這兩張圖:


名稱後方多了一個空格 (1)



名稱後方多了一個空格 (2)




Capture Debug 顯示的換行結果


這種 SNMP sysName 被換行的情況少之又少,因為正常情況下,SNMP 不應該有帶著換行字元的 sysName 存在。

這次發生問題的裝置是 MegaTec NetAgent II,它是用來搭配 UPS 使用的套件,原本使用正常,更新韌體後才發生會送出換行字元的問題。






手動處理

雖然已經提供了問題原因至官方討論區,但我已經等不及官方修復,先自己動手修了。

目前的作法是針對資料庫撈出資料後,以 replace 函式將換行字元給處理掉,套用後確實解決了無法顯示的問題,有遇到同樣問題的朋友,可以先下載替換使用,請至本文參考資料的第四個連結處。

我也已經將我修改的部份提交 Pull Request 至官方團隊,不過官方團隊表示對於修改 SQL 語法的方式不建議,所以我會再另外以 SNMP Poller 時或 Web 頁面部份的語法做替換,再提交 PR 回去,可查看參考資料第二項。


[2019/03/08 補充]
已經採用新的作法,從源頭 Poller 時就把不該有的換行字元處理掉,讓存進來的 sysName、sysLocation、sysContact 是正確格式,可查看參考資料第三項。




結論

開源的好處,就是在於遇到問題可以不必等開發團隊修復才能使用,而是可以自己動手做,並且在提交回饋的過程中與開發團隊互動,不斷學習到更好的技巧與方式。






參考資料