Merge branch 'now_dev' into backend_manual

This commit is contained in:
wangsong 2022-05-05 09:07:19 +08:00
commit c8be2f9f75
3 changed files with 52 additions and 45 deletions

View File

@ -401,7 +401,6 @@ class UpdateManager():
header = ''
desc = ''
try:
#第一次进入 之后update不进入
if self.cache is None:
self.cache = MyCache(None)
else:

View File

@ -21,20 +21,15 @@ import dbus,time
from gi.repository import GLib
import os
from importlib import reload
from SystemUpdater.Core.utils import unLockedEnableShutdown
from SystemUpdater.Core.utils import unLockedEnableShutdown,LockedPreventShutdown
# 超时检测 秒单位
UPDATER_IDLE_CHECK_INTERVAL = 5
#安装的超时检查20分钟
INSTALL_IDLE_TIMEOUT = 20 * 60
#更新超时检查 5分钟
UPDATE_IDLE_TIMEOUT = 5 * 60
import dbus
from SystemUpdater.Core.utils import (LockedPreventShutdown)
class InstallBackendAptdaemon(InstallBackend):
"""Makes use of aptdaemon to refresh the cache and to install updates."""
@ -53,20 +48,12 @@ class InstallBackendAptdaemon(InstallBackend):
#客户端连接aptdeamon的dbus接口
self.client = client.AptClient()
self.trans_failed_msg = None
#aptdeamon的实时进度
self.trans_progress = 0
self.trans_status = ''
self.details = ''
#是否在安装状态 判断依据进度>50
self.on_install_stage = False
if self.action == self.ACTION_INSTALL_SHUTDOWN:
self.on_install_stage = True
self.trans_cancelable = False
if self.action == self.ACTION_UPDATE:
#更新的超时检查机制 超时时取消下载
self.update_timestamp = 0
@ -87,10 +74,10 @@ class InstallBackendAptdaemon(InstallBackend):
def _check_simulation_progress(self):
self.simulation_progress += 20
if self.trans_progress >= 90 or self.simulation_progress > 80:
if self.aptd_base.progress >= 90 or self.simulation_progress > 80:
return False
else:
self._dist_status_changed(self.action,[],self.simulation_progress,self.trans_status,self.details)
self._dist_status_changed(self.action,[],self.simulation_progress,self.aptd_base.status,self.aptd_base.details)
return True
def _check_install_inactivity(self):
@ -103,15 +90,15 @@ class InstallBackendAptdaemon(InstallBackend):
logging.info("Installing to exit and timeout check quit...")
return False
#进度不同时 更新时间戳
if self.trans_progress != self.check_progress:
self.check_progress = self.trans_progress
if self.aptd_base.progress != self.check_progress:
self.check_progress = self.aptd_base.progress
self.install_timestamp = time.time()
#只有安装的时候启用 下载时候不使用
timestamp = self.install_timestamp
if (time.time() - timestamp > INSTALL_IDLE_TIMEOUT
and self.on_install_stage == True):
logging.error("Quitting due to inactivity(%s)",self.details)
logging.error("Quitting due to inactivity(%s)",self.aptd_base.details)
if self.action == self.ACTION_INSTALL_SHUTDOWN:
#关机安装模式 解除禁止关机锁
@ -124,7 +111,7 @@ class InstallBackendAptdaemon(InstallBackend):
# is_cancelled=False, success=False,
# #FIXME: 安装超时退出
# error_string=_("Could not install the upgrades"),
# error_desc=_("Installtion timeout to exit Due to inactivity") + self.details)
# error_desc=_("Installtion timeout to exit Due to inactivity") + self.aptd_base.details)
# self.window_main.dbusController.Quit(None)
return False
@ -134,19 +121,19 @@ class InstallBackendAptdaemon(InstallBackend):
def _check_update_inactivity(self):
logging.info("Checking for inactivity in Updating...")
#退出定时器 当更新完毕的时候
if (self.trans_cancelable == False and self.trans_progress >= 90) or self.window_main.now_working != self.ACTION_UPDATE:
if (self.aptd_base.cancelable == False and self.aptd_base.progress >= 90) or self.window_main.now_working != self.ACTION_UPDATE:
logging.info("Updating to exit and timeout check quit...")
return False
#当更新进入下载状态时 记录进去的时间
timestamp = self.update_timestamp
if self.trans_cancelable == True and timestamp == 0:
if self.aptd_base.cancelable == True and timestamp == 0:
self.update_timestamp = time.time()
return True
#超时设置
if self.update_timestamp != 0 and time.time() - self.update_timestamp > UPDATE_IDLE_TIMEOUT \
and self.trans_cancelable == True:
and self.aptd_base.cancelable == True:
logging.error("Quitting due to inactivity")
self.window_main.dbusController.transaction.cancel()
@ -305,14 +292,14 @@ class InstallBackendAptdaemon(InstallBackend):
return
#过滤掉不是线性的进度
if progress > self.trans_progress:
self.trans_progress = progress
if progress > self.aptd_base.progress:
self.aptd_base.progress = progress
else:
return
self.trans_progress = progress
self.aptd_base.progress = progress
self._dist_status_changed(action,self.now_upgrade.upgrade_groups+self.now_upgrade.single_pkgs,\
self.trans_progress,self.trans_status,self.details)
self.aptd_base.progress,self.aptd_base.status,self.aptd_base.details)
#同步状态回调
@ -321,12 +308,12 @@ class InstallBackendAptdaemon(InstallBackend):
return
#转化词条
self.trans_status = get_status_string_from_enum(status)
if self.trans_status == None:
self.aptd_base.status = get_status_string_from_enum(status)
if self.aptd_base.status == None:
return
self._dist_status_changed(action,self.now_upgrade.upgrade_groups+self.now_upgrade.single_pkgs,\
self.trans_progress,self.trans_status,self.details)
self.aptd_base.progress,self.aptd_base.status,self.aptd_base.details)
#分发进度状态和细节信息
def _dist_status_changed(self,action,upgrade_content = [],progress = 0,status = '',details = ''):
@ -349,14 +336,14 @@ class InstallBackendAptdaemon(InstallBackend):
#只处理从下载切换到安装时出现的网络问题
#当网络波动时下载某些软件包失败时属于异常状态进行重试时 不发送后续进度 等待重试正常是 进行下载安装
if self.is_version_upgrade == True and progress >= 48 and self.on_install_stage != True and 'Failed to fetch' in self.trans_error_details:
if self.is_version_upgrade == True and progress >= 48 and self.on_install_stage != True and 'Failed to fetch' in self.aptd_base.error_details:
logging.warning("Arise Failed to fetch and Need retry Upgrade...")
self.is_need_retry = True
return
#在下载阶段发送取消信号
if self.on_install_stage == False:
self.window_main.dbusController.Cancelable(self.trans_cancelable)
self.window_main.dbusController.Cancelable(self.aptd_base.cancelable)
self.window_main.dbusController.UpdateDloadAndInstStaChanged(upgrade_content,progress,status,details)
elif action == self.ACTION_INSTALL_SHUTDOWN:
@ -367,12 +354,12 @@ class InstallBackendAptdaemon(InstallBackend):
elif action == self.ACTION_DOWNLOADONLY:
#只处理从下载切换到安装时出现的网络问题
#当网络波动时下载某些软件包失败时属于异常状态进行重试时 不发送后续进度 等待重试正常是 进行下载安装
if self.is_version_upgrade == True and progress >= 48 and 'Failed to fetch' in self.trans_error_details:
if self.is_version_upgrade == True and progress >= 48 and 'Failed to fetch' in self.aptd_base.error_details:
logging.warning("Arise Failed to fetch and Need retry Upgrade...")
self.is_need_retry = True
return
self.window_main.dbusController.Cancelable(self.trans_cancelable)
self.window_main.dbusController.Cancelable(self.aptd_base.cancelable)
self.window_main.dbusController.UpdateDloadAndInstStaChanged(upgrade_content,progress,status,details)
elif action == self.ACTION_FIX_BROKEN:
@ -384,8 +371,10 @@ class InstallBackendAptdaemon(InstallBackend):
else:
logging.info("Other Action:progress = %d , status = %s ,details = %s",progress,status,details)
def _on_details_changed(self, trans, details):
self.details = details
def _on_details_changed(self, trans, details,action):
self.aptd_base.details = details
self._dist_status_changed(action,self.now_upgrade.upgrade_groups+self.now_upgrade.single_pkgs,\
self.aptd_base.progress,self.aptd_base.status,self.aptd_base.details)
def _on_download_changed(self, trans, details):
logging.info(details)
@ -415,7 +404,7 @@ class InstallBackendAptdaemon(InstallBackend):
logging.info("\033[1;32m" + "Emitting" + "\033[0m" +" Cancelable: %r",Cancelable)
self.window_main.dbusController.Cancelable(Cancelable)
#增加取消信号的频发机制
self.trans_cancelable = Cancelable
self.aptd_base.cancelable = Cancelable
def _on_config_file_conflict(self, transaction, old, new):
logging.info("Config file conflict oldconf = %s , newconf = %s...",str(old),str(new))
@ -427,7 +416,7 @@ class InstallBackendAptdaemon(InstallBackend):
#增加记录当产生错误的时候 详细信息
def _on_error_changed(self, trans,error_code, error_details):
# error_string = get_error_string_from_enum(error_code)
self.trans_error_details = str(error_details)
self.aptd_base.error_details = str(error_details)
logging.error(str(error_details))
@inline_callbacks
@ -441,7 +430,7 @@ class InstallBackendAptdaemon(InstallBackend):
trans.connect("cancellable-changed", self._on_cancellable_changed)
#下载的进度信息
trans.connect("progress-details-changed", self._on_progress_download_changed)
trans.connect("status-details-changed", self._on_details_changed)
trans.connect("status-details-changed", self._on_details_changed,action)
trans.connect("error", self._on_error_changed)
trans.connect("config-file-conflict", self._on_config_file_conflict)

