mirror of
https://codeberg.org/langfingaz/bbb-status
synced 2024-11-21 20:23:17 +01:00
retry get request; use "logging"
This commit is contained in:
parent
81f1042bf8
commit
04c29d21e5
@ -3,8 +3,9 @@
|
|||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Python 3.8 (xfconf-backup)" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.7 (venv37)" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PackageRequirementsSettings">
|
<component name="PackageRequirementsSettings">
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.8 (xfconf-backup)" project-jdk-type="Python SDK" />
|
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.7 (venv37)" project-jdk-type="Python SDK" />
|
||||||
</project>
|
</project>
|
@ -2,7 +2,7 @@ version: '3.7'
|
|||||||
services:
|
services:
|
||||||
bbb-status:
|
bbb-status:
|
||||||
build: .
|
build: .
|
||||||
command: ["log"] # see main.py for available commandline arguments
|
command: ["log-verbose"] # see main.py for available commandline arguments
|
||||||
environment:
|
environment:
|
||||||
- PYTHONPATH=/usr/src/ # pythonpath is required to import from self created modules ("from langfingaz ...")
|
- PYTHONPATH=/usr/src/ # pythonpath is required to import from self created modules ("from langfingaz ...")
|
||||||
- PYTHONUNBUFFERED=1
|
- PYTHONUNBUFFERED=1
|
||||||
|
@ -1,17 +1,27 @@
|
|||||||
import hashlib
|
import hashlib
|
||||||
|
import logging
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
from requests.adapters import HTTPAdapter
|
||||||
|
import requests.packages.urllib3.exceptions
|
||||||
|
from requests.packages.urllib3.util.retry import Retry
|
||||||
|
|
||||||
from xml.etree import ElementTree
|
from xml.etree import ElementTree
|
||||||
|
|
||||||
import langfingaz.util.fileUtil as fileUtil
|
import langfingaz.util.fileUtil as fileUtil
|
||||||
import langfingaz.util.util as util
|
|
||||||
|
|
||||||
|
|
||||||
def requestMeetingData() -> str:
|
def requestMeetingData(maxRetry=0, gracePeriod: int = 1) -> str:
|
||||||
|
"""
|
||||||
|
:arg maxRetry: maximum connection retries; if maxRetry=None, then unlimited retires
|
||||||
|
:arg gracePeriod: seconds to wait before retry
|
||||||
|
:return: XML file containing data about currently active BBB meetings
|
||||||
|
See also: https://docs.bigbluebutton.org/dev/api.html#monitoring
|
||||||
|
as well as: https://docs.bigbluebutton.org/dev/api.html#getmeetings
|
||||||
|
"""
|
||||||
|
|
||||||
requestUrl = getRequestUrl()
|
requestUrl = getRequestUrl()
|
||||||
util.debug("starting request for " + requestUrl)
|
response: requests.Response = doGetRequest(requestUrl)
|
||||||
response = requests.get(requestUrl)
|
|
||||||
if not response.ok:
|
|
||||||
raise ValueError("error during request, got status code {}".format(response.status_code))
|
|
||||||
|
|
||||||
tree = ElementTree.fromstring(response.content)
|
tree = ElementTree.fromstring(response.content)
|
||||||
if tree.find('returncode').text != 'SUCCESS':
|
if tree.find('returncode').text != 'SUCCESS':
|
||||||
@ -20,6 +30,37 @@ def requestMeetingData() -> str:
|
|||||||
return str(response.content, encoding=response.encoding)
|
return str(response.content, encoding=response.encoding)
|
||||||
|
|
||||||
|
|
||||||
|
def doGetRequest(requestUrl: str, maxRetries=6) -> requests.Response:
|
||||||
|
"""
|
||||||
|
Performs a HTTPS GET request for the given url and does at most maxRetries retries
|
||||||
|
on connection errors.
|
||||||
|
|
||||||
|
:raises requests.exceptions.HTTPError: If status code not 200 (will retry if 502, 503, 504)
|
||||||
|
:raises requests.packages.urllib3.exceptions.MaxRetryError:
|
||||||
|
"""
|
||||||
|
|
||||||
|
logLevel = logging.root.level # https://stackoverflow.com/a/53951759/6334421
|
||||||
|
logging.basicConfig(level=logging.DEBUG)
|
||||||
|
|
||||||
|
# https://stackoverflow.com/a/35636367/6334421
|
||||||
|
# Retry on basic connectivity issues (including DNS lookup failures),
|
||||||
|
# and HTTP status codes of 502, 503 and 504
|
||||||
|
# Grace period increases after each retry.
|
||||||
|
# See also:
|
||||||
|
# - Session: https://requests.readthedocs.io/en/master/user/advanced/
|
||||||
|
s: requests.sessions.Session = requests.Session()
|
||||||
|
retries: Retry = Retry(total=maxRetries, backoff_factor=5, status_forcelist=[502, 503, 504])
|
||||||
|
s.mount('https://', HTTPAdapter(max_retries=retries))
|
||||||
|
|
||||||
|
response: requests.Response = s.get(requestUrl)
|
||||||
|
logging.basicConfig(level=logLevel)
|
||||||
|
|
||||||
|
# raise exception if status conde NOT 200
|
||||||
|
response.raise_for_status()
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
|
||||||
def getRequestUrl(api_method: str = 'getMeetings', query_string: str = '') -> str:
|
def getRequestUrl(api_method: str = 'getMeetings', query_string: str = '') -> str:
|
||||||
url = getUrl()
|
url = getUrl()
|
||||||
api_url = url + "api/"
|
api_url = url + "api/"
|
||||||
@ -48,4 +89,3 @@ def getSecret() -> str:
|
|||||||
if len(secret) <= min_length:
|
if len(secret) <= min_length:
|
||||||
raise ValueError("secret should be longer than {} characters!".format(min_length))
|
raise ValueError("secret should be longer than {} characters!".format(min_length))
|
||||||
return secret
|
return secret
|
||||||
|
|
||||||
|
@ -14,9 +14,7 @@ def sleepFiveMin(verbose=False):
|
|||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
print(">> Sleeping for five minutes <<")
|
print(">> Sleeping for five minutes <<")
|
||||||
|
util.sleep(fiveMinutes)
|
||||||
sys.stdout.flush()
|
|
||||||
time.sleep(fiveMinutes)
|
|
||||||
|
|
||||||
|
|
||||||
def v2(folder: Path = saveData.getDefaultFolder()):
|
def v2(folder: Path = saveData.getDefaultFolder()):
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
from sys import argv
|
from sys import argv
|
||||||
|
import logging
|
||||||
|
|
||||||
from langfingaz import plotMeetings
|
from langfingaz import plotMeetings
|
||||||
from langfingaz import logMeetingData
|
from langfingaz import logMeetingData
|
||||||
from langfingaz.util import util
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
print("=== bbb-status ===")
|
print("=== bbb-status ===")
|
||||||
util.debug(str(argv))
|
logging.debug(str(argv))
|
||||||
print()
|
print()
|
||||||
|
|
||||||
usageStr = 'Usage:\n' + argv[0] + ' [log|log-verbose|plot]\n' + \
|
usageStr = 'Usage:\n' + argv[0] + ' [log|log-verbose|plot]\n' + \
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
BBB_STATUS_DEBUG = True
|
import time
|
||||||
|
|
||||||
|
|
||||||
def debug(message: str):
|
def sleep(seconds: float):
|
||||||
if BBB_STATUS_DEBUG:
|
print(flush=True) # print newline -> so that all characters of current line get flushed as well
|
||||||
print(">> " + message)
|
time.sleep(seconds)
|
||||||
|
|
||||||
|
|
||||||
def indentMultilineStr(s: str, indentWith='\t'):
|
def indentMultilineStr(s: str, indentWith='\t'):
|
||||||
|
Loading…
Reference in New Issue
Block a user