From e0e443a93c62b40d5718f3d36c1aa6760a99ab6b Mon Sep 17 00:00:00 2001 From: luoxueyi Date: Mon, 25 Jul 2022 11:42:53 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/SystemUpdater/UpdateManager.py | 4 ++-- backend/SystemUpdater/backend/__init__.py | 12 +++++++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/backend/SystemUpdater/UpdateManager.py b/backend/SystemUpdater/UpdateManager.py index aaa4eba..7ecaba5 100644 --- a/backend/SystemUpdater/UpdateManager.py +++ b/backend/SystemUpdater/UpdateManager.py @@ -776,9 +776,9 @@ class UpdateManager(): absolute_path, debname = os.path.split(deb_path) # 检查本地破损 try: - logging.info("Install package, open cache") + logging.info("Install deb package, open cache") deb_cache = Cache() - logging.info("Install package, check broken") + logging.info("Install deb package, check broken") broken_count = deb_cache._depcache.broken_count deb = DebPackage(deb_path, deb_cache) deb.check(allow_downgrade=True) diff --git a/backend/SystemUpdater/backend/__init__.py b/backend/SystemUpdater/backend/__init__.py index 7f6d243..6f47847 100644 --- a/backend/SystemUpdater/backend/__init__.py +++ b/backend/SystemUpdater/backend/__init__.py @@ -283,12 +283,22 @@ class InstallBackend(): self.install_deb(install_path = partial_upgrade_list, install_force = _is_install) except Exception as e: logging.error(str(e)) + # 安装在线包的接口 elif self.action == self.ACTION_BACKGROUND_UPGRADE: try: - pkgs_install = partial_upgrade_list + pkgs_install = [ str(pkg) for pkg in partial_upgrade_list] + logging.info("Install deb package, open cache") + cache = Cache() + for pkg_name in pkgs_install: + if pkg_name not in cache: + if "=" not in pkg_name or ("=" in pkg_name and pkg_name.split("=")[0] not in cache): + # 没找到包或格式不正确 + self.window_main.dbusController.UpdateInstallFinished(False, pkgs_install, "'"+pkg_name+"' is not in cache", "") + return self.commit(self.ACTION_INSTALL,pkgs_install,[],[]) except Exception as e: logging.error(str(e)) + self.window_main.dbusController.UpdateInstallFinished(False, pkgs_install, str(e), "") def update(self): """Run a update to refresh the package list""" From 2acc3ee4f67854495fb201ccd4156afa9c3d6a70 Mon Sep 17 00:00:00 2001 From: wangsong Date: Thu, 4 Aug 2022 09:43:11 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=AF=AD=E8=A8=80?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/kylin-system-updater | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/kylin-system-updater b/backend/kylin-system-updater index 0bb9d54..2fe08b5 100755 --- a/backend/kylin-system-updater +++ b/backend/kylin-system-updater @@ -65,7 +65,7 @@ if __name__ == "__main__": #当不存在语言变量时 默认显示中文 if not "LANGUAGE" in os.environ: - os.environ["LANGUAGE"] = "zh_CN" + os.environ["LANGUAGE"] = "zh_CN.UTF-8" #当不存在语言变量时 默认显示中文 if not "LANG" in os.environ: From a9da16070312f3f814af8e216281b197a0cb731b Mon Sep 17 00:00:00 2001 From: wangsong Date: Thu, 4 Aug 2022 14:35:33 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E8=B6=85=E6=97=B6=E5=90=8E=E7=9A=84=E5=BC=82=E5=B8=B8=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SystemUpdater/backend/InstallBackendAptdaemon.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/backend/SystemUpdater/backend/InstallBackendAptdaemon.py b/backend/SystemUpdater/backend/InstallBackendAptdaemon.py index 1957e69..3af7ba3 100644 --- a/backend/SystemUpdater/backend/InstallBackendAptdaemon.py +++ b/backend/SystemUpdater/backend/InstallBackendAptdaemon.py @@ -103,11 +103,11 @@ class InstallBackendAptdaemon(InstallBackend): else: #超时只单独进行解锁关机 self.window_main.inhibit_shutdown.unlock() - # self._action_done(self.ACTION_INSTALL, - # is_cancelled=False, success=False, - # #FIXME: 安装超时退出 - # error_string=_("Could not install the upgrades"), - # error_desc=_("Installtion timeout to exit Due to inactivity") + self.aptd_base.details) + self._action_done(self.ACTION_INSTALL, + is_cancelled=False, success=False, + #FIXME: 安装超时退出 + error_string=_("Could not install the upgrades"), + error_desc=_("Installtion timeout to exit Due to inactivity") + self.aptd_base.details) # self.window_main.dbusController.Quit(None) return False From acc7465137e8155cf9c7d88f49d3e495a186681b Mon Sep 17 00:00:00 2001 From: wangsong Date: Fri, 5 Aug 2022 11:05:46 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dapt=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=97=B6=E5=87=BA=E7=8E=B0=E5=8D=B8=E8=BD=BD=E9=87=8D=E8=A6=81?= =?UTF-8?q?=E8=BD=AF=E4=BB=B6=E5=8C=85=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=8C?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=E8=BF=9B=E8=A1=8C=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=B0=83=E6=95=B4=E9=80=BB=E8=BE=91=EF=BC=8C=E5=8A=A0?= =?UTF-8?q?=E5=85=A5=E6=A8=A1=E6=8B=9F=E8=AE=A1=E7=AE=97=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E7=B2=BE=E5=87=86=E8=AE=A1=E7=AE=97=E5=87=BA=E7=8E=B0=E7=9A=84?= =?UTF-8?q?=E7=A0=B4=E6=8D=9F=E4=BF=AE=E5=A4=8D=E6=96=B9=E6=A1=88=E7=9A=84?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=8A=9E=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/SystemUpdater/UpdateManager.py | 86 ++++++++--------------- backend/SystemUpdater/backend/__init__.py | 52 +++++++++++++- 2 files changed, 80 insertions(+), 58 deletions(-) diff --git a/backend/SystemUpdater/UpdateManager.py b/backend/SystemUpdater/UpdateManager.py index 7ecaba5..451a6a9 100644 --- a/backend/SystemUpdater/UpdateManager.py +++ b/backend/SystemUpdater/UpdateManager.py @@ -391,62 +391,18 @@ class UpdateManager(): raise UpdateProgressExit() def _check_system_broken(self,cache): - with cache.actiongroup(): - if cache.get_changes(): - cache.clear() - #获取出现破损状态包的数量 - wouldDelete = cache._depcache.broken_count - - if wouldDelete > 0: - broken_msg = get_broken_details(cache) - #获取那些依赖关系不满足导致的问题 - logging.info(broken_msg) - else: - logging.info("Check: System Apt Cache for Broken Successfully...") - return - try: - #计算依赖的解决方案 - cache.fix_broken() - except SystemError as e: - logging.error(e) - return - - pkgs_install = [] - pkgs_upgrade = [] - pkgs_remove = [] - - #计算修复破损包 方案 需要删除 新装那些包 - for pkg in 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) - except KeyError: - # pkg missing from fresh_cache can't be modified - pass - logging.warning("Fix broken Packages is need to install:%a and upgrade:%a and remove:%a",pkgs_install,pkgs_upgrade,pkgs_remove) - - #当存在需要卸载包的情况时 不进行修复 - if len(pkgs_remove) == 0: - logging.warning("start fix system broken pkgs...") - self.start_fix_broken() - else: - raw_description = [] - delete_desc = [] - #添加关于删除包的描述信息 - for pkg in pkgs_remove: - delete_desc.append('') - pkg_obj = self.cache[pkg] - raw_description.append(getattr(pkg_obj.candidate, "summary", '')) - - self.dbusController.UpdateFixBrokenStatus(True,True,pkgs_remove,raw_description,delete_desc,'','') - if cache.get_changes(): - cache.clear() - - raise UpdateProgressExit() + if cache.get_changes(): + cache.clear() + #获取出现破损状态包的数量 + if cache._depcache.broken_count > 0: + #线程获取详细的卸载软件包情况 + self.simulate_mode.start_caculate(["apt-get", "install","-f","--simulate"],thread=True) + else: + logging.info("Check: System Apt Cache for Broken Successfully...") + return + fix_backend = get_backend(self, InstallBackend.ACTION_CHECK_BROKEN) + fix_backend.start() + raise UpdateProgressExit() def _setup_dbus(self): # check if there is another g-a-i already and if not setup one @@ -995,7 +951,23 @@ class SimulateTerminal(): ZH_UNMET_DEPENDENCIES = '下列软件包有未满足的依赖关系:' EN_UNMET_DEPENDENCIES = 'The following packages have unmet dependencies:' def __init__(self): - pass + self.update_args = ["apt-get", "update"] + self.install_args = ["apt-get", "install","--simulate"] + + def _sub_emulate(self,args): + p = subprocess.run(args, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True) + logging.info(str(p.stdout)) + return p.stdout + + def start_caculate(self,args = [],thread = False): + tmp_str = '' + if thread is True: + threading_emulate = threading.Thread(target=self._sub_emulate,args=(args,)) + threading_emulate.start() + else: + p = subprocess.run(args, stdout=subprocess.PIPE,stderr=subprocess.STDOUT,text=True) + tmp_str = p.stdout + return tmp_str def _emulate_install(self,pkgs): args = ["apt-get", "install","--simulate"] diff --git a/backend/SystemUpdater/backend/__init__.py b/backend/SystemUpdater/backend/__init__.py index 6f47847..9217934 100644 --- a/backend/SystemUpdater/backend/__init__.py +++ b/backend/SystemUpdater/backend/__init__.py @@ -105,6 +105,7 @@ class InstallBackend(): ACTION_CLEAN = 8 ACTION_INSTALL_SHUTDOWN = 9 ACTION_BACKGROUND_UPGRADE = 10 + ACTION_CHECK_BROKEN = 11 MODE_DEFAULT_STATUS = -1 @@ -252,7 +253,37 @@ class InstallBackend(): self._action_done(self.action,False,True,'','') #修复未满足的依赖关系 与apt-get -f install匹配 + elif self.action == self.ACTION_CHECK_BROKEN: + try: + #计算依赖的解决方案 + self.cache.fix_broken() + except Exception as e: + logging.error(e) + raise UpdateBaseError(ERROR_RESOLVER_FAILED) + + pkgs_install,pkgs_upgrade,pkgs_remove = self._get_pkgs_from_cache(self.cache) + logging.warning("Fix broken Packages is need to install:%a and upgrade:%a and remove:%a",pkgs_install,pkgs_upgrade,pkgs_remove) + + #当存在需要卸载包的情况时 不进行修复 + if len(pkgs_remove) == 0: + logging.warning("start fix system broken pkgs...") + self.fix_broken() + else: + raw_description = [] + delete_desc = [] + #添加关于删除包的描述信息 + for pkg in pkgs_remove: + delete_desc.append('') + pkg_obj = self.cache[pkg] + raw_description.append(getattr(pkg_obj.candidate, "summary", '')) + + self.window_main.dbusController.UpdateFixBrokenStatus(True,True,pkgs_remove,raw_description,delete_desc,'','') + self._action_done(self.action,False,True,'','') + elif self.action == self.ACTION_FIX_BROKEN: + pkgs_install,pkgs_upgrade,pkgs_remove = self._get_pkgs_from_cache(self.cache) + + self.window_main.update_essential.check_essential(pkgs_remove) self.fix_broken() # 修复不完整的安装dpkg configure -a elif self.action == self.ACTION_FIX_INCOMPLETE: @@ -328,6 +359,25 @@ class InstallBackend(): """purge_packages""" raise NotImplementedError + def _get_pkgs_from_cache(self,cache): + pkgs_install = [] + pkgs_upgrade = [] + pkgs_remove = [] + + #计算修复破损包 方案 需要删除 新装那些包 + for pkg in 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) + except KeyError: + # pkg missing from fresh_cache can't be modified + pass + return pkgs_install,pkgs_upgrade,pkgs_remove + #从cache中拿到标记的列表 def _get_mark_from_cache(self,cache,_adjust_pkgs,upgrade_mode): pkgs_install = [] @@ -574,7 +624,7 @@ class InstallBackend(): error_string +' '+error_desc) #调用aptdeamon结束之后处理的地方 不管是出错还是正常都在此处理 - def _action_done(self, action, is_cancelled,success, error_string,error_desc,error_code=''): + def _action_done(self, action, is_cancelled,success, error_string='',error_desc='',error_code=''): #后端的状态 到空闲状态 self.window_main.now_working = self.ACTION_DEFUALT_STATUS From 0c9c4768222c2429de5fe0e737ce1bab70df0e10 Mon Sep 17 00:00:00 2001 From: luoxueyi Date: Thu, 28 Jul 2022 14:23:22 +0800 Subject: [PATCH 5/5] =?UTF-8?q?uu=20install=20signle=20=E4=B8=8D=E9=80=80?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/SystemUpdater/Core/utils.py | 19 +++++++++++++++++++ backend/SystemUpdater/UpdateManager.py | 5 +++-- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/backend/SystemUpdater/Core/utils.py b/backend/SystemUpdater/Core/utils.py index fbbaabc..6fff806 100644 --- a/backend/SystemUpdater/Core/utils.py +++ b/backend/SystemUpdater/Core/utils.py @@ -679,6 +679,25 @@ def kill_process(path): return False return True +def whether_to_quit_uu(): + osreleasedict={} + try: + with open('/etc/os-release') as f: + lines = f.readlines() + for line in lines: + ls = line.strip().split('=',1) + osreleasedict.update({ls[0]:ls[1].strip('"')}) + except Exception as e: + pass + if 'SUB_PROJECT_CODENAME' not in osreleasedict.keys(): + osreleasedict.update({'SUB_PROJECT_CODENAME':''}) + if 'PROJECT_CODENAME' in osreleasedict: + if osreleasedict['PROJECT_CODENAME']=='V10SP1-edu': + if 'SUB_PROJECT_CODENAME' in osreleasedict: + if osreleasedict['SUB_PROJECT_CODENAME']=='mavis': + return False + return True + def get_proc_from_dbus_name(dbus_name, bus=None): """Return a deferred that gets the id of process owning the given system D-Bus name. diff --git a/backend/SystemUpdater/UpdateManager.py b/backend/SystemUpdater/UpdateManager.py index 451a6a9..06a9b4f 100644 --- a/backend/SystemUpdater/UpdateManager.py +++ b/backend/SystemUpdater/UpdateManager.py @@ -30,7 +30,7 @@ from .Core.DataAcquisition import UpdateMsgCollector from SystemUpdater.Core.UpdaterConfigParser import UpgradeConfig from SystemUpdater.Core.utils import get_broken_details,kill_process from SystemUpdater.Core.DpkgInstallProgress import LogInstallProgress -from SystemUpdater.Core.utils import deb_verify,PolicyKit_Authority,get_proc_from_dbus_name +from SystemUpdater.Core.utils import deb_verify,PolicyKit_Authority,get_proc_from_dbus_name,whether_to_quit_uu class UpdateManager(): BACKEND_PKG_NAME = 'kylin-system-updater' @@ -194,7 +194,8 @@ class UpdateManager(): resolver_backend.start(upgrade_content) else: if not_resolver == True: - kill_process(self.RUN_UNATTENDED_UPGRADE) + if upgrade_mode == InstallBackend.MODE_INSTALL_SINGLE and whether_to_quit_uu: + kill_process(self.RUN_UNATTENDED_UPGRADE) install_backend = get_backend(self, InstallBackend.ACTION_INSTALL,upgrade_mode) install_backend.start(upgrade_content) else: