fix suggestions error | improving warnings presentation | snapd health check when snapd.service is available

This commit is contained in:
Vinicius Moreira
2019-09-26 12:07:50 -03:00
parent dae9befefc
commit 9aa069f4be
8 changed files with 53 additions and 25 deletions

View File

@@ -4,6 +4,14 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## [0.6.1]
### Improvements:
- Better warning presentation when there are several messages
### Fixes:
- Error when retrieving suggestions
- snapd health check when snapd.service is available
## [0.6.0] 2019-09-25 ## [0.6.0] 2019-09-25
### Features ### Features
@@ -33,7 +41,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Environment variable / parameter **BAUH_UPDATE_NOTIFICATION** renamed to **BAUH_SYSTEM_NOTIFICATIONS** and now works for any system notification - Environment variable / parameter **BAUH_UPDATE_NOTIFICATION** renamed to **BAUH_SYSTEM_NOTIFICATIONS** and now works for any system notification
- Environment variable / parameter **BAUH_DOWNLOAD_MULTITHREAD**: if source files should be downloaded using multi-threads (not supported by all **gems**). - Environment variable / parameter **BAUH_DOWNLOAD_MULTITHREAD**: if source files should be downloaded using multi-threads (not supported by all **gems**).
- Environment variables / parameter **BAUH_MAX_DISPLAYED**: controls the maximum number of displayed apps ( default to 50 ) - Environment variables / parameter **BAUH_MAX_DISPLAYED**: controls the maximum number of displayed apps ( default to 50 )
- Environment variables / parameter **BAUH_LOGS**: controls the maximum number of displayed apps ( default to 50 ) - Environment variables / parameter **BAUH_LOGS**: activates console logging.
- small UI improvements - small UI improvements
### UI Changes ### UI Changes

View File

