mirror of
https://github.com/munin-monitoring/contrib.git
synced 2025-07-22 14:16:00 +00:00
Added Comet Backup plugin
This commit is contained in:
parent
eb9d7fa2a1
commit
836ec47f1f
10 changed files with 448 additions and 0 deletions
177
plugins/comet/comet_server.py
Normal file
177
plugins/comet/comet_server.py
Normal file
|
@ -0,0 +1,177 @@
|
|||
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
|
Loading…
Add table
Add a link
Reference in a new issue