diff --git a/docs/api/v2/controller/snapshot/projectsprojectidsnapshots.rst b/docs/api/v2/controller/snapshot/projectsprojectidsnapshots.rst index c37b5788..af3ff793 100644 --- a/docs/api/v2/controller/snapshot/projectsprojectidsnapshots.rst +++ b/docs/api/v2/controller/snapshot/projectsprojectidsnapshots.rst @@ -13,7 +13,7 @@ Parameters Response status codes ********************** -- **201**: Snasphot created +- **201**: Snapshot created - **404**: The project doesn't exist Input @@ -54,7 +54,7 @@ Parameters Response status codes ********************** -- **200**: Snasphot list returned +- **200**: Snapshot list returned - **404**: The project doesn't exist Sample session diff --git a/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotid.rst b/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotid.rst index bf3a0e59..109cdb74 100644 --- a/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotid.rst +++ b/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotid.rst @@ -10,7 +10,7 @@ Delete a snapshot from disk Parameters ********** - **project_id**: Project UUID -- **snapshot_id**: Snasphot UUID +- **snapshot_id**: Snapshot UUID Response status codes ********************** diff --git a/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotidrestore.rst b/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotidrestore.rst index 82386f82..ae8f6ce8 100644 --- a/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotidrestore.rst +++ b/docs/api/v2/controller/snapshot/projectsprojectidsnapshotssnapshotidrestore.rst @@ -10,7 +10,7 @@ Restore a snapshot from disk Parameters ********** - **project_id**: Project UUID -- **snapshot_id**: Snasphot UUID +- **snapshot_id**: Snapshot UUID Response status codes ********************** diff --git a/gns3server/compute/docker/docker_vm.py b/gns3server/compute/docker/docker_vm.py index 25a9b5e7..2317375b 100644 --- a/gns3server/compute/docker/docker_vm.py +++ b/gns3server/compute/docker/docker_vm.py @@ -86,6 +86,7 @@ class DockerVM(BaseNode): self._telnet_servers = [] self._xvfb_process = None self._vnc_process = None + self._vncconfig_process = None self._console_resolution = console_resolution self._console_http_path = console_http_path self._console_http_port = console_http_port @@ -615,6 +616,11 @@ class DockerVM(BaseNode): x11_socket = os.path.join("/tmp/.X11-unix/", "X{}".format(self._display)) await wait_for_file_creation(x11_socket) + # Start vncconfig for tigervnc clipboard support, connection available only after socket creation. + tigervncconfig_path = shutil.which("vncconfig") + if tigervnc_path and tigervncconfig_path: + self._vncconfig_process = await asyncio.create_subprocess_exec(tigervncconfig_path, "-display", ":{}".format(self._display), "-nowin") + # sometimes the VNC process can crash monitor_process(self._vnc_process, self._vnc_callback) @@ -825,6 +831,12 @@ class DockerVM(BaseNode): await self.stop() if self.console_type == "vnc": + if self._vncconfig_process: + try: + self._vncconfig_process.terminate() + await self._vncconfig_process.wait() + except ProcessLookupError: + pass if self._vnc_process: try: self._vnc_process.terminate() diff --git a/gns3server/handlers/api/controller/snapshot_handler.py b/gns3server/handlers/api/controller/snapshot_handler.py index 513bbe3e..f42de566 100644 --- a/gns3server/handlers/api/controller/snapshot_handler.py +++ b/gns3server/handlers/api/controller/snapshot_handler.py @@ -40,7 +40,7 @@ class SnapshotHandler: input=SNAPSHOT_CREATE_SCHEMA, output=SNAPSHOT_OBJECT_SCHEMA, status_codes={ - 201: "Snasphot created", + 201: "Snapshot created", 404: "The project doesn't exist" }) async def create(request, response): @@ -57,21 +57,21 @@ class SnapshotHandler: "project_id": "Project UUID", }, status_codes={ - 200: "Snasphot list returned", + 200: "Snapshot list returned", 404: "The project doesn't exist" }) def list(request, response): controller = Controller.instance() project = controller.get_project(request.match_info["project_id"]) snapshots = [s for s in project.snapshots.values()] - response.json(sorted(snapshots, key=lambda s: s.created_at)) + response.json(sorted(snapshots, key=lambda s: (s.created_at, s.name))) @Route.delete( r"/projects/{project_id}/snapshots/{snapshot_id}", description="Delete a snapshot from disk", parameters={ "project_id": "Project UUID", - "snapshot_id": "Snasphot UUID" + "snapshot_id": "Snapshot UUID" }, status_codes={ 204: "Changes have been written on disk", @@ -89,7 +89,7 @@ class SnapshotHandler: description="Restore a snapshot from disk", parameters={ "project_id": "Project UUID", - "snapshot_id": "Snasphot UUID" + "snapshot_id": "Snapshot UUID" }, output=PROJECT_OBJECT_SCHEMA, status_codes={