# -*- coding: utf-8 -*- from .base import BaseTool from .base import PrintUtils,CmdTask,FileUtils,AptUtils,ChooseTask from .base import osversion from .base import run_tool_file ubuntu_ports_sources_template = """ deb <sources>/ <code-name> main restricted universe multiverse deb <sources>/ <code-name>-updates main restricted universe multiverse deb <sources>/ <code-name>-backports main restricted universe multiverse deb <sources>/ <code-name>-security main restricted universe multiverse """ ubuntu_amd64_sources_template = """ deb <sources>/ <code-name> main restricted universe multiverse deb <sources>/ <code-name>-updates main restricted universe multiverse deb <sources>/ <code-name>-backports main restricted universe multiverse deb <sources>/ <code-name>-security main restricted universe multiverse """ debian_amd64_sources_template = """ deb <sources>/ <code-name> main contrib non-free deb <sources>/ <code-name>-updates main contrib non-free deb <sources>/ <code-name>-backports main contrib non-free deb <sources>-security <code-name>/updates main contrib non-free """ ubuntu_ports_deb822_template = """ Types: deb URIs: <sources>/ Suites: <code-name> <code-name>-updates <code-name>-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg Types: deb URIs: <sources>/ Suites: <code-name>-security Components: main universe restricted multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg """ ubuntu_amd64_deb822_template = """ Types: deb URIs: <sources>/ Suites: <code-name> <code-name>-updates <code-name>-backports Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg # 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换 Types: deb URIs: <sources>/ Suites: <code-name>-security Components: main restricted universe multiverse Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg """ class Tool(BaseTool): def __init__(self): self.type = BaseTool.TYPE_CONFIG self.name = "一键更换系统源" self.author = '小鱼' def add_ros_source(self): """快速添加ROS源""" dic = {1:"添加ROS/ROS2源",2:"不添加ROS/ROS2源"} code,result = ChooseTask(dic, "请问是否添加ROS和ROS2源?").run() if code==2: return tool = run_tool_file('tools.tool_install_ros',authorun=False) if not tool.support_install(): return False tool.add_key() tool.add_source() def clean_old_source(self): dic = {1:"仅更换系统源",2:"更换系统源并清理第三方源"} code,result = ChooseTask(dic, "请选择换源方式,如果不知道选什么请选2").run() FileUtils.delete('/etc/apt/sources.list') if code==2: print("删除一个资源文件") FileUtils.delete('/etc/apt/sources.list.d') # fix add source failed before config system source CmdTask('sudo mkdir -p /etc/apt/sources.list.d').run() def get_source_by_system(self,system,codename,arch,failed_sources=[]): # 实际测试发现,阿里云虽然延时很低,但是带宽也低的离谱,一点都不用心,删掉了 ubuntu_amd64_sources = [ "https://mirrors.tuna.tsinghua.edu.cn/ubuntu", # "https://mirrors.aliyun.com/ubuntu", # "https://mirrors.163.com/ubuntu", "https://mirrors.ustc.edu.cn/ubuntu", "https://archive.ubuntu.com/ubuntu", "https://mirrors.kernel.org/ubuntu", "http://mirrors.tuna.tsinghua.edu.cn/ubuntu", # "http://mirrors.aliyun.com/ubuntu", # "http://mirrors.163.com/ubuntu", "http://mirrors.ustc.edu.cn/ubuntu", "http://archive.ubuntu.com/ubuntu", "http://mirrors.kernel.org/ubuntu", ] ubuntu_ports_sources = [ "https://ports.ubuntu.com/ubuntu-ports", # "https://mirrors.aliyun.com/ubuntu-ports", "https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports", "https://ports.ubuntu.com/ubuntu-ports", # "https://mirrors.aliyun.com/ubuntu-ports", "https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports", "http://ports.ubuntu.com/ubuntu-ports", # "https://mirrors.aliyun.com/ubuntu-ports", "http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports", "http://ports.ubuntu.com/ubuntu-ports", # "https://mirrors.aliyun.com/ubuntu-ports", "http://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports", ] debian_amd64_sources = [ "https://mirrors.tuna.tsinghua.edu.cn/debian", "https://mirrors.aliyun.com/debian", # "https://mirrors.163.com/debian", "https://mirrors.ustc.edu.cn/debian", "https://deb.debian.org/debian", "https://mirrors.kernel.org/debian", "http://mirrors.tuna.tsinghua.edu.cn/debian", "http://mirrors.aliyun.com/debian", # "http://mirrors.163.com/debian", "http://mirrors.ustc.edu.cn/debian", "http://deb.debian.org/debian", "http://mirrors.kernel.org/debian", ] sources = [] template = ubuntu_amd64_sources_template if system=='ubuntu': if arch=='amd64': sources = ubuntu_amd64_sources template = ubuntu_amd64_sources_template else: sources = ubuntu_ports_sources template = ubuntu_ports_sources_template elif system=='debian': if arch=='amd64': template = debian_amd64_sources_template sources = debian_amd64_sources PrintUtils.print_delay('搜索到可用源:{}'.format(sources),0.002) PrintUtils.print_delay('接下来将进行自动测速以为您选择最快的源:') fast_source = AptUtils.get_fast_url(sources) if len(failed_sources)>0: PrintUtils.print_warn('接下来为您排除已经失败的源') for source in fast_source: if source in failed_sources: PrintUtils.print_info('{} 已经测试失败,跳过!'.format(source)) else: return source,template else: return fast_source[0],template return None,None def replace_source(self,failed_sources=[]): arch = AptUtils.getArch() name = osversion.get_name() codename = osversion.get_codename() if name.find("ubuntu")>=0: system = 'ubuntu' elif name.find("debian")>=0: system = 'debian' else: return None PrintUtils.print_delay('检测到当前系统:{} 架构:{} 代号:{},正在为你搜索适合的源...'.format(system,arch,codename)) source,template = self.get_source_by_system(system,codename,arch,failed_sources) if not source: return None PrintUtils.print_success('为您选择最快镜像源:{}'.format(source)) FileUtils.new('/etc/apt/','sources.list',template.replace("<code-name>",codename).replace('<sources>',source)) return source def change_sys_source(self): self.clean_old_source() failed_sources = [] source = self.replace_source(failed_sources) if source: PrintUtils.print_delay("替换镜像源完成,尝试进行更新....") result = CmdTask('sudo apt update',100).run() while result[0]!= 0: failed_sources.append(source) PrintUtils.print_warn("更新失败,尝试更换其他源") source = self.replace_source(failed_sources) result = CmdTask('sudo apt update',100).run() else: PrintUtils.print_error("没有找到合适的镜像源,臣妾告退!") # # update # PrintUtils.print_delay("替换完成,尝试第一次更新....") # result = CmdTask('sudo apt update',100).run() # # https error update second # if result[0]!= 0 and FileUtils.check_result(result[1]+result[2],['Certificate verification','证书']): # PrintUtils.print_delay("发生证书错误,尝试第二次更新....") # FileUtils.delete('/etc/apt/sources.list') # FileUtils.new('/etc/apt/','sources.list',source.replace("https://","http://").replace("<code-name>",osversion.get_codename())) # result = CmdTask('sudo apt update',100).run() # if result[0]!=0: # PrintUtils.print_info("更新失败,开始更换导入方式并三次尝试...") # result = CmdTask("sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9",10).run() # result = CmdTask("sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys DCC9EFBF77E11517",10).run() # result = CmdTask("sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 54404762BBB6E853",10).run() # result = CmdTask("sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654",10).run() # # sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys # # result = CmdTask("apt-get install debian-keyring debian-archive-keyring",10).run() # result = CmdTask("apt-key update",10).run() # result = CmdTask('sudo apt update',100).run() # if result[0]!=0: # PrintUtils.print_info("""如果出现问题NO_PUBKEY XXXXXXXX,请手动运行添加指令:apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX # 如:error: NO_PUBKEY 0E98404D386FA1D9 # 运行指令:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0E98404D386FA1D9 # """) # # final check if result[0]==0: PrintUtils.print_success("搞定了,不信你看,累死宝宝了,还不快去给小鱼点个赞~") PrintUtils.print_info(result[1]) PrintUtils.print_success("镜像更新完成.....") def run(self): # 正式的运行 self.change_sys_source() # 添加 ROS Source self.add_ros_source()