#!/usr/bin/python3

#
# checkbbb.py
# Frank Schiebel frank@linuxmuster.net
# GPL v3
# modified to bbbsession checkmk agent plugin
# Stefan Botter obs@botter.cc
#

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

def getApiChecksum():
    # get API Scret and strip newline
    stream = os.popen('bbb-conf --secret | grep Secret: | awk -F":" \'{print $2}\' | sed -e "s/\s*//g" | sed -e "s/\\n//g"')
    sharedsecret = stream.read().rstrip()
    # assemble querystring + apisecret
    qstringwithsecret = "getMeetings" + sharedsecret
    # return SHA1 hash as API checksum
    return hashlib.sha1(qstringwithsecret.encode('utf-8')).hexdigest()

def getMeetingData(checksum):
    fqdn = socket.getfqdn()
    fullQueryUri = "https://"+fqdn+"/bigbluebutton/api/getMeetings?checksum="+checksum
    result = requests.get(fullQueryUri)
    return(result.status_code, result.text)

(status, xml) = getMeetingData(getApiChecksum())

checkName = "<<<bbbsessions>>>"
nagiosState = 3
numMeetings  = 0
numAttendeesTotal = 0
numAttendeesMax = 0
numWithVideoTotal = 0
numWithVideoMax = 0
numWithVoiceTotal = 0
numWithVoiceMax = 0
numListenersTotal  = 0
numListenersMax  = 0

if status != 200:
    sys.exit(nagiosState)

meetingdata = parseString(xml)

returncode=meetingdata.getElementsByTagName("returncode")[0]
returncode=returncode.firstChild.wholeText

if returncode != "SUCCESS":
    sys.exit(nagiosState)

# get numbers from active meetings
meetings=meetingdata.getElementsByTagName("meeting")
for m in meetings:
    numMeetings += 1

    p = m.getElementsByTagName("participantCount")[0]
    numAttendees = int(p.firstChild.wholeText) 
    numAttendeesTotal += numAttendees 
    numAttendeesMax = max([numAttendeesMax, numAttendees])

    p = m.getElementsByTagName("listenerCount")[0]
    numListeners = int(p.firstChild.wholeText) 
    numListenersTotal += numListeners
    numListenersMax = max([numListenersMax, numListeners])

    p = m.getElementsByTagName("voiceParticipantCount")[0]
    numWithVoice = int(p.firstChild.wholeText) 
    numWithVoiceTotal += numWithVoice
    numWithVoiceMax = max([numWithVoiceMax, numWithVoice]) 

    p = m.getElementsByTagName("videoCount")[0]
    numWithVideo = int(p.firstChild.wholeText) 
    numWithVideoTotal += numWithVideo 
    numWithVideoMax = max([numWithVideoMax, numWithVideo])


print(checkName)
checkstring = "MeetingsTotal " + str(numMeetings) 
print(checkstring)
checkstring = "Attendees " + str(numAttendeesTotal) 
print(checkstring)
checkstring = "MaxAttendees " + str(numAttendeesMax) 
print(checkstring)
checkstring = "Videos " + str(numWithVideoTotal) 
print(checkstring)
checkstring = "MaxVideos " + str(numWithVideoMax) 
print(checkstring)
checkstring = "Voice " + str(numWithVoiceTotal)
print(checkstring)
checkstring = "MaxVoice " + str(numWithVoiceMax)
print(checkstring)
checkstring = "Listeners " + str(numListenersTotal)
print(checkstring)
checkstring = "MaxListeners " + str(numListenersMax)
print(checkstring)

sys.exit(0)


