Merge branch 'dev' into 'master'

Dev

See merge request wangsong/kylin-system-updater!15
This commit is contained in:
王松 2021-10-25 03:02:24 +00:00
commit d3f26efe40
6 changed files with 133 additions and 64 deletions

View File

@ -202,6 +202,25 @@ class Sqlite3Server(object):
self.init_sqlit()
self.insert_into_updateinfo(str(i), pkgversion, pkgdescription, timestr, status, "1", errstr)
self.window_main.dbusController.update_sqlite_single(str(i), timestr)
elif mode == MODE_UPGRADE_SYSTEM: # 全盘升级
pkgs_install,pkgs_upgrade,pkgs_remove = self.refreshpkglist()
pkg_list = list(set(pkgs_upgrade).union(set(pkgs_install)))
for i in pkg_list:
try:
pkg = self.window_main.cache[i]
except Exception as e:
logging.error(_("%s could not be detected in the source because the source was changed or for other reasons."), \
str(i))
pkgversion = str(pkg.candidate.version)
pkgdescription = str(pkg.candidate.raw_description)
try:
self.insert_into_updateinfo(str(i), pkgversion, pkgdescription, timestr, status, "1", errstr)
# 数据库文件被删除或者新增字段导致需要重新初始化数据库再写入
except Exception as e:
self.init_sqlit()
self.insert_into_updateinfo(str(i), pkgversion, pkgdescription, timestr, status, "1", errstr)
self.window_main.dbusController.update_sqlite_single(str(i), timestr)
self.window_main.dbusController.update_sqlite_single(str(i), timestr)
else:
logging.warning("Cache is None.")

View File

@ -21,9 +21,7 @@ import time
from gettext import gettext as _
from SystemUpdater.backend import DownloadBackend as downb
from SystemUpdater.Core.Database import MODE_UPGRADE_SINGLE
#安装完成之后是否有请求需要重启
REBOOT_REQUIRED_FILE = "/var/run/reboot-required"
import apt_pkg
GROUPS_PKG_NAME = 'kylin-update-desktop-config'
INSTALL_ALONE_PROGRESS = "alone"
@ -62,6 +60,17 @@ class UpdateManager():
except Exception as e:
logging.error(str(e))
#download only 2.0
def start_download(self, pkgs):
try:
if self.options.no_update_source is False:
self.dbusController._on_update_important_list()
update_backend = get_backend(self, InstallBackend.ACTION_DOWNLOADONLY)
update_backend.start(partial_upgrade_list = pkgs)
except Exception as e:
logging.error(str(e))
#进行更新的操作
def start_update(self):
try:
@ -101,8 +110,7 @@ class UpdateManager():
#保持清空cache的标记
self.cache._initDepCache()
#检查安装完成之后需要重启吗
if os.path.exists(REBOOT_REQUIRED_FILE):
logging.error("REBOOT_REQUIRED_FILE")
self.is_reboot_required()
def check_group_config(self,cache):
_success = True
@ -201,7 +209,11 @@ class UpdateManager():
except SystemError as e:
pass
return _success,header,desc
def is_reboot_required(self):
"""If a reboot is required to get all changes into effect."""
return os.path.exists(os.path.join(apt_pkg.config.find_dir("Dir"),
"var/run/reboot-required"))
def _setup_dbus(self):
# check if there is another g-a-i already and if not setup one
# listening on dbus

View File

@ -206,7 +206,7 @@ class UpdateManagerDbusController(dbus.service.Object):
try_times = 1
times = try_times
while times > 0:
self.parent.download_backend(pkgs)
self.parent.start_download(pkgs)
times -= 1
return True
@ -242,10 +242,10 @@ class UpdateManagerDbusController(dbus.service.Object):
humanize_size(current_cps))
#查询解决依赖 信号
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='bbasasss')
def UpdateDependResloveStatus(self, resolver_status, remove_status,remove_pkgs,pkg_raw_description,error_string='',error_desc='',):
logging.info("emit UpdateDependResloveStatus:resolver_status = %r , resolver_status = %r , remove_pkgs = %a,pkg_raw_description = %a ,error_string = %s , error_desc = %s ",\
resolver_status,remove_status,remove_pkgs,pkg_raw_description,error_string,error_desc)
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='bbasasasss')
def UpdateDependResloveStatus(self, resolver_status, remove_status,remove_pkgs,pkg_raw_description,delete_desc,error_string='',error_desc='',):
logging.info("emit UpdateDependResloveStatus:resolver_status = %r , resolver_status = %r , remove_pkgs = %a,pkg_raw_description = %a ,delete_desc = %a,error_string = %s , error_desc = %s ",\
resolver_status,remove_status,remove_pkgs,pkg_raw_description,delete_desc,error_string,error_desc)
#查询dist-upgrade解决依赖
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='bbasasss')

View File

