diff --git a/.gitignore b/.gitignore index 0256658..879270c 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,7 @@ dh.pem /web-action # эти файлы после генерации должны быть перемещены в `/static` -front-generator/main-*.html +front-generator/out # логи сервера в релизной версии http_server_*.log diff --git a/README.md b/README.md index 62792f8..3ae296c 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,14 @@ Сервис, запускаемый на терминале как веб-морда. +# Превью (NEW) + +По многочисленным просьбам работающих, была создана новая фича - автоматическая генерация скриншотов для всех типов веб-сервера. +Вот готовые страницы со скриншотами: +* [SCPC](preview/scpc.md) +* [ШПС](preview/shps.md) +* [TDMA](preview/tdma.md) + # Зависимости По идее только `boost` и `ssl` diff --git a/front-generator/README.md b/front-generator/README.md new file mode 100644 index 0000000..4a9e783 --- /dev/null +++ b/front-generator/README.md @@ -0,0 +1,9 @@ +# Terminal web server - front generator + +Эта часть является подпроектом для веб-сервера и позволяет "на коленке" портировать/изменять веб-сервер для абонентских модемов, и терминалов. + +Скрипт [render.py](render.py) нужен для генерации фронтенда, скрипт [generate-screens.py](generate-screens.py) для генерации скриншотов. + + + + diff --git a/front-generator/generate-screens.py b/front-generator/generate-screens.py new file mode 100644 index 0000000..a1459ab --- /dev/null +++ b/front-generator/generate-screens.py @@ -0,0 +1,148 @@ +import subprocess +import pathlib +import time +import socket +import os +import json + +from selenium import webdriver +from selenium.webdriver.common.by import By + +BASE = pathlib.Path(__file__).parent + +CONFIG_DIR = BASE / "config" +MODEM_TYPES = {} + +for _fname in os.listdir(CONFIG_DIR): + if not _fname.endswith(".json"): + continue + path = os.path.join(CONFIG_DIR, _fname) + try: + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + except Exception as e: + print(f"[WARN] Failed to read {path}: {e}") + continue + modem_type = data.get("modem_type") + if modem_type is None: + print(f"[WARN] {_fname} ignored: no 'modem_type' field") + continue + MODEM_TYPES[modem_type] = data + +BASE_URL = "http://localhost:8080/" + +SCREEN_WIDTH = 1200 + +LOGIN = { + "username": "admin", + "password": "admin", +} + + +def wait_port(port=8080, host="127.0.0.1"): + for _ in range(100): + try: + socket.create_connection((host, port), timeout=1) + return True + except: + time.sleep(0.1) + raise RuntimeError("TCP port 8080 did not open in time") + + +def run_server(modem, build): + binary = BASE / f"../cmake-build-{build}-{modem}/terminal-web-server" + proc = subprocess.Popen([ + binary, + "nossl", + "0.0.0.0", + "8080", + "../static" + ]) + return proc + + +def create_driver(): + opts = webdriver.FirefoxOptions() + serv = webdriver.FirefoxService(executable_path='/snap/bin/geckodriver') + driver = webdriver.Firefox(options=opts, service=serv) + + driver.set_window_size(SCREEN_WIDTH, 1000) + driver.set_page_load_timeout(15) + return driver + + +def login(driver): + driver.get("http://localhost:8080/#") + + # Проверяем, редиректнуло ли на /login + if "/login" in driver.current_url: + # Ищем поля + user = driver.find_element(By.NAME, "username") + pwd = driver.find_element(By.NAME, "password") + + user.clear() + pwd.clear() + user.send_keys(LOGIN["username"]) + pwd.send_keys(LOGIN["password"]) + + # submit + btn = driver.find_element(By.ID, "submit") + btn.click() + + time.sleep(1) + + # Проверка успешного входа + if "/login" in driver.current_url: + raise RuntimeError("Login failed: still on /login after submit") + + +def make_screenshots_or_checks(modem): + out_dir = BASE / "out" / modem + out_dir.mkdir(parents=True, exist_ok=True) + + driver = create_driver() + try: + driver.get("http://localhost:8080/login") + driver.save_screenshot(str(out_dir / f"login.png")) + + login(driver) + + time.sleep(2) + + for tab in MODEM_TYPES[modem]["tabs"]: + tab_name = tab["name"] + driver.find_element(By.CSS_SELECTOR, f'a[href="#{tab_name}"]').click() + + # Проверка, что body загрузилось + time.sleep(1) + page_height = driver.execute_script("return document.body.scrollHeight") + driver.set_window_size(SCREEN_WIDTH, page_height + 200) + time.sleep(1) + + driver.find_element(By.TAG_NAME, "body") # гарантирует что DOM есть + driver.save_screenshot(str(out_dir / f"{tab_name}.png")) + + finally: + driver.quit() + + +def main(): + for mt in MODEM_TYPES: + build = "debug" + print(f"\n=== {mt} ({build}) ===") + + proc = run_server(mt, build) + try: + wait_port() + make_screenshots_or_checks(mt) + finally: + proc.terminate() + proc.wait() + + print("Done.") + + print("\nAll configurations processed.") + + +if __name__ == "__main__": + main() diff --git a/front-generator/render.py b/front-generator/render.py index d851942..1638db0 100644 --- a/front-generator/render.py +++ b/front-generator/render.py @@ -123,16 +123,27 @@ def render_modem(modem): loader = FileSystemLoader('template') env = Environment(loader=loader, trim_blocks=True, lstrip_blocks=True) template = env.get_template('main.html') - context = build_modem_env(modem) - with open(f"main-{modem}.html", "w") as f: + with open(f"out/main-{modem}.html", "w") as f: + f.write(template.render(context)) + +def render_modem_preview(modem): + loader = FileSystemLoader('template') + env = Environment(loader=loader, trim_blocks=True, lstrip_blocks=True) + template = env.get_template('modem-preview.md') + context = build_modem_env(modem) + + with open(f"out/{modem}.md", "w") as f: f.write(template.render(context)) if __name__ == '__main__': + os.makedirs('out', exist_ok=True) for mt in MODEM_TYPES: print(f'Generating {mt} modem...') render_modem(mt) - os.system(f'cp -u main-{mt}.html ../static') + render_modem_preview(mt) + os.system(f'cp -u out/main-{mt}.html ../static') + os.system(f'cp -u out/{mt}.md ../preview') diff --git a/front-generator/requirements.txt b/front-generator/requirements.txt new file mode 100644 index 0000000..c873755 --- /dev/null +++ b/front-generator/requirements.txt @@ -0,0 +1,5 @@ +jinja2 +selenium +selenium-firefox +requests +brotli diff --git a/front-generator/template/modem-preview.md b/front-generator/template/modem-preview.md new file mode 100644 index 0000000..343fe21 --- /dev/null +++ b/front-generator/template/modem-preview.md @@ -0,0 +1,13 @@ +# {{ modem_name }} + +## Страница входа + +На эту страницу пользователь попадет при попытке зайти в веб-интерфейс модема + +![login.png](images/login.png) + +{% for tab in header_tabs %} +## Страница `{{ tab.desc }}` + +![internet.jpg](images/{{ modem }}/{{ tab.name }}.png) +{% endfor %} diff --git a/preview/images/login.png b/preview/images/login.png new file mode 100644 index 0000000..9302fc0 Binary files /dev/null and b/preview/images/login.png differ diff --git a/preview/images/scpc/admin.png b/preview/images/scpc/admin.png new file mode 100644 index 0000000..4ed8d14 Binary files /dev/null and b/preview/images/scpc/admin.png differ diff --git a/preview/images/scpc/monitoring.png b/preview/images/scpc/monitoring.png new file mode 100644 index 0000000..eb6cbdd Binary files /dev/null and b/preview/images/scpc/monitoring.png differ diff --git a/preview/images/scpc/qos.png b/preview/images/scpc/qos.png new file mode 100644 index 0000000..4849c8a Binary files /dev/null and b/preview/images/scpc/qos.png differ diff --git a/preview/images/scpc/setup.png b/preview/images/scpc/setup.png new file mode 100644 index 0000000..79e08e3 Binary files /dev/null and b/preview/images/scpc/setup.png differ diff --git a/preview/images/shps/admin.png b/preview/images/shps/admin.png new file mode 100644 index 0000000..253cddf Binary files /dev/null and b/preview/images/shps/admin.png differ diff --git a/preview/images/shps/monitoring.png b/preview/images/shps/monitoring.png new file mode 100644 index 0000000..e7c9373 Binary files /dev/null and b/preview/images/shps/monitoring.png differ diff --git a/preview/images/shps/setup.png b/preview/images/shps/setup.png new file mode 100644 index 0000000..f197942 Binary files /dev/null and b/preview/images/shps/setup.png differ diff --git a/preview/images/tdma/admin.png b/preview/images/tdma/admin.png new file mode 100644 index 0000000..87a85fe Binary files /dev/null and b/preview/images/tdma/admin.png differ diff --git a/preview/images/tdma/logs.png b/preview/images/tdma/logs.png new file mode 100644 index 0000000..44cfc0f Binary files /dev/null and b/preview/images/tdma/logs.png differ diff --git a/preview/images/tdma/monitoring.png b/preview/images/tdma/monitoring.png new file mode 100644 index 0000000..98a09ce Binary files /dev/null and b/preview/images/tdma/monitoring.png differ diff --git a/preview/images/tdma/setup.png b/preview/images/tdma/setup.png new file mode 100644 index 0000000..12f3bf9 Binary files /dev/null and b/preview/images/tdma/setup.png differ diff --git a/preview/scpc.md b/preview/scpc.md new file mode 100644 index 0000000..af244a8 --- /dev/null +++ b/preview/scpc.md @@ -0,0 +1,20 @@ +# RSCM-201 + +## Страница входа + +На эту страницу пользователь попадет при попытке зайти в веб-интерфейс модема + +![login.png](images/login.png) + +## Страница `Мониторинг` + +![internet.jpg](images/scpc/monitoring.png) +## Страница `Настройки` + +![internet.jpg](images/scpc/setup.png) +## Страница `QoS` + +![internet.jpg](images/scpc/qos.png) +## Страница `Администрирование` + +![internet.jpg](images/scpc/admin.png) diff --git a/preview/shps.md b/preview/shps.md new file mode 100644 index 0000000..f26a1d6 --- /dev/null +++ b/preview/shps.md @@ -0,0 +1,17 @@ +# ШПС Модем + +## Страница входа + +На эту страницу пользователь попадет при попытке зайти в веб-интерфейс модема + +![login.png](images/login.png) + +## Страница `Мониторинг` + +![internet.jpg](images/shps/monitoring.png) +## Страница `Настройки` + +![internet.jpg](images/shps/setup.png) +## Страница `Администрирование` + +![internet.jpg](images/shps/admin.png) diff --git a/preview/tdma.md b/preview/tdma.md new file mode 100644 index 0000000..fdfcc2d --- /dev/null +++ b/preview/tdma.md @@ -0,0 +1,20 @@ +# VSAT Модем + +## Страница входа + +На эту страницу пользователь попадет при попытке зайти в веб-интерфейс модема + +![login.png](images/login.png) + +## Страница `Мониторинг` + +![internet.jpg](images/tdma/monitoring.png) +## Страница `Настройки` + +![internet.jpg](images/tdma/setup.png) +## Страница `Администрирование` + +![internet.jpg](images/tdma/admin.png) +## Страница `Журнал` + +![internet.jpg](images/tdma/logs.png)