177 lines
5.4 KiB
Python
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 |