Merge branch 'dev' into 'master'
Dev See merge request wangsong/kylin-system-updater!14
This commit is contained in:
commit
d0073b194c
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
@ -46,10 +47,10 @@ class LocalUpgradeDataList:
|
|||
run
|
||||
"""
|
||||
def __init__(self,
|
||||
upgrade_groups_pkgs={},
|
||||
upgrade_groups=[],
|
||||
single_pkgs=[],
|
||||
):
|
||||
upgrade_groups_pkgs={},
|
||||
upgrade_groups=[],
|
||||
single_pkgs=[],
|
||||
):
|
||||
#可升级的组列表
|
||||
self.upgrade_groups = upgrade_groups
|
||||
#组列表中包含的包
|
||||
|
@ -59,7 +60,7 @@ class LocalUpgradeDataList:
|
|||
|
||||
class UpdateList():
|
||||
|
||||
def __init__(self, parent, dist=None):
|
||||
def __init__(self):
|
||||
#所有的组升级安装列表
|
||||
self.local_upgrade_data = LocalUpgradeDataList({},[],[])
|
||||
|
||||
|
@ -74,7 +75,7 @@ class UpdateList():
|
|||
data_dirs = '/usr/local/share/:/usr/share/'
|
||||
|
||||
self.application_dirs = [os.path.join(base, 'applications')
|
||||
for base in data_dirs.split(':')]
|
||||
for base in data_dirs.split(':')]
|
||||
#清空上次输出的分组JSON文件
|
||||
def _empty_output_dir(self):
|
||||
try:
|
||||
|
@ -86,7 +87,7 @@ class UpdateList():
|
|||
os.makedirs(OUTPUT_CONFIG_PATH)
|
||||
logging.info('Emptying the configuration file is complete...')
|
||||
except Exception as e:
|
||||
logging.warning(e)
|
||||
logging.error(str(e))
|
||||
|
||||
def _read_important_list(self,cache,pkgs_upgrade):
|
||||
header = ''
|
||||
|
@ -366,7 +367,7 @@ class UpdateList():
|
|||
logging.info("Generate Jsonfile(%s) to complete... ",output_config_name)
|
||||
except Exception as e:
|
||||
logging.warning("Generate Jsonfile to failed... ")
|
||||
logging.error(e)
|
||||
logging.error(str(e))
|
||||
|
||||
def update(self,cache):
|
||||
pkgs_upgrade = []
|
||||
|
@ -396,7 +397,7 @@ class UpdateList():
|
|||
#important_list 为空时此次不需要升级
|
||||
if success == True and not group_important_list and not self.local_upgrade_data.single_pkgs:
|
||||
#不需要升级 全部的软件都是新的
|
||||
header = _("No software updates are available.")
|
||||
header = _("There are no updates to install.")
|
||||
desc = _('important_list is Empty')
|
||||
return True,header,desc
|
||||
elif success == False:
|
||||
|
|
|
@ -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_SINGLE
|
||||
|
||||
#安装完成之后是否有请求需要重启
|
||||
REBOOT_REQUIRED_FILE = "/var/run/reboot-required"
|
||||
|
@ -64,36 +65,27 @@ class UpdateManager():
|
|||
#进行更新的操作
|
||||
def start_update(self):
|
||||
try:
|
||||
#FIXME: 进行两次更新,在更新cache之前获取source.list 更新完成之后再进行一次
|
||||
#FIXME: 进行两次更新,在更新cache之前获取source.list 更新完成之后再进行一次 为了区别服务器错误和网络错误
|
||||
if self.options.no_update_source is False:
|
||||
self.dbusController._on_update_important_list()
|
||||
|
||||
self.is_updating = True
|
||||
update_backend = get_backend(self, InstallBackend.ACTION_UPDATE)
|
||||
update_backend.start()
|
||||
except Exception as e:
|
||||
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 +116,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 +127,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,15 +140,16 @@ 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])
|
||||
#直接退出
|
||||
_success = False
|
||||
header = INSTALL_ALONE_PROGRESS
|
||||
return _success,header,desc
|
||||
# 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])
|
||||
# #直接退出
|
||||
# _success = False
|
||||
# header = INSTALL_ALONE_PROGRESS
|
||||
# return _success,header,desc
|
||||
|
||||
return _success,header,desc
|
||||
|
||||
|
@ -162,7 +158,7 @@ class UpdateManager():
|
|||
header = None
|
||||
desc = None
|
||||
try:
|
||||
self.update_list = UpdateList(self)
|
||||
self.update_list = UpdateList()
|
||||
|
||||
#第一次进入 之后update不进入
|
||||
if self.cache is None:
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -187,53 +187,44 @@ class InstallBackendAptdaemon(InstallBackend):
|
|||
|
||||
@inline_callbacks
|
||||
def _show_transaction(self, trans, action, header, show_details):
|
||||
|
||||
#更新和升级最后完成和失败都会走此在此进行完成之后的处理
|
||||
trans.connect("finished", self._on_finished, action)
|
||||
|
||||
#升级和更新的状态信息和进度
|
||||
trans.connect("status-changed", self._on_status_changed,action)
|
||||
trans.connect("progress-changed", self._on_progress_changed,action)
|
||||
|
||||
#取消升级
|
||||
trans.connect("cancellable-changed", self._on_cancellable_changed)
|
||||
|
||||
#下载的进度信息
|
||||
trans.connect("progress-details-changed", self._on_progress_download_changed)
|
||||
|
||||
# trans.connect("medium-required", self._on_medium_required)
|
||||
trans.connect("status-details-changed", self._on_details_changed)
|
||||
#状态改变的时候的回调函数
|
||||
# trans.connect("download-changed", self._on_download_changed)
|
||||
# trans.connect("config-file-conflict", self._on_config_file_conflict)
|
||||
# yield trans.set_debconf_frontend("ukui")
|
||||
yield trans.run()
|
||||
|
||||
def _on_finished(self, trans, status, action):
|
||||
error_string = ''
|
||||
error_desc = ''
|
||||
trans_failed = False
|
||||
|
||||
if status == EXIT_FAILED:
|
||||
error_string = get_error_string_from_enum(trans.error.code)
|
||||
error_desc = get_error_description_from_enum(trans.error.code)
|
||||
if self.trans_failed_msg:
|
||||
trans_failed = True
|
||||
error_desc = error_desc + "\n" + self.trans_failed_msg
|
||||
#取消下载
|
||||
elif status == EXIT_CANCELLED:
|
||||
error_string = _("Failed to fetch")
|
||||
error_desc = _("_Cancel Upgrade")
|
||||
elif status == EXIT_SUCCESS:
|
||||
error_string = _("System upgrade is complete.")
|
||||
|
||||
is_success = (status == EXIT_SUCCESS)
|
||||
|
||||
if status == EXIT_CANCELLED:
|
||||
error_desc = "Download canceled."
|
||||
|
||||
try:
|
||||
self._action_done(action,
|
||||
authorized=True, success=is_success,
|
||||
error_string=error_string, error_desc=error_desc,
|
||||
trans_failed=trans_failed)
|
||||
authorized=True, success=is_success,
|
||||
error_string=error_string, error_desc=error_desc)
|
||||
except TypeError:
|
||||
# this module used to be be lazily imported and in older code
|
||||
# trans_failed= is not accepted
|
||||
# TODO: this workaround can be dropped in Ubuntu 20.10
|
||||
self._action_done(action,
|
||||
authorized=True, success=is_success,
|
||||
error_string=error_string, error_desc=error_desc)
|
||||
authorized=True, success=is_success,
|
||||
error_string=error_string, error_desc=error_desc)
|
||||
|
|
|
@ -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,98 @@ 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.window_main.update_list != None:
|
||||
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.is_updating = True
|
||||
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 +156,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 +166,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 +195,68 @@ 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)
|
||||
|
||||
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.window_main.cache[pkg].mark_install()
|
||||
for pkg in pkgs_upgrade:
|
||||
self.window_main.cache[pkg].mark_upgrade()
|
||||
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)
|
||||
#不会安装和卸载 只升级
|
||||
# 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 +266,26 @@ 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
|
||||
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()
|
||||
#完成后清空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,12 +298,12 @@ 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:
|
||||
self.window_main.is_updating = False
|
||||
if success:
|
||||
#开始生成列表
|
||||
self.window_main.start_available()
|
||||
elif error_string or error_desc:
|
||||
logging.warning(error_string + error_desc)
|
||||
|
@ -271,14 +311,7 @@ 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,'','')
|
||||
pass
|
||||
unLockedEnableShutdown()
|
||||
|
||||
# try aptdaemon
|
||||
|
|
|
@ -39,8 +39,8 @@ if __name__ == "__main__":
|
|||
help=_("Quit and replace an already running "
|
||||
"daemon"))
|
||||
parser.add_option ("--no-update-source", action="store_true",
|
||||
dest="no_update_source", default=False,
|
||||
help=_("Do not check for updates source when updating"))
|
||||
dest="no_update_source", default=False,
|
||||
help=_("Do not check for updates source when updating"))
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
|
Loading…
Reference in New Issue