munin-contrib/plugins/comet/comet_server.py

177 lines
5.4 KiB
Python

import os
import time
import json
import urllib.parse
import urllib.request
from datetime import datetime, timedelta
import time
COMET_SERVER_URL = ""
COMET_ADMIN_USERNAME = ""
COMET_ADMIN_PASSWORD = ""
class CometServer(object):
def __init__(self, url = COMET_SERVER_URL, adminuser = COMET_ADMIN_USERNAME, adminpass = COMET_ADMIN_PASSWORD):
self.url = url
self.adminuser = adminuser
self.adminpass = adminpass
self.apiCache = dict()
def _get_response(self, endpoint, extraparams):
apiRequest = urllib.request.Request(
url = self.url + endpoint,
data = urllib.parse.urlencode({
"Username": self.adminuser,
"AuthType": "Password",
"Password": self.adminpass,
**extraparams
}).encode('utf-8')
)
return urllib.request.urlopen(apiRequest)
def _request(self, endpoint, extraparams):
"""Make API request to Comet Server and parse response JSON"""
shouldCache = (len(extraparams) == 0)
#runs if there are no extra parameters and the endpoint is in the dict
if shouldCache and endpoint in self.apiCache:
return self.apiCache[endpoint]
ret = None
with self._get_response(endpoint, extraparams) as apiResponse:
ret = json.loads(apiResponse.read())
#runs and caches the results if there are no parameters
if shouldCache:
self.apiCache[endpoint] = ret
return ret
#---Online Devices
def countOnline(self):
#Count all online devices on the Comet Server
version = self._request("api/v1/admin/meta/version", {})["Version"]
count = 0
for device in self._request("api/v1/admin/dispatcher/list-active", {}).values():
if device["ReportedVersion"] == version:
count += 1
return count
def countOutdated(self):
#Count all online but outdated devices on the Comet Server
version = self._request("api/v1/admin/meta/version", {})["Version"]
count = 0
for device in self._request("api/v1/admin/dispatcher/list-active", {}).values():
if device["ReportedVersion"] != version:
count += 1
return count
def countOffline(self):
#Count all offline devices on the Comet Server
count = 0
for user in self._request("api/v1/admin/list-users-full", {}).values():
count += len(user["Devices"])
for device in self._request("api/v1/admin/dispatcher/list-active", {}).values():
count -= 1
return count
#---Server History
def countUsers(self):
#Count all usernames on the Comet Server
return len(self._request("api/v1/admin/list-users", {}))
def countBuckets(self):
#Count all buckets on the Comet Server
return len(self._request("api/v1/admin/storage/list-buckets", {}))
def countDevices(self):
#Count all devices on the Comet Server
count = 0
for user in self._request("api/v1/admin/list-users-full", {}).values():
count += len(user["Devices"])
return count
def countBoosters(self):
#Count all boosters on the Comet Server
count = 0
paidBoosters = {"engine1/exchangeedb", "engine1/mssql", "engine1/vsswriter", "engine1/hyperv", "engine1/windisk", "engine1/mongodb", "engine1/winmsofficemail"}
for user in self._request("api/v1/admin/list-users-full", {}).values():
singleCheck = set()
hasItem = set()
for source in user["Sources"].values():
#This check is for the very small chance there is no Device tied to the Protected Item
if source["OwnerDevice"] != "":
hasItem.add(source["OwnerDevice"])
if source["Engine"] in paidBoosters:
singleCheck.add(source["OwnerDevice"]+source["Engine"])
for deviceID in hasItem:
device = user['Devices'][deviceID]
if "PlatformVersion" in device and "distribution" in device["PlatformVersion"] and device["PlatformVersion"]["distribution"] == "Synology DSM":
singleCheck.add(deviceID+"Synology")
count += len(singleCheck)
return count
#---JobStatus
def getJobsStatus(self):
#Return job status from the last 24h on the Comet Server
today = int(time.time())
yesterday = int(time.time() - 86400)
statusCount = {
"Success": 0,
"Error": 0,
"Warning": 0,
"Missed": 0,
"Running": 0,
"Skipped": 0
}
for job in self._request("api/v1/admin/get-jobs-for-date-range", {"Start": yesterday, "End": today}):
if (5000 <= job["Status"] <= 5999):
statusCount["Success"] += 1
elif (6000 <= job["Status"] <= 6999):
statusCount["Running"] += 1
elif (job["Status"] == 7001):
statusCount["Warning"] += 1
elif (job["Status"] == 7004):
statusCount["Missed"] += 1
elif (job["Status"] == 7006):
statusCount["Skipped"] += 1
else:
statusCount["Error"] += 1
return statusCount
#---JobClassification
def getJobsClassification(self):
#Return job classification from the last 24h on the Comet Server
today = int(time.time())
yesterday = int(time.time() - 86400)
classificationCount = {
"Backup": 0,
"Restore": 0,
"Other": 0
}
for job in self._request("api/v1/admin/get-jobs-for-date-range", {"Start": yesterday, "End": today}):
if (job["Classification"] == 4001):
classificationCount["Backup"] += 1
elif (job["Classification"] == 4002):
classificationCount["Restore"] += 1
else:
classificationCount["Other"] += 1
return classificationCount
#---Latency
def getAPITime(self):
#Return API time to the Comet Server
start = datetime.now()
_ = self._get_response("api/v1/admin/meta/server-config/get", {})
end = datetime.now()
return (end - start).total_seconds()*1000
#---OnlineCheck
def checkOnline(self):
#Checks if the server is online
try:
response = self._get_response("api/v1/admin/meta/server-config/get", {})
return 1
except:
return 0