diff --git a/config.py b/config.py index 213c897..06af075 100644 --- a/config.py +++ b/config.py @@ -10,8 +10,8 @@ import logging BASE_DIR = Path(__file__).parent -TEMPLATES_DIR = BASE_DIR / "templates" -STATIC_DIR = TEMPLATES_DIR / "static" +TEMPLATES_DIR = BASE_DIR / "web" / "templates" +STATIC_DIR = BASE_DIR / "web" / "static" class RunConfig(BaseModel): diff --git a/main.py b/main.py index b3c5054..1cff39a 100644 --- a/main.py +++ b/main.py @@ -5,7 +5,7 @@ import uvicorn from fastapi import FastAPI from fastapi.responses import ORJSONResponse from starlette.staticfiles import StaticFiles -from api import router as swagger_router +from web.router import router as web_router input_text = """ @@ -29,7 +29,9 @@ main_app = FastAPI( default_response_class=ORJSONResponse, docs_url=None, ) -main_app.include_router(swagger_router) + +main_app.include_router(web_router) + main_app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") diff --git a/poetry.lock b/poetry.lock index 35fbaba..4e75145 100644 --- a/poetry.lock +++ b/poetry.lock @@ -204,6 +204,92 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "mypy-extensions" version = "1.0.0" @@ -446,6 +532,17 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-multipart" +version = "0.0.12" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python_multipart-0.0.12-py3-none-any.whl", hash = "sha256:43dcf96cf65888a9cd3423544dd0d75ac10f7aa0c3c28a175bbcd00c9ce1aebf"}, + {file = "python_multipart-0.0.12.tar.gz", hash = "sha256:045e1f98d719c1ce085ed7f7e1ef9d8ccc8c02ba02b5566d5f7521410ced58cb"}, +] + [[package]] name = "pyyaml" version = "6.0.2" @@ -809,4 +906,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "d146d1a687ebef36f0e5c9b79480590680ceda9f5eae3c07592190c70cbf9f60" +content-hash = "a489bb194ffae8c9206620f55be022c868805f8c4df87e1d32d60606a381158a" diff --git a/pyproject.toml b/pyproject.toml index f67264c..6513f61 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,6 +11,8 @@ python = "^3.12" pydantic-settings = "^2.5.2" uvicorn = {extras = ["standard"], version = "^0.31.0"} fastapi = "^0.115.0" +jinja2 = "^3.1.4" +python-multipart = "^0.0.12" diff --git a/scripts/сheck_available_ports.py b/scripts/сheck_available_ports.py index 6b1ff3d..08905ea 100644 --- a/scripts/сheck_available_ports.py +++ b/scripts/сheck_available_ports.py @@ -28,7 +28,9 @@ def parse_input(text: str) -> List[Dict[str, Union[int, str]]]: return result -def start_check(text: str) -> List[Dict[str, Union[int, str, bool]]]: +def start_check( + text: str, result_type: str = "json" +) -> List[Dict[str, Union[int, str, bool]]] | List[str]: logging.info("") result = [] for i in parse_input(text): @@ -39,4 +41,13 @@ def start_check(text: str) -> List[Dict[str, Union[int, str, bool]]]: else: i["result"] = False result.append(i) + + if result_type == "test": + results = [] + for i in result: + if i["result"]: + results.append(f"{i['ip']}:{i['port']}/{i['protocol']} - OK") + else: + results.append(f"{i['ip']}:{i['port']}/{i['protocol']} - FAIL") + return results return result diff --git a/web/__init__.py b/web/__init__.py new file mode 100644 index 0000000..424f4f1 --- /dev/null +++ b/web/__init__.py @@ -0,0 +1,10 @@ +from fastapi import APIRouter +from web.router import router as web_router + + +router = APIRouter() + +router.include_router( + web_router, + prefix="", +) diff --git a/web/router.py b/web/router.py new file mode 100644 index 0000000..1ef1a79 --- /dev/null +++ b/web/router.py @@ -0,0 +1,61 @@ +from fastapi import APIRouter, Form +from starlette.requests import Request +from starlette.responses import HTMLResponse +from starlette.templating import Jinja2Templates +from fastapi.openapi.docs import get_swagger_ui_html + +from config import settings +from config import TEMPLATES_DIR + +from scripts.сheck_available_ports import start_check + +router = APIRouter( + tags=["Web"], +) + +templates = Jinja2Templates(directory=TEMPLATES_DIR) + + +@router.get("/web/check_ports", response_class=HTMLResponse) +async def check_ports(request: Request): + return templates.TemplateResponse( + "body-check_ports.html", + { + "request": request, + }, + ) + + +@router.get("/web/start_check_ports") +async def start_check_ports(request: Request, inputText: str): + + results = start_check(inputText, result_type="test") + return templates.TemplateResponse( + "body-check_ports.html", + { + "request": request, + "results": results, + }, + ) + + +@router.get("/docs", include_in_schema=False) +async def custom_swagger_ui_html(): + return get_swagger_ui_html( + openapi_url=settings.swagger.openapi_url, + title=settings.swagger.title, + oauth2_redirect_url=settings.swagger.oauth2_redirect_url, + swagger_js_url=settings.swagger.swagger_js_url, + swagger_css_url=settings.swagger.swagger_css_url, + swagger_favicon_url=settings.swagger.swagger_favicon_url, + ) + + +@router.get("/", response_class=HTMLResponse) +async def start_page(request: Request): + return templates.TemplateResponse( + "base.html", + { + "request": request, + }, + ) diff --git a/web/static/css/base.css b/web/static/css/base.css new file mode 100644 index 0000000..edc884e --- /dev/null +++ b/web/static/css/base.css @@ -0,0 +1,29 @@ +header { +background-color: green; +position: relative; +top: 0; +left: 0; +width: 100%; +margin-bottom: 10px; +} + +div.header-button{ +#background-color: red; +display: inline-block; +float: right; + +} +div.body{ +position: relative; + +} + +footer { +background-color: red; +position:fixed; +left: 0; +bottom:0; +width:100%; +text-align: right; + +} diff --git a/templates/static/js/htmx.js b/web/static/js/htmx.js similarity index 100% rename from templates/static/js/htmx.js rename to web/static/js/htmx.js diff --git a/templates/static/js/htmx.min.js b/web/static/js/htmx.min.js similarity index 100% rename from templates/static/js/htmx.min.js rename to web/static/js/htmx.min.js diff --git a/templates/static/swagger/favicon.png b/web/static/swagger/favicon.png similarity index 100% rename from templates/static/swagger/favicon.png rename to web/static/swagger/favicon.png diff --git a/templates/static/swagger/swagger-ui-bundle.js b/web/static/swagger/swagger-ui-bundle.js similarity index 100% rename from templates/static/swagger/swagger-ui-bundle.js rename to web/static/swagger/swagger-ui-bundle.js diff --git a/templates/static/swagger/swagger-ui.css b/web/static/swagger/swagger-ui.css similarity index 100% rename from templates/static/swagger/swagger-ui.css rename to web/static/swagger/swagger-ui.css diff --git a/web/templates/base.html b/web/templates/base.html new file mode 100644 index 0000000..f70b545 --- /dev/null +++ b/web/templates/base.html @@ -0,0 +1,15 @@ + + + + SiPi-web + + + + + +{% include 'header.html' %} + +{% include 'body.html' %} + +{% include 'footer.html' %} + \ No newline at end of file diff --git a/web/templates/body-check_ports.html b/web/templates/body-check_ports.html new file mode 100644 index 0000000..8e4726d --- /dev/null +++ b/web/templates/body-check_ports.html @@ -0,0 +1,15 @@ +
+ + + + + + + + +
+ {% for result in results %} +

{{ result }}

+ {% endfor %} +
+
diff --git a/web/templates/body.html b/web/templates/body.html new file mode 100644 index 0000000..19520eb --- /dev/null +++ b/web/templates/body.html @@ -0,0 +1,3 @@ +
+ +
\ No newline at end of file diff --git a/web/templates/footer.html b/web/templates/footer.html new file mode 100644 index 0000000..7f9de12 --- /dev/null +++ b/web/templates/footer.html @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/web/templates/header.html b/web/templates/header.html new file mode 100644 index 0000000..71f4854 --- /dev/null +++ b/web/templates/header.html @@ -0,0 +1,14 @@ +
+ +
+ + +
+
\ No newline at end of file