123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287 |
- import { SocketHandler } from "../socket-handler.js";
- import { DockgeServer } from "../dockge-server";
- import { callbackError, checkLogin, DockgeSocket, ValidationError } from "../util-server";
- import { Stack } from "../stack";
- // @ts-ignore
- import composerize from "composerize";
- import { convertToLocalStackName, convertToRemoteStackID, isRemoteStackName, LooseObject } from "../util-common";
- export class DockerSocketHandler extends SocketHandler {
- create(socket : DockgeSocket, server : DockgeServer) {
- socket.on("deployStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
- try {
- checkLogin(socket);
- const stack = this.saveStack(socket, server, name, composeYAML, isAdd);
- await stack.deploy(socket);
- server.sendStackList();
- callback({
- ok: true,
- msg: "Deployed",
- });
- stack.joinCombinedTerminal(socket);
- } catch (e) {
- callbackError(e, callback);
- }
- });
- socket.on("saveStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
- try {
- checkLogin(socket);
- this.saveStack(socket, server, name, composeYAML, isAdd);
- callback({
- ok: true,
- "msg": "Saved"
- });
- server.sendStackList();
- } catch (e) {
- callbackError(e, callback);
- }
- });
- socket.on("deleteStack", async (name : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(name) !== "string") {
- throw new ValidationError("Name must be a string");
- }
- const stack = Stack.getStack(server, name);
- try {
- await stack.delete(socket);
- } catch (e) {
- server.sendStackList();
- throw e;
- }
- server.sendStackList();
- callback({
- ok: true,
- msg: "Deleted"
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- this.event("getStack", socket, (req : LooseObject, callback) => {
- try {
- checkLogin(socket);
- if (typeof(req) !== "object") {
- throw new ValidationError("Request must be an object");
- }
- let stackName = req.stackName;
- const stack = Stack.getStack(server, stackName);
- if (stack.isManagedByDockge) {
- stack.joinCombinedTerminal(socket);
- }
- callback({
- ok: true,
- stack: stack.toJSON(),
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // requestStackList
- socket.on("requestStackList", async (callback) => {
- try {
- checkLogin(socket);
- server.sendStackList();
- callback({
- ok: true,
- msg: "Updated"
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // startStack
- socket.on("startStack", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName);
- await stack.start(socket);
- callback({
- ok: true,
- msg: "Started"
- });
- server.sendStackList();
- stack.joinCombinedTerminal(socket);
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // stopStack
- socket.on("stopStack", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName);
- await stack.stop(socket);
- callback({
- ok: true,
- msg: "Stopped"
- });
- server.sendStackList();
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // restartStack
- socket.on("restartStack", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName);
- await stack.restart(socket);
- callback({
- ok: true,
- msg: "Restarted"
- });
- server.sendStackList();
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // updateStack
- socket.on("updateStack", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName);
- await stack.update(socket);
- callback({
- ok: true,
- msg: "Updated"
- });
- server.sendStackList();
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // down stack
- socket.on("downStack", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName);
- await stack.down(socket);
- callback({
- ok: true,
- msg: "Downed"
- });
- server.sendStackList();
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // Services status
- socket.on("serviceStatusList", async (stackName : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(stackName) !== "string") {
- throw new ValidationError("Stack name must be a string");
- }
- const stack = Stack.getStack(server, stackName, true);
- const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList());
- callback({
- ok: true,
- serviceStatusList,
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // getExternalNetworkList
- socket.on("getDockerNetworkList", async (callback) => {
- try {
- checkLogin(socket);
- const dockerNetworkList = server.getDockerNetworkList();
- callback({
- ok: true,
- dockerNetworkList,
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- // composerize
- socket.on("composerize", async (dockerRunCommand : unknown, callback) => {
- try {
- checkLogin(socket);
- if (typeof(dockerRunCommand) !== "string") {
- throw new ValidationError("dockerRunCommand must be a string");
- }
- const composeTemplate = composerize(dockerRunCommand);
- callback({
- ok: true,
- composeTemplate,
- });
- } catch (e) {
- callbackError(e, callback);
- }
- });
- }
- saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, isAdd : unknown) : Stack {
- // Check types
- if (typeof(name) !== "string") {
- throw new ValidationError("Name must be a string");
- }
- if (typeof(composeYAML) !== "string") {
- throw new ValidationError("Compose YAML must be a string");
- }
- if (typeof(isAdd) !== "boolean") {
- throw new ValidationError("isAdd must be a boolean");
- }
- const stack = new Stack(server, name, composeYAML);
- stack.save(isAdd);
- return stack;
- }
- }
|