dockerSocket.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. 'use strict';
  2. // @ts-check
  3. // ==================================================================================
  4. // dockerSockets.js
  5. // ----------------------------------------------------------------------------------
  6. // Description: System Information - library
  7. // for Node.js
  8. // Copyright: (c) 2014 - 2022
  9. // Author: Sebastian Hildebrandt
  10. // ----------------------------------------------------------------------------------
  11. // License: MIT
  12. // ==================================================================================
  13. // 13. DockerSockets
  14. // ----------------------------------------------------------------------------------
  15. const net = require('net');
  16. const isWin = require('os').type() === 'Windows_NT';
  17. const socketPath = isWin ? '//./pipe/docker_engine' : '/var/run/docker.sock';
  18. class DockerSocket {
  19. getInfo(callback) {
  20. try {
  21. let socket = net.createConnection({ path: socketPath });
  22. let alldata = '';
  23. let data;
  24. socket.on('connect', () => {
  25. socket.write('GET http:/info HTTP/1.0\r\n\r\n');
  26. });
  27. socket.on('data', data => {
  28. alldata = alldata + data.toString();
  29. });
  30. socket.on('error', () => {
  31. socket = false;
  32. callback({});
  33. });
  34. socket.on('end', () => {
  35. let startbody = alldata.indexOf('\r\n\r\n');
  36. alldata = alldata.substring(startbody + 4);
  37. socket = false;
  38. try {
  39. data = JSON.parse(alldata);
  40. callback(data);
  41. } catch (err) {
  42. callback({});
  43. }
  44. });
  45. } catch (err) {
  46. callback({});
  47. }
  48. }
  49. listImages(all, callback) {
  50. try {
  51. let socket = net.createConnection({ path: socketPath });
  52. let alldata = '';
  53. let data;
  54. socket.on('connect', () => {
  55. socket.write('GET http:/images/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
  56. });
  57. socket.on('data', data => {
  58. alldata = alldata + data.toString();
  59. });
  60. socket.on('error', () => {
  61. socket = false;
  62. callback({});
  63. });
  64. socket.on('end', () => {
  65. let startbody = alldata.indexOf('\r\n\r\n');
  66. alldata = alldata.substring(startbody + 4);
  67. socket = false;
  68. try {
  69. data = JSON.parse(alldata);
  70. callback(data);
  71. } catch (err) {
  72. callback({});
  73. }
  74. });
  75. } catch (err) {
  76. callback({});
  77. }
  78. }
  79. inspectImage(id, callback) {
  80. id = id || '';
  81. if (id) {
  82. try {
  83. let socket = net.createConnection({ path: socketPath });
  84. let alldata = '';
  85. let data;
  86. socket.on('connect', () => {
  87. socket.write('GET http:/images/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
  88. });
  89. socket.on('data', data => {
  90. alldata = alldata + data.toString();
  91. });
  92. socket.on('error', () => {
  93. socket = false;
  94. callback({});
  95. });
  96. socket.on('end', () => {
  97. let startbody = alldata.indexOf('\r\n\r\n');
  98. alldata = alldata.substring(startbody + 4);
  99. socket = false;
  100. try {
  101. data = JSON.parse(alldata);
  102. callback(data);
  103. } catch (err) {
  104. callback({});
  105. }
  106. });
  107. } catch (err) {
  108. callback({});
  109. }
  110. } else {
  111. callback({});
  112. }
  113. }
  114. listContainers(all, callback) {
  115. try {
  116. let socket = net.createConnection({ path: socketPath });
  117. let alldata = '';
  118. let data;
  119. socket.on('connect', () => {
  120. socket.write('GET http:/containers/json' + (all ? '?all=1' : '') + ' HTTP/1.0\r\n\r\n');
  121. });
  122. socket.on('data', data => {
  123. alldata = alldata + data.toString();
  124. });
  125. socket.on('error', () => {
  126. socket = false;
  127. callback({});
  128. });
  129. socket.on('end', () => {
  130. let startbody = alldata.indexOf('\r\n\r\n');
  131. alldata = alldata.substring(startbody + 4);
  132. socket = false;
  133. try {
  134. data = JSON.parse(alldata);
  135. callback(data);
  136. } catch (err) {
  137. callback({});
  138. }
  139. });
  140. } catch (err) {
  141. callback({});
  142. }
  143. }
  144. getStats(id, callback) {
  145. id = id || '';
  146. if (id) {
  147. try {
  148. let socket = net.createConnection({ path: socketPath });
  149. let alldata = '';
  150. let data;
  151. socket.on('connect', () => {
  152. socket.write('GET http:/containers/' + id + '/stats?stream=0 HTTP/1.0\r\n\r\n');
  153. });
  154. socket.on('data', data => {
  155. alldata = alldata + data.toString();
  156. });
  157. socket.on('error', () => {
  158. socket = false;
  159. callback({});
  160. });
  161. socket.on('end', () => {
  162. let startbody = alldata.indexOf('\r\n\r\n');
  163. alldata = alldata.substring(startbody + 4);
  164. socket = false;
  165. try {
  166. data = JSON.parse(alldata);
  167. callback(data);
  168. } catch (err) {
  169. callback({});
  170. }
  171. });
  172. } catch (err) {
  173. callback({});
  174. }
  175. } else {
  176. callback({});
  177. }
  178. }
  179. getInspect(id, callback) {
  180. id = id || '';
  181. if (id) {
  182. try {
  183. let socket = net.createConnection({ path: socketPath });
  184. let alldata = '';
  185. let data;
  186. socket.on('connect', () => {
  187. socket.write('GET http:/containers/' + id + '/json?stream=0 HTTP/1.0\r\n\r\n');
  188. });
  189. socket.on('data', data => {
  190. alldata = alldata + data.toString();
  191. });
  192. socket.on('error', () => {
  193. socket = false;
  194. callback({});
  195. });
  196. socket.on('end', () => {
  197. let startbody = alldata.indexOf('\r\n\r\n');
  198. alldata = alldata.substring(startbody + 4);
  199. socket = false;
  200. try {
  201. data = JSON.parse(alldata);
  202. callback(data);
  203. } catch (err) {
  204. callback({});
  205. }
  206. });
  207. } catch (err) {
  208. callback({});
  209. }
  210. } else {
  211. callback({});
  212. }
  213. }
  214. getProcesses(id, callback) {
  215. id = id || '';
  216. if (id) {
  217. try {
  218. let socket = net.createConnection({ path: socketPath });
  219. let alldata = '';
  220. let data;
  221. socket.on('connect', () => {
  222. socket.write('GET http:/containers/' + id + '/top?ps_args=-opid,ppid,pgid,vsz,time,etime,nice,ruser,user,rgroup,group,stat,rss,args HTTP/1.0\r\n\r\n');
  223. });
  224. socket.on('data', data => {
  225. alldata = alldata + data.toString();
  226. });
  227. socket.on('error', () => {
  228. socket = false;
  229. callback({});
  230. });
  231. socket.on('end', () => {
  232. let startbody = alldata.indexOf('\r\n\r\n');
  233. alldata = alldata.substring(startbody + 4);
  234. socket = false;
  235. try {
  236. data = JSON.parse(alldata);
  237. callback(data);
  238. } catch (err) {
  239. callback({});
  240. }
  241. });
  242. } catch (err) {
  243. callback({});
  244. }
  245. } else {
  246. callback({});
  247. }
  248. }
  249. listVolumes(callback) {
  250. try {
  251. let socket = net.createConnection({ path: socketPath });
  252. let alldata = '';
  253. let data;
  254. socket.on('connect', () => {
  255. socket.write('GET http:/volumes HTTP/1.0\r\n\r\n');
  256. });
  257. socket.on('data', data => {
  258. alldata = alldata + data.toString();
  259. });
  260. socket.on('error', () => {
  261. socket = false;
  262. callback({});
  263. });
  264. socket.on('end', () => {
  265. let startbody = alldata.indexOf('\r\n\r\n');
  266. alldata = alldata.substring(startbody + 4);
  267. socket = false;
  268. try {
  269. data = JSON.parse(alldata);
  270. callback(data);
  271. } catch (err) {
  272. callback({});
  273. }
  274. });
  275. } catch (err) {
  276. callback({});
  277. }
  278. }
  279. }
  280. module.exports = DockerSocket;