diff --git a/gns3server/api/routes/compute/__init__.py b/gns3server/api/routes/compute/__init__.py index 7606e6ddf..934243922 100644 --- a/gns3server/api/routes/compute/__init__.py +++ b/gns3server/api/routes/compute/__init__.py @@ -15,43 +15,44 @@ # along with this program. If not, see . -from fastapi import FastAPI, Request, Depends +import logging + +from fastapi import Depends, FastAPI, Request from fastapi.responses import JSONResponse from starlette.exceptions import HTTPException as StarletteHTTPException -from gns3server.controller.gns3vm.gns3_vm_error import GNS3VMError -from gns3server.compute.error import ImageMissingError, NodeError -from gns3server.compute.ubridge.ubridge_error import UbridgeError - -from .dependencies.authentication import compute_authentication from gns3server.compute.compute_error import ( ComputeError, + ComputeForbiddenError, ComputeNotFoundError, ComputeTimeoutError, - ComputeForbiddenError, ComputeUnauthorizedError, ) +from gns3server.compute.error import ImageMissingError, NodeError +from gns3server.compute.ubridge.ubridge_error import UbridgeError +from gns3server.controller.gns3vm.gns3_vm_error import GNS3VMError -from . import capabilities -from . import compute -from . import projects -from . import notifications -from . import images -from . import atm_switch_nodes -from . import cloud_nodes -from . import docker_nodes -from . import dynamips_nodes -from . import ethernet_hub_nodes -from . import ethernet_switch_nodes -from . import frame_relay_switch_nodes -from . import iou_nodes -from . import nat_nodes -from . import qemu_nodes -from . import virtualbox_nodes -from . import vmware_nodes -from . import vpcs_nodes - -import logging +from . import ( + atm_switch_nodes, + capabilities, + cloud_nodes, + compute, + docker_nodes, + dynamips_nodes, + ethernet_hub_nodes, + ethernet_switch_nodes, + frame_relay_switch_nodes, + images, + iou_nodes, + nat_nodes, + notifications, + projects, + qemu_nodes, + virtualbox_nodes, + vmware_nodes, + vpcs_nodes, +) +from .dependencies.authentication import compute_authentication log = logging.getLogger(__name__) diff --git a/gns3server/api/routes/compute/atm_switch_nodes.py b/gns3server/api/routes/compute/atm_switch_nodes.py index 1282a162d..e62a54eb1 100644 --- a/gns3server/api/routes/compute/atm_switch_nodes.py +++ b/gns3server/api/routes/compute/atm_switch_nodes.py @@ -18,13 +18,13 @@ API routes for ATM switch nodes. """ -from typing import Any import os +from typing import Any +from uuid import UUID -from fastapi import APIRouter, Depends, Body, Path, status, HTTPException +from fastapi import APIRouter, Body, Depends, HTTPException, Path, status from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse -from uuid import UUID from gns3server import schemas from gns3server.compute.dynamips import Dynamips diff --git a/gns3server/api/routes/compute/capabilities.py b/gns3server/api/routes/compute/capabilities.py index 42154d4e1..363b2906b 100644 --- a/gns3server/api/routes/compute/capabilities.py +++ b/gns3server/api/routes/compute/capabilities.py @@ -19,14 +19,14 @@ API routes for capabilities """ import sys -import psutil +import psutil from fastapi import APIRouter, Request -from gns3server.version import __version__ +from gns3server import schemas from gns3server.compute import MODULES from gns3server.utils.path import get_default_project_directory -from gns3server import schemas +from gns3server.version import __version__ router = APIRouter() diff --git a/gns3server/api/routes/compute/cloud_nodes.py b/gns3server/api/routes/compute/cloud_nodes.py index d0a4ead9e..53b4ed432 100644 --- a/gns3server/api/routes/compute/cloud_nodes.py +++ b/gns3server/api/routes/compute/cloud_nodes.py @@ -19,13 +19,13 @@ API routes for cloud nodes. """ import os - -from fastapi import APIRouter, Depends, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, Union from uuid import UUID +from fastapi import APIRouter, Depends, HTTPException, Path, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + from gns3server import schemas from gns3server.compute.builtin import Builtin from gns3server.compute.builtin.nodes.cloud import Cloud diff --git a/gns3server/api/routes/compute/compute.py b/gns3server/api/routes/compute/compute.py index c98b1a256..cd750edb9 100644 --- a/gns3server/api/routes/compute/compute.py +++ b/gns3server/api/routes/compute/compute.py @@ -20,26 +20,26 @@ API routes for compute. """ import os -import psutil -import cpuinfo - from functools import lru_cache -from gns3server.config import Config -from gns3server.utils.cpu_percent import CpuPercent -from gns3server.version import __version__ -from gns3server.utils.path import get_default_project_directory, is_safe_path +from typing import List, Optional +from uuid import UUID + +import cpuinfo +import psutil +from fastapi import APIRouter, Body, HTTPException, Response, status +from fastapi.encoders import jsonable_encoder + +from gns3server import schemas from gns3server.compute.port_manager import PortManager from gns3server.compute.project_manager import ProjectManager -from gns3server.utils.interfaces import interfaces from gns3server.compute.qemu import Qemu from gns3server.compute.virtualbox import VirtualBox from gns3server.compute.vmware import VMware -from gns3server import schemas - -from fastapi import APIRouter, HTTPException, Body, Response, status -from fastapi.encoders import jsonable_encoder -from uuid import UUID -from typing import Optional, List +from gns3server.config import Config +from gns3server.utils.cpu_percent import CpuPercent +from gns3server.utils.interfaces import interfaces +from gns3server.utils.path import get_default_project_directory, is_safe_path +from gns3server.version import __version__ router = APIRouter() diff --git a/gns3server/api/routes/compute/dependencies/authentication.py b/gns3server/api/routes/compute/dependencies/authentication.py index 0412a4136..db5a3f0d0 100644 --- a/gns3server/api/routes/compute/dependencies/authentication.py +++ b/gns3server/api/routes/compute/dependencies/authentication.py @@ -14,16 +14,17 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import secrets import base64 import binascii import logging +import secrets +from typing import Optional, Union from fastapi import Depends, HTTPException, WebSocket, status from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.security.utils import get_authorization_scheme_param + from gns3server.config import Config -from typing import Optional, Union log = logging.getLogger(__name__) security = HTTPBasic(auto_error=False) diff --git a/gns3server/api/routes/compute/docker_nodes.py b/gns3server/api/routes/compute/docker_nodes.py index 9dee90dda..37c00d5a3 100644 --- a/gns3server/api/routes/compute/docker_nodes.py +++ b/gns3server/api/routes/compute/docker_nodes.py @@ -19,16 +19,17 @@ API routes for Docker nodes. """ import os +from typing import Any, Union +from uuid import UUID -from fastapi import APIRouter, WebSocket, Depends, Body, status, HTTPException +from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse -from uuid import UUID -from typing import Any, Union from gns3server import schemas from gns3server.compute.docker import Docker from gns3server.compute.docker.docker_vm import DockerVM + from .dependencies.authentication import compute_authentication, ws_compute_authentication responses: dict[int | str, dict[str, Any]] = { diff --git a/gns3server/api/routes/compute/dynamips_nodes.py b/gns3server/api/routes/compute/dynamips_nodes.py index ccfcd58fb..99c1b53cd 100644 --- a/gns3server/api/routes/compute/dynamips_nodes.py +++ b/gns3server/api/routes/compute/dynamips_nodes.py @@ -19,16 +19,16 @@ API routes for Dynamips nodes. """ import os - -from fastapi import APIRouter, WebSocket, Body, Depends, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, List, Optional, Union from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + +from gns3server import schemas from gns3server.compute.dynamips import Dynamips from gns3server.compute.dynamips.nodes.router import Router -from gns3server import schemas from .dependencies.authentication import compute_authentication, ws_compute_authentication diff --git a/gns3server/api/routes/compute/ethernet_hub_nodes.py b/gns3server/api/routes/compute/ethernet_hub_nodes.py index 150d18e64..05985100c 100644 --- a/gns3server/api/routes/compute/ethernet_hub_nodes.py +++ b/gns3server/api/routes/compute/ethernet_hub_nodes.py @@ -18,17 +18,17 @@ API routes for Ethernet hub nodes. """ -from typing import Any import os - -from fastapi import APIRouter, Depends, Body, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse +from typing import Any from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, Path, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + +from gns3server import schemas from gns3server.compute.dynamips import Dynamips from gns3server.compute.dynamips.nodes.ethernet_hub import EthernetHub -from gns3server import schemas responses: dict[int | str, dict[str, Any]] = { 404: {"model": schemas.ErrorMessage, "description": "Could not find project or Ethernet hub node"} diff --git a/gns3server/api/routes/compute/ethernet_switch_nodes.py b/gns3server/api/routes/compute/ethernet_switch_nodes.py index 9c7736e9c..e6e13e94d 100644 --- a/gns3server/api/routes/compute/ethernet_switch_nodes.py +++ b/gns3server/api/routes/compute/ethernet_switch_nodes.py @@ -22,17 +22,17 @@ through uBridge's ``brctl`` module (see ``gns3server.compute.builtin.nodes.ethernet_switch``). """ -from typing import Any import os - -from fastapi import APIRouter, Depends, Body, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse +from typing import Any from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, Path, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + +from gns3server import schemas from gns3server.compute.builtin import Builtin from gns3server.compute.builtin.nodes.ethernet_switch import EthernetSwitch -from gns3server import schemas responses: dict[int | str, dict[str, Any]] = { 404: {"model": schemas.ErrorMessage, "description": "Could not find project or Ethernet switch node"} diff --git a/gns3server/api/routes/compute/frame_relay_switch_nodes.py b/gns3server/api/routes/compute/frame_relay_switch_nodes.py index bd8bb1f18..0c298f8b9 100644 --- a/gns3server/api/routes/compute/frame_relay_switch_nodes.py +++ b/gns3server/api/routes/compute/frame_relay_switch_nodes.py @@ -18,13 +18,13 @@ API routes for Frame Relay switch nodes. """ -from typing import Any import os +from typing import Any +from uuid import UUID -from fastapi import APIRouter, Depends, Body, Path, status, HTTPException +from fastapi import APIRouter, Body, Depends, HTTPException, Path, status from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse -from uuid import UUID from gns3server import schemas from gns3server.compute.dynamips import Dynamips diff --git a/gns3server/api/routes/compute/images.py b/gns3server/api/routes/compute/images.py index fd49974a1..966063cc8 100644 --- a/gns3server/api/routes/compute/images.py +++ b/gns3server/api/routes/compute/images.py @@ -20,11 +20,11 @@ API routes for images. import os import urllib.parse - -from fastapi import APIRouter, Body, Request, status, Response, HTTPException -from fastapi.responses import FileResponse from typing import List +from fastapi import APIRouter, Body, HTTPException, Request, Response, status +from fastapi.responses import FileResponse + from gns3server.compute.docker import Docker from gns3server.compute.dynamips import Dynamips from gns3server.compute.iou import IOU diff --git a/gns3server/api/routes/compute/iou_nodes.py b/gns3server/api/routes/compute/iou_nodes.py index 5285c07b5..50600a734 100644 --- a/gns3server/api/routes/compute/iou_nodes.py +++ b/gns3server/api/routes/compute/iou_nodes.py @@ -19,13 +19,13 @@ API routes for IOU nodes. """ import os - -from fastapi import APIRouter, WebSocket, Depends, Body, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, Union from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, WebSocket, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + from gns3server import schemas from gns3server.compute.iou import IOU from gns3server.compute.iou.iou_vm import IOUVM diff --git a/gns3server/api/routes/compute/nat_nodes.py b/gns3server/api/routes/compute/nat_nodes.py index 37d8b4401..43d1e33d5 100644 --- a/gns3server/api/routes/compute/nat_nodes.py +++ b/gns3server/api/routes/compute/nat_nodes.py @@ -19,13 +19,13 @@ API routes for NAT nodes. """ import os - -from fastapi import APIRouter, Depends, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, Union from uuid import UUID +from fastapi import APIRouter, Depends, HTTPException, Path, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + from gns3server import schemas from gns3server.compute.builtin import Builtin from gns3server.compute.builtin.nodes.nat import Nat diff --git a/gns3server/api/routes/compute/notifications.py b/gns3server/api/routes/compute/notifications.py index 66de26675..24f8ee059 100644 --- a/gns3server/api/routes/compute/notifications.py +++ b/gns3server/api/routes/compute/notifications.py @@ -18,14 +18,15 @@ API routes for compute notifications. """ -from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect +import logging from typing import Union + +from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect from websockets.exceptions import ConnectionClosed, WebSocketException from gns3server.compute.notification_manager import NotificationManager -from .dependencies.authentication import ws_compute_authentication -import logging +from .dependencies.authentication import ws_compute_authentication log = logging.getLogger(__name__) diff --git a/gns3server/api/routes/compute/projects.py b/gns3server/api/routes/compute/projects.py index 729510055..0ab1caa1f 100644 --- a/gns3server/api/routes/compute/projects.py +++ b/gns3server/api/routes/compute/projects.py @@ -18,28 +18,27 @@ API routes for projects. """ +import asyncio +import inspect +import logging import os import shutil import urllib.parse -import inspect -import asyncio - -import logging log = logging.getLogger() -from fastapi import APIRouter, Depends, HTTPException, Request, Response, status, Query -from fastapi.encoders import jsonable_encoder -from fastapi.responses import FileResponse from typing import List from uuid import UUID -from gns3server.compute.project_manager import ProjectManager -from gns3server.compute.project import Project -from gns3server.compute.base_manager import BaseManager -from gns3server.utils.path import is_safe_path -from gns3server import schemas +from fastapi import APIRouter, Depends, HTTPException, Query, Request, Response, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import FileResponse +from gns3server import schemas +from gns3server.compute.base_manager import BaseManager +from gns3server.compute.project import Project +from gns3server.compute.project_manager import ProjectManager +from gns3server.utils.path import is_safe_path router = APIRouter() diff --git a/gns3server/api/routes/compute/qemu_nodes.py b/gns3server/api/routes/compute/qemu_nodes.py index 6f1794fb9..1f5574654 100644 --- a/gns3server/api/routes/compute/qemu_nodes.py +++ b/gns3server/api/routes/compute/qemu_nodes.py @@ -18,21 +18,21 @@ API routes for Qemu nodes. """ +import logging import os - -from fastapi import APIRouter, WebSocket, Depends, Body, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, Union from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, Path, WebSocket, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + from gns3server import schemas from gns3server.compute import qemu from gns3server.compute.qemu import Qemu from gns3server.compute.qemu.qemu_vm import QemuVM -from .dependencies.authentication import compute_authentication, ws_compute_authentication -import logging +from .dependencies.authentication import compute_authentication, ws_compute_authentication log = logging.getLogger(__name__) diff --git a/gns3server/api/routes/compute/virtualbox_nodes.py b/gns3server/api/routes/compute/virtualbox_nodes.py index 9f137d066..49e7f7316 100644 --- a/gns3server/api/routes/compute/virtualbox_nodes.py +++ b/gns3server/api/routes/compute/virtualbox_nodes.py @@ -19,12 +19,12 @@ API routes for VirtualBox nodes. """ import os +from typing import Any, Union +from uuid import UUID -from fastapi import APIRouter, WebSocket, Depends, Path, status +from fastapi import APIRouter, Depends, Path, WebSocket, status from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse -from uuid import UUID -from typing import Any, Union from gns3server import schemas from gns3server.compute.virtualbox import VirtualBox diff --git a/gns3server/api/routes/compute/vmware_nodes.py b/gns3server/api/routes/compute/vmware_nodes.py index 61849da30..ffb476215 100644 --- a/gns3server/api/routes/compute/vmware_nodes.py +++ b/gns3server/api/routes/compute/vmware_nodes.py @@ -19,12 +19,12 @@ API routes for VMware nodes. """ import os +from typing import Any, Union +from uuid import UUID -from fastapi import APIRouter, WebSocket, Depends, Path, status +from fastapi import APIRouter, Depends, Path, WebSocket, status from fastapi.encoders import jsonable_encoder from fastapi.responses import StreamingResponse -from uuid import UUID -from typing import Any, Union from gns3server import schemas from gns3server.compute.vmware import VMware diff --git a/gns3server/api/routes/compute/vpcs_nodes.py b/gns3server/api/routes/compute/vpcs_nodes.py index a9f96bdc5..255ce33f6 100644 --- a/gns3server/api/routes/compute/vpcs_nodes.py +++ b/gns3server/api/routes/compute/vpcs_nodes.py @@ -19,16 +19,17 @@ API routes for VPCS nodes. """ import os - -from fastapi import APIRouter, WebSocket, Depends, Body, Path, status, HTTPException -from fastapi.encoders import jsonable_encoder -from fastapi.responses import StreamingResponse from typing import Any, Union from uuid import UUID +from fastapi import APIRouter, Body, Depends, HTTPException, Path, WebSocket, status +from fastapi.encoders import jsonable_encoder +from fastapi.responses import StreamingResponse + from gns3server import schemas from gns3server.compute.vpcs import VPCS from gns3server.compute.vpcs.vpcs_vm import VPCSVM + from .dependencies.authentication import compute_authentication, ws_compute_authentication responses: dict[int | str, dict[str, Any]] = { diff --git a/gns3server/api/routes/index.py b/gns3server/api/routes/index.py index 0c4719725..c06bd36b2 100644 --- a/gns3server/api/routes/index.py +++ b/gns3server/api/routes/index.py @@ -16,12 +16,12 @@ import os -from fastapi import APIRouter, Request, HTTPException, status -from fastapi.responses import RedirectResponse, HTMLResponse, FileResponse +from fastapi import APIRouter, HTTPException, Request, status +from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates -from gns3server.version import __version__ from gns3server.utils.get_resource import get_resource +from gns3server.version import __version__ router = APIRouter() templates = Jinja2Templates(directory=os.path.join("gns3server", "templates")) diff --git a/gns3server/config.py b/gns3server/config.py index ed1507f4e..5b588ac4b 100644 --- a/gns3server/config.py +++ b/gns3server/config.py @@ -18,19 +18,19 @@ Reads the configuration file and store the settings for the server. """ -import sys -import os -import shutil -import secrets import configparser - -from enum import Enum -from pydantic import ValidationError -from .schemas import ServerConfig -from .version import __version_info__ -from .utils.file_watcher import FileWatcher - import logging +import os +import secrets +import shutil +import sys +from enum import Enum + +from pydantic import ValidationError + +from .schemas import ServerConfig +from .utils.file_watcher import FileWatcher +from .version import __version_info__ log = logging.getLogger(__name__) diff --git a/gns3server/core/tasks.py b/gns3server/core/tasks.py index 71d15bbb4..bb1f2edd6 100644 --- a/gns3server/core/tasks.py +++ b/gns3server/core/tasks.py @@ -16,21 +16,19 @@ # along with this program. If not, see . import asyncio - -from fastapi import FastAPI +import logging from contextlib import asynccontextmanager -from gns3server.controller import Controller -from gns3server.config import Config +from fastapi import FastAPI + from gns3server.compute import MODULES -from gns3server.compute.port_manager import PortManager from gns3server.compute.marker.marker_manager import MarkerManager -from gns3server.utils.http_client import HTTPClient -from gns3server.db.tasks import connect_to_db, get_computes, disconnect_from_db +from gns3server.compute.port_manager import PortManager +from gns3server.config import Config +from gns3server.controller import Controller +from gns3server.db.tasks import connect_to_db, disconnect_from_db, get_computes from gns3server.services.image_reconciliation import get_image_reconciliation_service - - -import logging +from gns3server.utils.http_client import HTTPClient log = logging.getLogger(__name__) diff --git a/gns3server/db_migrations/env.py b/gns3server/db_migrations/env.py index f60fef2f6..d7f5ba73b 100644 --- a/gns3server/db_migrations/env.py +++ b/gns3server/db_migrations/env.py @@ -2,11 +2,10 @@ import asyncio import os from logging.config import fileConfig +from alembic import context from sqlalchemy import pool from sqlalchemy.ext.asyncio import async_engine_from_config -from alembic import context - # this is the Alembic Config object, which provides # access to the values within the .ini file in use. config = context.config diff --git a/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py b/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py index 27bdd04ea..47732f3c9 100644 --- a/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py +++ b/gns3server/db_migrations/versions/20260303_create_llm_model_configs_table.py @@ -6,8 +6,8 @@ Create Date: 2026-03-03 """ -from alembic import op import sqlalchemy as sa +from alembic import op from sqlalchemy import inspect # revision identifiers, used by Alembic. diff --git a/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py b/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py index 4c218cf5e..05570706e 100644 --- a/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py +++ b/gns3server/db_migrations/versions/7ceeddd9c9a8_init.py @@ -6,9 +6,8 @@ Create Date: 2023-01-11 08:55:25.116126 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "7ceeddd9c9a8" diff --git a/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py b/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py index 64d1489b4..d821cbe09 100644 --- a/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py +++ b/gns3server/db_migrations/versions/8f2a1c4e9d3b_add_extra_configs_to_docker_templates.py @@ -6,9 +6,8 @@ Create Date: 2026-08-14 10:00:00.000000 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "8f2a1c4e9d3b" diff --git a/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py b/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py index 567aa3107..8744f9115 100644 --- a/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py +++ b/gns3server/db_migrations/versions/98083573d011_add_tags_field_to_templates.py @@ -6,9 +6,8 @@ Create Date: 2026-02-23 18:23:59.857607 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "98083573d011" diff --git a/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py b/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py index e85dc00f7..25d36675d 100644 --- a/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py +++ b/gns3server/db_migrations/versions/9a5292aa4389_add_mac_address_field_in_docker_.py @@ -6,9 +6,8 @@ Create Date: 2024-09-18 17:52:53.429522 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "9a5292aa4389" diff --git a/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py b/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py index fb146edd7..de87baced 100644 --- a/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py +++ b/gns3server/db_migrations/versions/a8829e6c069b_add_llm_config_privileges.py @@ -6,10 +6,11 @@ Create Date: 2026-05-26 """ -from alembic import op -import sqlalchemy as sa from uuid import uuid4 +import sqlalchemy as sa +from alembic import op + # revision identifiers, used by Alembic. revision = "a8829e6c069b" down_revision = "aff810fc119a" diff --git a/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py b/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py index 8de44a283..edf5f997a 100644 --- a/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py +++ b/gns3server/db_migrations/versions/aff810fc119a_add_token_version_to_users_table.py @@ -6,8 +6,8 @@ Create Date: 2026-04-06 19:49:12.155446 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "aff810fc119a" diff --git a/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py b/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py index 661b33d69..6a98aca5c 100644 --- a/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py +++ b/gns3server/db_migrations/versions/b3c7e2a91d4f_add_netmiko_device_type_to_templates.py @@ -6,9 +6,8 @@ Create Date: 2026-08-16 10:00:00.000000 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "b3c7e2a91d4f" diff --git a/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py b/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py index e0725102f..7bde600dc 100644 --- a/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py +++ b/gns3server/db_migrations/versions/c7e4a9f1d2b6_add_appliance_metadata_to_templates.py @@ -6,9 +6,8 @@ Create Date: 2026-08-16 12:00:00.000000 """ -from alembic import op import sqlalchemy as sa - +from alembic import op # revision identifiers, used by Alembic. revision = "c7e4a9f1d2b6" diff --git a/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py b/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py index d25782c13..a42aa7212 100644 --- a/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py +++ b/gns3server/db_migrations/versions/ec4b7b198555_convert_pickletype_fields_to_json.py @@ -6,8 +6,8 @@ Create Date: 2026-04-03 19:51:06.173013 """ -from alembic import op import sqlalchemy as sa +from alembic import op # revision identifiers, used by Alembic. revision = "ec4b7b198555" @@ -21,8 +21,8 @@ def convert_pickle_to_json(conn, table_name: str, column_name: str) -> None: Convert a PickleType column to JSON for all rows in a table. """ - import pickle import json + import pickle result = conn.execute(sa.text(f"SELECT template_id, {column_name} FROM {table_name}")) for row in result: @@ -49,8 +49,8 @@ def convert_json_to_pickle(conn, table_name: str, column_name: str) -> None: Convert a JSON column to PickleType for all rows in a table. """ - import pickle import json + import pickle result = conn.execute(sa.text(f"SELECT template_id, {column_name} FROM {table_name}")) for row in result: diff --git a/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py b/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py index a52dd05d6..50942c9ed 100644 --- a/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py +++ b/gns3server/db_migrations/versions/f0b0de2a9_add_api_keys_table.py @@ -6,8 +6,9 @@ Create Date: 2026-06-11 10:00:00.000000 """ -from alembic import op import sqlalchemy as sa +from alembic import op + import gns3server.db.models.base as models # revision identifiers, used by Alembic. diff --git a/gns3server/logger.py b/gns3server/logger.py index 30d99bf39..50fe04017 100644 --- a/gns3server/logger.py +++ b/gns3server/logger.py @@ -17,12 +17,11 @@ """Provide a pretty logging on console""" +import gzip import logging -import sys import os import shutil -import gzip - +import sys from logging.handlers import RotatingFileHandler diff --git a/gns3server/main.py b/gns3server/main.py index 29a2073cf..5692fab79 100644 --- a/gns3server/main.py +++ b/gns3server/main.py @@ -25,14 +25,14 @@ Entry point of the server. It's support daemonize the process # if is not writetable the application crash. It's the user fault # because one day the user as used sudo to run an egg and break his # filesystem permissions, but it's a common mistake. -import gns3server.utils.get_resource - -import os -import sys -import asyncio import argparse +import asyncio import logging +import os import resource +import sys + +import gns3server.utils.get_resource def daemonize(): diff --git a/gns3server/server.py b/gns3server/server.py index 7d7eb3186..f9824caab 100644 --- a/gns3server/server.py +++ b/gns3server/server.py @@ -20,25 +20,25 @@ Start the program. Use main.py to load it. """ -import os -import datetime -import locale -import psutil -import sys import asyncio -import signal +import datetime import functools -import uvicorn +import locale +import logging +import os import secrets +import signal import string +import sys + +import psutil +import uvicorn +from pydantic import SecretStr, ValidationError -from gns3server.logger import init_logger -from gns3server.version import __version__ from gns3server.config import Config from gns3server.crash_report import CrashReport -from pydantic import ValidationError, SecretStr - -import logging +from gns3server.logger import init_logger +from gns3server.version import __version__ log = logging.getLogger(__name__) diff --git a/gns3server/utils/__init__.py b/gns3server/utils/__init__.py index 386095757..44c224ff7 100644 --- a/gns3server/utils/__init__.py +++ b/gns3server/utils/__init__.py @@ -16,14 +16,14 @@ # along with this program. If not, see . -import sys -import re -import shlex -import textwrap -import posixpath -import socket import errno import hashlib +import posixpath +import re +import shlex +import socket +import sys +import textwrap def force_unix_path(path): diff --git a/gns3server/utils/application_id.py b/gns3server/utils/application_id.py index 488fb70b8..b9241cf29 100644 --- a/gns3server/utils/application_id.py +++ b/gns3server/utils/application_id.py @@ -15,10 +15,10 @@ # along with this program. If not, see . # -from gns3server.controller.controller_error import ControllerError - import logging +from gns3server.controller.controller_error import ControllerError + log = logging.getLogger(__name__) # IOU draws from the lower half: uBridge's iol_bridge uses application_id + 512 diff --git a/gns3server/utils/asyncio/__init__.py b/gns3server/utils/asyncio/__init__.py index 345cd77a8..98b72c66b 100644 --- a/gns3server/utils/asyncio/__init__.py +++ b/gns3server/utils/asyncio/__init__.py @@ -15,12 +15,12 @@ # along with this program. If not, see . -import functools import asyncio -import sys -import os -import threading +import functools import inspect +import os +import sys +import threading async def wait_run_in_executor(func, *args, **kwargs): diff --git a/gns3server/utils/asyncio/aiozipstream.py b/gns3server/utils/asyncio/aiozipstream.py index b9a9d42c9..07770ed0e 100644 --- a/gns3server/utils/asyncio/aiozipstream.py +++ b/gns3server/utils/asyncio/aiozipstream.py @@ -22,16 +22,17 @@ Derived directly from zipfile.py and the zipstream project https://github.com/allanlei/python-zipstream """ +import asyncio import os -import sys import stat import struct +import sys import time import zipfile -import asyncio -import aiofiles from concurrent import futures +import aiofiles + structCentralDir = "<4s4B4HL2L5H2L" structEndArchive64 = "<4sQ2H2L4Q" structEndArchive = b"<4s4H2LH" diff --git a/gns3server/utils/asyncio/embed_shell.py b/gns3server/utils/asyncio/embed_shell.py index 7059c9e29..5f044222d 100644 --- a/gns3server/utils/asyncio/embed_shell.py +++ b/gns3server/utils/asyncio/embed_shell.py @@ -16,24 +16,24 @@ # along with this program. If not, see . -import sys import asyncio import inspect import io +import sys from prompt_toolkit import prompt -from prompt_toolkit.history import InMemoryHistory from prompt_toolkit.contrib.completers import WordCompleter from prompt_toolkit.enums import DEFAULT_BUFFER from prompt_toolkit.eventloop.base import EventLoop +from prompt_toolkit.history import InMemoryHistory +from prompt_toolkit.input import StdinInput from prompt_toolkit.interface import CommandLineInterface from prompt_toolkit.layout.screen import Size -from prompt_toolkit.shortcuts import create_prompt_application, create_asyncio_eventloop +from prompt_toolkit.shortcuts import create_asyncio_eventloop, create_prompt_application from prompt_toolkit.terminal.vt100_output import Vt100_Output -from prompt_toolkit.input import StdinInput -from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer, TelnetConnection from gns3server.utils.asyncio.input_stream import InputStream +from gns3server.utils.asyncio.telnet_server import AsyncioTelnetServer, TelnetConnection class EmbedShell: diff --git a/gns3server/utils/asyncio/input_stream.py b/gns3server/utils/asyncio/input_stream.py index 6a9c983c6..90a3398b5 100644 --- a/gns3server/utils/asyncio/input_stream.py +++ b/gns3server/utils/asyncio/input_stream.py @@ -5,11 +5,10 @@ Parser for VT100 input stream. # Copied from prompt_toolkit/terminal/vt100_input.py due to dependency on termios (which is not available on Windows) import re + import six - - -from prompt_toolkit.keys import Keys from prompt_toolkit.key_binding.input_processor import KeyPress +from prompt_toolkit.keys import Keys # __all__ = ( # 'InputStream', diff --git a/gns3server/utils/asyncio/pool.py b/gns3server/utils/asyncio/pool.py index 0b0b43c9f..659222f6d 100644 --- a/gns3server/utils/asyncio/pool.py +++ b/gns3server/utils/asyncio/pool.py @@ -15,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import sys import asyncio +import sys class Pool: diff --git a/gns3server/utils/asyncio/raw_command_server.py b/gns3server/utils/asyncio/raw_command_server.py index 0b7102dc3..87e0dbb05 100644 --- a/gns3server/utils/asyncio/raw_command_server.py +++ b/gns3server/utils/asyncio/raw_command_server.py @@ -14,12 +14,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re -import copy import asyncio import asyncio.subprocess - +import copy import logging +import re log = logging.getLogger(__name__) diff --git a/gns3server/utils/asyncio/serial.py b/gns3server/utils/asyncio/serial.py index c142a2e38..8a20a0799 100644 --- a/gns3server/utils/asyncio/serial.py +++ b/gns3server/utils/asyncio/serial.py @@ -17,8 +17,8 @@ import asyncio -from gns3server.utils.asyncio import wait_for_file_creation from gns3server.compute.error import NodeError +from gns3server.utils.asyncio import wait_for_file_creation """ This module handle connection to unix socket diff --git a/gns3server/utils/cpu_percent.py b/gns3server/utils/cpu_percent.py index 016c633b6..3f2f701a5 100644 --- a/gns3server/utils/cpu_percent.py +++ b/gns3server/utils/cpu_percent.py @@ -14,9 +14,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import psutil import time +import psutil + class CpuPercent: """ diff --git a/gns3server/utils/encryption.py b/gns3server/utils/encryption.py index 38719a60e..0b0974859 100644 --- a/gns3server/utils/encryption.py +++ b/gns3server/utils/encryption.py @@ -19,9 +19,10 @@ Encryption utilities for sensitive data like API keys. Uses Fernet symmetric encryption. """ -import os import logging +import os from typing import Optional + from cryptography.fernet import Fernet log = logging.getLogger(__name__) diff --git a/gns3server/utils/file_watcher.py b/gns3server/utils/file_watcher.py index 508fda67d..d481b293c 100644 --- a/gns3server/utils/file_watcher.py +++ b/gns3server/utils/file_watcher.py @@ -15,11 +15,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import zlib import asyncio -import os - import logging +import os +import zlib log = logging.getLogger(__name__) diff --git a/gns3server/utils/http_client.py b/gns3server/utils/http_client.py index a6b032a82..62841e4ec 100644 --- a/gns3server/utils/http_client.py +++ b/gns3server/utils/http_client.py @@ -15,11 +15,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import aiohttp -from pydantic import SecretStr +import logging import socket -import logging +import aiohttp +from pydantic import SecretStr log = logging.getLogger(__name__) diff --git a/gns3server/utils/images.py b/gns3server/utils/images.py index d7483ec59..4f6e402bb 100644 --- a/gns3server/utils/images.py +++ b/gns3server/utils/images.py @@ -14,30 +14,31 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import os -import hashlib -import stat -import aiofiles import asyncio +import hashlib +import os +import stat import tempfile -from gns3server.utils.image_inventory import fingerprint, stat_fingerprint, image_lock, publish_image, contained_path +import aiofiles + +from gns3server.utils.image_inventory import contained_path, fingerprint, image_lock, publish_image, stat_fingerprint try: import importlib_resources except ImportError: from importlib import resources as importlib_resources -from typing import List, AsyncGenerator -from ..config import Config -from . import force_unix_path +import logging from io import DEFAULT_BUFFER_SIZE +from typing import AsyncGenerator, List import gns3server.db.models as models from gns3server.db.repositories.images import ImagesRepository from gns3server.utils.asyncio import wait_run_in_executor -import logging +from ..config import Config +from . import force_unix_path log = logging.getLogger(__name__) diff --git a/gns3server/utils/interfaces.py b/gns3server/utils/interfaces.py index f48db2c8a..0585028c9 100644 --- a/gns3server/utils/interfaces.py +++ b/gns3server/utils/interfaces.py @@ -16,9 +16,10 @@ import os -import sys import socket import struct +import sys + import psutil from gns3server.compute.compute_error import ComputeError @@ -94,8 +95,8 @@ def get_windows_interfaces(): :returns: list of windows interfaces """ - import win32com.client import pywintypes + import win32com.client interfaces = [] try: diff --git a/gns3server/utils/notification_queue.py b/gns3server/utils/notification_queue.py index b7cf93759..4c0e0d6a4 100644 --- a/gns3server/utils/notification_queue.py +++ b/gns3server/utils/notification_queue.py @@ -17,14 +17,14 @@ import asyncio import json +import logging import time + import psutil from gns3server.utils.cpu_percent import CpuPercent from gns3server.utils.path import get_default_project_directory -import logging - log = logging.getLogger(__name__) diff --git a/gns3server/utils/packet_filter_validation.py b/gns3server/utils/packet_filter_validation.py index d20ac9f24..29febb2fb 100644 --- a/gns3server/utils/packet_filter_validation.py +++ b/gns3server/utils/packet_filter_validation.py @@ -4,7 +4,7 @@ Packet filter parameter validation utilities. import logging import subprocess -from typing import Dict, List, Any, Optional +from typing import Any, Dict, List, Optional log = logging.getLogger(__name__) diff --git a/gns3server/utils/path.py b/gns3server/utils/path.py index d567d065e..35d7cc142 100644 --- a/gns3server/utils/path.py +++ b/gns3server/utils/path.py @@ -16,9 +16,10 @@ # along with this program. If not, see . import os - from pathlib import Path + from fastapi import HTTPException, status + from ..config import Config diff --git a/gns3server/utils/picture.py b/gns3server/utils/picture.py index 61df743e3..814183b05 100644 --- a/gns3server/utils/picture.py +++ b/gns3server/utils/picture.py @@ -15,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re import io +import re import struct from xml.etree.ElementTree import ElementTree, ParseError diff --git a/gns3server/utils/port_allocator.py b/gns3server/utils/port_allocator.py index f08954a97..015142a76 100644 --- a/gns3server/utils/port_allocator.py +++ b/gns3server/utils/port_allocator.py @@ -5,7 +5,6 @@ import hashlib - # Display/port allocation range (stable across process restarts) DISPLAY_RANGE = 10000 DISPLAY_MODULO = 10000 diff --git a/gns3server/utils/request_utils.py b/gns3server/utils/request_utils.py index 297a9e90b..27b8294b3 100644 --- a/gns3server/utils/request_utils.py +++ b/gns3server/utils/request_utils.py @@ -6,8 +6,8 @@ from ASGI scope dictionaries for logging and debugging purposes. """ import logging +from typing import Any, Dict, Optional from urllib.parse import parse_qs -from typing import Dict, Any, Optional log = logging.getLogger(__name__) diff --git a/gns3server/utils/uninstall_ai_features.py b/gns3server/utils/uninstall_ai_features.py index 8a1106bca..aa7f0ff5c 100644 --- a/gns3server/utils/uninstall_ai_features.py +++ b/gns3server/utils/uninstall_ai_features.py @@ -7,10 +7,10 @@ Usage: gns3server-uninstall-ai-features -y """ -import os -import sys -import subprocess import argparse +import os +import subprocess +import sys def _find_base_dir(): diff --git a/gns3server/utils/uuid_validator.py b/gns3server/utils/uuid_validator.py index 08524f4c9..6b099e180 100644 --- a/gns3server/utils/uuid_validator.py +++ b/gns3server/utils/uuid_validator.py @@ -6,7 +6,6 @@ import argparse import re - UUID_PATTERN = re.compile(r"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$", re.IGNORECASE) diff --git a/gns3server/utils/vmnet.py b/gns3server/utils/vmnet.py index c9340fc8b..9fe5f39d5 100644 --- a/gns3server/utils/vmnet.py +++ b/gns3server/utils/vmnet.py @@ -15,12 +15,11 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import sys -import os -import ipaddress import argparse +import ipaddress +import os import shutil - +import sys from collections import OrderedDict if sys.platform.startswith("darwin"): diff --git a/gns3server/utils/zipfile_zstd/__init__.py b/gns3server/utils/zipfile_zstd/__init__.py index f43df1493..687a808b0 100644 --- a/gns3server/utils/zipfile_zstd/__init__.py +++ b/gns3server/utils/zipfile_zstd/__init__.py @@ -1,7 +1,7 @@ # NOTE: this patches the standard zipfile module -from . import _zipfile - from zipfile import * + +from . import _zipfile from ._zipfile import ( ZIP_ZSTANDARD, ZSTANDARD_VERSION, diff --git a/gns3server/utils/zipfile_zstd/_zipfile.py b/gns3server/utils/zipfile_zstd/_zipfile.py index e4bb61b03..2e26ba61e 100644 --- a/gns3server/utils/zipfile_zstd/_zipfile.py +++ b/gns3server/utils/zipfile_zstd/_zipfile.py @@ -1,8 +1,9 @@ -import zipfile as _zipfile_module -import zstandard as zstd import inspect +import zipfile as _zipfile_module from typing import Any +import zstandard as zstd + from ._patcher import patch zipfile: Any = _zipfile_module