Newer
Older

Stéphane Diemer
committed
'''
Criticality: Normal
Checks that the streaming server (Wowza) is running correctly.

Stéphane Diemer
committed
'''
from defusedxml.ElementTree import parse
from psutil import net_connections
from packaging.version import parse as parse_version
from lxml import etree
sys.path.append(str(Path(__file__).parents[1].resolve()))
# pylint: disable=wrong-import-position
from utilities import logging as lg # noqa: E402

Stéphane Diemer
committed
LATEST_VERSION = '4.8.5'
WOWZA_TUNE_FILE = '/usr/local/WowzaStreamingEngine/conf/Tune.xml'
WOWZA_RECOMMENDED_HEAP_SIZE = 2000

Stéphane Diemer
committed
'''Run all checks and exits with corresponding exit code.'''

Stéphane Diemer
committed
print('Checking Wowza settings:')
if not check_installed():
exit(2)
# check wowza version
check_warn, check_err = check_version()
if check_err:
errors += 1
elif check_warn:
warnings += 1
# check wowza heap size
check_warn, check_err = check_heap_size()
if check_err:
errors += 1
elif check_warn:
warnings += 1
# check that wowza is running
check_warn, check_err = check_running()
if check_err:
errors += 1
elif check_warn:
warnings += 1
# check that wowza is listening
check_warn, check_err = check_listening()
if check_err:
errors += 1
elif check_warn:
warnings += 1
if errors:
exit(1)
elif warnings:
exit(3)
exit(0)
def check_installed() -> bool:

Stéphane Diemer
committed
'''Check that Wowza is installed.

Stéphane Diemer
committed
'''

Stéphane Diemer
committed
cmd = 'dpkg --get-selections "wowza*"'

Stéphane Diemer
committed
if state != 'install':
lg.info('not installed, skip test')
return False
return True
def check_version() -> tuple:

Stéphane Diemer
committed
'''Check the Wowza version installed.

Stéphane Diemer
committed
'''

Stéphane Diemer
committed
cmd = 'dpkg --get-selections "wowza*"'

Stéphane Diemer
committed
for line in out.split('\n'):
if line.split()[-1] == 'install':

Stéphane Diemer
committed
lg.error('many Wowza versions installed, keep only latest')

Stéphane Diemer
committed
version = '.'.join(re.findall(r'\d', line))

Stéphane Diemer
committed
lg.error('cannot find Wowza version')
if parse_version(version) < parse_version(LATEST_VERSION):
lg.info(

Stéphane Diemer
committed
'using outdated version: {0} < {1} (recommended)'
.format(version, LATEST_VERSION)
)
elif parse_version(version) > parse_version(LATEST_VERSION):
lg.success(

Stéphane Diemer
committed
'using newer version than the recommended: {0} > {1} (recommended)'
.format(version, LATEST_VERSION)
)

Stéphane Diemer
committed
lg.success('using the recommended version: {0}'.format(version))
return warnings, errors
def check_heap_size() -> tuple:

Stéphane Diemer
committed
'''Check the heap size configured.

Stéphane Diemer
committed
'''
# Configured wowza heap size extraction

Stéphane Diemer
committed
try:
tune_xml = etree.parse(WOWZA_TUNE_FILE)
value = tune_xml.find('Tune/HeapSize').text[0:-1]
heap_size = int(value)
except Exception as e:
lg.info(
'failed to get heap size value: {0}'
.format(e)

Stéphane Diemer
committed
if heap_size < WOWZA_RECOMMENDED_HEAP_SIZE:
lg.error(
'not using recommended heap size: {0}M < {1}M (recommended)'
.format(heap_size, WOWZA_RECOMMENDED_HEAP_SIZE)
)
errors += 1
else:
lg.success(
'using recommended heap size or above: {0}M'
.format(heap_size)
)
return warnings, errors
def check_running() -> tuple:

Stéphane Diemer
committed
'''Check that Wowza is running.

Stéphane Diemer
committed
'''

Stéphane Diemer
committed
cmd = 'systemctl status WowzaStreamingEngine'

Stéphane Diemer
committed
if 'Active: active (running)' not in out:
lg.error('service not running')

Stéphane Diemer
committed
lg.success('service running')
def check_listening() -> tuple:

Stéphane Diemer
committed
'''Check that Wowza is listening on configured port.
:return: Exit return codes
:rtype: bool

Stéphane Diemer
committed
'''
warnings = 0
errors = 0
# get port number in Wowza config

Stéphane Diemer
committed
conf = parse('/usr/local/WowzaStreamingEngine/conf/VHost.xml').getroot()
port = conf.findall('VHost/HostPortList/HostPort/Port')[0].text
# get listening ports
listening = set(

Stéphane Diemer
committed
c.laddr[1] for c in net_connections(kind='inet') if c.status == 'LISTEN'
)
# check that system is listening on this port
if int(port) not in listening:

Stéphane Diemer
committed
lg.error('not listening on port {}'.format(port))
errors += 1
else:

Stéphane Diemer
committed
lg.success('listening on port {}'.format(port))
return warnings, errors

Stéphane Diemer
committed
if __name__ == '__main__':