Skip to content

Commit 5cc9e7f

Browse files
committed
FEAT: Docker socket
1 parent 8fabd3a commit 5cc9e7f

8 files changed

Lines changed: 413 additions & 3 deletions

File tree

Cargo.lock

Lines changed: 337 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,7 @@ serde = { version = "1.0.217", features = ["derive"] }
1111
serde_json = "1.0.138"
1212
tower-http = { version = "0.6.2", features = ["cors"] }
1313
tower = "0.5.2"
14+
tokio-tungstenite = "0.26.1"
15+
futures = "0.3.31"
16+
futures-util = "0.3.31"
17+
socketioxide = "0.16.1"

src/main.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,29 @@
11
mod routes;
22
mod controllers;
33
mod errors;
4+
mod sockets;
5+
mod services;
46

57
use axum::http::{HeaderValue, Method};
68
use routes::setup_routes;
79
use tower_http::cors::{AllowOrigin, CorsLayer};
810

911
#[tokio::main]
10-
async fn main() {
12+
async fn main() {
1113
let cors = CorsLayer::new()
1214
.allow_methods(vec![Method::GET, Method::POST, Method::PUT, Method::DELETE])
1315
.allow_origin(AllowOrigin::list([
1416
HeaderValue::from_str("https://admin.bryan-ferrando.fr").unwrap(),
1517
HeaderValue::from_str("http://localhost:5173").unwrap()
1618
]));
1719

18-
let app = setup_routes().layer(cors);
20+
let app = setup_routes()
21+
.layer(sockets::create_websocket_layer())
22+
.layer(cors);
1923

2024
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
25+
26+
27+
2128
axum::serve(listener, app).await.unwrap();
2229
}

src/routes/mod.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,4 @@ mod docker;
55
pub fn setup_routes() -> Router {
66
Router::new()
77
.nest("/docker", docker::create_routes())
8-
98
}

src/services/docker.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use serde_json::json;
2+
use bollard::{container::ListContainersOptions, errors::Error, secret::ContainerSummary, system::Version, Docker};
3+
4+
pub fn get_docker_client() -> Result<Docker, Error> {
5+
Docker::connect_with_socket_defaults()
6+
}
7+
8+
pub async fn get_version() -> Result<Version, Error> {
9+
let docker = get_docker_client();
10+
11+
match docker {
12+
Ok(docker) => {
13+
match docker.version().await {
14+
Ok(version) => Ok(version),
15+
Err(error) => Err(error)
16+
}
17+
},
18+
Err(error) => Err(error)
19+
}
20+
}
21+
22+
pub async fn get_containers() -> Result<Vec<ContainerSummary>, Error> {
23+
let options = Some(bollard::container::ListContainersOptions::<String> {
24+
all: true,
25+
..Default::default()
26+
});
27+
28+
let docker = get_docker_client();
29+
30+
match docker {
31+
Ok(docker) => {
32+
match docker.list_containers(options).await {
33+
Ok(containers) => Ok(containers),
34+
Err(error) => Err(error)
35+
}
36+
},
37+
Err(error) => Err(error)
38+
}
39+
}

src/services/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod docker;

src/sockets/docker.rs

Whitespace-only changes.

src/sockets/mod.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use socketioxide::{extract::SocketRef, layer::SocketIoLayer, SocketIo};
2+
3+
use crate::services::docker;
4+
5+
pub fn create_websocket_layer() -> SocketIoLayer {
6+
let (socket_layer, io) = SocketIo::new_layer();
7+
8+
io.ns("/", |socket: SocketRef| async move {
9+
println!("Client connected : {}", socket.id);
10+
11+
socket.on("docker:containers", |socket: SocketRef| async move {
12+
let containers = docker::get_containers().await.unwrap_or_else(|_| vec![]);
13+
14+
let _ = socket.emit("docker:containers", &containers);
15+
});
16+
17+
socket.on_disconnect(|socket: SocketRef| async move {
18+
println!("Client disconnected : {}", socket.id);
19+
});
20+
});
21+
22+
socket_layer
23+
}

0 commit comments

Comments
 (0)