docker-socket-handler.ts 8.8 KB

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