From c7b3fcb6a2fded15fc560292a224c7f3b09b227b Mon Sep 17 00:00:00 2001
From: w-e-w <40751091+w-e-w@users.noreply.github.com>
Date: Fri, 27 Dec 2024 08:58:44 +0900
Subject: [PATCH] Authenticated Sysinfo
---
javascript/sysinfo.js | 22 ++++++++++++++++++++++
modules/api/api.py | 5 ++++-
modules/sysinfo.py | 10 ++++++++++
modules/ui.py | 16 ++--------------
modules/ui_settings.py | 11 ++++++++++-
5 files changed, 48 insertions(+), 16 deletions(-)
create mode 100644 javascript/sysinfo.js
diff --git a/javascript/sysinfo.js b/javascript/sysinfo.js
new file mode 100644
index 00000000000..d973e9eafae
--- /dev/null
+++ b/javascript/sysinfo.js
@@ -0,0 +1,22 @@
+function downloadSysinfo() {
+ const content = document.querySelector('#internal-sysinfo-textbox textarea').value;
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = String(now.getMonth() + 1).padStart(2, '0');
+ const day = String(now.getDate()).padStart(2, '0');
+ const hours = String(now.getHours()).padStart(2, '0');
+ const minutes = String(now.getMinutes()).padStart(2, '0');
+ const filename = `sysinfo-${year}-${month}-${day}-${hours}-${minutes}.json`;
+ const blob = new Blob([content], {type: 'application/json'});
+ const link = document.createElement('a');
+ link.href = URL.createObjectURL(blob);
+ link.download = filename;
+ link.click();
+}
+
+function openTabSysinfo() {
+ const content = document.querySelector('#internal-sysinfo-textbox textarea').value;
+ const blob = new Blob([content], {type: 'application/json'});
+ const url = URL.createObjectURL(blob);
+ window.open(url, '_blank');
+}
diff --git a/modules/api/api.py b/modules/api/api.py
index db2fc648019..8604c741f3a 100644
--- a/modules/api/api.py
+++ b/modules/api/api.py
@@ -17,7 +17,7 @@
from secrets import compare_digest
import modules.shared as shared
-from modules import sd_samplers, deepbooru, sd_hijack, images, scripts, ui, postprocessing, errors, restart, shared_items, script_callbacks, infotext_utils, sd_models, sd_schedulers
+from modules import sd_samplers, deepbooru, sd_hijack, images, scripts, ui, postprocessing, errors, restart, shared_items, script_callbacks, infotext_utils, sd_models, sd_schedulers, sysinfo
from modules.api import models
from modules.shared import opts
from modules.processing import StableDiffusionProcessingTxt2Img, StableDiffusionProcessingImg2Img, process_images
@@ -33,6 +33,7 @@
from contextlib import closing
from modules.progress import create_task_id, add_task_to_queue, start_task, finish_task, current_task
+
def script_name_to_index(name, scripts):
try:
return [script.title().lower() for script in scripts].index(name.lower())
@@ -244,6 +245,8 @@ def __init__(self, app: FastAPI, queue_lock: Lock):
self.add_api_route("/sdapi/v1/scripts", self.get_scripts_list, methods=["GET"], response_model=models.ScriptsList)
self.add_api_route("/sdapi/v1/script-info", self.get_script_info, methods=["GET"], response_model=list[models.ScriptInfo])
self.add_api_route("/sdapi/v1/extensions", self.get_extensions_list, methods=["GET"], response_model=list[models.ExtensionItem])
+ self.add_api_route("/internal/sysinfo", sysinfo.download_sysinfo, methods=["GET"])
+ self.add_api_route("/internal/sysinfo-download", lambda: sysinfo.download_sysinfo(attachment=True), methods=["GET"])
if shared.cmd_opts.api_server_stop:
self.add_api_route("/sdapi/v1/server-kill", self.kill_webui, methods=["POST"])
diff --git a/modules/sysinfo.py b/modules/sysinfo.py
index e9a83d74e03..3afdfd49177 100644
--- a/modules/sysinfo.py
+++ b/modules/sysinfo.py
@@ -213,3 +213,13 @@ def get_config():
return json.load(f)
except Exception as e:
return str(e)
+
+
+def download_sysinfo(attachment=False):
+ from fastapi.responses import PlainTextResponse
+ from datetime import datetime
+
+ text = get()
+ filename = f"sysinfo-{datetime.utcnow().strftime('%Y-%m-%d-%H-%M')}.json"
+
+ return PlainTextResponse(text, headers={'Content-Disposition': f'{"attachment" if attachment else "inline"}; filename="{filename}"'})
diff --git a/modules/ui.py b/modules/ui.py
index 9a76b5fcd90..f6386ebf53f 100644
--- a/modules/ui.py
+++ b/modules/ui.py
@@ -1,4 +1,3 @@
-import datetime
import mimetypes
import os
import sys
@@ -10,10 +9,10 @@
import gradio.utils
import numpy as np
from PIL import Image, PngImagePlugin # noqa: F401
-from modules.call_queue import wrap_gradio_gpu_call, wrap_queued_call, wrap_gradio_call, wrap_gradio_call_no_job # noqa: F401
+from modules.call_queue import wrap_gradio_gpu_call, wrap_queued_call, wrap_gradio_call, wrap_gradio_call_no_job # noqa: F401
from modules import gradio_extensons, sd_schedulers # noqa: F401
-from modules import sd_hijack, sd_models, script_callbacks, ui_extensions, deepbooru, extra_networks, ui_common, ui_postprocessing, progress, ui_loadsave, shared_items, ui_settings, timer, sysinfo, ui_checkpoint_merger, scripts, sd_samplers, processing, ui_extra_networks, ui_toprow, launch_utils
+from modules import sd_hijack, sd_models, script_callbacks, ui_extensions, deepbooru, extra_networks, ui_common, ui_postprocessing, progress, ui_loadsave, shared_items, ui_settings, timer, ui_checkpoint_merger, scripts, sd_samplers, processing, ui_extra_networks, ui_toprow, launch_utils
from modules.ui_components import FormRow, FormGroup, ToolButton, FormHTML, InputAccordion, ResizeHandleRow
from modules.paths import script_path
from modules.ui_common import create_refresh_button
@@ -1223,16 +1222,5 @@ def quicksettings_hint():
app.add_api_route("/internal/profile-startup", lambda: timer.startup_record, methods=["GET"])
- def download_sysinfo(attachment=False):
- from fastapi.responses import PlainTextResponse
-
- text = sysinfo.get()
- filename = f"sysinfo-{datetime.datetime.utcnow().strftime('%Y-%m-%d-%H-%M')}.json"
-
- return PlainTextResponse(text, headers={'Content-Disposition': f'{"attachment" if attachment else "inline"}; filename="{filename}"'})
-
- app.add_api_route("/internal/sysinfo", download_sysinfo, methods=["GET"])
- app.add_api_route("/internal/sysinfo-download", lambda: download_sysinfo(attachment=True), methods=["GET"])
-
import fastapi.staticfiles
app.mount("/webui-assets", fastapi.staticfiles.StaticFiles(directory=launch_utils.repo_dir('stable-diffusion-webui-assets')), name="webui-assets")
diff --git a/modules/ui_settings.py b/modules/ui_settings.py
index e53ad50f8f4..79f15e41fc6 100644
--- a/modules/ui_settings.py
+++ b/modules/ui_settings.py
@@ -170,7 +170,16 @@ def create_ui(self, loadsave, dummy_component):
loadsave.create_ui()
with gr.TabItem("Sysinfo", id="sysinfo", elem_id="settings_tab_sysinfo"):
- gr.HTML('Download system info
(or open as text in a new page)', elem_id="sysinfo_download")
+ download_sysinfo = gr.Button(value='Download system info', elem_id="internal-download-sysinfo", visible=False)
+ open_sysinfo = gr.Button(value='Open as text in a new page', elem_id="internal-open-sysinfo", visible=False)
+ sysinfo_textbox = gr.Textbox('', elem_id='internal-sysinfo-textbox', interactive=False, visible=False)
+ sysinfo_html = gr.HTML('''Download system info
(or open as text in a new page)''', elem_id="sysinfo_download")
+
+ def get_sysinfo():
+ return sysinfo.get(), gr.update()
+
+ download_sysinfo.click(fn=get_sysinfo, outputs=[sysinfo_textbox, sysinfo_html], show_progress=True).then(fn=None, _js='downloadSysinfo')
+ open_sysinfo.click(fn=get_sysinfo, outputs=[sysinfo_textbox, sysinfo_html], show_progress=True).then(fn=None, _js='openTabSysinfo')
with gr.Row():
with gr.Column(scale=1):