通过筛选 META 数据自定义 nextCloud 仪表盘
nextCloud 后台提供的监控工具是基于 XML / JSON 形式呈现的,阅读起来很不方便,官方提供的开发工具比较繁琐而第三方监控工具要么臃肿要么已经停更很久,所以只能自己动手开发一个。
官方提供的外部监控工具需要进行身份验证,要么进行页面登录,要么通过不记名的 Token 进行身份验证,找遍全网也没找到靠谱的案例,只能一步步摸索。
第一步需要生成一个新的 Token 并指定到 nextCloud 的 serverinfo 任务类型:
1 2 3 4 5 6 |
# 生成 Token [root@localhost ~]# openssl rand -hex 32 0242a6c12b355eae904fe465c27d2ddedaa4a05e2862a934c0042f7c0cc225c2 # 指定到 serverinfo [root@localhost ~]# sudo php /www/domain.com/occ config:app:set serverinfo token --value 0242a6c12b355eae904fe465c27d2ddedaa4a05e2862a934c0042f7c0cc225c2 |
解决了身份验证问题,然后就可以通过 php 的 curl 扩展获取监控工具的 META 信息了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
// 抓取 nextCloud 监控数据 function getMeta ( $scanLink, $token ) { $metaData = null; $ch = curl_init(); // 将 Token 写入 header $headers = [ 'NC-Token:'. $token ]; curl_setopt($ch, CURLOPT_URL, $scanLink); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 获取 html 内容 $metaHTML = curl_exec($ch); curl_close($ch); $dom = new DOMDocument(); libxml_use_internal_errors(true); $dom->loadHTML($metaHTML); // 以数组形式返回所需数据 $metaData = array ( $dom->getElementsByTagName( 'num_users' )->item(0)->nodeValue, $dom->getElementsByTagName( 'num_files' )->item(0)->nodeValue, $dom->getElementsByTagName( 'freespace' )->item(0)->nodeValue, $dom->getElementsByTagName( 'last5minutes' )->item(0)->nodeValue, $dom->getElementsByTagName( 'last1hour' )->item(0)->nodeValue, $dom->getElementsByTagName( 'last24hours' )->item(0)->nodeValue, ); return metaData; } // 获取 nextCloud 监控数据 getMETA( 'https://domain.com/ocs/v2.php/apps/serverinfo/api/v1/info', '0242a6c12b355eae904fe465c27d2ddedaa4a05e2862a934c0042f7c0cc225c2' ); |
上述函数重点是在 curl 请求时使用 CURLOPT_HTTPHEADER 传递 Token 以通过 nextCloud 的身份认证,否则获取到内容是 401 错误。
第一步的例子是将 Token 写入 nextCloud 数据库,如果不想进行数据库读写可以使用以下命令将 Token 写入 config.php 中,可以达到同样效果,以后要修改 Token 也更加方便。
1 2 |
# 指定到 serverinfo [root@localhost ~]# sudo php /www/domain.com/occ config:system:set serverinfo token --value 0242a6c12b355eae904fe465c27d2ddedaa4a05e2862a934c0042f7c0cc225c2 |