feat(playout): use liquidsoap version functions

- remove "packaging" package
This commit is contained in:
jo 2022-07-16 23:22:55 +02:00 committed by Kyle Robbertze
parent 58ad40f997
commit 2bc7d64cc4
9 changed files with 83 additions and 54 deletions

View file

@ -1,7 +1,6 @@
""" Runs Airtime liquidsoap
"""
import os
import subprocess
from pathlib import Path
from typing import Optional
@ -12,6 +11,7 @@ from libretime_shared.logging import level_from_name, setup_logger
from loguru import logger
from .entrypoint import generate_entrypoint
from .version import get_liquidsoap_version
@click.command(context_settings={"auto_envvar_prefix": DEFAULT_ENV_PREFIX})
@ -25,14 +25,10 @@ def cli(log_level: int, log_filepath: Optional[Path]):
generate_entrypoint(log_filepath)
# check liquidsoap version so we can run a scripts matching the liquidsoap minor version
liquidsoap_version = subprocess.check_output(
"liquidsoap 'print(liquidsoap.version) shutdown()'",
shell=True,
universal_newlines=True,
)[0:3]
version = get_liquidsoap_version()
script_path = os.path.join(
os.path.dirname(__file__), liquidsoap_version, "ls_script.liq"
os.path.dirname(__file__), f"{version[0]}.{version[1]}", "ls_script.liq"
)
exec_args = [
"/usr/bin/liquidsoap",
@ -43,5 +39,5 @@ def cli(log_level: int, log_filepath: Optional[Path]):
if log_level.is_debug():
exec_args.append("--debug")
logger.debug(f"Liquidsoap {liquidsoap_version} using script: {script_path}")
logger.debug(f"Liquidsoap {version} using script: {script_path}")
os.execl(*exec_args)

View file

@ -0,0 +1,26 @@
import re
from subprocess import PIPE, run
from typing import Tuple
LIQUIDSOAP_VERSION_RE = re.compile(r"(?:Liquidsoap )?(\d+).(\d+).(\d+)")
LIQUIDSOAP_MIN_VERSION = (1, 1, 1)
def parse_liquidsoap_version(version: str) -> Tuple[int, int, int]:
match = LIQUIDSOAP_VERSION_RE.search(version)
if match is None:
return (0, 0, 0)
return (int(match.group(1)), int(match.group(2)), int(match.group(3)))
def get_liquidsoap_version() -> Tuple[int, int, int]:
cmd = run(
("liquidsoap", "--check", "print(liquidsoap.version) shutdown()"),
check=True,
stdout=PIPE,
stderr=PIPE,
universal_newlines=True,
)
return parse_liquidsoap_version(cmd.stdout)

View file

@ -2,7 +2,6 @@
Python part of radio playout (pypo)
"""
import re
import signal
import sys
import telnetlib
@ -11,7 +10,7 @@ from datetime import datetime
from pathlib import Path
from queue import Queue
from threading import Lock
from typing import Optional
from typing import Optional, Tuple
import click
from libretime_api_client.version1 import AirtimeApiClient as ApiClient
@ -20,8 +19,8 @@ from libretime_shared.config import DEFAULT_ENV_PREFIX
from libretime_shared.logging import level_from_name, setup_logger
from loguru import logger
from . import pure
from .config import CACHE_DIR, RECORD_DIR, Config
from .liquidsoap.version import LIQUIDSOAP_MIN_VERSION, parse_liquidsoap_version
from .listenerstat import ListenerStat
from .pypofetch import PypoFetch
from .pypofile import PypoFile
@ -31,8 +30,6 @@ from .pypopush import PypoPush
from .recorder import Recorder
from .timeout import ls_timeout
LIQUIDSOAP_MIN_VERSION = "1.1.1"
class Global:
def __init__(self, api_client):
@ -51,7 +48,7 @@ def keyboardInterruptHandler(signum, frame):
@ls_timeout
def liquidsoap_get_info(telnet_lock, host, port):
def liquidsoap_get_info(telnet_lock, host, port) -> Optional[Tuple[int, int, int]]:
logger.debug("Checking to see if Liquidsoap is running")
try:
telnet_lock.acquire()
@ -66,50 +63,38 @@ def liquidsoap_get_info(telnet_lock, host, port):
finally:
telnet_lock.release()
return get_liquidsoap_version(response)
def get_liquidsoap_version(version_string):
m = re.match(r"Liquidsoap (\d+.\d+.\d+)", version_string)
if m:
return m.group(1)
else:
return None
return parse_liquidsoap_version(response)
def liquidsoap_startup_test(telnet_lock, liquidsoap_host, liquidsoap_port):
liquidsoap_version_string = liquidsoap_get_info(
liquidsoap_version = liquidsoap_get_info(
telnet_lock,
liquidsoap_host,
liquidsoap_port,
)
while not liquidsoap_version_string:
logger.warning(
"Liquidsoap doesn't appear to be running!, " + "Sleeping and trying again"
)
while not liquidsoap_version:
logger.warning("Liquidsoap doesn't appear to be running! Trying again later...")
time.sleep(1)
liquidsoap_version_string = liquidsoap_get_info(
liquidsoap_version = liquidsoap_get_info(
telnet_lock,
liquidsoap_host,
liquidsoap_port,
)
while pure.version_cmp(liquidsoap_version_string, LIQUIDSOAP_MIN_VERSION) < 0:
while not LIQUIDSOAP_MIN_VERSION <= liquidsoap_version:
logger.warning(
"Liquidsoap is running but in incorrect version! "
+ "Make sure you have at least Liquidsoap %s installed"
% LIQUIDSOAP_MIN_VERSION
f"Found invalid Liquidsoap version! "
f"Liquidsoap<={LIQUIDSOAP_MIN_VERSION} is required!"
)
time.sleep(1)
liquidsoap_version_string = liquidsoap_get_info(
time.sleep(5)
liquidsoap_version = liquidsoap_get_info(
telnet_lock,
liquidsoap_host,
liquidsoap_port,
)
logger.info("Liquidsoap version string found %s" % liquidsoap_version_string)
logger.info(f"Liquidsoap version {liquidsoap_version}")
@click.command(context_settings={"auto_envvar_prefix": DEFAULT_ENV_PREFIX})

View file

@ -1,16 +1,3 @@
from packaging.version import parse
def version_cmp(version1, version2):
version1 = parse(version1)
version2 = parse(version2)
if version1 > version2:
return 1
if version1 == version2:
return 0
return -1
def date_interval_to_seconds(interval):
"""
Convert timedelta object into int representing the number of seconds. If

View file

@ -16,7 +16,6 @@ from libretime_api_client import version1 as v1_api_client
from libretime_api_client import version2 as api_client
from loguru import logger
from . import pure
from .config import CACHE_DIR, POLL_INTERVAL, Config
from .schedule import get_schedule
from .timeout import ls_timeout