Merge branch 'dev' into 'master'
Dev See merge request wangsong/kylin-system-updater!15
This commit is contained in:
commit
d3f26efe40
|
@ -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.")
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue