mirror of
https://github.com/spalencsar/bearhub.git
synced 2026-07-09 08:44:15 +02:00
fix suggestions error | improving warnings presentation | snapd health check when snapd.service is available
This commit is contained in:
10
CHANGELOG.md
10
CHANGELOG.md
@@ -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
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
@@ -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:
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user