@wocker/ws 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -0
- package/lib/AppModule.js +17 -39
- package/lib/controllers/DebugController.d.ts +2 -1
- package/lib/controllers/DebugController.js +13 -5
- package/lib/controllers/KeystoreController.d.ts +11 -0
- package/lib/controllers/KeystoreController.js +106 -0
- package/lib/controllers/PluginController.d.ts +3 -5
- package/lib/controllers/PluginController.js +11 -57
- package/lib/controllers/PresetController.d.ts +5 -3
- package/lib/controllers/PresetController.js +73 -55
- package/lib/controllers/ProjectController.d.ts +5 -3
- package/lib/controllers/ProjectController.js +71 -46
- package/lib/controllers/ProxyController.d.ts +1 -1
- package/lib/controllers/ProxyController.js +56 -14
- package/lib/controllers/index.d.ts +1 -1
- package/lib/controllers/index.js +1 -1
- package/lib/env.d.ts +2 -1
- package/lib/env.js +20 -9
- package/lib/keystore/KeystoreService.d.ts +12 -0
- package/lib/keystore/KeystoreService.js +70 -0
- package/lib/keystore/index.d.ts +1 -0
- package/lib/keystore/index.js +17 -0
- package/lib/keystore/providers/FileKeystoreProvider.d.ts +16 -0
- package/lib/keystore/providers/FileKeystoreProvider.js +97 -0
- package/lib/keystore/providers/KeytarKeystoreProvider.d.ts +9 -0
- package/lib/keystore/providers/KeytarKeystoreProvider.js +74 -0
- package/lib/keystore/types/Encryption.d.ts +9 -0
- package/lib/keystore/types/Encryption.js +81 -0
- package/lib/keystore/types/Encryptor.d.ts +10 -0
- package/lib/keystore/types/Encryptor.js +59 -0
- package/lib/keystore/types/FileKeystore.d.ts +17 -0
- package/lib/keystore/types/FileKeystore.js +33 -0
- package/lib/keystore/types/Keytar.d.ts +8 -0
- package/lib/keystore/types/Keytar.js +2 -0
- package/lib/keystore/utils/createEncryptionKey.d.ts +1 -0
- package/lib/keystore/utils/createEncryptionKey.js +46 -0
- package/lib/keystore/utils/createPasswordHash.d.ts +1 -0
- package/lib/keystore/utils/createPasswordHash.js +20 -0
- package/lib/keystore/utils/decrypt.d.ts +1 -0
- package/lib/keystore/utils/decrypt.js +15 -0
- package/lib/keystore/utils/encrypt.d.ts +1 -0
- package/lib/keystore/utils/encrypt.js +19 -0
- package/lib/keystore/utils/index.d.ts +5 -0
- package/lib/keystore/utils/index.js +21 -0
- package/lib/keystore/utils/verifyPasswordHash.d.ts +1 -0
- package/lib/keystore/utils/verifyPasswordHash.js +9 -0
- package/lib/main.js +10 -5
- package/lib/makes/FS.d.ts +2 -2
- package/lib/makes/FS.js +19 -9
- package/lib/makes/GithubClient.d.ts +14 -0
- package/lib/makes/GithubClient.js +65 -0
- package/lib/makes/Http.js +17 -7
- package/lib/makes/Plugin.d.ts +6 -0
- package/lib/makes/Plugin.js +16 -0
- package/lib/makes/index.d.ts +1 -0
- package/lib/makes/index.js +1 -0
- package/lib/plugins/MongodbPlugin.js +17 -7
- package/lib/plugins/index.d.ts +0 -2
- package/lib/plugins/index.js +0 -2
- package/lib/repositories/PresetRepository.d.ts +23 -0
- package/lib/repositories/PresetRepository.js +115 -0
- package/lib/repositories/index.d.ts +1 -0
- package/lib/repositories/index.js +17 -0
- package/lib/services/AppConfigService.d.ts +16 -1
- package/lib/services/AppConfigService.js +88 -62
- package/lib/services/AppEventsService.d.ts +4 -4
- package/lib/services/AppEventsService.js +14 -10
- package/lib/services/CertService.js +18 -8
- package/lib/services/DockerService.d.ts +2 -2
- package/lib/services/DockerService.js +14 -8
- package/lib/services/LogService.d.ts +4 -1
- package/lib/services/LogService.js +14 -8
- package/lib/services/PluginService.d.ts +8 -2
- package/lib/services/PluginService.js +88 -23
- package/lib/services/PresetService.d.ts +9 -8
- package/lib/services/PresetService.js +144 -248
- package/lib/services/ProjectService.d.ts +5 -2
- package/lib/services/ProjectService.js +37 -10
- package/lib/services/ProxyService.d.ts +3 -2
- package/lib/services/ProxyService.js +43 -25
- package/lib/utils/index.d.ts +0 -2
- package/lib/utils/index.js +0 -2
- package/package.json +30 -15
- package/plugins/proxy/Dockerfile +17 -1
- package/plugins/proxy/Procfile +2 -0
- package/lib/controllers/ImageController.d.ts +0 -7
- package/lib/controllers/ImageController.js +0 -46
- package/lib/makes/Model.d.ts +0 -5
- package/lib/makes/Model.js +0 -12
- package/lib/plugins/ElasticSearchPlugin.d.ts +0 -15
- package/lib/plugins/ElasticSearchPlugin.js +0 -72
- package/lib/plugins/ProxmoxPlugin.d.ts +0 -12
- package/lib/plugins/ProxmoxPlugin.js +0 -83
- package/lib/utils/volumeFormat.d.ts +0 -6
- package/lib/utils/volumeFormat.js +0 -8
- package/lib/utils/volumeParse.d.ts +0 -2
- package/lib/utils/volumeParse.js +0 -13
- package/plugins/proxy/config.json +0 -3
- package/presets/bun/Dockerfile +0 -11
- package/presets/bun/config.json +0 -4
|
@@ -1,33 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
2
|
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
3
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
4
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
5
|
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
6
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
7
|
};
|
|
24
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
|
-
if (mod && mod.__esModule) return mod;
|
|
26
|
-
var result = {};
|
|
27
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
28
|
-
__setModuleDefault(result, mod);
|
|
29
|
-
return result;
|
|
30
|
-
};
|
|
31
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
32
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
33
10
|
};
|
|
@@ -39,79 +16,78 @@ exports.PresetService = void 0;
|
|
|
39
16
|
const core_1 = require("@wocker/core");
|
|
40
17
|
const utils_1 = require("@wocker/utils");
|
|
41
18
|
const md5_1 = __importDefault(require("md5"));
|
|
42
|
-
const axios_1 = __importDefault(require("axios"));
|
|
43
|
-
const unzipper_1 = require("unzipper");
|
|
44
|
-
const Path = __importStar(require("path"));
|
|
45
19
|
const AppConfigService_1 = require("./AppConfigService");
|
|
46
20
|
const LogService_1 = require("./LogService");
|
|
47
|
-
const
|
|
48
|
-
const
|
|
21
|
+
const PresetRepository_1 = require("../repositories/PresetRepository");
|
|
22
|
+
const GithubClient_1 = require("../makes/GithubClient");
|
|
49
23
|
let PresetService = class PresetService {
|
|
50
|
-
constructor(appConfigService, logService) {
|
|
24
|
+
constructor(appConfigService, presetRepository, logService) {
|
|
51
25
|
this.appConfigService = appConfigService;
|
|
26
|
+
this.presetRepository = presetRepository;
|
|
52
27
|
this.logService = logService;
|
|
53
28
|
}
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
29
|
+
async prompt(configMap, values = {}) {
|
|
30
|
+
for (const name in configMap) {
|
|
31
|
+
const config = configMap[name];
|
|
32
|
+
switch (config.type) {
|
|
33
|
+
case "boolean": {
|
|
34
|
+
const value = await (0, utils_1.promptConfirm)({
|
|
35
|
+
message: config.message,
|
|
36
|
+
required: config.required,
|
|
37
|
+
default: typeof values[name] !== "undefined" && values[name] === "true"
|
|
38
|
+
? true
|
|
39
|
+
: undefined,
|
|
40
|
+
});
|
|
41
|
+
values[name] = value.toString();
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
case "select": {
|
|
45
|
+
const result = await (0, utils_1.promptSelect)({
|
|
46
|
+
required: config.required,
|
|
47
|
+
multiple: config.multiple,
|
|
48
|
+
message: config.message,
|
|
49
|
+
options: config.options,
|
|
50
|
+
default: values[name]
|
|
51
|
+
});
|
|
52
|
+
if (!config.multiple) {
|
|
53
|
+
values[name] = result;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
const options = (0, utils_1.normalizeOptions)(config.options);
|
|
57
|
+
for (const option of options) {
|
|
58
|
+
if (result.includes(option.value)) {
|
|
59
|
+
values[option.value] = "true";
|
|
60
|
+
}
|
|
61
|
+
else if (option.value in values) {
|
|
62
|
+
delete values[option.value];
|
|
63
|
+
}
|
|
75
64
|
}
|
|
76
|
-
fs.writeJSON("config.json", rest);
|
|
77
|
-
break;
|
|
78
65
|
}
|
|
66
|
+
break;
|
|
79
67
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
await
|
|
68
|
+
case "int":
|
|
69
|
+
case "number": {
|
|
70
|
+
const result = await (0, utils_1.promptInput)({
|
|
71
|
+
...config,
|
|
72
|
+
type: "number",
|
|
73
|
+
default: values[name] || config.default
|
|
74
|
+
});
|
|
75
|
+
values[name] = result.toString();
|
|
76
|
+
break;
|
|
83
77
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
78
|
+
case "string":
|
|
79
|
+
case "text":
|
|
80
|
+
case "password": {
|
|
81
|
+
values[name] = await (0, utils_1.promptInput)({
|
|
82
|
+
...config,
|
|
83
|
+
type: config.type === "string" ? "text" : config.type,
|
|
84
|
+
default: values[name] || config.default
|
|
90
85
|
});
|
|
91
|
-
|
|
92
|
-
await config.save();
|
|
86
|
+
break;
|
|
93
87
|
}
|
|
94
88
|
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
async getList() {
|
|
98
|
-
const dirs = await makes_1.FS.readdir(env_1.PRESETS_DIR);
|
|
99
|
-
const { presets = [] } = this.appConfigService.getConfig();
|
|
100
|
-
return [
|
|
101
|
-
...dirs.map((name) => {
|
|
102
|
-
return {
|
|
103
|
-
name,
|
|
104
|
-
source: core_1.PRESET_SOURCE_INTERNAL,
|
|
105
|
-
path: Path.join(env_1.PRESETS_DIR, name)
|
|
106
|
-
};
|
|
107
|
-
}),
|
|
108
|
-
...presets.map((item) => {
|
|
109
|
-
if (item.source === core_1.PRESET_SOURCE_GITHUB) {
|
|
110
|
-
item.path = this.appConfigService.dataPath("presets", item.name);
|
|
111
|
-
}
|
|
112
|
-
return item;
|
|
113
|
-
})
|
|
114
|
-
];
|
|
89
|
+
}
|
|
90
|
+
return values;
|
|
115
91
|
}
|
|
116
92
|
getImageNameForProject(project, preset) {
|
|
117
93
|
switch (project.presetMode) {
|
|
@@ -122,8 +98,7 @@ let PresetService = class PresetService {
|
|
|
122
98
|
}
|
|
123
99
|
}
|
|
124
100
|
getImageName(preset, buildArgs) {
|
|
125
|
-
const rawValues = [];
|
|
126
|
-
const hashValues = [];
|
|
101
|
+
const rawValues = [], hashValues = [];
|
|
127
102
|
Object.keys(preset.buildArgsOptions || {}).forEach((key) => {
|
|
128
103
|
const hash = (preset.buildArgsOptions[key] || {}).hash || true;
|
|
129
104
|
const value = buildArgs[key];
|
|
@@ -143,107 +118,88 @@ let PresetService = class PresetService {
|
|
|
143
118
|
return `ws-preset-${preset.name}:${version}`;
|
|
144
119
|
}
|
|
145
120
|
async init() {
|
|
146
|
-
|
|
121
|
+
const fs = new core_1.FileSystem(this.appConfigService.pwd());
|
|
122
|
+
let preset = this.presetRepository.searchOne({
|
|
147
123
|
path: this.appConfigService.pwd()
|
|
148
124
|
});
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
if (!fs.exists("config.json")) {
|
|
152
|
-
preset = this.toObject({
|
|
153
|
-
name: "",
|
|
154
|
-
version: "",
|
|
155
|
-
source: "external",
|
|
156
|
-
path: this.appConfigService.pwd()
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
preset = this.toObject(fs.readJSON("config.json"));
|
|
161
|
-
preset.source = "external";
|
|
162
|
-
preset.path = this.appConfigService.pwd();
|
|
163
|
-
}
|
|
125
|
+
if (preset) {
|
|
126
|
+
return;
|
|
164
127
|
}
|
|
165
|
-
if (
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
required: true,
|
|
170
|
-
validate: async (value) => {
|
|
171
|
-
if (!/^[a-z][a-z0-9-_]+$/.test(value || "")) {
|
|
172
|
-
return "Invalid name";
|
|
173
|
-
}
|
|
174
|
-
const presetData = list.find((presetData) => {
|
|
175
|
-
return presetData.name === value;
|
|
176
|
-
});
|
|
177
|
-
if (presetData) {
|
|
178
|
-
return "Preset name is already taken";
|
|
179
|
-
}
|
|
180
|
-
return true;
|
|
181
|
-
},
|
|
182
|
-
default: preset.name
|
|
183
|
-
});
|
|
128
|
+
if (fs.exists("config.json")) {
|
|
129
|
+
const config = fs.readJSON("config.json");
|
|
130
|
+
this.appConfigService.registerPreset(config.name, core_1.PRESET_SOURCE_EXTERNAL, fs.path());
|
|
131
|
+
return;
|
|
184
132
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
}
|
|
133
|
+
let config = {};
|
|
134
|
+
config.name = await (0, utils_1.promptInput)({
|
|
135
|
+
message: "Preset name",
|
|
136
|
+
required: true,
|
|
137
|
+
validate: (name) => {
|
|
138
|
+
if (!name || typeof name !== "string") {
|
|
192
139
|
return true;
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
140
|
+
}
|
|
141
|
+
if (this.presetRepository.searchOne({ name })) {
|
|
142
|
+
return "Preset name already taken";
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
config.version = await (0, utils_1.promptInput)({
|
|
148
|
+
message: "Preset version",
|
|
149
|
+
validate: (version) => {
|
|
150
|
+
if (!/^[0-9]+\.[0-9]+\.[0-9]+$/.test(version)) {
|
|
151
|
+
return "Invalid version";
|
|
152
|
+
}
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
config.type = await (0, utils_1.promptSelect)({
|
|
157
|
+
message: "Preset type",
|
|
158
|
+
options: ["dockerfile", "image"]
|
|
159
|
+
});
|
|
160
|
+
switch (config.type) {
|
|
204
161
|
case "dockerfile":
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
return true;
|
|
210
|
-
}
|
|
211
|
-
return new RegExp("^Dockerfile(\\..*)?").test(fileName);
|
|
212
|
-
});
|
|
213
|
-
if (dockerfiles.length === 0) {
|
|
214
|
-
throw new Error("No dockerfiles found");
|
|
162
|
+
const files = await fs.readdirFiles();
|
|
163
|
+
const dockerfiles = files.filter((fileName) => {
|
|
164
|
+
if (new RegExp("^(.*)\\.dockerfile$").test(fileName)) {
|
|
165
|
+
return true;
|
|
215
166
|
}
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
167
|
+
return new RegExp("^Dockerfile(\\..*)?").test(fileName);
|
|
168
|
+
});
|
|
169
|
+
if (dockerfiles.length === 0) {
|
|
170
|
+
throw new Error("No dockerfiles found");
|
|
220
171
|
}
|
|
172
|
+
config.dockerfile = await (0, utils_1.promptSelect)({
|
|
173
|
+
message: "Preset dockerfile",
|
|
174
|
+
options: dockerfiles
|
|
175
|
+
});
|
|
221
176
|
break;
|
|
222
177
|
case "image":
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
return "Invalid image name";
|
|
230
|
-
}
|
|
231
|
-
return true;
|
|
178
|
+
config.image = await (0, utils_1.promptInput)({
|
|
179
|
+
message: "Preset image",
|
|
180
|
+
required: true,
|
|
181
|
+
validate(value) {
|
|
182
|
+
if (!/^[a-z0-9]+(?:[._-][a-z0-9]+)*(?::[a-z0-9]+(?:[._-][a-z0-9]+)*)?$/.test(value)) {
|
|
183
|
+
return "Invalid image name";
|
|
232
184
|
}
|
|
233
|
-
|
|
234
|
-
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
235
188
|
break;
|
|
236
189
|
}
|
|
237
|
-
console.info(JSON.stringify(
|
|
190
|
+
console.info(JSON.stringify(config, null, 4));
|
|
238
191
|
const confirm = await (0, utils_1.promptConfirm)({
|
|
239
|
-
message: "Correct
|
|
192
|
+
message: "Correct",
|
|
193
|
+
default: true
|
|
240
194
|
});
|
|
241
|
-
if (confirm) {
|
|
242
|
-
|
|
195
|
+
if (!confirm) {
|
|
196
|
+
return;
|
|
243
197
|
}
|
|
198
|
+
fs.writeJSON("config.json", config);
|
|
199
|
+
this.appConfigService.registerPreset(config.name, core_1.PRESET_SOURCE_EXTERNAL, fs.path());
|
|
244
200
|
}
|
|
245
201
|
async deinit() {
|
|
246
|
-
const preset =
|
|
202
|
+
const preset = this.presetRepository.searchOne({
|
|
247
203
|
path: this.appConfigService.pwd()
|
|
248
204
|
});
|
|
249
205
|
if (!preset) {
|
|
@@ -251,100 +207,40 @@ let PresetService = class PresetService {
|
|
|
251
207
|
}
|
|
252
208
|
const config = this.appConfigService.getConfig();
|
|
253
209
|
config.unregisterPreset(preset.name);
|
|
254
|
-
|
|
210
|
+
config.save();
|
|
255
211
|
}
|
|
256
|
-
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
throw new Error(`Preset ${name} not found`);
|
|
212
|
+
get(name) {
|
|
213
|
+
const preset = name
|
|
214
|
+
? this.presetRepository.searchOne({ name })
|
|
215
|
+
: this.presetRepository.searchOne({ path: this.appConfigService.pwd() });
|
|
216
|
+
if (!preset) {
|
|
217
|
+
throw new Error(name ? `Preset "${name}" not found` : "Preset not found");
|
|
263
218
|
}
|
|
264
|
-
|
|
265
|
-
return this.toObject({
|
|
266
|
-
...item,
|
|
267
|
-
...config
|
|
268
|
-
});
|
|
219
|
+
return preset;
|
|
269
220
|
}
|
|
270
|
-
async addPreset(name) {
|
|
271
|
-
let preset =
|
|
221
|
+
async addPreset(name, repository, version) {
|
|
222
|
+
let preset = this.presetRepository.searchOne({
|
|
272
223
|
name
|
|
273
224
|
});
|
|
274
225
|
if (!preset) {
|
|
275
226
|
console.info("Loading...");
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
.send(`/kearisp/wocker-${name}-preset/master/config.json`);
|
|
279
|
-
preset = this.toObject(res.data);
|
|
280
|
-
preset.source = core_1.PRESET_SOURCE_GITHUB;
|
|
281
|
-
preset.path = this.appConfigService.dataPath("presets", preset.name);
|
|
282
|
-
const zipRes = await axios_1.default.create({
|
|
283
|
-
baseURL: "https://github.com",
|
|
284
|
-
headers: {
|
|
285
|
-
"User-Agent": "Wocker"
|
|
286
|
-
}
|
|
287
|
-
}).get(`/kearisp/wocker-${preset.name}-preset/archive/refs/heads/master.zip`, {
|
|
288
|
-
responseType: "stream"
|
|
289
|
-
});
|
|
290
|
-
makes_1.FS.mkdirSync(preset.path, {
|
|
291
|
-
recursive: true
|
|
292
|
-
});
|
|
293
|
-
zipRes.data.pipe((0, unzipper_1.Parse)()).on("entry", (entry) => {
|
|
294
|
-
const path = entry.path.replace(/^[^\/]+\//, "");
|
|
295
|
-
if (path === "config.json") {
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
const fullPath = this.appConfigService.dataPath("presets", preset.name, path);
|
|
299
|
-
if (entry.type === "File") {
|
|
300
|
-
entry.pipe(makes_1.FS.createWriteStream(fullPath));
|
|
301
|
-
}
|
|
302
|
-
else if (entry.type === "Directory") {
|
|
303
|
-
makes_1.FS.mkdirSync(fullPath, {
|
|
304
|
-
recursive: true
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
|
-
await preset.save();
|
|
309
|
-
}
|
|
310
|
-
console.log(preset.version);
|
|
311
|
-
}
|
|
312
|
-
async search(options = {}) {
|
|
313
|
-
const { name, source, path } = options;
|
|
314
|
-
const presets = [];
|
|
315
|
-
const presetConfigs = await this.getList();
|
|
316
|
-
for (const presetConfig of presetConfigs) {
|
|
317
|
-
if (name && name !== presetConfig.name) {
|
|
318
|
-
continue;
|
|
319
|
-
}
|
|
320
|
-
if (source && source !== presetConfig.source) {
|
|
321
|
-
continue;
|
|
322
|
-
}
|
|
323
|
-
if (path && path !== presetConfig.path) {
|
|
324
|
-
continue;
|
|
325
|
-
}
|
|
326
|
-
try {
|
|
327
|
-
const fullConfig = await makes_1.FS.readJSON(presetConfig.path, "config.json");
|
|
328
|
-
const preset = this.toObject({
|
|
329
|
-
...presetConfig,
|
|
330
|
-
...fullConfig
|
|
331
|
-
});
|
|
332
|
-
presets.push(preset);
|
|
333
|
-
}
|
|
334
|
-
catch (err) {
|
|
335
|
-
this.logService.error("PresetService.search(", options, ") ->", err.message);
|
|
227
|
+
if (!repository) {
|
|
228
|
+
repository = `kearisp/wocker-${name}-preset`;
|
|
336
229
|
}
|
|
230
|
+
const [owner, repo] = repository.split("/");
|
|
231
|
+
const github = new GithubClient_1.GithubClient(owner, repo);
|
|
232
|
+
const info = await github.getInfo();
|
|
233
|
+
const config = await github.getFile(info.default_branch, "config.json");
|
|
234
|
+
console.log(config);
|
|
235
|
+
await github.download(info.default_branch, this.appConfigService.fs.path(`presets/${name}`));
|
|
236
|
+
this.appConfigService.registerPreset(name, core_1.PRESET_SOURCE_GITHUB);
|
|
337
237
|
}
|
|
338
|
-
return presets;
|
|
339
|
-
}
|
|
340
|
-
async searchOne(options = {}) {
|
|
341
|
-
const [preset] = await this.search(options);
|
|
342
|
-
return preset || null;
|
|
343
238
|
}
|
|
344
239
|
};
|
|
345
240
|
exports.PresetService = PresetService;
|
|
346
241
|
exports.PresetService = PresetService = __decorate([
|
|
347
242
|
(0, core_1.Injectable)(),
|
|
348
243
|
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
|
|
244
|
+
PresetRepository_1.PresetRepository,
|
|
349
245
|
LogService_1.LogService])
|
|
350
246
|
], PresetService);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Project, ProjectProperties } from "@wocker/core";
|
|
2
|
+
import { KeystoreService } from "../keystore";
|
|
2
3
|
import { AppConfigService } from "./AppConfigService";
|
|
3
4
|
import { AppEventsService } from "./AppEventsService";
|
|
4
5
|
import { DockerService } from "./DockerService";
|
|
@@ -9,16 +10,18 @@ type SearchParams = Partial<{
|
|
|
9
10
|
declare class ProjectService {
|
|
10
11
|
protected readonly appConfigService: AppConfigService;
|
|
11
12
|
protected readonly appEventsService: AppEventsService;
|
|
13
|
+
protected readonly keystoreService: KeystoreService;
|
|
12
14
|
protected readonly dockerService: DockerService;
|
|
13
|
-
constructor(appConfigService: AppConfigService, appEventsService: AppEventsService, dockerService: DockerService);
|
|
15
|
+
constructor(appConfigService: AppConfigService, appEventsService: AppEventsService, keystoreService: KeystoreService, dockerService: DockerService);
|
|
14
16
|
fromObject(data: Partial<ProjectProperties>): Project;
|
|
15
17
|
get(name?: string): Project;
|
|
16
18
|
getById(id: string): Project;
|
|
17
19
|
cdProject(name: string): void;
|
|
18
20
|
start(project: Project, restart?: boolean, rebuild?: boolean): Promise<void>;
|
|
19
21
|
stop(project: Project): Promise<void>;
|
|
20
|
-
save(project: Project):
|
|
22
|
+
save(project: Project): void;
|
|
21
23
|
search(params?: Partial<SearchParams>): Project[];
|
|
22
24
|
searchOne(params?: Partial<SearchParams>): Project | null;
|
|
25
|
+
logs(detach?: boolean): Promise<void>;
|
|
23
26
|
}
|
|
24
27
|
export { ProjectService };
|
|
@@ -11,13 +11,15 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.ProjectService = void 0;
|
|
13
13
|
const core_1 = require("@wocker/core");
|
|
14
|
+
const keystore_1 = require("../keystore");
|
|
14
15
|
const AppConfigService_1 = require("./AppConfigService");
|
|
15
16
|
const AppEventsService_1 = require("./AppEventsService");
|
|
16
17
|
const DockerService_1 = require("./DockerService");
|
|
17
18
|
let ProjectService = class ProjectService {
|
|
18
|
-
constructor(appConfigService, appEventsService, dockerService) {
|
|
19
|
+
constructor(appConfigService, appEventsService, keystoreService, dockerService) {
|
|
19
20
|
this.appConfigService = appConfigService;
|
|
20
21
|
this.appEventsService = appEventsService;
|
|
22
|
+
this.keystoreService = keystoreService;
|
|
21
23
|
this.dockerService = dockerService;
|
|
22
24
|
}
|
|
23
25
|
fromObject(data) {
|
|
@@ -26,8 +28,14 @@ let ProjectService = class ProjectService {
|
|
|
26
28
|
constructor(data) {
|
|
27
29
|
super(data);
|
|
28
30
|
}
|
|
29
|
-
async
|
|
30
|
-
|
|
31
|
+
async getSecret(key, defaultValue) {
|
|
32
|
+
return _this.keystoreService.get(`p:${this.name}:${key}`, defaultValue);
|
|
33
|
+
}
|
|
34
|
+
async setSecret(key, value) {
|
|
35
|
+
return _this.keystoreService.set(`p:${this.name}:${key}`, value);
|
|
36
|
+
}
|
|
37
|
+
save() {
|
|
38
|
+
_this.save(this);
|
|
31
39
|
}
|
|
32
40
|
}(data);
|
|
33
41
|
}
|
|
@@ -128,7 +136,7 @@ let ProjectService = class ProjectService {
|
|
|
128
136
|
await this.appEventsService.emit("project:stop", project);
|
|
129
137
|
await this.dockerService.removeContainer(project.containerName);
|
|
130
138
|
}
|
|
131
|
-
|
|
139
|
+
save(project) {
|
|
132
140
|
if (!project.name) {
|
|
133
141
|
throw new Error("Project should has a name");
|
|
134
142
|
}
|
|
@@ -138,20 +146,20 @@ let ProjectService = class ProjectService {
|
|
|
138
146
|
if (!project.id) {
|
|
139
147
|
project.id = project.name;
|
|
140
148
|
}
|
|
141
|
-
const config = this.appConfigService.getConfig();
|
|
142
149
|
if (!this.appConfigService.fs.exists(`projects/${project.id}`)) {
|
|
143
|
-
this.appConfigService.fs.mkdir(`projects/${project.id}`, {
|
|
150
|
+
this.appConfigService.fs.mkdir(`projects/${project.id}`, {
|
|
151
|
+
recursive: true
|
|
152
|
+
});
|
|
144
153
|
}
|
|
145
154
|
const { path, ...rest } = project.toJSON();
|
|
146
|
-
|
|
155
|
+
this.appConfigService.addProject(project.id, project.name, path);
|
|
147
156
|
this.appConfigService.fs.writeJSON(`projects/${project.id}/config.json`, rest);
|
|
148
|
-
|
|
157
|
+
this.appConfigService.save();
|
|
149
158
|
}
|
|
150
159
|
search(params = {}) {
|
|
151
160
|
const { name, path } = params;
|
|
152
|
-
const config = this.appConfigService.getConfig();
|
|
153
161
|
const projects = [];
|
|
154
|
-
for (const projectConfig of
|
|
162
|
+
for (const projectConfig of this.appConfigService.projects || []) {
|
|
155
163
|
if (name && projectConfig.name !== name) {
|
|
156
164
|
continue;
|
|
157
165
|
}
|
|
@@ -170,11 +178,30 @@ let ProjectService = class ProjectService {
|
|
|
170
178
|
const [project] = this.search(params);
|
|
171
179
|
return project || null;
|
|
172
180
|
}
|
|
181
|
+
async logs(detach) {
|
|
182
|
+
const project = this.get();
|
|
183
|
+
const container = await this.dockerService.getContainer(project.containerName);
|
|
184
|
+
if (!container) {
|
|
185
|
+
throw new Error("Project not started");
|
|
186
|
+
}
|
|
187
|
+
if (!detach) {
|
|
188
|
+
await this.dockerService.logs(container);
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
const data = await container.logs({
|
|
192
|
+
stdout: true,
|
|
193
|
+
stderr: true,
|
|
194
|
+
follow: false
|
|
195
|
+
});
|
|
196
|
+
process.stdout.write(data);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
173
199
|
};
|
|
174
200
|
exports.ProjectService = ProjectService;
|
|
175
201
|
exports.ProjectService = ProjectService = __decorate([
|
|
176
202
|
(0, core_1.Injectable)("PROJECT_SERVICE"),
|
|
177
203
|
__metadata("design:paramtypes", [AppConfigService_1.AppConfigService,
|
|
178
204
|
AppEventsService_1.AppEventsService,
|
|
205
|
+
keystore_1.KeystoreService,
|
|
179
206
|
DockerService_1.DockerService])
|
|
180
207
|
], ProjectService);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { Project } from "@wocker/core";
|
|
1
|
+
import { Project, ProxyService as CoreProxyService } from "@wocker/core";
|
|
2
2
|
import { AppConfigService } from "./AppConfigService";
|
|
3
3
|
import { DockerService } from "./DockerService";
|
|
4
|
-
export declare class ProxyService {
|
|
4
|
+
export declare class ProxyService extends CoreProxyService {
|
|
5
5
|
protected readonly appConfigService: AppConfigService;
|
|
6
6
|
protected readonly dockerService: DockerService;
|
|
7
7
|
protected containerName: string;
|
|
8
8
|
protected imageName: string;
|
|
9
|
+
protected oldImages: string[];
|
|
9
10
|
constructor(appConfigService: AppConfigService, dockerService: DockerService);
|
|
10
11
|
init(project: Project): Promise<void>;
|
|
11
12
|
start(restart?: boolean, rebuild?: boolean): Promise<void>;
|