增加全盘升级 and 优化代码逻辑

This commit is contained in:
wangsong 2021-10-21 11:26:09 +08:00
parent bb41bdd435
commit 10072c2545
5 changed files with 183 additions and 184 deletions

View File

@ -14,8 +14,16 @@ import apt_pkg
DB_FILE = os.path.join("/var/cache/kylin-system-updater/kylin-system-updater.db")
INSTALLED_LIST = [{"item": "errorcode", "type": "int", "default": "0"}]
DISPALY_LIST = []
MODE_UPGRADEPARTIAL = 0
MODE_UPGRADEALL = 1
MODE_DEFAULT_STATUS = -1
#部分升级
MODE_UPGRADE_PARTIAL = 0
#全部升级
MODE_UPGRADE_ALL = 1
#系统全盘升级
MODE_UPGRADE_SYSTEM = 2
#后端内部安装包使用
MODE_UPGRADE_SINGLE = 3
class Sqlite3Server(object):
def __init__(self, window_main):
@ -134,7 +142,7 @@ class Sqlite3Server(object):
status = 'failed'
# 判断更新方式
if mode == MODE_UPGRADEPARTIAL: # 部分更新
if mode == MODE_UPGRADE_PARTIAL: # 部分更新
# 判断更新包为单包或更新组
if pkg_group:
# 更新组
@ -160,7 +168,7 @@ class Sqlite3Server(object):
self.insert_into_updateinfo(pkgname, pkgversion, pkgdescription, timestr, status, "1", errstr)
# FIXME: 这里也需要, 发送插入数据库成功的信号
self.window_main.dbusController.update_sqlite_single(pkgname, timestr)
elif mode == MODE_UPGRADEALL: # 系统升级
elif mode == MODE_UPGRADE_ALL: # 系统升级
# # insert signal deb first
for i in pkg_list:
try:

View File

