在 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 使用率拉高。
參考資料
- 三分鐘學會安裝 LibreNMS SNMP Tools CentOS 7 (Apache) - iT 邦幫忙
https://ithelp.ithome.com.tw/articles/10212310 - Manage group new device group fail - Help - LibreNMS Community
https://community.librenms.org/t/manage-group-new-device-group-fail/8711