@ -143,6 +143,25 @@ class InstallBackendAptdaemon(InstallBackend):
error_string=None, error_desc=None)
raise
@inline_callbacks
def download_deb(self, pkg_lists):
"""download deb only"""
try:
trans = yield self.client.download_packages(pkg_names = pkg_lists, defer=True)
self.window_main.dbusController.transaction = trans
# 注册回调函数 接收更新的状态
yield self._show_transaction(trans, self.ACTION_DOWNLOADONLY,
_("Downloading deb packages…"), False)
except errors.NotAuthorizedError:
self._action_done(self.ACTION_DOWNLOADONLY,
authorized=False, success=False,
error_string=None, error_desc=None)
except Exception:
self._action_done(self.ACTION_DOWNLOADONLY,
authorized=True, success=False,
error_string=None, error_desc=None)
raise
#进度回调
def _on_progress_changed(self, trans,progress,action):
if progress == 101:
@ -151,10 +170,11 @@ class InstallBackendAptdaemon(InstallBackend):
if action == self.ACTION_UPDATE:
self.window_main.dbusController.UpdateDetectStatusChanged(self.trans_progress,self.trans_status)
else:
if progress >= 50:
if progress >= 50 and action != self.ACTION_DOWNLOADONLY:
LockedPreventShutdown()
upgrade_content = self.now_upgrade.upgrade_groups+self.now_upgrade.single_pkgs
self.window_main.dbusController.UpdateDloadAndInstStaChanged(upgrade_content,self.trans_progress,self.trans_status,self.details)
#同步状态回调
def _on_status_changed(self, trans, status,action):
@ -163,11 +183,13 @@ class InstallBackendAptdaemon(InstallBackend):
if action == self.ACTION_UPDATE:
self.window_main.dbusController.UpdateDetectStatusChanged(self.trans_progress,self.trans_status)
else:
elif action == self.ACTION_INSTALL and action == self.ACTION_INSTALL_DEB:
#升级的时候发送状态信号时需要上传更新组信息self.upgrade_groups_list
upgrade_content = self.now_upgrade.upgrade_groups+self.now_upgrade.single_pkgs
self.window_main.dbusController.UpdateDloadAndInstStaChanged(upgrade_content,self.trans_progress,self.trans_status,self.details)
elif action == self.ACTION_DOWNLOADONLY:
pass
def _on_details_changed(self, trans, details):
self.details = details

View File

