visio.chapril.org-tools/statistiques/parseStats.py

160 lines
5.5 KiB
Python
Raw Normal View History

2022-12-17 11:20:59 +01:00
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
# Imports
import os
import sys
import time
import datetime
from calendar import monthrange
# Constantes
STAT_DIR = '/srv/visio.chapril.org/statistiques/'
2022-12-18 22:38:54 +01:00
STATS_TOT_FIELDS = ['total_conferences_created','total_failed_conferences','total_conferences_completed','total_conference_seconds','total_bytes_received','total_bytes_sent','total_participants','conferences','videochannels','endpoints_sending_audio',]
STATS_FR_TOT_FIELDS = ['conferences creees total','conferences totalement echouees','conferences terminees total','duree totale conferences','total octets reçus','total octets envoyés','total participants','nombre de conferences','canaux video','clients en audio',]
2022-12-17 11:20:59 +01:00
STATS_AVG_FIELDS = ['largest_conference',]
STATS_FR_AVG_FIELDS = ['plus grande conference',]
# Classes
class Stats:
def __init__(self,year,mois):
self.year = year
self.mois = mois
self.files = os.listdir(STAT_DIR)
self.startDate = self.EndDate = None
self.consolided = {}
self.consolided_datas = {}
self.__initBounds()
def __initBounds(self):
self.__setStartDate(f'{self.year}-{self.mois}-01 00:00:00')
maxDays = monthrange(self.year,self.mois)[1]
self.__setEndDate(f'{self.year}-{self.mois}-{maxDays} 23:59:59')
def __setStartDate(self,thisDate):
self.startDate = self.__date2timestamp(thisDate)
def getStartDate(self):
if self.startDate is not None:
return self.startDate
else:
return 'undefiined'
def getEndDate(self):
if self.endDate is not None:
return self.endDate
else:
return 'undefiined'
def __setEndDate(self,thisDate):
self.endDate = self.__date2timestamp(thisDate)
def __date2timestamp(self,thisDate):
timestamp = time.mktime(time.strptime(thisDate, '%Y-%m-%d %H:%M:%S'))
return int(timestamp)
2022-12-18 22:38:54 +01:00
def __conv(self,octets,dataType='b'):
if dataType == 'b':
unit = 'octets'
if int(octets) > 1024:
octets = int(octets) / 1024
unit = 'ko'
if int(octets) > 1024:
octets = int(octets) / 1024
unit = 'Mo'
if int(octets) > 1024:
octets = int(octets) / 1024
unit = 'Go'
elif dataType == 't':
unit = 's'
if int(octets) > 60:
unit = 'min'
octets = octets / 60
if int(octets) > 60:
unit = 'h'
octets = octets / 60
octets = int(octets * 10) / 10
return octets,unit
2022-12-17 11:20:59 +01:00
def parse(self):
if len(self.files) <= 0:
return None
for f in self.files:
ts = int(f.split('.')[0].split('_')[3])
if ts >= self.startDate and ts <= self.endDate:
with open(f"{STAT_DIR}/{f}") as fh:
datas = fh.readlines()
for line in datas:
if line.split(';')[0].lower() in STATS_TOT_FIELDS:
key = line.split(';')[0].lower()
value = int(line.split(';')[1])
if key in self.consolided_datas:
datas = self.consolided_datas[key]
if datas[0] <= 0:
self.consolided_datas[key][0] = value
else:
if value > datas[1]:
self.consolided_datas[key][1] = value
else:
self.consolided_datas[key] = [value,0]
if line.split(';')[0].lower() in STATS_AVG_FIELDS:
key = line.split(';')[0].lower()
value = int(line.split(';')[1])
if key in self.consolided:
if self.consolided[key] < int(value):
self.consolided[key] = int(value)
else:
self.consolided[key] = 0
for (k,v) in self.consolided_datas.items():
self.consolided[k] = v[1] - v[0]
2022-12-18 22:38:54 +01:00
if 'byte' in k:
octets,unit = self.__conv(self.consolided[k])
self.consolided[k] = f"{octets} {unit}"
elif 'seconds' in k:
octets,unit = self.__conv(self.consolided[k],'t')
self.consolided[k] = f"{octets} {unit}"
2022-12-17 11:20:59 +01:00
return self.consolided
# Fonctions
# Principal
def runMain():
if len(sys.argv) <= 1:
print('Argument manquant: mois')
sys.exit(1)
try:
mois = int(sys.argv[1])
except ValueError:
print('Le mois doit etre un nombre compris entre 1 et 12 !')
sys.exit(1)
if mois < 1 or mois > 12:
print('Le mois doit etre un nombre compris entre 1 et 12 !')
sys.exit(1)
currentDate = datetime.date.today()
if len(sys.argv) >= 3:
year = int(sys.argv[2])
else:
year = currentDate.year
stats = Stats(year,mois)
res = stats.parse()
for (k,v) in res.items():
if k in STATS_TOT_FIELDS:
chaine = STATS_FR_TOT_FIELDS[STATS_TOT_FIELDS.index(k)]
elif k in STATS_AVG_FIELDS:
chaine = STATS_FR_AVG_FIELDS[STATS_AVG_FIELDS.index(k)]
print(f"{chaine} : {v}")
if __name__ == '__main__':
runMain()
# Fin du programme