docker-socket-handler.ts 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. import { SocketHandler } from "../socket-handler.js";
  2. import { DockgeServer } from "../dockge-server";
  3. import { callbackError, checkLogin, DockgeSocket, ValidationError } from "../util-server";
  4. import { Stack } from "../stack";
  5. // @ts-ignore
  6. import composerize from "composerize";
  7. import { convertToLocalStackName, convertToRemoteStackID, isRemoteStackName, LooseObject } from "../util-common";
  8. export class DockerSocketHandler extends SocketHandler {
  9. create(socket : DockgeSocket, server : DockgeServer) {
  10. socket.on("deployStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
  11. try {
  12. checkLogin(socket);
  13. const stack = this.saveStack(socket, server, name, composeYAML, isAdd);
  14. await stack.deploy(socket);
  15. server.sendStackList();
  16. callback({
  17. ok: true,
  18. msg: "Deployed",
  19. });
  20. stack.joinCombinedTerminal(socket);
  21. } catch (e) {
  22. callbackError(e, callback);
  23. }
  24. });
  25. socket.on("saveStack", async (name : unknown, composeYAML : unknown, isAdd : unknown, callback) => {
  26. try {
  27. checkLogin(socket);
  28. this.saveStack(socket, server, name, composeYAML, isAdd);
  29. callback({
  30. ok: true,
  31. "msg": "Saved"
  32. });
  33. server.sendStackList();
  34. } catch (e) {
  35. callbackError(e, callback);
  36. }
  37. });
  38. socket.on("deleteStack", async (name : unknown, callback) => {
  39. try {
  40. checkLogin(socket);
  41. if (typeof(name) !== "string") {
  42. throw new ValidationError("Name must be a string");
  43. }
  44. const stack = Stack.getStack(server, name);
  45. try {
  46. await stack.delete(socket);
  47. } catch (e) {
  48. server.sendStackList();
  49. throw e;
  50. }
  51. server.sendStackList();
  52. callback({
  53. ok: true,
  54. msg: "Deleted"
  55. });
  56. } catch (e) {
  57. callbackError(e, callback);
  58. }
  59. });
  60. this.event("getStack", socket, (req : LooseObject, callback) => {
  61. try {
  62. checkLogin(socket);
  63. if (typeof(req) !== "object") {
  64. throw new ValidationError("Request must be an object");
  65. }
  66. let stackName = req.stackName;
  67. const stack = Stack.getStack(server, stackName);
  68. if (stack.isManagedByDockge) {
  69. stack.joinCombinedTerminal(socket);
  70. }
  71. callback({
  72. ok: true,
  73. stack: stack.toJSON(),
  74. });
  75. } catch (e) {
  76. callbackError(e, callback);
  77. }
  78. });
  79. // requestStackList
  80. socket.on("requestStackList", async (callback) => {
  81. try {
  82. checkLogin(socket);
  83. server.sendStackList();
  84. callback({
  85. ok: true,
  86. msg: "Updated"
  87. });
  88. } catch (e) {
  89. callbackError(e, callback);
  90. }
  91. });
  92. // startStack
  93. socket.on("startStack", async (stackName : unknown, callback) => {
  94. try {
  95. checkLogin(socket);
  96. if (typeof(stackName) !== "string") {
  97. throw new ValidationError("Stack name must be a string");
  98. }
  99. const stack = Stack.getStack(server, stackName);
  100. await stack.start(socket);
  101. callback({
  102. ok: true,
  103. msg: "Started"
  104. });
  105. server.sendStackList();
  106. stack.joinCombinedTerminal(socket);
  107. } catch (e) {
  108. callbackError(e, callback);
  109. }
  110. });
  111. // stopStack
  112. socket.on("stopStack", async (stackName : unknown, callback) => {
  113. try {
  114. checkLogin(socket);
  115. if (typeof(stackName) !== "string") {
  116. throw new ValidationError("Stack name must be a string");
  117. }
  118. const stack = Stack.getStack(server, stackName);
  119. await stack.stop(socket);
  120. callback({
  121. ok: true,
  122. msg: "Stopped"
  123. });
  124. server.sendStackList();
  125. } catch (e) {
  126. callbackError(e, callback);
  127. }
  128. });
  129. // restartStack
  130. socket.on("restartStack", async (stackName : unknown, callback) => {
  131. try {
  132. checkLogin(socket);
  133. if (typeof(stackName) !== "string") {
  134. throw new ValidationError("Stack name must be a string");
  135. }
  136. const stack = Stack.getStack(server, stackName);
  137. await stack.restart(socket);
  138. callback({
  139. ok: true,
  140. msg: "Restarted"
  141. });
  142. server.sendStackList();
  143. } catch (e) {
  144. callbackError(e, callback);
  145. }
  146. });
  147. // updateStack
  148. socket.on("updateStack", async (stackName : unknown, callback) => {
  149. try {
  150. checkLogin(socket);
  151. if (typeof(stackName) !== "string") {
  152. throw new ValidationError("Stack name must be a string");
  153. }
  154. const stack = Stack.getStack(server, stackName);
  155. await stack.update(socket);
  156. callback({
  157. ok: true,
  158. msg: "Updated"
  159. });
  160. server.sendStackList();
  161. } catch (e) {
  162. callbackError(e, callback);
  163. }
  164. });
  165. // down stack
  166. socket.on("downStack", async (stackName : unknown, callback) => {
  167. try {
  168. checkLogin(socket);
  169. if (typeof(stackName) !== "string") {
  170. throw new ValidationError("Stack name must be a string");
  171. }
  172. const stack = Stack.getStack(server, stackName);
  173. await stack.down(socket);
  174. callback({
  175. ok: true,
  176. msg: "Downed"
  177. });
  178. server.sendStackList();
  179. } catch (e) {
  180. callbackError(e, callback);
  181. }
  182. });
  183. // Services status
  184. socket.on("serviceStatusList", async (stackName : unknown, callback) => {
  185. try {
  186. checkLogin(socket);
  187. if (typeof(stackName) !== "string") {
  188. throw new ValidationError("Stack name must be a string");
  189. }
  190. const stack = Stack.getStack(server, stackName, true);
  191. const serviceStatusList = Object.fromEntries(await stack.getServiceStatusList());
  192. callback({
  193. ok: true,
  194. serviceStatusList,
  195. });
  196. } catch (e) {
  197. callbackError(e, callback);
  198. }
  199. });
  200. // getExternalNetworkList
  201. socket.on("getDockerNetworkList", async (callback) => {
  202. try {
  203. checkLogin(socket);
  204. const dockerNetworkList = server.getDockerNetworkList();
  205. callback({
  206. ok: true,
  207. dockerNetworkList,
  208. });
  209. } catch (e) {
  210. callbackError(e, callback);
  211. }
  212. });
  213. // composerize
  214. socket.on("composerize", async (dockerRunCommand : unknown, callback) => {
  215. try {
  216. checkLogin(socket);
  217. if (typeof(dockerRunCommand) !== "string") {
  218. throw new ValidationError("dockerRunCommand must be a string");
  219. }
  220. const composeTemplate = composerize(dockerRunCommand);
  221. callback({
  222. ok: true,
  223. composeTemplate,
  224. });
  225. } catch (e) {
  226. callbackError(e, callback);
  227. }
  228. });
  229. }
  230. saveStack(socket : DockgeSocket, server : DockgeServer, name : unknown, composeYAML : unknown, isAdd : unknown) : Stack {
  231. // Check types
  232. if (typeof(name) !== "string") {
  233. throw new ValidationError("Name must be a string");
  234. }
  235. if (typeof(composeYAML) !== "string") {
  236. throw new ValidationError("Compose YAML must be a string");
  237. }
  238. if (typeof(isAdd) !== "boolean") {
  239. throw new ValidationError("isAdd must be a boolean");
  240. }
  241. const stack = new Stack(server, name, composeYAML);
  242. stack.save(isAdd);
  243. return stack;
  244. }
  245. }