1 | "use strict";
|
2 | var _ = require('lodash');
|
3 | var child_process = require('child_process');
|
4 | var os = require('os');
|
5 | var nodeify_ts_1 = require('nodeify-ts');
|
6 | var cli_table_2_json_1 = require('cli-table-2-json');
|
7 | var dockermachine_cli_js_1 = require('dockermachine-cli-js');
|
8 | var exec = child_process.exec;
|
9 | var array2Oject = function (lines) {
|
10 | return lines.reduce(function (object, linep) {
|
11 | var line = linep.trim();
|
12 | if (line.length === 0) {
|
13 | return object;
|
14 | }
|
15 | var parts = line.split(':');
|
16 | var key = parts[0];
|
17 | var value = parts.slice(1).join(':');
|
18 | key = _.snakeCase(key);
|
19 | object[key] = value.trim();
|
20 | return object;
|
21 | }, {});
|
22 | };
|
23 | var extractResult = function (result) {
|
24 | var extracterArray = [
|
25 | {
|
26 | re: / build /,
|
27 | run: function (resultp) {
|
28 | var lines = resultp.raw.split(os.EOL);
|
29 | lines.forEach(function (line) {
|
30 | var re = /Successfully built (.*)$/;
|
31 | var str = line;
|
32 | var m;
|
33 | if ((m = re.exec(str)) !== null) {
|
34 | if (m.index === re.lastIndex) {
|
35 | re.lastIndex++;
|
36 | }
|
37 | resultp.success = true;
|
38 | resultp.imageId = m[1];
|
39 | }
|
40 | });
|
41 | resultp.response = lines;
|
42 | return resultp;
|
43 | },
|
44 | },
|
45 | {
|
46 | re: / run /,
|
47 | run: function (resultp) {
|
48 | resultp.containerId = resultp.raw.trim();
|
49 | return resultp;
|
50 | },
|
51 | },
|
52 | {
|
53 | re: / ps /,
|
54 | run: function (resultp) {
|
55 | var lines = resultp.raw.split(os.EOL);
|
56 | resultp.containerList = cli_table_2_json_1.cliTable2Json(lines);
|
57 | return resultp;
|
58 | },
|
59 | },
|
60 | {
|
61 | re: / images /,
|
62 | run: function (resultp) {
|
63 | var lines = resultp.raw.split(os.EOL);
|
64 | resultp.images = cli_table_2_json_1.cliTable2Json(lines);
|
65 | return resultp;
|
66 | },
|
67 | },
|
68 | {
|
69 | re: / network ls /,
|
70 | run: function (resultp) {
|
71 | var lines = resultp.raw.split(os.EOL);
|
72 | resultp.network = cli_table_2_json_1.cliTable2Json(lines);
|
73 | return resultp;
|
74 | },
|
75 | },
|
76 | {
|
77 | re: / inspect /,
|
78 | run: function (resultp) {
|
79 | var object = JSON.parse(resultp.raw);
|
80 | resultp.object = object;
|
81 | return resultp;
|
82 | },
|
83 | },
|
84 | {
|
85 | re: / info /,
|
86 | run: function (resultp) {
|
87 | var lines = resultp.raw.split(os.EOL);
|
88 | resultp.object = array2Oject(lines);
|
89 | return resultp;
|
90 | },
|
91 | },
|
92 | ];
|
93 | extracterArray.forEach(function (extracter) {
|
94 | var re = extracter.re;
|
95 | var str = result.command;
|
96 | var m;
|
97 | if ((m = re.exec(str)) !== null) {
|
98 | if (m.index === re.lastIndex) {
|
99 | re.lastIndex++;
|
100 | }
|
101 | return extracter.run(result);
|
102 | }
|
103 | });
|
104 | return result;
|
105 | };
|
106 | var Docker = (function () {
|
107 | function Docker(options) {
|
108 | if (options === void 0) { options = {
|
109 | currentWorkingDirectory: null,
|
110 | machineName: null,
|
111 | }; }
|
112 | this.options = options;
|
113 | }
|
114 | Docker.prototype.command = function (command, callback) {
|
115 | var docker = this;
|
116 | var execCommand = 'docker ';
|
117 | var machineconfig = '';
|
118 | var promise = Promise.resolve().then(function () {
|
119 | if (docker.options.machineName) {
|
120 | var dockerMachine = new dockermachine_cli_js_1.DockerMachine();
|
121 | return dockerMachine.command('config ' + docker.options.machineName).then(function (data) {
|
122 | machineconfig = data.machine.config;
|
123 | });
|
124 | }
|
125 | }).then(function () {
|
126 | execCommand += ' ' + machineconfig + ' ' + command + ' ';
|
127 | var execOptions = {
|
128 | cwd: docker.options.currentWorkingDirectory,
|
129 | env: {
|
130 | DEBUG: '',
|
131 | HOME: process.env.HOME,
|
132 | PATH: process.env.PATH,
|
133 | },
|
134 | maxBuffer: 200 * 1024 * 1024,
|
135 | };
|
136 | return new Promise(function (resolve, reject) {
|
137 | exec(execCommand, execOptions, function (error, stdout, stderr) {
|
138 | if (error) {
|
139 | var message = "error: '" + error + "' stdout = '" + stdout + "' stderr = '" + stderr + "'";
|
140 | console.error(message);
|
141 | reject(message);
|
142 | }
|
143 | resolve({ result: stdout });
|
144 | });
|
145 | });
|
146 | }).then(function (data) {
|
147 | var result = {
|
148 | command: execCommand,
|
149 | raw: data.result,
|
150 | };
|
151 | return extractResult(result);
|
152 | });
|
153 | return nodeify_ts_1.default(promise, callback);
|
154 | };
|
155 | return Docker;
|
156 | }());
|
157 | exports.Docker = Docker;
|
158 | var Options = (function () {
|
159 | function Options(machineName, currentWorkingDirectory) {
|
160 | this.machineName = machineName;
|
161 | this.currentWorkingDirectory = currentWorkingDirectory;
|
162 | }
|
163 | return Options;
|
164 | }());
|
165 | exports.Options = Options;
|
166 |
|
\ | No newline at end of file |