import Docker from 'dockerode';
import { DockerClient } from '../docker/client.js';
export interface PruneOptions {
filters?: Record<string, string[]>;
}
export class SystemManager {
constructor(private dockerClient: DockerClient) {}
private getDocker(): Docker {
return this.dockerClient.getDocker();
}
async getSystemInfo(): Promise<any> {
return await this.dockerClient.getInfo();
}
async getVersion(): Promise<Docker.DockerVersion> {
return await this.dockerClient.getVersion();
}
async getEvents(options: { filters?: Record<string, string[]>; since?: number | string; until?: number | string } = {}): Promise<any> {
const docker = this.getDocker();
const eventOptions: any = {};
if (options.filters) {
eventOptions.filters = JSON.stringify(options.filters);
}
if (options.since) {
eventOptions.since = options.since;
}
if (options.until) {
eventOptions.until = options.until;
}
return await docker.getEvents(eventOptions);
}
async pruneSystem(options: PruneOptions = {}): Promise<any> {
// Dockerode doesn't have pruneSystem, so we'll combine individual prunes
const [images, containers, volumes, networks] = await Promise.all([
this.pruneImages(options),
this.pruneContainers(options),
this.pruneVolumes(options),
this.pruneNetworks(options),
]);
return {
ImagesDeleted: images.ImagesDeleted || [],
ContainersDeleted: containers.ContainersDeleted || [],
VolumesDeleted: volumes.VolumesDeleted || [],
NetworksDeleted: networks.NetworksDeleted || [],
SpaceReclaimed: (images.SpaceReclaimed || 0) + (volumes.SpaceReclaimed || 0),
};
}
async pruneImages(options: PruneOptions = {}): Promise<any> {
const docker = this.getDocker();
return await docker.pruneImages({
filters: options.filters ? JSON.stringify(options.filters) : undefined,
});
}
async pruneContainers(options: PruneOptions = {}): Promise<any> {
const docker = this.getDocker();
return await docker.pruneContainers({
filters: options.filters ? JSON.stringify(options.filters) : undefined,
});
}
async pruneVolumes(options: PruneOptions = {}): Promise<any> {
const docker = this.getDocker();
return await docker.pruneVolumes({
filters: options.filters ? JSON.stringify(options.filters) : undefined,
});
}
async pruneNetworks(options: PruneOptions = {}): Promise<any> {
const docker = this.getDocker();
return await docker.pruneNetworks({
filters: options.filters ? JSON.stringify(options.filters) : undefined,
});
}
}