123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- import json
- import os
- import sys
- import traceback
- import platform
- import hashlib
- import pkg_resources
- import psutil
- import re
- import launch
- from modules import paths_internal, timer
- checksum_token = "DontStealMyGamePlz__WINNERS_DONT_USE_DRUGS__DONT_COPY_THAT_FLOPPY"
- environment_whitelist = {
- "GIT",
- "INDEX_URL",
- "WEBUI_LAUNCH_LIVE_OUTPUT",
- "GRADIO_ANALYTICS_ENABLED",
- "PYTHONPATH",
- "TORCH_INDEX_URL",
- "TORCH_COMMAND",
- "REQS_FILE",
- "XFORMERS_PACKAGE",
- "GFPGAN_PACKAGE",
- "CLIP_PACKAGE",
- "OPENCLIP_PACKAGE",
- "STABLE_DIFFUSION_REPO",
- "K_DIFFUSION_REPO",
- "CODEFORMER_REPO",
- "BLIP_REPO",
- "STABLE_DIFFUSION_COMMIT_HASH",
- "K_DIFFUSION_COMMIT_HASH",
- "CODEFORMER_COMMIT_HASH",
- "BLIP_COMMIT_HASH",
- "COMMANDLINE_ARGS",
- "IGNORE_CMD_ARGS_ERRORS",
- }
- def pretty_bytes(num, suffix="B"):
- for unit in ["", "K", "M", "G", "T", "P", "E", "Z", "Y"]:
- if abs(num) < 1024 or unit == 'Y':
- return f"{num:.0f}{unit}{suffix}"
- num /= 1024
- def get():
- res = get_dict()
- text = json.dumps(res, ensure_ascii=False, indent=4)
- h = hashlib.sha256(text.encode("utf8"))
- text = text.replace(checksum_token, h.hexdigest())
- return text
- re_checksum = re.compile(r'"Checksum": "([0-9a-fA-F]{64})"')
- def check(x):
- m = re.search(re_checksum, x)
- if not m:
- return False
- replaced = re.sub(re_checksum, f'"Checksum": "{checksum_token}"', x)
- h = hashlib.sha256(replaced.encode("utf8"))
- return h.hexdigest() == m.group(1)
- def get_dict():
- ram = psutil.virtual_memory()
- res = {
- "Platform": platform.platform(),
- "Python": platform.python_version(),
- "Version": launch.git_tag(),
- "Commit": launch.commit_hash(),
- "Script path": paths_internal.script_path,
- "Data path": paths_internal.data_path,
- "Extensions dir": paths_internal.extensions_dir,
- "Checksum": checksum_token,
- "Commandline": sys.argv,
- "Torch env info": get_torch_sysinfo(),
- "Exceptions": get_exceptions(),
- "CPU": {
- "model": platform.processor(),
- "count logical": psutil.cpu_count(logical=True),
- "count physical": psutil.cpu_count(logical=False),
- },
- "RAM": {
- x: pretty_bytes(getattr(ram, x, 0)) for x in ["total", "used", "free", "active", "inactive", "buffers", "cached", "shared"] if getattr(ram, x, 0) != 0
- },
- "Extensions": get_extensions(enabled=True),
- "Inactive extensions": get_extensions(enabled=False),
- "Environment": get_environment(),
- "Config": get_config(),
- "Startup": timer.startup_record,
- "Packages": sorted([f"{pkg.key}=={pkg.version}" for pkg in pkg_resources.working_set]),
- }
- return res
- def format_traceback(tb):
- return [[f"{x.filename}, line {x.lineno}, {x.name}", x.line] for x in traceback.extract_tb(tb)]
- def format_exception(e, tb):
- return {"exception": str(e), "traceback": format_traceback(tb)}
- def get_exceptions():
- try:
- from modules import errors
- return list(reversed(errors.exception_records))
- except Exception as e:
- return str(e)
- def get_environment():
- return {k: os.environ[k] for k in sorted(os.environ) if k in environment_whitelist}
- re_newline = re.compile(r"\r*\n")
- def get_torch_sysinfo():
- try:
- import torch.utils.collect_env
- info = torch.utils.collect_env.get_env_info()._asdict()
- return {k: re.split(re_newline, str(v)) if "\n" in str(v) else v for k, v in info.items()}
- except Exception as e:
- return str(e)
- def get_extensions(*, enabled):
- try:
- from modules import extensions
- def to_json(x: extensions.Extension):
- return {
- "name": x.name,
- "path": x.path,
- "version": x.version,
- "branch": x.branch,
- "remote": x.remote,
- }
- return [to_json(x) for x in extensions.extensions if not x.is_builtin and x.enabled == enabled]
- except Exception as e:
- return str(e)
- def get_config():
- try:
- from modules import shared
- return shared.opts.data
- except Exception as e:
- return str(e)
|