@ -40,6 +40,7 @@ class InstallBackend():
ACTION_INSTALL = 1
ACTION_INSTALL_DEB = 2
ACTION_CHECK_RESOLVER = 3
ACTION_DOWNLOADONLY = 4
def __init__(self, window_main, action):
self.window_main = window_main
@ -86,23 +87,24 @@ class InstallBackend():
_success = True
header = ''
desc = ''
#判断是否使用全盘升级 全盘使用dist-upgrade
if _upgrade_mode != MODE_UPGRADE_SYSTEM:
#获取要升级的列表
pkgs_install,pkgs_upgrade = self._make_upgrade_list(_upgrade_mode,partial_upgrade_list)
#计算解决依赖关系
_success,header,desc = self._make_problem_resolver(pkgs_install,pkgs_upgrade)
_success,delete_pkgs,delete_desc,header,desc = self._make_problem_resolver(pkgs_install,pkgs_upgrade)
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.cache)
pkgs_remove = delete_pkgs
else:
# 使用全盘升级 全盘使用dist-upgrade
try:
self.cache._initDepCache()
_success = self.cache._depcache.upgrade(True)
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.cache)
except Exception as e:
_success = False
desc = str(e)
logging.error(desc)
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.cache)
logging.info("RESOLVER install:%d , upgrade:%d remove:%d",len(pkgs_install),len(pkgs_upgrade),len(pkgs_remove))
is_remove_pkgs = len(pkgs_remove) != 0
@ -117,9 +119,15 @@ class InstallBackend():
else:
raw_description.append(getattr(pkg_obj.candidate, "summary", ''))
if _upgrade_mode != MODE_UPGRADE_SYSTEM:
self.window_main.dbusController.UpdateDependResloveStatus(_success,is_remove_pkgs,pkgs_remove,raw_description,header,desc)
self.window_main.dbusController.UpdateDependResloveStatus(_success,is_remove_pkgs,pkgs_remove,raw_description,delete_desc,header,desc)
else:
self.window_main.dbusController.DistupgradeDependResloveStatus(_success,is_remove_pkgs,pkgs_remove,raw_description,header,desc)
elif self.action == self.ACTION_DOWNLOADONLY:
try:
self.window_main.is_upgrading = True
self.download_deb(partial_upgrade_list)
except Exception as e:
logging.error(str(e))
elif self.action == self.ACTION_UPDATE:
self.is_updating = True
self.update()
@ -202,6 +210,21 @@ class InstallBackend():
except Exception as e:
logging.error(str(e))
return [],[]
#计算升级或者安装这个包 是否存在需要卸载某个包
def _make_delete_pkgs(self,cache,all_delete_pkgs):
wouldDelete = cache._depcache.del_count
deleted_pkgs = []
if wouldDelete > len(all_delete_pkgs):
for pkg_obj in cache:
if pkg_obj.marked_delete:
if pkg_obj.name in all_delete_pkgs:
continue
else:
deleted_pkgs.append(pkg_obj.name)
if deleted_pkgs:
all_delete_pkgs += deleted_pkgs
return deleted_pkgs
#将获取本次升级的包 进行计算依赖关系 解决依赖问题
def _make_problem_resolver(self,pkgs_install,pkgs_upgrade):
@ -211,50 +234,35 @@ class InstallBackend():
try:
logging.info("ProblemResolver install:%d , upgrade:%d",len(pkgs_install),len(pkgs_upgrade))
logging.info("Start calculating dependencies...")
self.cache._initDepCache()
Fix = apt_pkg.ProblemResolver(self.cache._depcache)
totolDelete = 0
totol_delete_pkgs = []
for pkg in pkgs_upgrade:
self.cache[pkg].mark_upgrade()
wouldDelete = self.cache._depcache.del_count
if wouldDelete > totolDelete:
totolDelete += wouldDelete
tem_deleted_pkgs = []
for pkg_obj in self.cache:
if pkg_obj.marked_delete:
if pkg_obj.name in totol_delete_pkgs:
continue
else:
tem_deleted_pkgs.append(pkg_obj.name)
totol_delete_pkgs += tem_deleted_pkgs
logging.warning("(%a)将要被删除由于升级(%s)",tem_deleted_pkgs,pkg)
for pkg in pkgs_install:
self.cache[pkg].mark_install()
wouldDelete = self.cache._depcache.del_count
if wouldDelete > totolDelete:
totolDelete += wouldDelete
tem_deleted_pkgs = []
for pkg_obj in self.cache:
if pkg_obj.marked_delete:
if pkg_obj.name in totol_delete_pkgs:
continue
else:
tem_deleted_pkgs.append(pkg_obj.name)
totol_delete_pkgs += tem_deleted_pkgs
logging.warning("(%a)将要被删除由于安装(%s)",tem_deleted_pkgs,pkg)
# self.cache['kylin-burner-i18n'].mark_keep()
# Fix.protect(self.cache['kylin-burner-i18n']._pkg)
#会安装新包和卸载包
Fix.resolve(True)
#actiongroup 可以加速计算依赖关系 计算花费的时间将大幅度缩减
with self.cache.actiongroup():
self.cache._initDepCache()
Fix = apt_pkg.ProblemResolver(self.cache._depcache)
all_delete_pkgs = []
all_delete_desc = []
#标记计算所有需要升级的包
for pkg in pkgs_upgrade:
self.cache[pkg].mark_upgrade()
deleted_pkgs = self._make_delete_pkgs(self.cache,all_delete_pkgs)
for d_pkg in deleted_pkgs:
delete_desc = str(d_pkg) + _(" Will be deleted Due to Upgrade ") + str(pkg)
all_delete_desc.append(delete_desc)
logging.warning(delete_desc)
#标记计算所有需要安装的
for pkg in pkgs_install:
self.cache[pkg].mark_install()
deleted_pkgs = self._make_delete_pkgs(self.cache,all_delete_pkgs)
for d_pkg in deleted_pkgs:
delete_desc = str(d_pkg) + _(" Will be deleted Due to Install ") + str(pkg)
all_delete_desc.append(delete_desc)
logging.warning(delete_desc)
#会安装新包和卸载包
Fix.resolve(True)
#不会安装和卸载 只升级
return _success,header,desc
return _success,all_delete_pkgs,all_delete_desc,header,desc
except Exception as e:
_success = False
header = _("Could not calculate the upgrade")
@ -264,13 +272,12 @@ class InstallBackend():
"package and include the following error "
"message:\n") + str(e)
logging.error(header + desc)
return _success,header,desc
return _success,[],[],header,desc
#出现错误和更新升级完成都会调到此方法 进行处理
def _action_done(self, action, authorized, success, error_string,error_desc):
#升级完成后走的分支
if action == self.ACTION_INSTALL:
upgrade_content = self.now_upgrade.upgrade_groups + self.now_upgrade.single_pkgs
self.window_main.is_upgrading = False
unLockedEnableShutdown()
@ -310,6 +317,16 @@ class InstallBackend():
self.window_main.dbusController.UpdateDetectFinished(success,[],error_string,error_desc)
else:
self.window_main.dbusController.UpdateDetectFinished(success,[],'','')
elif action == self.ACTION_DOWNLOADONLY:
self.window_main.is_upgrading = False
if success:
#开始生成列表
self.window_main.start_available()
elif error_string or error_desc:
logging.warning(error_string + error_desc)
self.window_main.dbusController.UpdateDetectFinished(success,[],error_string,error_desc)
else:
self.window_main.dbusController.UpdateDetectFinished(success,[],'','')
elif action == self.ACTION_INSTALL_DEB:
pass
unLockedEnableShutdown()

View File

@ -28,7 +28,6 @@ def signal_handler_term(signal, frame):
app.dbusController.Quit(None)
if __name__ == "__main__":
# LockedPreventShutdown()
# Begin parsing of options
parser = OptionParser()
parser.add_option ("-d", "--debug", action="store_true", default=False,