跳到主要內容
節省工具箱Jason Tools
經驗分享

解決 LibreNMS 新增裝置群組錯誤問題

Jason Cheng 瀏覽 5,048 次
解決 LibreNMS 新增裝置群組錯誤問題
本文目錄
  1. 問題情況
  2. 解決問題
  3. 結論
  4. 參考資料

在 LibreNMS 當中,提供了名為「裝置群組」的功能,可以用來解決上層設備斷線時,下層所有裝置的警報一起發送的問題。

然而,最近陸續聽到不少使用者的回報,在進行新增群組時會發生錯誤的問題。

問題情況

當使用者進入功能表的 [Device 裝置] > [Device Group 裝置群組] > [New Device Group 新增裝置群組] 時,會出現錯誤畫面。

新增裝置群組發生錯誤
新增裝置群組發生錯誤

這就麻煩了,資訊太少,只好開始進行除錯的任務。

解決問題

首先,依據錯誤畫面所提供的資訊,前往記錄檔查看線索,開啟 /opt/librenms/logs/librenms.log。

在記錄檔中,可以發現這樣的錯誤訊息:

production.ERROR:
file_put_contents(/opt/librenms/cache/devices_relationships.cache): failed to open stream: Permission denied {“userId”:1,“email”:“XXXXXXXXXXXXXXXXXX”,“exception”:"[object] (ErrorException(code: 0):
file_put_contents(/opt/librenms/cache/devices_relationships.cache): failed to open stream: Permission denied at /opt/librenms/LibreNMS/DB/Schema.php:173)
[stacktrace]
#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, ‘file_put_conten…’, ‘/opt/librenms/L…’, 173, Array)
#1 /opt/librenms/LibreNMS/DB/Schema.php(173): file_put_contents(’/opt/librenms/c…’, ‘a:2:{s:7:"versi…’)

在過去的經驗裡,通常是因為該資料夾的權限不足無法寫入所致 (為了寫入 /opt/librenms/cache/devices_relationships.cache),因此,我們將 /opt/librenms/cache 賦予寫入權限:

chmod 664 /opt/librenms/cache
chown librenms:librenms /opt/librenms/cache

設定完成後,測試後發現仍然沒有解決問題,改為順著錯誤訊息指向的程式碼來追查,開啟 /opt/librenms/LibreNMS/DB/Schema.php,並跳至第 173 行:

file_put_contents($cache_file, serialize($cache));

沒錯,這一行的的確確是要寫入檔案,權限也給了,但為什麼還是不行呢?

為了先協助解決新增裝置群組的操作需求,請把這一行改註解掉,作法是將該行的前方加上兩個斜線:

// file_put_contents($cache_file, serialize($cache));

存檔退出再回頭測試,已經可以順利操作了。

結論

目前仍在觀察這一行寫入 cache 的程式碼不動作是否會有副作用,暫時來看是沒有的,若有我會回頭補充這篇文章。

在官方討論區也有人遇到相同問題,我也已將這個修改法回覆於其中,希望讓開發團隊能早日找出問題。

[2019/07/12 更新]
開發團隊告知這個修改法可能造成 LibreNMS 的 CPU 使用率拉高。

參考資料

延伸閱讀