"""satnogs-setup module"""
import os
import subprocess
import sys
from pathlib import Path
from satnogsconfig import settings
def get_package_version(package_name):
"""Get installed version of the given package
:return: Version of the given package
:rtype: str
"""
try:
result = subprocess.run(
f"dpkg-query --show -f='${{Version}}' {package_name}",
shell=True,
stdout=subprocess.PIPE,
check=True
)
except subprocess.CalledProcessError:
return 'unknown'
return result.stdout.decode('utf-8').strip() or 'unknown'
[docs]class SatnogsSetup():
"""Interract with satnogs-setup"""
def __init__(self):
"""Class constructor"""
self._satnogs_stamp_dir = settings.SATNOGS_SETUP_STAMP_DIR
self._satnogs_upgrade_script = settings.SATNOGS_SETUP_UPGRADE_SCRIPT
[docs] @staticmethod
def restart(boot=False):
"""Restart satnogs-setup script
:param boot: Whether to bootstrap or not
:type boot: bool, optional
"""
if boot:
os.execlp('satnogs-setup', 'satnogs-setup', '-b')
else:
os.execlp('satnogs-setup', 'satnogs-setup')
@property
def is_applied(self):
"""Check whether configuration has been applied
:return: Whether configuration has been applied
:rtype: bool
"""
install_stamp_path = Path(self._satnogs_stamp_dir).joinpath(
settings.SATNOGS_SETUP_INSTALL_STAMP
)
if install_stamp_path.exists():
with install_stamp_path.open(mode='r', encoding='utf-8') as file:
if file.read():
return False
return True
return False
@is_applied.setter
def is_applied(self, install):
"""Mark that configuration has been applied
:param install: Configuration has been installed
:type install: bool
"""
install_stamp_path = Path(self._satnogs_stamp_dir).joinpath(
settings.SATNOGS_SETUP_INSTALL_STAMP
)
if install:
with install_stamp_path.open(mode='w', encoding='utf-8'):
pass
else:
try:
install_stamp_path.unlink()
except FileNotFoundError:
pass
@property
def tags(self):
"""Get satnogs-setup tags
:return: Set of tags
:rtype: set
"""
tags_path = Path(self._satnogs_stamp_dir
).joinpath(settings.SATNOGS_SETUP_INSTALL_STAMP)
if tags_path.exists():
with tags_path.open(mode='r', encoding='utf-8') as file:
if contents := file.read():
return set(contents.split(','))
return None
@tags.setter
def tags(self, tags):
"""Set satnogs-setup tags
:param tags: List of tags
:type tags: list
"""
new_tags = self.tags.copy() if self.tags else set()
new_tags.update(tags)
tags_path = Path(self._satnogs_stamp_dir
).joinpath(settings.SATNOGS_SETUP_INSTALL_STAMP)
if tags_path.exists():
with tags_path.open(mode='w', encoding='utf-8') as file:
file.write(','.join(new_tags))
[docs] def upgrade_system(self):
"""Upgrade system packages"""
try:
subprocess.run(
self._satnogs_upgrade_script, shell=True, check=True
)
except subprocess.CalledProcessError:
sys.exit(1)
@property
def satnogs_client_ansible_version(self):
"""Get installed SatNOGS Client Ansible version
:return: Version of SatNOGS Client Ansible
:rtype: str
"""
try:
result = subprocess.run(
'cd "$HOME/.satnogs/ansible"'
'&& TZ=UTC '
'git show -s --format=%cd --date="format-local:%Y%m%d%H%M"',
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True
)
except subprocess.CalledProcessError:
return 'unknown'
return result.stdout.decode('utf-8').strip() or 'unknown'
@property
def satnogs_client_version(self):
"""Get installed SatNOGS Client version
:return: Version of SatNOGS Client
:rtype: str
"""
try:
result = subprocess.run(
'/var/lib/satnogs/bin/pip show satnogs-client 2>/dev/null'
" | awk '/^Version: / { print $2 }'",
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
check=True
)
except subprocess.CalledProcessError:
return 'unknown'
return result.stdout.decode('utf-8').strip() or 'unknown'
@property
def gr_satnogs_version(self):
"""Get installed gr-satnogs version
:return: Version of gr-satnogs
:rtype: str
"""
return get_package_version('gr-satnogs')
@property
def satnogs_flowgraphs_version(self):
"""Get installed satnogs-flowgraphs version
:return: Version of satnogs-flowgraphs
:rtype: str
"""
return get_package_version('satnogs-flowgraphs')
@property
def gr_soapy_version(self):
"""Get installed gr-soapy version
:return: Version of gr-soapy
:rtype: str
"""
return get_package_version('gr-soapy')
@property
def gnuradio_version(self):
"""Get installed gnuradio version
:return: Version of gr-soapy
:rtype: str
"""
return get_package_version('gnuradio')