@ -22,6 +22,7 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA
from __future__ import print_function
from gettext import gettext as _
import logging
import os
@ -376,6 +377,9 @@ class UpdateList():
#查找所有可升级的包
for pkg in cache:
try:
if pkg.name == 'kylin-burner-i18n':
print("ds")
if pkg.is_upgradable and pkg.is_installed:
if getattr(pkg.candidate, "origins", None) is None:
logging.error("WARNING: upgradable but no candidate.origins?!?: ",

View File

@ -20,6 +20,7 @@ from .Core.loop import mainloop
import time
from gettext import gettext as _
from SystemUpdater.backend import DownloadBackend as downb
from SystemUpdater.Core.Database import MODE_UPGRADE_PARTIAL,MODE_UPGRADE_ALL,MODE_UPGRADE_SYSTEM,MODE_UPGRADE_SINGLE
#安装完成之后是否有请求需要重启
REBOOT_REQUIRED_FILE = "/var/run/reboot-required"
@ -75,25 +76,17 @@ class UpdateManager():
logging.error(e)
#进行升级的操作
def start_install(self,is_install = False,partial_upgrade_list = []):
def start_install(self,upgrade_mode,is_install = False,partial_upgrade_list = []):
try:
if is_install == True:
self.is_upgrading = True
install_backend = get_backend(self, InstallBackend.ACTION_INSTALL)
install_backend.start(partial_upgrade_list)
install_backend.start(upgrade_mode,partial_upgrade_list)
else:
install_backend = get_backend(self, InstallBackend.ACTION_CHECK_RESOLVER)
install_backend.start(partial_upgrade_list)
install_backend.start(upgrade_mode,partial_upgrade_list)
except Exception as e:
logging.error(e)
#进行升级的操作-传入包列表
def start_install_alone(self,pkgs_install = [], pkgs_upgrade = [], pkgs_remove = [],pkgs_purge = []):
logging.info("Disk Check finished...")
self.is_upgrading = True
install_backend = get_backend(self, InstallBackend.ACTION_INSTALL)
install_backend.start_alone(pkgs_install,pkgs_upgrade,pkgs_remove,pkgs_purge)
#更新结束之后会调到此获取要升级的列表 and 更新cache 生成升级组列表JSON
def start_available(self):
_success,header,desc = self.refresh_cache()
@ -124,7 +117,9 @@ class UpdateManager():
#是否可升级
if pkg_json.is_upgradable:
logging.info("groups JSON ConfigPkgs(%s) start upgrading...",self.GROUPS_PKG_NAME)
self.start_install_alone(pkgs_upgrade = [GROUPS_PKG_NAME])
pkg_json.mark_upgrade()
self.start_install(MODE_UPGRADE_SINGLE,True)
#直接退出
_success = False
header = INSTALL_ALONE_PROGRESS
@ -133,7 +128,8 @@ class UpdateManager():
logging.info("ConfigPkgs(%s) No need to upgrade...",GROUPS_PKG_NAME)
else:
logging.info("groups JSON ConfigPkgs(%s) start new installing...",GROUPS_PKG_NAME)
self.start_install_alone(pkgs_install = [GROUPS_PKG_NAME])
pkg_json.mark_install()
self.start_install(MODE_UPGRADE_SINGLE,True)
#直接退出
_success = False
header = INSTALL_ALONE_PROGRESS
@ -145,11 +141,12 @@ class UpdateManager():
logging.error(e)
_success = False
#FIXME:
#3、 判断目录是JSON配置文件夹是否缺失 缺失后进行修复 卸载重新安装步骤
if not os.path.exists(INPUT_CONFIG_PATH):
logging.info("groups JSON Config Path(%s) Missing and Trying to fix...",INPUT_CONFIG_PATH)
#将软件包卸载 之后进行重新安装here --> purge --> start_available 进行判断是否安装未安装重新安装
self.start_install_alone(pkgs_purge = [GROUPS_PKG_NAME])
# self.start_install_alone(pkgs_purge = [GROUPS_PKG_NAME])
#直接退出
_success = False
header = INSTALL_ALONE_PROGRESS

View File

@ -12,6 +12,7 @@ from .Core.utils import humanize_size
from SystemUpdater.Core.utils import (
unLockedEnableShutdown,
)
from SystemUpdater.Core.Database import MODE_UPGRADE_PARTIAL,MODE_UPGRADE_ALL,MODE_UPGRADE_SYSTEM,MODE_UPGRADE_SINGLE
UPDATER_DBUS_INTERFACE = 'com.kylin.systemupgrade.interface'
UPDATER_DBUS_PATH = '/com/kylin/systemupgrade'
@ -76,8 +77,8 @@ class UpdateManagerDbusController(dbus.service.Object):
logging.info('Network Disconnected ...')
@dbus.service.method(UPDATER_DBUS_INTERFACE,
in_signature="", out_signature="",
sender_keyword="caller_name")
in_signature="", out_signature="",
sender_keyword="caller_name")
def Quit(self, caller_name):
"""Request a shutdown of the daemon."""
self.CancelDownload()
@ -116,7 +117,7 @@ class UpdateManagerDbusController(dbus.service.Object):
return False,'In the process of updating or Upgrading...'
else:
logging.info('method DistUpgradeSystem and is_install:%r...',is_install)
self.parent.start_install(is_install)
self.parent.start_install(MODE_UPGRADE_ALL,is_install)
return True,'success'
except Exception as e:
return False,str(e)
@ -142,7 +143,7 @@ class UpdateManagerDbusController(dbus.service.Object):
if upgrade_intersection_pkgs:
logging.info('dbus partial_upgrade(%s),is_install:%r',partial_upgrade_list,is_install)
self.parent.start_install(is_install,partial_upgrade_list)
self.parent.start_install(MODE_UPGRADE_PARTIAL,is_install,partial_upgrade_list)
return True,'dbus upgrading'
else:
logging.warning('input upgrade list(%s) not in local upgrade_list(%s)',partial_upgrade_list,local_upgrade_groups+local_single_pkgs)
@ -168,47 +169,18 @@ class UpdateManagerDbusController(dbus.service.Object):
return (status, message)
# 依赖错误时调用的接口
@dbus.service.method(UPDATER_DBUS_INTERFACE, out_signature='bs')
def DistUpgradeSystem(self):
pkgs_install = []
pkgs_upgrade = []
pkgs_remove = []
@dbus.service.method(UPDATER_DBUS_INTERFACE,in_signature='b',out_signature='bs')
def DistUpgradeSystem(self,_is_install):
try:
is_install = bool(_is_install)
#处于更新和升级中的话 不进行升级
if self.parent.is_updating or self.parent.is_upgrading:
logging.info('In the process of updating or Upgrading...')
return False,'In the process of updating or Upgrading...'
else:
if True:
#查找所有可升级的包
self.parent.cache.saveDistUpgrade()
for pkg in self.parent.cache:
try:
if pkg.marked_install:
pkgs_install.append(pkg.name)
elif pkg.marked_upgrade:
pkgs_upgrade.append(pkg.name)
elif pkg.marked_delete:
pkgs_remove.append(pkg.name)
# elif pkg.is_upgradable :
# pkgs_upgrade.append(pkg.name)
except Exception as e:
logging.error(e)
if pkgs_install or pkgs_upgrade or pkgs_remove:
logging.info('total: install pkgs num(%d) | upgrade pkgs num(%d) | remove pkgs num(%d) |', \
len(pkgs_install), \
len(pkgs_upgrade), \
len(pkgs_remove))
#开始安装
self.parent.start_install_alone( \
pkgs_install = pkgs_install, \
pkgs_upgrade = pkgs_upgrade, \
pkgs_remove = pkgs_remove)
return True,'dbus upgrading'
else:
logging.info('pkgs list is empty.')
return False,'upgrade_list is empty'
logging.info('method DistUpgradeSystem and is_install:%r...',is_install)
self.parent.start_install(MODE_UPGRADE_SYSTEM,is_install)
return True,'success'
except Exception as e:
logging.error(False, str(e))
return (False, str(e))
@ -241,29 +213,30 @@ class UpdateManagerDbusController(dbus.service.Object):
#更新进度信息 0~100 进度信息 101为非预期的信号
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='is')
def UpdateDetectStatusChanged(self,progress,status):
logging.info("emit progress = %d , status = %s",progress,status)
logging.info("emit UpdateDetectStatusChanged progress = %d , status = %s",progress,status)
#更新完成的信号
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='basss')
def UpdateDetectFinished(self, success, upgrade_group,error_string='',error_desc='',):
logging.info("emit update success = %r , upgrade_group = %a, error_string = %s , error_desc = %s ",\
logging.info("emit UpdateDetectFinished success = %r , upgrade_group = %a, error_string = %s , error_desc = %s ",\
success,upgrade_group,error_string,error_desc)
#升级的进度信息 0~100 进度信息 101为非预期的信号
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='asiss')
def UpdateDloadAndInstStaChanged(self,groups_list,progress,status,current_details):
logging.info("emit upgrade groups_list = %s progress = %d , status = %s ,current_details = %s",groups_list,progress,status,current_details)
logging.info("emit UpdateDloadAndInstStaChanged upgrade groups_list = %s progress = %d , status = %s ,\
current_details = %s",groups_list,progress,status,current_details)
#升级完成的信号
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='basss')
def UpdateDownloadFinished(self, success, upgrade_group,error_string='',error_desc='',):
logging.info("emit success = %r , upgrade_group = %a, error_string = %s , error_desc = %s ",\
logging.info("emit UpdateDownloadFinished success = %r , upgrade_group = %a, error_string = %s , error_desc = %s ",\
success,upgrade_group, error_string,error_desc)
#发送下载包信息
@dbus.service.signal(UPDATER_DBUS_INTERFACE, signature='iiiii')
def UpdateDownloadInfo(self, current_items, total_items, currenty_bytes, total_bytes, current_cps):
logging.info("emit current_items = %d, total_items = %d, currenty_bytes = %s, total_bytes = %s, current_cps = %s/s",\
logging.info("emit UpdateDownloadInfo current_items = %d, total_items = %d, currenty_bytes = %s, total_bytes = %s, current_cps = %s/s",\
current_items, total_items, \
humanize_size(currenty_bytes), humanize_size(total_bytes),\
humanize_size(current_cps))
@ -274,6 +247,12 @@ class UpdateManagerDbusController(dbus.service.Object):
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)
#查询dist-upgrade解决依赖
@dbus.service.signal(UPDATER_DBUS_INTERFACE,signature='bbasasss')
def DistupgradeDependResloveStatus(self, resolver_status, remove_status,remove_pkgs,pkg_raw_description,error_string='',error_desc='',):
logging.info("emit DistupgradeDependResloveStatus: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='b')
def Cancelable(self, Cancelable):

View File

@ -15,7 +15,7 @@ from SystemUpdater.Core.utils import (
unLockedEnableShutdown,
check_free_space
)
from ..Core.Database import MODE_UPGRADEPARTIAL,MODE_UPGRADEALL
from ..Core.Database import MODE_DEFAULT_STATUS,MODE_UPGRADE_PARTIAL,MODE_UPGRADE_ALL,MODE_UPGRADE_SYSTEM,MODE_UPGRADE_SINGLE
class NowUpgradePara:
"""
@ -23,14 +23,15 @@ class NowUpgradePara:
run
"""
def __init__(self,
upgrade_groups=[],
upgrade_mode=[],
single_pkgs=[],
):
#升级的模式
self.upgrade_mode = upgrade_mode
upgrade_groups=[],
upgrade_mode=MODE_DEFAULT_STATUS,
single_pkgs=[],
):
#组列表中包含的包
self.upgrade_groups = upgrade_groups
#升级的模式
self.upgrade_mode = upgrade_mode
#推送的可升级的单包
self.single_pkgs = single_pkgs
@ -42,9 +43,97 @@ class InstallBackend():
def __init__(self, window_main, action):
self.window_main = window_main
self.cache = window_main.cache
self.action = action
self.now_upgrade = NowUpgradePara([],[],[])
if self.action != self.ACTION_UPDATE:
self.local_upgrade_data = window_main.update_list.local_upgrade_data
self.now_upgrade = NowUpgradePara([],MODE_DEFAULT_STATUS,[])
def start(self,_upgrade_mode = MODE_DEFAULT_STATUS,partial_upgrade_list = []):
#安装升级包 首先必须调用ACTION_CHECK_RESOLVER 计算依赖解决方便 标记cache 进行升级
if self.action == self.ACTION_INSTALL:
self.now_upgrade.upgrade_mode = _upgrade_mode
if _upgrade_mode != MODE_UPGRADE_SINGLE:
self._make_upgrade_list(_upgrade_mode,partial_upgrade_list)
#检查磁盘的状态
_success,desc = check_free_space(self.cache)
if _success == False and desc != None:
header = _("Can not upgrade")
self._action_done(self.action,True,False,header,desc)
return
logging.info("Disk Check finished...")
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.cache)
logging.info("INSTALL install:%d , upgrade:%d remove:%d",len(pkgs_install),len(pkgs_upgrade),len(pkgs_remove))
if len(pkgs_install) == 0 and len(pkgs_upgrade) == 0 and len(pkgs_remove) == 0:
#FIXME: 没有需要升级和安装的包 检查升级包是否不存在本次升级
header = _("There are no packages that need to be upgraded and installed")
desc = _("Check if the upgrade package does not exist for this upgrade")
self._action_done(self.action,True,False,header,desc)
return
try:
self.window_main.is_upgrading = True
self.commit(pkgs_install, pkgs_upgrade, pkgs_remove)
except Exception as e:
logging.error(e)
#计算依赖解决方案
elif self.action == self.ACTION_CHECK_RESOLVER:
_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)
else:
try:
self.cache._initDepCache()
_success = self.cache._depcache.upgrade(True)
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
#属于检测查询依赖解决是否成功 是否存在删包
raw_description = []
#添加关于删除包的描述信息
for pkg in pkgs_remove:
pkg_obj = self.cache[pkg]
app = self.window_main.update_list._get_application_for_package(pkg_obj)
if app is not None:
raw_description.append(app.get_display_name())
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)
else:
self.window_main.dbusController.DistupgradeDependResloveStatus(_success,is_remove_pkgs,pkgs_remove,raw_description,header,desc)
elif self.action == self.ACTION_UPDATE:
self.update()
def update(self):
"""Run a update to refresh the package list"""
raise NotImplementedError
def commit(self, pkgs_install, pkgs_upgrade, pkgs_remove,pkgs_purge = []):
"""Commit the cache changes """
raise NotImplementedError
def install_deb(self,install_path,install_force):
"""install_deb the cache changes """
raise NotImplementedError
#从cache中拿到标记的列表
def _get_mark_from_cache(self,cache):
@ -66,8 +155,8 @@ class InstallBackend():
pass
return pkgs_install,pkgs_upgrade,pkgs_remove
#从本地中获取本次升级需要升级的包
def _make_upgrade_list(self,partial_upgrade_list):
#从本地中获取本次升级需要升级的包 部分升级和全部升级使用 全盘升级不适用
def _make_upgrade_list(self,_upgrade_mode,partial_upgrade_list):
pkgs_install = []
pkgs_upgrade = []
@ -76,29 +165,27 @@ class InstallBackend():
try:
#可选升级
if partial_upgrade_list:
self.now_upgrade.upgrade_mode = MODE_UPGRADEPARTIAL
if _upgrade_mode == MODE_UPGRADE_PARTIAL:
for i in partial_upgrade_list:
#组升级方式
if i in self.window_main.update_list.local_upgrade_data.upgrade_groups:
if i in self.local_upgrade_data.upgrade_groups:
local_groups_list.append(i)
#单包升级方式
elif i in self.window_main.update_list.local_upgrade_data.single_pkgs:
elif i in self.local_upgrade_data.single_pkgs:
local_pkg_list.append(i)
else:
logging.warning("this package(%s) not in selected list",i)
#全部升级列表
else:
self.now_upgrade.upgrade_mode = MODE_UPGRADEALL
local_groups_list = self.window_main.update_list.local_upgrade_data.upgrade_groups
local_pkg_list = self.window_main.update_list.local_upgrade_data.single_pkgs
elif _upgrade_mode == MODE_UPGRADE_ALL:
local_groups_list = self.local_upgrade_data.upgrade_groups
local_pkg_list = self.local_upgrade_data.single_pkgs
#单包的升级方式
if local_pkg_list:
self.now_upgrade.single_pkgs += local_pkg_list
for pkg in local_pkg_list:
if self.window_main.cache[pkg].is_installed:
if self.cache[pkg].is_installed:
pkgs_upgrade.append(pkg)
else:
pkgs_install.append(pkg)
@ -107,45 +194,40 @@ class InstallBackend():
if local_groups_list:
self.now_upgrade.upgrade_groups += local_groups_list
for group_name in local_groups_list:
pkgs_install += self.window_main.update_list.local_upgrade_data.upgrade_groups_pkgs.get(group_name,[]).get('pkgs_install',[])
pkgs_upgrade += self.window_main.update_list.local_upgrade_data.upgrade_groups_pkgs.get(group_name,[]).get('pkgs_upgrade',[])
pkgs_install += self.local_upgrade_data.upgrade_groups_pkgs.get(group_name,[]).get('pkgs_install',[])
pkgs_upgrade += self.local_upgrade_data.upgrade_groups_pkgs.get(group_name,[]).get('pkgs_upgrade',[])
return pkgs_upgrade,pkgs_install
return pkgs_install,pkgs_upgrade
except Exception as e:
logging.error(str(e))
return [],[]
#将获取本次升级的包 进行计算依赖关系 解决依赖问题
def _make_problem_resolver(self,partial_upgrade_list):
def _make_problem_resolver(self,pkgs_install,pkgs_upgrade):
_success = True
header = ''
desc = ''
pkgs_install = []
pkgs_upgrade = []
try:
pkgs_upgrade,pkgs_install = self._make_upgrade_list(partial_upgrade_list)
logging.info("ProblemResolver install:%d , upgrade:%d",len(pkgs_install),len(pkgs_upgrade))
logging.info("Start calculating dependencies...")
self.window_main.cache._initDepCache()
Fix = apt_pkg.ProblemResolver(self.window_main.cache._depcache)
self.cache._initDepCache()
Fix = apt_pkg.ProblemResolver(self.cache._depcache)
for pkg in pkgs_install:
self.window_main.cache[pkg].mark_install()
self.cache[pkg].mark_install()
for pkg in pkgs_upgrade:
self.window_main.cache[pkg].mark_upgrade()
self.cache[pkg].mark_upgrade()
# self.cache['kylin-burner-i18n'].mark_keep()
# Fix.protect(self.cache['kylin-burner-i18n']._pkg)
#会安装新包和卸载包
Fix.resolve(True)
#不会安装和卸载 只升级
# Fix.resolve_by_keep()
return _success,header,desc
except Exception as e:
_success = False
#FIXME: 中文 依赖解决器出现异常
header = _("Could not calculate the upgrade")
desc = _("An unresolvable problem occurred while "
"calculating the upgrade.\n\n"
@ -155,97 +237,27 @@ class InstallBackend():
logging.error(header + desc)
return _success,header,desc
def start(self,partial_upgrade_list = []):
if self.action == self.ACTION_INSTALL:
self._make_upgrade_list(partial_upgrade_list)
#检查磁盘的状态
_success,desc = check_free_space(self.window_main.cache)
if _success == False and desc != None:
header = _("Can not upgrade")
self._action_done(self.action,True,False,header,desc)
return
logging.info("Disk Check finished...")
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.window_main.cache)
logging.info("INSTALL install:%d , upgrade:%d remove:%d",len(pkgs_install),len(pkgs_upgrade),len(pkgs_remove))
if len(pkgs_install) == 0 and len(pkgs_upgrade) == 0 and len(pkgs_remove) == 0:
#FIXME: 没有需要升级和安装的包 检查升级包是否不存在本次升级
header = _("There are no packages that need to be upgraded and installed")
desc = _("Check if the upgrade package does not exist for this upgrade")
self._action_done(self.action,True,False,header,desc)
return
try:
self.commit(pkgs_install, pkgs_upgrade, pkgs_remove)
except Exception as e:
logging.error(e)
#计算依赖解决方案
elif self.action == self.ACTION_CHECK_RESOLVER:
_success,header,desc = self._make_problem_resolver(partial_upgrade_list)
pkgs_install,pkgs_upgrade,pkgs_remove = self._get_mark_from_cache(self.window_main.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
#属于检测查询依赖解决是否成功 是否存在删包
raw_description = []
#添加关于删除包的描述信息
for pkg in pkgs_remove:
pkg_obj = self.window_main.cache[pkg]
app = self.window_main.update_list._get_application_for_package(pkg_obj)
if app is not None:
raw_description.append(app.get_display_name())
else:
raw_description.append(getattr(pkg_obj.candidate, "summary", ''))
self.window_main.dbusController.UpdateDependResloveStatus(_success,is_remove_pkgs,pkgs_remove,raw_description,header,desc)
elif self.action == self.ACTION_UPDATE:
self.update()
#调用此接口进行安装升级包的话,安装完成或者升级完成会重新调用升级
def start_alone(self,pkgs_install = [], pkgs_upgrade = [], pkgs_remove = [],pkgs_purge = []):
os.environ["APT_LISTCHANGES_FRONTEND"] = "none"
if self.action == self.ACTION_INSTALL:
# Get the packages which should be installed and update
self.commit(pkgs_install, pkgs_upgrade, pkgs_remove, pkgs_purge)
else:
self.update()
def update(self):
"""Run a update to refresh the package list"""
raise NotImplementedError
def commit(self, pkgs_install, pkgs_upgrade, pkgs_remove,pkgs_purge = []):
"""Commit the cache changes """
raise NotImplementedError
def install_deb(self,install_path,install_force):
"""install_deb the cache changes """
raise NotImplementedError
#出现错误和更新升级完成都会调到此方法 进行处理
def _action_done(self, action, authorized, success, error_string,
error_desc, trans_failed=False):
upgrade_content = self.now_upgrade.upgrade_groups + self.now_upgrade.single_pkgs
#升级完成后走的分支
if action == self.ACTION_INSTALL:
upgrade_content = self.now_upgrade.upgrade_groups + self.now_upgrade.single_pkgs
self.window_main.is_upgrading = False
unLockedEnableShutdown()
#完成后清空cache
self.window_main.cache._initDepCache()
self.cache._initDepCache()
if success:
#当组列表为空时 表示现在的单独进行安装某些包或卸载,不发信号到控制面板
if upgrade_content:
if self.now_upgrade.upgrade_mode != MODE_UPGRADE_SINGLE:
#升级完成后从升级列表删除
for groups in self.now_upgrade.upgrade_groups:
self.window_main.update_list.local_upgrade_data.upgrade_groups.remove(groups)
self.local_upgrade_data.upgrade_groups.remove(groups)
for pkg in self.now_upgrade.single_pkgs:
self.window_main.update_list.local_upgrade_data.single_pkgs.remove(pkg)
self.local_upgrade_data.single_pkgs.remove(pkg)
else:
self.window_main.start_available()
return
@ -258,7 +270,6 @@ class InstallBackend():
if error_string != '' or error_desc != '':
logging.error(error_string + error_desc)
unLockedEnableShutdown()
self.window_main.sqlite3_server.insert_info(self.now_upgrade.upgrade_mode,self.now_upgrade.single_pkgs,self.now_upgrade.upgrade_groups,success,error_string,error_desc)
self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,error_string,error_desc)
elif action == self.ACTION_UPDATE:
@ -271,14 +282,14 @@ class InstallBackend():
else:
self.window_main.dbusController.UpdateDetectFinished(success,[],'','')
elif action == self.ACTION_INSTALL_DEB:
if success:
#当组列表为空时 表示现在的单独进行安装某些包或卸载,不发信号到控制面板
self.window_main.start_available()
elif error_string or error_desc:
logging.warning(error_string + error_desc)
self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,error_string,error_desc)
else:
self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,'','')
# if success:
# #当组列表为空时 表示现在的单独进行安装某些包或卸载,不发信号到控制面板
# self.window_main.start_available()
# elif error_string or error_desc:
# logging.warning(error_string + error_desc)
# self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,error_string,error_desc)
# else:
# self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,'','')
unLockedEnableShutdown()
# try aptdaemon