#
# @copyright Copyright (c) 2025, Pietro Marini (pmarini@rcasys.com)
#
# @license GNU AGPL version 3 or any later version
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
import subprocess
import pandas as pd
import io
import json
cmd = "sudo -u www-data /usr/bin/php /var/www/nextcloud/occ groupfolders:list --output json".split()
try:
teamfolders_output = subprocess.check_output(cmd)
except:
print("It seems that the app groupfolders is not installed")
results = {
"teamfolder_nr": 0,
"teamfolder_total_quota_gb": 0,
"teamfolder_nr_files_trash": 0,
"teamfolder_nr_files_versions": 0,
"teamfolder_nr_files": 0,
"teamfolder_total_trash_size_gb": 0,
"teamfolder_total_size_gb": 0,
"teamfolder_total_versions_size_gb": 0,
}
else:
teamfolders = json.loads(teamfolders_output.decode())
gb_conversion_factor = 1./(1024.*1024.*1024.)
cmd = "sudo -u www-data /usr/bin/php /var/www/nextcloud/occ config:system:get datadirectory".split()
datadir = subprocess.check_output(cmd).strip(b"\n").decode()
####################
# Metrics
####################
# Number of team folders
teamfolder_nr = len(teamfolders)
# Total quota assigned to team folders
teamfolders_quota = [teamfolder['quota'] for teamfolder in teamfolders]
teamfolder_total_quota_gb = sum(teamfolders_quota)*gb_conversion_factor
# Number of files and folders in team folders (excluding versions and trash)
cmd = "find /{datadir}/__groupfolders/ -not -path */versions/* -not -path */trash/*".format(datadir=datadir).split()
teamfolder_nr_files_find = subprocess.Popen(cmd,
stdout=subprocess.PIPE)
teamfolder_nr_files = subprocess.check_output(('wc', '-l'),
stdin=teamfolder_nr_files_find.stdout)
teamfolder_nr_files_find.wait()
teamfolder_nr_files = int(teamfolder_nr_files.decode().strip())
# Number of files in team folders versions
cmd = 'find /{datadir}/__groupfolders/versions/'.format(datadir=datadir).split()
teamfolder_nr_files_versions_find = subprocess.Popen(cmd, stdout=subprocess.PIPE)
teamfolder_nr_files_versions = subprocess.check_output(('wc', '-l'),
stdin=teamfolder_nr_files_versions_find.stdout)
teamfolder_nr_files_versions_find.wait()
teamfolder_nr_files_versions = int(teamfolder_nr_files_versions.decode().strip())-teamfolder_nr-1
# Number of files in team folders trash
cmd = 'find /ncdata/__groupfolders/trash/'.split()
teamfolder_nr_files_trash_find = subprocess.Popen(cmd, stdout=subprocess.PIPE)
teamfolder_nr_files_trash = subprocess.check_output(('wc', '-l'),
stdin=teamfolder_nr_files_trash_find.stdout)
teamfolder_nr_files_trash_find.wait()
teamfolder_nr_files_trash = int(teamfolder_nr_files_trash.decode().strip())-teamfolder_nr-1
# Storage used by team folders (excluding versions and trash)
cmd = "du -b -d1 {datadir}/__groupfolders/".format(datadir=datadir).split()
teamfolder_total_size_output = subprocess.check_output(cmd)
df_teamfolder_total_size = pd.read_table(io.StringIO(teamfolder_total_size_output.decode()),names=["folder_size", "folder"])
df_teamfolder_total_size["folder"] = df_teamfolder_total_size.folder.str.removeprefix("{datadir}/__groupfolders/".format(datadir=datadir))
df_teamfolder_total_size["folder_size_gb"] = df_teamfolder_total_size["folder_size"]*gb_conversion_factor
# Storage used by team folders (excluding versions and trash)
teamfolder_total_size_gb = float(df_teamfolder_total_size.query("folder not in ('trash', 'versions') and folder != ''").folder_size_gb.sum())
# Storage used by team folders versions
teamfolder_total_versions_size_gb = float(df_teamfolder_total_size.query("folder == 'versions'").folder_size_gb.sum())
# Storage used by team folders trash
teamfolder_total_trash_size_gb = float(df_teamfolder_total_size.query("folder == 'trash'").folder_size_gb.sum())
results = {
"teamfolder_nr": teamfolder_nr,
"teamfolder_total_quota_gb": teamfolder_total_quota_gb,
"teamfolder_nr_files_trash": teamfolder_nr_files_trash,
"teamfolder_nr_files_versions":teamfolder_nr_files_versions,
"teamfolder_nr_files":teamfolder_nr_files,
"teamfolder_total_trash_size_gb": teamfolder_total_trash_size_gb,
"teamfolder_total_size_gb": teamfolder_total_size_gb,
"teamfolder_total_versions_size_gb": teamfolder_total_versions_size_gb,
}
json.dump(results,
open("/var/lib/zabbix/output/nc_teamfolders_metrics.json","w")
)