#!/usr/bin/python3

# This plugin is based on:
# checkbbb.py
# Frank Schiebel frank@linuxmuster.net
# GPL v3
#
# Adapted by the folks at Hochschule Hannover :-)

import os
import sys
import socket
import re
import hashlib
import requests
from collections import defaultdict
from xml.dom.minidom import parse, parseString

def getStatus():
    stream = os.popen('/usr/bin/docker exec  scalelite-api  ./bin/rake status')
    stream = stream.read()
    allservers = []
    for line in stream.splitlines():
        fields = re.split(r'\s',line)
        fields = list(filter(None, fields))
        numfields = len(fields)

        if numfields == 8:
            hrfields = {}
            fields[0] = re.split(r'\.',fields[0])[0]
            hrfields["hostname"] = fields[0]
            hrfields["state"] = fields[1]
            hrfields["status"] = fields[2]
            hrfields["meetings"] = fields[3]
            hrfields["users"] = fields[4]
            hrfields["largestmeeting"] = fields[5]
            hrfields["videos"] = fields[6]
            hrfields["load"] = fields[7]
            allservers.append(hrfields)
            
    return allservers

def generateCheckLine(bbb):
    global totalMeetings
    global totalAttendees
    global totalVideousers
    global totalLoad
    global avgVideoPerMeeting
    checkstate = 0 
    statusline = ""

    if bbb["state"] == "enabled" and bbb["status"] == "online":
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=" + bbb["meetings"] + "|"
        statusline += "numAttendees=" + bbb["users"] + "|"
        statusline += "numWithVideo=" + bbb["videos"] + "|"
        statusline += "numLoad=" + bbb["load"] + " "
        statusline += "[" + bbb["hostname"] + " M:" + bbb["meetings"] + " "
        statusline += "Att:" + bbb["users"] + " "
        statusline += "Vid:" + bbb["videos"] + " "
        statusline += "Load:" + bbb["load"] + "]"
    
    if bbb["state"] == "cordoned" and bbb["status"] == "online":
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=" + bbb["meetings"] + "|"
        statusline += "numAttendees=" + bbb["users"] + "|"
        statusline += "numWithVideo=" + bbb["videos"] + "|"
        statusline += "numLoad=" + bbb["load"] + " "
        statusline += "****CORDONED IN SCALELITE**** [" + bbb["hostname"] + " M:" + bbb["meetings"] + " "
        statusline += "Att:" + bbb["users"] + " "
        statusline += "Vid:" + bbb["videos"] + " "
        statusline += "Load:" + bbb["load"] + "]"

    if bbb["state"] == "disabled" and bbb["status"] == "online":
        checkstate = 1
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=" + bbb["meetings"] + "|"
        statusline += "numAttendees=" + bbb["users"] + "|"
        statusline += "numWithVideo=" + bbb["videos"] + "|"
        statusline += "numLoad=" + bbb["load"] + " "
        statusline += "****DISABLED IN SCALELITE**** [" + bbb["hostname"] + " M:" + bbb["meetings"] + " "
        statusline += "Att:" + bbb["users"] + " "
        statusline += "Vid:" + bbb["videos"] + " "
        statusline += "Load:" + bbb["load"] + "]"
    
    if bbb["state"] == "enabled" and bbb["status"] == "offline":
        checkstate = 2
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=0|"
        statusline += "numAttendees=0|"
        statusline += "numWithVideo=0|"
        statusline += "numLoad=0 "
        statusline += "****ENABLED BUT OFFLINE****" 
    
    if bbb["state"] == "cordoned" and bbb["status"] == "offline":
        checkstate = 2
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=0|"
        statusline += "numAttendees=0|"
        statusline += "numWithVideo=0|"
        statusline += "numLoad=0 "
        statusline += "****CORDONED IN SCALELITE AND OFFLINE****"

    if bbb["state"] == "disabled" and bbb["status"] == "offline":
        checkstate = 1
        statusline  = str(checkstate) + " " + "BBB_" + bbb["hostname"] + " "
        statusline += "numMeetings=0|"
        statusline += "numAttendees=0|"
        statusline += "numWithVideo=0|"
        statusline += "numLoad=0 "
        statusline += "****DISABLED IN SCALELITE AND OFFLINE****"

    totalMeetings += int(bbb["meetings"])
    totalAttendees += int(bbb["users"])
    totalVideousers += int(bbb["videos"])
    totalLoad += float(bbb["load"])

    return statusline



# Global metrics
totalMeetings = 0
totalAttendees = 0
totalVideousers = 0
totalLoad = 0.0
allservers = getStatus()

for bbb in allservers:
    print(generateCheckLine(bbb))


statusline  = "0 BBBSCL_" + socket.gethostname() + " "
statusline += "numMeetings=" + str(totalMeetings) + "|"
statusline += "numAttendees=" + str(totalAttendees) + "|"
statusline += "numWithVideo=" + str(totalVideousers) + "|"
statusline += "numTotalLoad=" + str(totalLoad) + " "
statusline += "[scalelite totals "
statusline += "M:" + str(totalMeetings) + " "
statusline += "Att:" + str(totalAttendees) + " "
statusline += "Vid:" + str(totalVideousers) + " "
statusline += "Load:" + str(totalLoad) + "]"

print(statusline)
overalltext  = "0 BBB_Overall_Attendees count="+str(totalAttendees) + ";200;500 "
overalltext += str(totalAttendees) 
print(overalltext)