View File

@ -18,6 +18,7 @@ from SystemUpdater.Core.DataAcquisition import get_east_8_time
from apt import Cache
import subprocess
from SystemUpdater.Core.UpdateList import LocalUpgradeDataList
class NowUpgradePara:
"""
Represent the (potentially partial) results of an unattended-upgrades
@ -32,6 +33,24 @@ class NowUpgradePara:
#推送的可升级的单包
self.single_pkgs = single_pkgs
class AptdBaseInformation:
"""
进度 状态 状态细节信息
"""
def __init__(self,
progress = 0,
status='',
details='',
cancelable = False,
error_details = '',
):
self.progress = progress
self.status = status
self.details = details
self.cancelable = cancelable
self.error_details = error_details
class InstallBackend():
INSTALL_OUTPUT_JSON = "/var/lib/kylin-system-updater/json/showdown_install.json"
@ -71,7 +90,7 @@ class InstallBackend():
self.window_main.now_working = action
self.trans_error_details = ''
self.aptd_base = AptdBaseInformation()
#更新的时候此对象还未生成
if self.window_main.update_list != None:
@ -646,10 +665,10 @@ class InstallBackend():
self.window_main.dbusController.UpdateDownloadFinished(success,upgrade_content,error_string,error_desc)
elif action == self.ACTION_UPDATE:
if success == False and 'The following signatures' in self.trans_error_details:
if success == False and 'The following signatures' in self.aptd_base.error_details:
error_desc = _("Check your source public key signature")
#网络认证错误
elif success == False and 'does the network require authentication?' in self.trans_error_details:
elif success == False and 'does the network require authentication?' in self.aptd_base.error_details:
error_desc = _("Check if your network requires authentication?")
if success and self.action_mode == self.MODE_UPDATE_ALL:
@ -683,7 +702,7 @@ class InstallBackend():
elif action == self.ACTION_INSTALL_DEB:
#FIXME: '\r\n: \r\n\r\n'就认为是验证失败
if success == False and '\r\n: \r\n\r\n' in self.trans_error_details:
if success == False and '\r\n: \r\n\r\n' in self.aptd_base.error_details:
error_string = _("Package validation failed and installation was rejected.")
error_desc = ''
self.window_main.dbusController.InstalldebFinished(success,error_string,error_desc)
@ -739,7 +758,7 @@ class InstallBackend():
false_num = 0
try:
#目前去掉打印 错误日志
# error_desc = error_desc +'\n\n'+self.trans_error_details
# error_desc = error_desc +'\n\n'+self.aptd_base.error_details
#在安装失败 and 不是取消升级 则走下面的 否则不计算全部直接插入数据库
if success == False and is_cancelled == False and self.action_mode != self.MODE_INSTALL_SYSTEM:
#获取当前系统中最新的cache