2019年7月10日 星期三

[經驗分享]解決 LibreNMS 新增裝置群組錯誤問題


在 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 使用率拉高。





參考資料