Compare commits

..

4 commits

Author SHA1 Message Date
ac982668c7
HTTP long polling before upgrade
All checks were successful
/ pylint (push) Successful in 1m10s
/ mypy (push) Successful in 2m47s
/ lint-and-typing (push) Successful in 2m52s
/ build-artifacts (push) Successful in 17s
/ publish-artifacts (push) Successful in 1m21s
/ build-and-push-container (push) Successful in 2m37s
/ release (push) Successful in 1m42s
2024-10-01 23:25:30 +02:00
ed24d59a92
HTTP long polling before upgrade 2024-10-01 23:24:31 +02:00
401e446059
Release 0.1.1
All checks were successful
/ pylint (push) Successful in 13s
/ mypy (push) Successful in 13s
/ publish-artifacts (push) Successful in 10s
/ lint-and-typing (push) Successful in 17s
/ build-artifacts (push) Successful in 12s
/ build-and-push-container (push) Successful in 1m23s
/ release (push) Successful in 7s
2024-09-28 15:39:22 +02:00
fc7ecdcd77
Readme
All checks were successful
/ pylint (push) Successful in 12s
/ mypy (push) Successful in 13s
2024-08-15 23:09:02 +02:00
3 changed files with 39 additions and 4 deletions

View file

@ -18,16 +18,50 @@ In the end, this is the current result that works pretty well for my understandi
Install it from the custom package index using Install it from the custom package index using
``` ```shell
pip install --extra-index-url https://forgejo.neshweb.net/api/packages/Firq/pypi/simple/ dockge-cli pip install --extra-index-url https://forgejo.neshweb.net/api/packages/Firq/pypi/simple/ dockge-cli
``` ```
Alternativly, install it using this repository. When installing for development, make sure to install with the additional dependencies Alternativly, install it using this repository. When installing for development, make sure to install with the additional dependencies
``` ```shell
pip install -e .[lint,typing] pip install -e .[lint,typing]
``` ```
## Usage ## Usage
Call the CLI using `dockge-cli` or `dockge`. Call the CLI using `dockge-cli` or `dockge`.
```shell
usage: dockge_cli [-h] [--version] {host,login,logout,list,status,restart,start,stop,down,update,exit,help}
CLI interface for interacting with Dockge
positional arguments:
{host,login,logout,list,status,restart,start,stop,down,update,exit,help}
options:
-h, --help show this help message and exit
--version show program's version number and exit
```
Help for each individual command can be invoked by calling `dockge-cli help <command>`
## The magic behind this
Generally, this makes use of the underlying Websockets API that the Dockge frontend uses to communicate with the server. By analyzing the traffic and looking into the codebase, I was able to reverse most of the packets that are being sent. This allows me to then contruct, send and receive my own packets, making the whole thing work.
There are some things that need to be taken into account for this: For one, dockge uses socket.io for the websocket communication. This meant I had to find the corresponding socket.io version to get the correct version of python-socketio. In addition, I had to find out how the authorization mechanism behind this works.
After finishing up the first prototype, the workings are as follows:
1. A websocket session is established using socket.io - this happens automatically
2. After the session is ready, the `login` command is sent together with a provided username and password
3. Once the CLI is authorized, the selected command is sent
4. The CLI waits for any response values and exits once the command has executed successfully
To provide a smooth experience, both the credentials and the remote host URI are stored on disk. just like the `docker` cli, the credentials are not encrypted, meaning it is advised to either clear the credentials after use OR to use the `--username` and `--password` parameters. This is especially recommended for CI applications.
## Known issues
This CLI does not work when Mullvad is used, as Mullvad actively blocks port forwarding (which python-socketio uses)

View file

@ -72,7 +72,7 @@ class DockgeConnection:
Connect to the websocket Connect to the websocket
""" """
# Dockge uses Socket.io for the websockets, so this URI and params are always the same # Dockge uses Socket.io for the websockets, so this URI and params are always the same
self._sio.connect(f"https://{self._host}/socket.io/", transports=['websocket']) self._sio.connect(f"https://{self._host}/socket.io/")
self.login() self.login()
def login(self): def login(self):

View file

@ -1,9 +1,10 @@
[project] [project]
name = "dockge_cli" name = "dockge_cli"
version = "0.1.1-c.2" version = "0.1.2"
dependencies = [ dependencies = [
"pyyaml~=6.0.1", "pyyaml~=6.0.1",
"pydantic~=2.8.0", "pydantic~=2.8.0",
"requests~=2.32.3",
"python-socketio~=5.11.3", "python-socketio~=5.11.3",
"websocket-client~=1.8.0", "websocket-client~=1.8.0",
"tabulate ~=0.9.0", "tabulate ~=0.9.0",