def __init__(self) -> None: self.console = Console(highlight=False) self._crawl_progress = Progress( TextColumn("{task.description}", table_column=Column(ratio=1)), BarColumn(), TimeRemainingColumn(), expand=True, ) self._download_progress = Progress( TextColumn("{task.description}", table_column=Column(ratio=1)), TransferSpeedColumn(), DownloadColumn(), BarColumn(), TimeRemainingColumn(), expand=True, ) self._live = Live(console=self.console, transient=True) self._update_live() self._showing_progress = False self._progress_suspended = False self._lock = asyncio.Lock() self._lines: List[str] = [] # Whether different parts of the output are enabled or disabled self.output_explain = False self.output_status = True self.output_report = True
def __init__(self): """Init Rich Console and Table""" super().__init__() # init ELF table self.table_elf = Table(title="Checksec Results: ELF", expand=True) self.table_elf.add_column("File", justify="left", header_style="") self.table_elf.add_column("NX", justify="center") self.table_elf.add_column("PIE", justify="center") self.table_elf.add_column("Canary", justify="center") self.table_elf.add_column("Relro", justify="center") self.table_elf.add_column("RPATH", justify="center") self.table_elf.add_column("RUNPATH", justify="center") self.table_elf.add_column("Symbols", justify="center") self.table_elf.add_column("FORTIFY", justify="center") self.table_elf.add_column("Fortified", justify="center") self.table_elf.add_column("Fortifiable", justify="center") self.table_elf.add_column("Fortify Score", justify="center") # init PE table self.table_pe = Table(title="Checksec Results: PE", expand=True) self.table_pe.add_column("File", justify="left", header_style="") self.table_pe.add_column("NX", justify="center") self.table_pe.add_column("Canary", justify="center") self.table_pe.add_column("ASLR", justify="center") self.table_pe.add_column("Dynamic Base", justify="center") self.table_pe.add_column("High Entropy VA", justify="center") self.table_pe.add_column("SEH", justify="center") self.table_pe.add_column("SafeSEH", justify="center") self.table_pe.add_column("Force Integrity", justify="center") self.table_pe.add_column("Control Flow Guard", justify="center") self.table_pe.add_column("Isolation", justify="center") # init console self.console = Console() # build progress bar self.process_bar = Progress( TextColumn("[bold blue]Processing...", justify="left"), BarColumn(bar_width=None), "{task.completed}/{task.total}", "•", "[progress.percentage]{task.percentage:>3.1f}%", console=self.console, ) self.display_res_bar = Progress( BarColumn(bar_width=None), TextColumn("[bold blue]{task.description}", justify="center"), BarColumn(bar_width=None), console=self.console, transient=True, ) self.enumerate_bar = Progress( TextColumn("[bold blue]Enumerating...", justify="center"), BarColumn(bar_width=None), console=self.console, transient=True, ) self.process_task_id = None
def do_speed_test( server: Optional[str] = None, disable: Optional[str] = None, up_threads: Optional[int] = None, dl_threads: Optional[int] = None, ) -> SpeedResult: """ 进行 SpeedTest 测试 服务器列表 ID 可以从这儿获取: https://williamyaps.github.io/wlmjavascript/servercli.html 每次仅允许测试一个服务器 :param server: 期望的服务器ID (ID 来自于 SpeedTest 官网) :param disable: up|down 禁止测试 上传/下载 :param up_threads: 上传线程数量 :param dl_threads: 下载线程数量 """ st = Speedtest() st.get_servers(servers=None if server is None else [server]) server = st.best if disable != "up": with Progress( "[progress.description]{task.description}", BarColumn(), "{task.completed} / {task.total}", TimeElapsedColumn(), ) as progress: task_id = progress.add_task(f"上传: {server['host']}") def up_cb(idx, total, **kwargs): speed_test_cb(progress, task_id, idx, total, **kwargs) st.upload(threads=up_threads, callback=up_cb) if disable != "dl": with Progress( "[progress.description]{task.description}", BarColumn(), "{task.completed} / {task.total}", TimeElapsedColumn(), ) as progress: task_id = progress.add_task(f"下载: {server['host']}") def dl_cb(idx, total, **kwargs): speed_test_cb(progress, task_id, idx, total, **kwargs) st.download(threads=dl_threads, callback=dl_cb) return SpeedResult(**st.results.dict())
def remove_unused_cms(self): if len(self.unused_cms) == 0: print("There is no unused CMS") else: choice = Prompt.ask("Do you want to clean up {} unused CMS".format(len(self.unused_cms)), choices=["Y", "N"]) if choice == 'Y': failed_cms = [] t = timer() with MyProgress("[progress.description]{task.description}", BarColumn(), TextColumn(text_format="[progress.percentage]{task.percentage:>3.0f}% [green]{task.completed} of {task.total} [bold green] | Success: [bold white]{task.fields[success]} | [bold red]Faied: [bold white]{task.fields[failed]} "), "Took [bold blue]{task.fields[time_elapsed]}s") as progress: task = progress.add_task(total=len(self.unused_cms), description='Deleting unused CMS', success=0, failed=0, time_elapsed=0) for cms_item in self.unused_cms: delete_cmd = 'rm -rf {}'.format(cms_item.get_dir()) out = subprocess.Popen(delete_cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE) out.communicate() status_code = out.poll() self.success += 1 if status_code == 0 else 0 if status_code != 0: failed_cms.append(cms_item) self.failed += 1 progress.advance(task) progress.update(task, success=self.success, failed=self.failed, time_elapsed=int(timer() - t)) if len(failed_cms) > 0: console.print("[bold red]These CMS are failed to delete:") for cms_item in failed_cms: console.print('[bold purple]' + str(cms_item))
def dump_mem(vm_name: Optional[str], kvm_unix_socket: Optional[str], output_file: Optional[str]): # prepare drivers init params init_params = DriverInitParamsPy() common = CommonInitParamsPy() common.vm_name = vm_name init_params.common = common if kvm_unix_socket: kvm = KVMInitParamsPy() kvm.unix_socket = kvm_unix_socket init_params.kvm = kvm # init libmicrovmi micro = Microvmi(None, init_params) destination = output_file.format(vm_name=vm_name) with pause_ctxt(micro): max_addr = micro.max_addr print(f"Dumping physical memory on {vm_name} until 0x{max_addr:X} to {destination}") with open(destination, "wb") as f: with Progress( "[progress.description]{task.description}", TextColumn("[bold yellow]0x{task.completed:X}"), BarColumn(bar_width=None), "[progress.percentage]{task.percentage:>3.0f}%", transient=True, ) as progress: dump_task = progress.add_task("Dumping ", total=max_addr) mem = micro.padded_memory for addr in range(0, max_addr, READ_SIZE): logging.debug("dumping at 0x%x", addr) current_chunk_size = min(READ_SIZE, max_addr - addr) buffer = mem.read(current_chunk_size) f.write(buffer) progress.update(dump_task, advance=READ_SIZE)
def _create_rich_progress(self): desc_column = TextColumn("{task.description}", table_column=Column(ratio=1)) bar_column = BarColumn(bar_width=None, table_column=Column(ratio=2)) progress = Progress(desc_column, bar_column, "[progress.percentage]{task.percentage}%", expand=True) return progress
def run(): client = vision.ImageAnnotatorClient() # Locate valid files files = os.listdir(INPUT_PATH) select = list(filter(lambda file: valid_extension(get_extension(file)), files)) if len(select) == 0: logger.fatal("No valid files located.") return else: logger.info(f"Found {len(select)} valid files") # Create the 'temp' directory if not os.path.exists(TEMP_PATH): logger.info("Creating temporary processing directory") os.makedirs(TEMP_PATH) try: with Progress("[progress.description]{task.description}", BarColumn(bar_width=None), "[progress.percentage]{task.percentage:>3.0f}%") as progress: mp = MasterFileProcessor(select, 10, convert_to_bytes("1780 KB"), True, client=client, progress=progress) logger.info('MasterFileProcessor created.') mp.load() logger.info('Finished loading/starting initial threads.') mp.join() logger.info('Finished joining threads, now quitting.') except Exception as error: logger.error(str(error)) raise finally: os.rmdir(TEMP_PATH) logger.info("Temporary directory removed.")
def predict(trainData, trainLabel, testData, K=27): ''' 测试模型正确率 =========== Arguments --------- - `trainData` 训练集数据集 - `trainLabel` 训练集标记 - `testData` 测试集数据集 - `K` 选择近邻数 Returns ------- - `predictLabel` 预测标签 ''' predictLabel = [] progress = Progress( "[progress.description]{task.description}", BarColumn(bar_width=None), "[progress.percentage]{task.completed}/{task.total}", "•", TimeRemainingColumn(), ) # rich 进度条 progress.start() testTask = progress.add_task("[cyan]predicting...", total=len(testData)) for x in testData: predictLabel.append(NearestNeighbor(trainData, trainLabel, x, K)) # 预测标签分类 progress.update(testTask, advance=1) progress.stop() return predictLabel
def upload_osf(params_str, build, title, detach, force, update): params = {e.split('=')[0]: e.split('=')[1] for e in params_str.split()} dst = params['folder'] with Progress( TAB + "> Retrieving list of files in the project... [IN PROGRESS]\n", transient=True, ) as progress: _ = progress.add_task("Retrieving...") osf_files = osf('-p', params['project'], '-u', params['user'], 'ls', _env={'OSF_PASSWORD': get_password()}) print(TAB + "> Retrieving list of files in the project... [green][DONE]\n") osf_files = [f.replace('osfstorage/', '').strip() for f in osf_files] files = get_list_of_files(build) with Progress( TAB + "> Uploading... [IN PROGRESS]\n", BarColumn(30), TimeRemainingColumn(), "| ({task.completed}/{task.total}) Uploading [blue]{task.fields[file]} [white]" "{task.fields[error]}", transient=True, ) as progress: task = progress.add_task("Uploading...", total=len(files), error="", file=files[0]) for file in files: error = "" dst_file = file.replace(build, dst + '/') if not update or dst_file not in osf_files: for j in range(MAX_RETRY): try: osf('-p', params['project'], '-u', params['user'], 'upload', '-f', file, dst_file, _env={'OSF_PASSWORD': get_password()}) break except Exception as e: log.debug(e) error = '\n| ({}/{}) Failed to upload document {}'.format( j + 1, MAX_RETRY, file) error += '\n| {}'.format(str(e)) progress.update(task, advance=0, error=error, file=file) else: error = "\n| Skip as document exists already" progress.update(task, advance=1, error=error, file=file) print(TAB + "> Upload... [green][DONE]\n")
def backup_wtf(self, console): zipf = zipfile.ZipFile( Path('WTF-Backup', f'{datetime.datetime.now().strftime("%d%m%y")}.zip'), 'w', zipfile.ZIP_DEFLATED) filecount = 0 for root, dirs, files in os.walk('WTF/', topdown=True): files = [f for f in files if not f[0] == '.'] dirs[:] = [d for d in dirs if not d[0] == '.'] filecount += len(files) with Progress('{task.completed}/{task.total}', '|', BarColumn(bar_width=None), '|', auto_refresh=False, console=console) as progress: task = progress.add_task('', total=filecount) while not progress.finished: for root, dirs, files in os.walk('WTF/', topdown=True): files = [f for f in files if not f[0] == '.'] dirs[:] = [d for d in dirs if not d[0] == '.'] for f in files: zipf.write(Path(root, f)) progress.update(task, advance=1, refresh=True) zipf.close()
def backup_wtf(self, console): archive = Path('WTF-Backup', f'{datetime.datetime.now().strftime("%d%m%y")}.zip') if os.path.isfile(archive): suffix = 1 while True: archive = Path('WTF-Backup', f'{datetime.datetime.now().strftime("%d%m%y")}-{suffix}.zip') if not os.path.isfile(archive): break suffix += 1 zipf = zipfile.ZipFile(archive, 'w', zipfile.ZIP_DEFLATED) filecount = 0 for _, _, files in os.walk('WTF/', topdown=True, followlinks=True): files = [f for f in files if not f[0] == '.'] filecount += len(files) if filecount > 0: with Progress('{task.completed}/{task.total}', '|', BarColumn(bar_width=None), '|', auto_refresh=False, console=console) as progress: task = progress.add_task('', total=filecount) while not progress.finished: for root, _, files in os.walk('WTF/', topdown=True, followlinks=True): files = [f for f in files if not f[0] == '.'] for f in files: zipf.write(Path(root, f)) progress.update(task, advance=1, refresh=True) zipf.close()
def get_bolumler(self, isim): """ Animenin bölümlerini {bölüm,title} formatında döndürür. """ with Progress(SpinnerColumn(), '[progress.description]{task.description}', BarColumn(bar_width=40)) as progress: task = progress.add_task("[cyan]Bölümler getiriliyor..", start=False) anime_slug = self.tamliste[isim] raw = self.driver.execute_script( f"return $.get('/anime/{anime_slug}')") soup = bs4(raw, "html.parser") self.anime_ismi = soup.title.text anime_code = soup.find('meta', { 'name': 'twitter:image' }).get('content').split('lerb/')[1][:-4] raw = self.driver.execute_script( f"return $.get('https://www.turkanime.net/ajax/bolumler&animeId={anime_code}')" ) soup = bs4(raw, "html.parser") bolumler = [] for bolum in soup.findAll("span", {"class": "bolumAdi"}): bolumler.append({ 'name': bolum.text, 'value': bolum.findParent().get("href").split("video/")[1] }) progress.update(task, visible=False) return bolumler
def put( self, path: str, key: str, acl: str = "public-read", metadata: dict = {} ) -> dict: with Progress( SpinnerColumn(spinner_name="earth"), TextColumn("[progress.description]{task.description}"), BarColumn(bar_width=30), TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), TimeRemainingColumn(), transient=True, ) as progress: size = os.stat(path).st_size task = progress.add_task( f"[green]Uploading [bold]{os.path.basename(path)}[/bold]", total=size ) def update_progress(complete): progress.update(task, completed=complete) try: response = self.client.upload_file( path, self.bucket, key, ExtraArgs={"ACL": acl, "Metadata": metadata}, Callback=update_progress, ) except ClientError as e: logging.error(e) return {} return response
def test_expand_bar() -> None: console = Console(file=io.StringIO(), force_terminal=True, width=10) progress = Progress(BarColumn(bar_width=None), console=console) progress.add_task("foo") progress.refresh() expected = "\x1b[38;5;237m━━━━━━━━━\x1b[0m \r\x1b[2K\x1b[38;5;237m━━━━━━━━━\x1b[0m " assert console.file.getvalue() == expected
def do_multi_ping( hosts: dict, count: int = 8, interval: float = 0.01, timeout: int = 2 ) -> List[PingResult]: pool = ThreadPoolExecutor(thread_name_prefix="ping") with Progress( "[progress.description]{task.description}", BarColumn(), "{task.completed} / {task.total}", TimeRemainingColumn(), transient=True, ) as progress: jobs = [] offset = 0 for host, cc in hosts.items(): offset += 1 job = pool.submit( do_one_ping_wrapper, seq_offset=offset * len(hosts) * count, host=host, cc=cc, count=count, interval=interval, timeout=timeout, progress=progress, ) jobs.append(job) sleep(0.5) # fixme there is a deadlock in rich, need more inspect results: List[Optional[PingResult]] = list(map(lambda x: x.result(), jobs)) results: List[PingResult] = list(filter(lambda x: x is not None, results)) return results
def __init__(self, host: str, port: int, user: str, password: str, **kwargs): super().__init__(host, port, user, password) if not host: raise ChannelError("no host address provided") if port is None: raise ChannelError("no port provided") with Progress( f"connecting to [blue]{host}[/blue]:[cyan]{port}[/cyan]", BarColumn(bar_width=None), transient=True, ) as progress: task_id = progress.add_task("connecting", total=1, start=False) # Connect to the remote host client = socket.create_connection((host, port)) progress.update(task_id, visible=False) progress.log( f"connection to " f"[blue]{host}[/blue]:[cyan]{port}[/cyan] [green]established[/green]" ) self.client = client self.address = (host, port)
def UploadFile(socket, address, key, size_uncompressed, size_compressed, buffer=2048): with open("temp.tar.gz", "rb") as f: file_hash_uc = SHA512.new(); file_hash_c = SHA512.new(); for address_singular in address: with open(address_singular, "rb") as filehandle: while True: block = filehandle.read(buffer); if not block: break; file_hash_uc.update(block); with Progress(TextColumn("[bold blue]{task.description}", justify="right"), BarColumn(bar_width=None), "[progress.percentage]{task.percentage:>3.1f}%", "•", DownloadColumn(), "•", TransferSpeedColumn(), "•", TimeRemainingColumn(),) as progress: task = progress.add_task("Uploading file(s)", total=size_compressed); while not progress.finished: l = f.read(buffer); if not l: break; select.select([], [socket], []); sendEncryptedMessage(socket, l, key); progress.update(task, advance=len(l)); file_hash_c.update(l); return (file_hash_uc, file_hash_c);
def download(self, batch, articles, folder): """ Download a pdf batch """ log_file = os.path.join(folder, 'missing.log') logger.remove() logger.add(log_file, format="{time} {level} {message}", mode='w', level="INFO") assert len(articles) > 0, 'no article.' progress = Progress(TextColumn( "[progress.description]{task.description}", table_column=Column(ratio=1)), TimeElapsedColumn(table_column=Column(ratio=1)), BarColumn(table_column=Column(ratio=2)), "| {task.completed} of {task.total:>2.0f}", expand=False) missing = 0 with progress: task = progress.add_task(f" {batch} |", total=len(articles)) for article in articles: done = self.get_article( article['article_url'], os.path.join(folder, article['file_name'])) if done: progress.update(task, advance=1) else: missing += 1 logger.info("NOT_FOUND_IN_SCI-HUB | " + article['warning_str']) return missing, log_file
def c_uninstall(self, args): if args: addons = [ addon.strip() for addon in list(reader([args], skipinitialspace=True))[0] ] with Progress('{task.completed}/{task.total}', '|', BarColumn(bar_width=None), '|', auto_refresh=False, console=self.console) as progress: task = progress.add_task('', total=len(addons)) while not progress.finished: for addon in addons: name, version = self.core.del_addon(addon) if name: self.table.add_row( f'[bold red]Uninstalled[/bold red]', name, version) else: self.table.add_row( f'[bold black]Not installed[/bold black]', addon, '') progress.update(task, advance=1, refresh=True) self.console.print(self.table) else: self.console.print( '[green]Usage:[/green]\n\tThis command accepts a comma-separated list of addon names or ' 'full links as an argument.\n[bold green]Supported URL:[/bold green]\n\thttps://www.curs' 'eforge.com/wow/addons/[[addon_name]]\n\thttps://www.wowinterface.com/downloads/[[addon_' 'name]]\n\thttps://www.tukui.org/addons.php?id=[[addon_id]]\n\thttps://www.tukui.org/cla' 'ssic-addons.php?id=[[addon_id]]\n\thttps://github.com/[[username]]/[[repository_name]]', highlight=False)
async def load_packages(self): if packages: with Progress("Launching Tuxbot", BarColumn(bar_width=None), transient=True) as progress: task = progress.add_task("Loading packages...", total=len(packages)) for package in packages: try: self.load_extension(package) progress.log( f"[u]{package}[/u]'s [cyan]package[/cyan] [green]loaded[/green]" ) log.info("Package %s loaded", package) except Exception as e: log.exception("Failed to load package %s", package, exc_info=e) progress.log( f"[red]Failed to load package {package} " f"[i](see " f"{str((self.logs / 'tuxbot.log').resolve())} " f"for more details)[/i]") progress.advance(task)
def __init__(self, host: str, port: int, user: str, password: str, **kwargs): super().__init__(host, port, user, password) if not host or host == "": host = "0.0.0.0" if port is None: raise ChannelError(f"no port specified") with Progress( f"bound to [blue]{host}[/blue]:[cyan]{port}[/cyan]", BarColumn(bar_width=None), transient=True, ) as progress: task_id = progress.add_task("listening", total=1, start=False) # Create the socket server server = socket.create_server((host, port), reuse_port=True) try: # Wait for a connection (client, address) = server.accept() except KeyboardInterrupt: raise ChannelError("listener aborted") progress.update(task_id, visible=False) progress.log( f"[green]received[/green] connection from [blue]{address[0]}[/blue]:[cyan]{address[1]}[/cyan]" ) self.client = client self.address = address
def check_remote_servers(logger, servers): check_result = dict() progress = Progress( "{task.description}", SpinnerColumn(), BarColumn(), TextColumn("[progress.percentage]{task.percentage:>3.0f}%"), ) with progress: with ThreadPoolExecutor() as pool: for server in servers: if server["check"] == "False": continue reader = DriverReader(progress) tinfo = pool.submit( reader.get_remote_drivers, server["ip"], server["user"], server["password"], server["ssh_port"], server["query"], ) check_result[server["ip"]] = tinfo for ip in check_result: drivers, wu_drivers, noinfo_drivers = check_result[ip].result() check_result[ip] = { "drivers": drivers, "weak-update-drivers": wu_drivers, "noinfo-drivers": noinfo_drivers, } progress.console.print("[green]Check completed![/]") return check_result
def default_transient_progress(): return Progress( "[progress.dexcription]{task.description}", BarColumn(), console=console, transient=True, )
def c_uninstall(self, args): if args: optkeep = False pargs = split(args) if '-k' in pargs: optkeep = True args = args.replace('-k', '', 1) addons = self.parse_args(args) with Progress('{task.completed}/{task.total}', '|', BarColumn(bar_width=None), '|', auto_refresh=False, console=self.console) as progress: task = progress.add_task('', total=len(addons)) while not progress.finished: for addon in addons: name, version = self.core.del_addon(addon, optkeep) if name: self.table.add_row(f'[bold red]Uninstalled[/bold red]', Text(name, no_wrap=True), Text(version, no_wrap=True)) else: self.table.add_row(f'[bold black]Not installed[/bold black]', Text(addon, no_wrap=True), Text('', no_wrap=True)) progress.update(task, advance=1, refresh=True) self.console.print(self.table) else: self.console.print('[green]Usage:[/green]\n\tThis command accepts a space-separated list of addon names or ' 'full links as an argument.\n\t[bold white]Flags:[/bold white]\n\t\t[bold white]-k[/bold' ' white] - Keep the addon files after uninstalling.', highlight=False)
def create_progress_bar(): """ Create progress bar to display overall progress. Returns rich.progress.Progress instance if the Rich Python package is available, or a shim DummyProgress instance otherwise. """ if use_rich() and build_option('show_progress_bar'): # pick random spinner, from a selected subset of available spinner (see 'python3 -m rich.spinner') spinner = random.choice(('aesthetic', 'arc', 'bounce', 'dots', 'line', 'monkey', 'point', 'simpleDots')) progress_bar = Progress( SpinnerColumn(spinner), "[progress.percentage]{task.percentage:>3.1f}%", TextColumn( "[bold blue]Installing {task.description} ({task.completed:.0f}/{task.total} done)" ), BarColumn(bar_width=None), TimeElapsedColumn(), transient=True, expand=True, ) else: progress_bar = DummyProgress() return progress_bar
def start(self, *, total: Optional[float], at: float, description: str) -> None: from rich.progress import ( Progress, BarColumn, DownloadColumn, TimeRemainingColumn, TransferSpeedColumn, ) assert total is not None self.console.print(f'[progress.description]{description}') self.progress_bar = Progress( '[', BarColumn(), ']', '[progress.percentage]{task.percentage:>3.0f}%', '(', DownloadColumn(), ')', TimeRemainingColumn(), TransferSpeedColumn(), console=self.console, transient=True) self.progress_bar.start() self.transfer_task = self.progress_bar.add_task(description, completed=at, total=total)
def c_install(self, args): if args: if args.startswith('-i '): args = args[3:] optignore = True else: optignore = False addons = [addon.strip() for addon in list(reader([args], skipinitialspace=True))[0]] with Progress('{task.completed}/{task.total}', '|', BarColumn(bar_width=None), '|', auto_refresh=False, console=self.console) as progress: task = progress.add_task('', total=len(addons)) while not progress.finished: for addon in addons: installed, name, version = self.core.add_addon(addon, optignore) if installed: self.table.add_row('[green]Installed[/green]', name, version) else: self.table.add_row('[bold black]Already installed[/bold black]', name, version) progress.update(task, advance=1, refresh=True) self.console.print(self.table) else: self.console.print('[green]Usage:[/green]\n\tThis command accepts a comma-separated list of links as an arg' 'ument.\n\tOption [bold white]-i[/bold white] will disable the client version check.\n[b' 'old green]Supported URL:[/bold green]\n\thttps://www.curseforge.com/wow/addons/[[addon_' 'name]] [bold white]|[/bold white] cf:[[addon_name]]\n\thttps://www.wowinterface.com/dow' 'nloads/[[addon_name]] [bold white]|[/bold white] wowi:[[addon_id]]\n\thttps://www.tukui' '.org/addons.php?id=[[addon_id]] [bold white]|[/bold white] tu:[[addon_id]]\n\thttps://w' 'ww.tukui.org/classic-addons.php?id=[[addon_id]] [bold white]|[/bold white] tuc:[[addon_' 'id]]\n\tElvUI [bold white]|[/bold white] ElvUI:Dev\n\tTukui\n\tSLE:Dev', highlight=False)
class ProgressBar: OPTIONS = [ "[progress.description]{task.description}", BarColumn(), "[progress.percentage]{task.completed:>6}/{task.total}", TimeElapsedColumn(), ] def __init__(self, description, total): self.description = description self.total = total def __enter__(self): self.progress = Progress(*self.OPTIONS) self.progress.start() self.task = self.progress.add_task(self.description, total=self.total) return self def __exit__(self, exc_type, exc_val, exc_tb): self.progress.stop() def print(self, message): self.progress.console.print(message) def advance(self, advance=1): self.progress.update(self.task, advance=advance)
def check_cdn(original_targets, checkcdn): targets = [] # 有效的目标,加上解析出的ip valid_targets = [] # 有效的目标 # 创建一个事件循环 loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) # 创建一个线程池,开启100个线程 threads = ThreadPoolExecutor(100) # 这一步很重要, 使用线程池访问,使用loop.run_in_executor()函数:内部接受的是阻塞的线程池,执行的函数,传入的参数 tasks = [] # 进度条设置 from rich.progress import ( BarColumn, TimeRemainingColumn, TransferSpeedColumn, Progress, ) progress = Progress( "[progress.description]{task.description}", BarColumn(), "[progress.percentage]{task.percentage:>3.1f}%", "•", "[bold green]{task.completed}/{task.total}", "•", TransferSpeedColumn(), "•", TimeRemainingColumn(), transient=True, # 100%后隐藏进度条 ) with progress: progress_bar = progress.add_task("[cyan]DNS, CDN detection...", total=len(original_targets)) for target in original_targets: target = target.replace('\n', '').replace('\r', '').strip() tasks.append( loop.run_in_executor(threads, run, target, checkcdn, progress_bar, progress)) if len(tasks) > 0: # 使用uvloop加速asyncio, 目前不支持Windows import platform if platform.system() != "Windows": import uvloop asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) # 等待所有的任务完成 tasks_result = asyncio.wait(tasks) loop.run_until_complete(tasks_result) for i in tasks: url_ip_list, valid_domain = i.result() targets.extend(url_ip_list) if valid_domain: valid_targets.append(valid_domain) return list(set(targets)), valid_targets
def test_bar_columns(): bar_column = BarColumn(100) assert bar_column.bar_width == 100 task = Task(1, "test", 100, 20, _get_time=lambda: 1.0) bar = bar_column(task) assert isinstance(bar, Bar) assert bar.completed == 20 assert bar.total == 100