@@ -9,6 +9,7 @@ from bauh.api.abstract.handler import ProcessWatcher
from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpdate, PackageSuggestion, \ from bauh.api.abstract.model import SoftwarePackage, PackageHistory, PackageUpdate, PackageSuggestion, \
SuggestionPriority SuggestionPriority
from bauh.commons import internet from bauh.commons import internet
from bauh.commons.html import bold
from bauh.commons.system import SystemProcess, ProcessHandler from bauh.commons.system import SystemProcess, ProcessHandler
from bauh.gems.snap import snap, suggestions from bauh.gems.snap import snap, suggestions
from bauh.gems.snap.constants import SNAP_API_URL from bauh.gems.snap.constants import SNAP_API_URL
@@ -83,7 +84,6 @@ class SnapManager(SoftwareManager):
def read_installed(self, disk_loader: DiskCacheLoader, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult: def read_installed(self, disk_loader: DiskCacheLoader, limit: int = -1, only_apps: bool = False, pkg_types: Set[Type[SoftwarePackage]] = None, internet_available: bool = None) -> SearchResult:
if snap.is_snapd_running(): if snap.is_snapd_running():
internet_available = internet.is_available(self.http_client, self.logger)
installed = [self.map_json(app_json, installed=True, disk_loader=disk_loader, internet=internet_available) for app_json in snap.read_installed()] installed = [self.map_json(app_json, installed=True, disk_loader=disk_loader, internet=internet_available) for app_json in snap.read_installed()]
return SearchResult(installed, None, len(installed)) return SearchResult(installed, None, len(installed))
else: else:
@@ -146,7 +146,9 @@ class SnapManager(SoftwareManager):
def list_warnings(self) -> List[str]: def list_warnings(self) -> List[str]:
if not snap.is_snapd_running(): if not snap.is_snapd_running():
return [self.i18n['snap.notification.snapd_unavailable']] snap_bold = bold('Snap')
return [self.i18n['snap.notification.snapd_unavailable'].format(bold('snapd'), snap_bold),
self.i18n['snap.notification.snap.disable'].format(snap_bold, bold(self.i18n['manage_window.settings.gems']))]
def _fill_suggestion(self, pkg_name: str, priority: SuggestionPriority, out: List[PackageSuggestion]): def _fill_suggestion(self, pkg_name: str, priority: SuggestionPriority, out: List[PackageSuggestion]):
res = self.http_client.get_json(SNAP_API_URL + '/search?q=package_name:{}'.format(pkg_name)) res = self.http_client.get_json(SNAP_API_URL + '/search?q=package_name:{}'.format(pkg_name))
@@ -163,24 +165,25 @@ class SnapManager(SoftwareManager):
def list_suggestions(self, limit: int) -> List[PackageSuggestion]: def list_suggestions(self, limit: int) -> List[PackageSuggestion]:
res = [] res = []
sugs = [(i, p) for i, p in suggestions.ALL.items()] if snap.is_snapd_running():
sugs.sort(key=lambda t: t[1].value, reverse=True) sugs = [(i, p) for i, p in suggestions.ALL.items()]
sugs.sort(key=lambda t: t[1].value, reverse=True)
threads = [] threads = []
for sug in sugs: for sug in sugs:
if limit <= 0 or len(res) < limit: if limit <= 0 or len(res) < limit:
t = Thread(target=self._fill_suggestion, args=(sug[0], sug[1], res)) t = Thread(target=self._fill_suggestion, args=(sug[0], sug[1], res))
t.start() t.start()
threads.append(t) threads.append(t)
time.sleep(0.001) # to avoid being blocked time.sleep(0.001) # to avoid being blocked
else: else:
break break
for t in threads: for t in threads:
t.join() t.join()
res.sort(key=lambda s: s.priority.value, reverse=True) res.sort(key=lambda s: s.priority.value, reverse=True)
return res return res
def is_default_enabled(self) -> bool: def is_default_enabled(self) -> bool:

View File

@@ -1,3 +1,4 @@
snap.notification.snapd_unavailable=snapd seems not to be installed or enabled. snap packages will not be available. snap.notification.snapd_unavailable={} seems not to be installed or enabled. {} packages will not be available.
snap.notification.snap.disable=If you do not want to use Snap applications, uncheck {} in {}
snap.action.refresh.status=Refreshing snap.action.refresh.status=Refreshing
snap.action.refresh.label=Refresh snap.action.refresh.label=Refresh

View File

@@ -7,6 +7,7 @@ snap.info.revision=revisión
snap.info.tracking=tracking snap.info.tracking=tracking
snap.info.installed=instalado snap.info.installed=instalado
snap.info.publisher=publicador snap.info.publisher=publicador
snap.notification.snapd_unavailable=snapd no parece estar instalado o habilitado. los paquetes snap estarán indisponibles. snap.notification.snapd_unavailable={} no parece estar instalado o habilitado. los paquetes {} estarán indisponibles.
snap.notification.snap.disable=Si no desea usar aplicativos Snap, desmarque {} en {}
snap.action.refresh.status=Actualizando snap.action.refresh.status=Actualizando
snap.action.refresh.label=Actualizar snap.action.refresh.label=Actualizar

View File

@@ -7,6 +7,7 @@ snap.info.revision=revisão
snap.info.tracking=tracking snap.info.tracking=tracking
snap.info.installed=instalado snap.info.installed=instalado
snap.info.publisher=publicador snap.info.publisher=publicador
snap.notification.snapd_unavailable=snapd não parece estar instalado ou habilitado. os pacotes snap estarão indisponíveis. snap.notification.snapd_unavailable={} não parece estar instalado ou habilitado. os pacotes {} estarão indisponíveis.
snap.notification.snap.disable=Se não deseja usar aplicativos Snap, desmarque {} em {}
snap.action.refresh.status=Atualizando snap.action.refresh.status=Atualizando
snap.action.refresh.label=Atualizar snap.action.refresh.label=Atualizar

View File

@@ -7,6 +7,8 @@ from bauh.commons.system import new_root_subprocess, run_cmd, new_subprocess
from bauh.gems.snap.model import SnapApplication from bauh.gems.snap.model import SnapApplication
BASE_CMD = 'snap' BASE_CMD = 'snap'
RE_SNAPD_STATUS = re.compile('\s+')
SNAPD_RUNNING_STATUS = {'listening', 'running'}
def is_installed(): def is_installed():
@@ -17,12 +19,24 @@ def is_installed():
def is_snapd_running() -> bool: def is_snapd_running() -> bool:
services = new_subprocess(['systemctl', 'list-units']) services = new_subprocess(['systemctl', 'list-units'])
for o in new_subprocess(['grep', '-oP', 'snapd.socket.+\K(listening|running)'], stdin=services.stdout).stdout: service, service_running = False, False
socket, socket_running = False, False
for o in new_subprocess(['grep', '-Eo', 'snapd.+'], stdin=services.stdout).stdout:
if o: if o:
line = o.decode().strip() line = o.decode().strip()
return bool(line)
return False if line:
line_split = RE_SNAPD_STATUS.split(line)
running = line_split[3] in SNAPD_RUNNING_STATUS
if line_split[0] == 'snapd.service':
service = True
service_running = running
elif line_split[0] == 'snapd.socket':
socket = True
socket_running = running
return socket and socket_running and (not service or (service and service_running))
def app_str_to_json(app: str) -> dict: def app_str_to_json(app: str) -> dict:

View File

@@ -389,7 +389,7 @@ class FindSuggestions(AsyncAction):
def run(self): def run(self):
sugs = self.man.list_suggestions(limit=-1) sugs = self.man.list_suggestions(limit=-1)
self.notify_finished([s.package for s in sugs] if sugs is not None else []) self.notify_finished({'pkgs_found': [s.package for s in sugs] if sugs is not None else [], 'error': None})
class ListWarnings(QThread): class ListWarnings(QThread):

View File

@@ -333,7 +333,7 @@ class ManageWindow(QWidget):
def _show_warnings(self, warnings: List[str]): def _show_warnings(self, warnings: List[str]):
if warnings: if warnings:
dialog.show_message(title=self.i18n['warning'].capitalize(), body='<p>{}</p>'.format('<br/>'.join(warnings)), type_=MessageType.WARNING) dialog.show_message(title=self.i18n['warning'].capitalize(), body='<p>{}</p>'.format('<br/><br/>'.join(warnings)), type_=MessageType.WARNING)
def show(self): def show(self):
super(ManageWindow, self).show() super(ManageWindow, self).show()