@adinsure-ops/ops-cli 5.2.1 → 5.3.0
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 +123 -9
- package/lib/commands/config/get.d.ts +11 -0
- package/lib/commands/config/get.js +40 -0
- package/lib/commands/config/list.d.ts +8 -0
- package/lib/commands/config/list.js +26 -0
- package/lib/commands/config/set.d.ts +12 -0
- package/lib/commands/config/set.js +60 -0
- package/lib/commands/config/unset.d.ts +11 -0
- package/lib/commands/config/unset.js +42 -0
- package/lib/commands/download/client.d.ts +11 -3
- package/lib/commands/download/client.js +52 -8
- package/lib/commands/download/identity-server.d.ts +11 -3
- package/lib/commands/download/identity-server.js +53 -8
- package/lib/commands/download/jmeter.d.ts +1 -1
- package/lib/commands/download/jmeter.js +13 -3
- package/lib/commands/download/keycloak-scim.d.ts +1 -1
- package/lib/commands/download/keycloak-scim.js +13 -3
- package/lib/commands/download/platform.d.ts +11 -3
- package/lib/commands/download/platform.js +53 -8
- package/lib/commands/download/scheduler.d.ts +11 -3
- package/lib/commands/download/scheduler.js +52 -8
- package/lib/commands/download/server.d.ts +11 -3
- package/lib/commands/download/server.js +53 -9
- package/lib/commands/download/signalr.d.ts +11 -3
- package/lib/commands/download/signalr.js +52 -8
- package/lib/commands/download/studio.d.ts +11 -3
- package/lib/commands/download/studio.js +52 -8
- package/lib/commands/login.d.ts +9 -0
- package/lib/commands/login.js +60 -1
- package/lib/commands/login.ru.d.ts +12 -0
- package/lib/commands/login.ru.js +42 -0
- package/lib/commands/npm/check-publish.js +1 -1
- package/lib/lib/config.d.ts +10 -0
- package/lib/lib/config.js +33 -0
- package/lib/lib/yarnrc.d.ts +22 -0
- package/lib/lib/yarnrc.js +40 -0
- package/lib/security/context.d.ts +22 -0
- package/lib/security/context.js +113 -0
- package/oclif.manifest.json +415 -152
- package/package.json +1 -1
|
@@ -6,10 +6,12 @@ import fs from 'fs-extra';
|
|
|
6
6
|
import os from 'os';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import CommandBase from '../../command.base.js';
|
|
9
|
+
import OpsConfig from '../../lib/config.js';
|
|
9
10
|
class DownloadServer extends CommandBase {
|
|
10
11
|
constructor() {
|
|
11
12
|
super(...arguments);
|
|
12
|
-
this.
|
|
13
|
+
this.url_azure = 'https://ops.adinsure.com/api/storage/binaries/';
|
|
14
|
+
this.url_gitlabru = 'https://gitlabru.adacta-fintech.ru/api/v4/projects/2/packages/generic';
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* Get unique AdInsure Server zip by specified version
|
|
@@ -17,9 +19,9 @@ class DownloadServer extends CommandBase {
|
|
|
17
19
|
* @returns {Promise<AxiosResponse<any, any>>}
|
|
18
20
|
*/
|
|
19
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
|
|
22
|
+
downloadFileFromAzure(version) {
|
|
21
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
return axios.get(`${this.
|
|
24
|
+
return axios.get(`${this.url_azure}/AdInsure-server-${version}.zip`, {
|
|
23
25
|
headers: {
|
|
24
26
|
Authorization: 'Bearer ' + (yield this.security.getToken()),
|
|
25
27
|
'Content-Type': 'application/octet-stream',
|
|
@@ -28,6 +30,24 @@ class DownloadServer extends CommandBase {
|
|
|
28
30
|
});
|
|
29
31
|
});
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Get unique AdInsure Server zip by specified version
|
|
35
|
+
* @param {string} version The version of AdInsure Server
|
|
36
|
+
* @returns {Promise<AxiosResponse<any, any>>}
|
|
37
|
+
*/
|
|
38
|
+
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
downloadFileFromGitLabRu(version) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
const packageName = 'AdInsure-server';
|
|
42
|
+
const fileName = `${packageName}-${version}.zip`;
|
|
43
|
+
return axios.get(`${this.url_gitlabru}/${packageName}/${version}/${fileName}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
'PRIVATE-TOKEN': this.security.getTokenRu(),
|
|
46
|
+
},
|
|
47
|
+
responseType: 'arraybuffer',
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
31
51
|
run() {
|
|
32
52
|
const _super = Object.create(null, {
|
|
33
53
|
run: { get: () => super.run }
|
|
@@ -35,14 +55,34 @@ class DownloadServer extends CommandBase {
|
|
|
35
55
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
56
|
_super.run.call(this);
|
|
37
57
|
const { flags } = yield this.parse(DownloadServer);
|
|
38
|
-
|
|
58
|
+
let outputDir = flags.output;
|
|
59
|
+
if (!outputDir) {
|
|
60
|
+
// If the user didn't provide the output flag, try to get the default from config.
|
|
61
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
62
|
+
const defaultFolder = config.get('download_folder');
|
|
63
|
+
outputDir = defaultFolder || './'; // no flag -> DEFAULT output is "./"
|
|
64
|
+
}
|
|
65
|
+
// Expand tilde if present
|
|
66
|
+
const basePath = outputDir.charAt(0) === '~'
|
|
67
|
+
? os.homedir() + outputDir.split('~')[1]
|
|
68
|
+
: outputDir;
|
|
39
69
|
const filename = `AdInsure-server-${flags.version}.zip`;
|
|
40
70
|
const filePath = path.resolve(basePath, filename);
|
|
41
71
|
ux.action.start(`Downloading AdInsure Server version ${flags.version} to ${filePath}`, undefined, { stdout: true });
|
|
42
72
|
try {
|
|
43
|
-
|
|
73
|
+
var file;
|
|
74
|
+
if (!flags.source) {
|
|
75
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
76
|
+
flags.source = config.get('endpoint') || 'azure'; // no flag -> DEFAULT source is azure
|
|
77
|
+
}
|
|
78
|
+
if (flags.source === 'azure') {
|
|
79
|
+
file = yield this.downloadFileFromAzure(flags.version);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
file = yield this.downloadFileFromGitLabRu(flags.version);
|
|
83
|
+
}
|
|
44
84
|
const writeStream = fs.createWriteStream(filePath);
|
|
45
|
-
writeStream.write(file, 'binary');
|
|
85
|
+
writeStream.write(file.data, 'binary');
|
|
46
86
|
writeStream.on('finish', () => {
|
|
47
87
|
ux.action.stop(`${chalk.green('OK')}`);
|
|
48
88
|
});
|
|
@@ -52,10 +92,10 @@ class DownloadServer extends CommandBase {
|
|
|
52
92
|
catch (error) {
|
|
53
93
|
switch (error.statusCode) {
|
|
54
94
|
case 404: {
|
|
55
|
-
this.error('Does not
|
|
95
|
+
this.error('Does not exist.', { exit: 1 });
|
|
56
96
|
}
|
|
57
97
|
case 400: {
|
|
58
|
-
this.error('Try refreshing your login credentials with "ops login".', { exit: 1 });
|
|
98
|
+
this.error('Try refreshing your login credentials with "ops login" or "ops login:ru".', { exit: 1 });
|
|
59
99
|
}
|
|
60
100
|
default: {
|
|
61
101
|
this.error(error.message);
|
|
@@ -71,6 +111,11 @@ DownloadServer.examples = [
|
|
|
71
111
|
`$ ops download:server -v 3.2.0 -o ~/Downloads`,
|
|
72
112
|
];
|
|
73
113
|
DownloadServer.flags = {
|
|
114
|
+
source: Flags.string({
|
|
115
|
+
char: 's',
|
|
116
|
+
description: '[default: azure] artifact source, configurable with config:set endpoint <option>',
|
|
117
|
+
options: ['azure', 'gitlabru'],
|
|
118
|
+
}),
|
|
74
119
|
version: Flags.string({
|
|
75
120
|
char: 'v',
|
|
76
121
|
description: 'version we want to download',
|
|
@@ -79,7 +124,6 @@ DownloadServer.flags = {
|
|
|
79
124
|
output: Flags.string({
|
|
80
125
|
char: 'o',
|
|
81
126
|
description: 'output directory',
|
|
82
|
-
default: './',
|
|
83
127
|
}),
|
|
84
128
|
};
|
|
85
129
|
export default DownloadServer;
|
|
@@ -5,15 +5,23 @@ export default class DownloadSignalrServer extends CommandBase<typeof DownloadSi
|
|
|
5
5
|
static usage: string;
|
|
6
6
|
static examples: string[];
|
|
7
7
|
static flags: {
|
|
8
|
+
source: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
9
|
version: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
-
output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
11
|
};
|
|
11
|
-
private readonly
|
|
12
|
+
private readonly url_azure;
|
|
13
|
+
private readonly url_gitlabru;
|
|
12
14
|
/**
|
|
13
15
|
* Get unique AdInsure SignalR Server zip by specified version
|
|
14
16
|
* @param {string} version The version of AdInsure SignalR Server
|
|
15
17
|
* @returns {Promise<AxiosResponse<any, any>>}
|
|
16
18
|
*/
|
|
17
|
-
|
|
19
|
+
downloadFileFromAzure(version: string): Promise<AxiosResponse<any, any>>;
|
|
20
|
+
/**
|
|
21
|
+
* Get unique AdInsure SignalR zip by specified version
|
|
22
|
+
* @param {string} version The version of AdInsure SignalR
|
|
23
|
+
* @returns {Promise<AxiosResponse<any, any>>}
|
|
24
|
+
*/
|
|
25
|
+
downloadFileFromGitLabRu(version: string): Promise<AxiosResponse<any>>;
|
|
18
26
|
run(): Promise<void>;
|
|
19
27
|
}
|
|
@@ -6,10 +6,12 @@ import fs from 'fs-extra';
|
|
|
6
6
|
import os from 'os';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import CommandBase from '../../command.base.js';
|
|
9
|
+
import OpsConfig from '../../lib/config.js';
|
|
9
10
|
class DownloadSignalrServer extends CommandBase {
|
|
10
11
|
constructor() {
|
|
11
12
|
super(...arguments);
|
|
12
|
-
this.
|
|
13
|
+
this.url_azure = 'https://ops.adinsure.com/api/storage/binaries/';
|
|
14
|
+
this.url_gitlabru = 'https://gitlabru.adacta-fintech.ru/api/v4/projects/2/packages/generic';
|
|
13
15
|
}
|
|
14
16
|
/**
|
|
15
17
|
* Get unique AdInsure SignalR Server zip by specified version
|
|
@@ -17,9 +19,9 @@ class DownloadSignalrServer extends CommandBase {
|
|
|
17
19
|
* @returns {Promise<AxiosResponse<any, any>>}
|
|
18
20
|
*/
|
|
19
21
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
20
|
-
|
|
22
|
+
downloadFileFromAzure(version) {
|
|
21
23
|
return __awaiter(this, void 0, void 0, function* () {
|
|
22
|
-
return axios.get(`${this.
|
|
24
|
+
return axios.get(`${this.url_azure}/AdInsure-signalr-${version}.zip`, {
|
|
23
25
|
headers: {
|
|
24
26
|
Authorization: 'Bearer ' + (yield this.security.getToken()),
|
|
25
27
|
'Content-Type': 'application/octet-stream',
|
|
@@ -28,6 +30,24 @@ class DownloadSignalrServer extends CommandBase {
|
|
|
28
30
|
});
|
|
29
31
|
});
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Get unique AdInsure SignalR zip by specified version
|
|
35
|
+
* @param {string} version The version of AdInsure SignalR
|
|
36
|
+
* @returns {Promise<AxiosResponse<any, any>>}
|
|
37
|
+
*/
|
|
38
|
+
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
39
|
+
downloadFileFromGitLabRu(version) {
|
|
40
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
41
|
+
const packageName = 'AdInsure-signalr';
|
|
42
|
+
const fileName = `${packageName}-${version}.zip`;
|
|
43
|
+
return axios.get(`${this.url_gitlabru}/${packageName}/${version}/${fileName}`, {
|
|
44
|
+
headers: {
|
|
45
|
+
'PRIVATE-TOKEN': this.security.getTokenRu(),
|
|
46
|
+
},
|
|
47
|
+
responseType: 'arraybuffer',
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
31
51
|
run() {
|
|
32
52
|
const _super = Object.create(null, {
|
|
33
53
|
run: { get: () => super.run }
|
|
@@ -35,12 +55,32 @@ class DownloadSignalrServer extends CommandBase {
|
|
|
35
55
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
56
|
_super.run.call(this);
|
|
37
57
|
const { flags } = yield this.parse(DownloadSignalrServer);
|
|
38
|
-
|
|
58
|
+
let outputDir = flags.output;
|
|
59
|
+
if (!outputDir) {
|
|
60
|
+
// If the user didn't provide the output flag, try to get the default from config.
|
|
61
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
62
|
+
const defaultFolder = config.get('download_folder');
|
|
63
|
+
outputDir = defaultFolder || './'; // no flag -> DEFAULT output is "./"
|
|
64
|
+
}
|
|
65
|
+
// Expand tilde if present
|
|
66
|
+
const basePath = outputDir.charAt(0) === '~'
|
|
67
|
+
? os.homedir() + outputDir.split('~')[1]
|
|
68
|
+
: outputDir;
|
|
39
69
|
const filename = `AdInsure-signalr-${flags.version}.zip`;
|
|
40
70
|
const filePath = path.resolve(basePath, filename);
|
|
41
71
|
ux.action.start(`Downloading AdInsure SignalR Server version ${flags.version} to ${filePath}`, undefined, { stdout: true });
|
|
42
72
|
try {
|
|
43
|
-
|
|
73
|
+
var file;
|
|
74
|
+
if (!flags.source) {
|
|
75
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
76
|
+
flags.source = config.get('endpoint') || 'azure'; // no flag -> DEFAULT source is azure
|
|
77
|
+
}
|
|
78
|
+
if (flags.source === 'azure') {
|
|
79
|
+
file = yield this.downloadFileFromAzure(flags.version);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
file = yield this.downloadFileFromGitLabRu(flags.version);
|
|
83
|
+
}
|
|
44
84
|
const writeStream = fs.createWriteStream(filePath);
|
|
45
85
|
writeStream.write(file.data, 'binary');
|
|
46
86
|
writeStream.on('finish', () => {
|
|
@@ -52,10 +92,10 @@ class DownloadSignalrServer extends CommandBase {
|
|
|
52
92
|
catch (error) {
|
|
53
93
|
switch (error.statusCode) {
|
|
54
94
|
case 404: {
|
|
55
|
-
this.error('Does not
|
|
95
|
+
this.error('Does not exist.', { exit: 1 });
|
|
56
96
|
}
|
|
57
97
|
case 400: {
|
|
58
|
-
this.error('Try refreshing your login credentials with "ops login".', { exit: 1 });
|
|
98
|
+
this.error('Try refreshing your login credentials with "ops login" or "ops login:ru".', { exit: 1 });
|
|
59
99
|
}
|
|
60
100
|
default: {
|
|
61
101
|
this.error(error.message);
|
|
@@ -71,6 +111,11 @@ DownloadSignalrServer.examples = [
|
|
|
71
111
|
`$ ops download:signalr -v 18.0.0 -o ~/Downloads`,
|
|
72
112
|
];
|
|
73
113
|
DownloadSignalrServer.flags = {
|
|
114
|
+
source: Flags.string({
|
|
115
|
+
char: 's',
|
|
116
|
+
description: '[default: azure] artifact source, configurable with config:set endpoint <option>',
|
|
117
|
+
options: ['azure', 'gitlabru'],
|
|
118
|
+
}),
|
|
74
119
|
version: Flags.string({
|
|
75
120
|
char: 'v',
|
|
76
121
|
description: 'version we want to download',
|
|
@@ -79,7 +124,6 @@ DownloadSignalrServer.flags = {
|
|
|
79
124
|
output: Flags.string({
|
|
80
125
|
char: 'o',
|
|
81
126
|
description: 'output directory',
|
|
82
|
-
default: './',
|
|
83
127
|
}),
|
|
84
128
|
};
|
|
85
129
|
export default DownloadSignalrServer;
|
|
@@ -5,20 +5,28 @@ export default class DownloadStudio extends CommandBase<typeof DownloadStudio> {
|
|
|
5
5
|
static usage: string;
|
|
6
6
|
static examples: string[];
|
|
7
7
|
static flags: {
|
|
8
|
+
source: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
8
9
|
version: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
-
output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
|
+
output: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
11
|
install: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
12
|
skip: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
12
13
|
keep: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
13
14
|
force: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
14
15
|
};
|
|
15
|
-
private readonly
|
|
16
|
+
private readonly url_azure;
|
|
17
|
+
private readonly url_gitlabru;
|
|
16
18
|
/**
|
|
17
19
|
* Get unique AdInsure Studio vsix zip by specified version
|
|
18
20
|
* @param {string} version The version of AdInsure Studio vsix
|
|
19
21
|
* @returns {Promise<AxiosResponse<any, any>>}
|
|
20
22
|
*/
|
|
21
|
-
|
|
23
|
+
downloadFileFromAzure(version: string): Promise<AxiosResponse<any, any>>;
|
|
24
|
+
/**
|
|
25
|
+
* Get unique AdInsure Studio zip by specified version
|
|
26
|
+
* @param {string} version The version of AdInsure Studio
|
|
27
|
+
* @returns {Promise<AxiosResponse<any, any>>}
|
|
28
|
+
*/
|
|
29
|
+
downloadFileFromGitLabRu(version: string): Promise<AxiosResponse<any>>;
|
|
22
30
|
installExtension(extensionPath: string): Promise<void>;
|
|
23
31
|
findExtensionIfEnabled(studioVersion: string, enabled: boolean): Promise<boolean>;
|
|
24
32
|
run(): Promise<0 | undefined>;
|
|
@@ -7,10 +7,12 @@ import os from 'os';
|
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import CommandBase from '../../command.base.js';
|
|
9
9
|
import ChildProcessCommand from '../../lib/command.js';
|
|
10
|
+
import OpsConfig from '../../lib/config.js';
|
|
10
11
|
class DownloadStudio extends CommandBase {
|
|
11
12
|
constructor() {
|
|
12
13
|
super(...arguments);
|
|
13
|
-
this.
|
|
14
|
+
this.url_azure = 'https://ops.adinsure.com/api/storage/extensions/';
|
|
15
|
+
this.url_gitlabru = 'https://gitlabru.adacta-fintech.ru/api/v4/projects/2/packages/generic';
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* Get unique AdInsure Studio vsix zip by specified version
|
|
@@ -18,9 +20,9 @@ class DownloadStudio extends CommandBase {
|
|
|
18
20
|
* @returns {Promise<AxiosResponse<any, any>>}
|
|
19
21
|
*/
|
|
20
22
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
21
|
-
|
|
23
|
+
downloadFileFromAzure(version) {
|
|
22
24
|
return __awaiter(this, void 0, void 0, function* () {
|
|
23
|
-
return axios.get(`${this.
|
|
25
|
+
return axios.get(`${this.url_azure}/adinsure-studio-${version}.vsix`, {
|
|
24
26
|
headers: {
|
|
25
27
|
Authorization: 'Bearer ' + (yield this.security.getToken()),
|
|
26
28
|
'Content-Type': 'application/octet-stream',
|
|
@@ -29,6 +31,24 @@ class DownloadStudio extends CommandBase {
|
|
|
29
31
|
});
|
|
30
32
|
});
|
|
31
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Get unique AdInsure Studio zip by specified version
|
|
36
|
+
* @param {string} version The version of AdInsure Studio
|
|
37
|
+
* @returns {Promise<AxiosResponse<any, any>>}
|
|
38
|
+
*/
|
|
39
|
+
//eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
downloadFileFromGitLabRu(version) {
|
|
41
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
42
|
+
const packageName = 'adinsure-studio';
|
|
43
|
+
const fileName = `${packageName}-${version}.vsix`;
|
|
44
|
+
return axios.get(`${this.url_gitlabru}/${packageName}/${version}/${fileName}`, {
|
|
45
|
+
headers: {
|
|
46
|
+
'PRIVATE-TOKEN': this.security.getTokenRu(),
|
|
47
|
+
},
|
|
48
|
+
responseType: 'arraybuffer',
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
32
52
|
installExtension(extensionPath) {
|
|
33
53
|
return __awaiter(this, void 0, void 0, function* () {
|
|
34
54
|
const cp = new ChildProcessCommand();
|
|
@@ -57,7 +77,17 @@ class DownloadStudio extends CommandBase {
|
|
|
57
77
|
_super.run.call(this);
|
|
58
78
|
const { flags } = yield this.parse(DownloadStudio);
|
|
59
79
|
// The os.homedir expands the ~ char, as the node path.resolve method does not expand it
|
|
60
|
-
|
|
80
|
+
let outputDir = flags.output;
|
|
81
|
+
if (!outputDir) {
|
|
82
|
+
// If the user didn't provide the output flag, try to get the default from config.
|
|
83
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
84
|
+
const defaultFolder = config.get('download_folder');
|
|
85
|
+
outputDir = defaultFolder || './'; // no flag -> DEFAULT output is "./"
|
|
86
|
+
}
|
|
87
|
+
// Expand tilde if present
|
|
88
|
+
const basePath = outputDir.charAt(0) === '~'
|
|
89
|
+
? os.homedir() + outputDir.split('~')[1]
|
|
90
|
+
: outputDir;
|
|
61
91
|
if (flags.force && !(yield fs.pathExists(basePath))) {
|
|
62
92
|
yield fs.mkdirp(basePath);
|
|
63
93
|
}
|
|
@@ -82,7 +112,17 @@ class DownloadStudio extends CommandBase {
|
|
|
82
112
|
return;
|
|
83
113
|
}
|
|
84
114
|
ux.action.start(`Downloading AdInsure Studio version ${flags.version} to ${filePath}`, undefined, { stdout: true });
|
|
85
|
-
|
|
115
|
+
var file;
|
|
116
|
+
if (!flags.source) {
|
|
117
|
+
const config = new OpsConfig(this.security.getConfigPath());
|
|
118
|
+
flags.source = config.get('endpoint') || 'azure'; // no flag -> DEFAULT source is azure
|
|
119
|
+
}
|
|
120
|
+
if (flags.source === 'azure') {
|
|
121
|
+
file = yield this.downloadFileFromAzure(flags.version);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
file = yield this.downloadFileFromGitLabRu(flags.version);
|
|
125
|
+
}
|
|
86
126
|
const writeStream = fs.createWriteStream(filePath);
|
|
87
127
|
writeStream.write(file.data, 'binary');
|
|
88
128
|
writeStream.on('finish', () => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -105,10 +145,10 @@ class DownloadStudio extends CommandBase {
|
|
|
105
145
|
catch (error) {
|
|
106
146
|
switch (error.statusCode) {
|
|
107
147
|
case 404: {
|
|
108
|
-
this.error('Does not
|
|
148
|
+
this.error('Does not exist.', { exit: 1 });
|
|
109
149
|
}
|
|
110
150
|
case 400: {
|
|
111
|
-
this.error('Try refreshing your login credentials with "ops login".', { exit: 1 });
|
|
151
|
+
this.error('Try refreshing your login credentials with "ops login" or "ops login:ru".', { exit: 1 });
|
|
112
152
|
}
|
|
113
153
|
default: {
|
|
114
154
|
this.error(error.message);
|
|
@@ -126,8 +166,13 @@ DownloadStudio.examples = [
|
|
|
126
166
|
`$ ops download:studio -v 15.0.0 -i`,
|
|
127
167
|
`$ ops download:studio -v 15.0.0 -i -s`,
|
|
128
168
|
`$ ops download:studio -v 15.0.0 -i -k`,
|
|
169
|
+
`$ ops download:studio -v 15.0.0 --source=gitlabru`,
|
|
129
170
|
];
|
|
130
171
|
DownloadStudio.flags = {
|
|
172
|
+
source: Flags.string({
|
|
173
|
+
description: '[default: azure] artifact source, configurable with config:set endpoint <option>',
|
|
174
|
+
options: ['azure', 'gitlabru'],
|
|
175
|
+
}),
|
|
131
176
|
version: Flags.string({
|
|
132
177
|
char: 'v',
|
|
133
178
|
description: 'version we want to download',
|
|
@@ -136,7 +181,6 @@ DownloadStudio.flags = {
|
|
|
136
181
|
output: Flags.string({
|
|
137
182
|
char: 'o',
|
|
138
183
|
description: 'output directory',
|
|
139
|
-
default: './',
|
|
140
184
|
}),
|
|
141
185
|
install: Flags.boolean({
|
|
142
186
|
char: 'i',
|
package/lib/commands/login.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export default class Login extends CommandBase<typeof Login> {
|
|
|
8
8
|
npm: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
9
9
|
skipCI: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string | undefined, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
10
10
|
force: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
|
+
docker: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
11
12
|
};
|
|
12
13
|
static responsePageContent: string;
|
|
13
14
|
private readonly npmRegistries;
|
|
@@ -17,5 +18,13 @@ export default class Login extends CommandBase<typeof Login> {
|
|
|
17
18
|
* @returns [[Promise<string>]]
|
|
18
19
|
*/
|
|
19
20
|
setNPM(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Handle Docker login by:
|
|
23
|
+
* 1. Checking if Docker is available.
|
|
24
|
+
* 2. Ensuring user is logged in.
|
|
25
|
+
* 3. Generating a Docker token for adinsure.azurecr.io.
|
|
26
|
+
* 4. Running 'docker login' with the generated token.
|
|
27
|
+
*/
|
|
28
|
+
private handleDockerLogin;
|
|
20
29
|
run(): Promise<void>;
|
|
21
30
|
}
|
package/lib/commands/login.js
CHANGED
|
@@ -6,8 +6,10 @@ import http from 'http';
|
|
|
6
6
|
import open from 'open';
|
|
7
7
|
import path from 'path';
|
|
8
8
|
import url from 'url';
|
|
9
|
+
import { execSync } from 'child_process';
|
|
9
10
|
import CommandBase from '../command.base.js';
|
|
10
11
|
import NpmRc from '../lib/npmrc.js';
|
|
12
|
+
import YarnRc from '../lib/yarnrc.js';
|
|
11
13
|
class Login extends CommandBase {
|
|
12
14
|
constructor() {
|
|
13
15
|
super(...arguments);
|
|
@@ -26,12 +28,15 @@ class Login extends CommandBase {
|
|
|
26
28
|
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
|
|
27
29
|
try {
|
|
28
30
|
const npmRc = new NpmRc();
|
|
31
|
+
const yarnRc = new YarnRc();
|
|
29
32
|
const token = yield this.security.getNPMToken();
|
|
30
33
|
for (const registry of this.npmRegistries) {
|
|
31
34
|
const registryUrl = new url.URL(registry);
|
|
32
35
|
npmRc.set(`//${registryUrl.hostname}${registryUrl.pathname}:_authToken`, token);
|
|
36
|
+
yarnRc.set("npmAuthToken", token);
|
|
33
37
|
}
|
|
34
38
|
npmRc.save();
|
|
39
|
+
yarnRc.save();
|
|
35
40
|
this.log(`${chalk.green('NPM token generated!')}`);
|
|
36
41
|
resolve();
|
|
37
42
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -42,6 +47,52 @@ class Login extends CommandBase {
|
|
|
42
47
|
}));
|
|
43
48
|
});
|
|
44
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Handle Docker login by:
|
|
52
|
+
* 1. Checking if Docker is available.
|
|
53
|
+
* 2. Ensuring user is logged in.
|
|
54
|
+
* 3. Generating a Docker token for adinsure.azurecr.io.
|
|
55
|
+
* 4. Running 'docker login' with the generated token.
|
|
56
|
+
*/
|
|
57
|
+
handleDockerLogin() {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
// 1. Check if Docker command is available
|
|
60
|
+
try {
|
|
61
|
+
execSync('docker --version', { stdio: 'ignore' });
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
this.error('Docker is not installed or not in PATH. Please install Docker first.', { exit: 1 });
|
|
65
|
+
}
|
|
66
|
+
// 2. Ensure the user is logged in (using your existing token retrieval logic)
|
|
67
|
+
try {
|
|
68
|
+
yield this.security.getToken();
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
this.error('User is not logged in. Please run "ops login" without --docker first.', { exit: 1 });
|
|
73
|
+
}
|
|
74
|
+
// 3. generate token from `adinsure.azurecr.io`
|
|
75
|
+
this.log(chalk.yellow('Generating Docker authentication token for adinsure.azurecr.io...'));
|
|
76
|
+
let acrToken;
|
|
77
|
+
try {
|
|
78
|
+
acrToken = yield this.security.getACRToken();
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
}
|
|
81
|
+
catch (err) {
|
|
82
|
+
this.error('Failed to generate Docker token: ' + err.message, { exit: 1 });
|
|
83
|
+
}
|
|
84
|
+
// 4. call docker login command
|
|
85
|
+
this.log(chalk.yellow('Logging in to adinsure.azurecr.io via Docker...'));
|
|
86
|
+
try {
|
|
87
|
+
execSync(`docker login adinsure.azurecr.io -u 00000000-0000-0000-0000-000000000000 --password "${acrToken}" `);
|
|
88
|
+
this.log(chalk.green('Docker login successful!'));
|
|
89
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
this.error('Docker login failed: ' + err.message, { exit: 1 });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
45
96
|
run() {
|
|
46
97
|
const _super = Object.create(null, {
|
|
47
98
|
run: { get: () => super.run }
|
|
@@ -49,6 +100,10 @@ class Login extends CommandBase {
|
|
|
49
100
|
return __awaiter(this, void 0, void 0, function* () {
|
|
50
101
|
_super.run.call(this);
|
|
51
102
|
const { flags } = yield this.parse(Login);
|
|
103
|
+
if (flags.docker) {
|
|
104
|
+
yield this.handleDockerLogin();
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
52
107
|
if (flags.force) {
|
|
53
108
|
fs.unlink(path.resolve(this.security.getTokenPath()), () => {
|
|
54
109
|
this.log(`${chalk.yellow('Note: We have launched a browser for you to login.')}`);
|
|
@@ -115,7 +170,7 @@ class Login extends CommandBase {
|
|
|
115
170
|
});
|
|
116
171
|
}
|
|
117
172
|
}
|
|
118
|
-
Login.description = 'log in to use ops services';
|
|
173
|
+
Login.description = 'log in to use ops services with AzureAD';
|
|
119
174
|
Login.usage = 'login';
|
|
120
175
|
Login.examples = [
|
|
121
176
|
`$ ops login`,
|
|
@@ -139,6 +194,10 @@ Login.flags = {
|
|
|
139
194
|
description: 'Force a change of login token',
|
|
140
195
|
default: false,
|
|
141
196
|
}),
|
|
197
|
+
docker: Flags.boolean({
|
|
198
|
+
description: 'Authenticate with adinsure.azurecr.io for Docker',
|
|
199
|
+
default: false,
|
|
200
|
+
}),
|
|
142
201
|
};
|
|
143
202
|
Login.responsePageContent = `
|
|
144
203
|
<!DOCTYPE html>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import CommandBase from '../command.base.js';
|
|
2
|
+
export default class LoginRu extends CommandBase<typeof LoginRu> {
|
|
3
|
+
static aliases: string[];
|
|
4
|
+
static description: string;
|
|
5
|
+
static usage: string;
|
|
6
|
+
static examples: string[];
|
|
7
|
+
static flags: {
|
|
8
|
+
token: import("@oclif/core/lib/interfaces/parser.js").OptionFlag<string, import("@oclif/core/lib/interfaces/parser.js").CustomOptions>;
|
|
9
|
+
force: import("@oclif/core/lib/interfaces/parser.js").BooleanFlag<boolean>;
|
|
10
|
+
};
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { Flags } from '@oclif/core';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import CommandBase from '../command.base.js';
|
|
6
|
+
class LoginRu extends CommandBase {
|
|
7
|
+
run() {
|
|
8
|
+
const _super = Object.create(null, {
|
|
9
|
+
run: { get: () => super.run }
|
|
10
|
+
});
|
|
11
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
12
|
+
_super.run.call(this);
|
|
13
|
+
const { flags } = yield this.parse(LoginRu);
|
|
14
|
+
// const configDir = this.config.configDir; // should work?
|
|
15
|
+
// Instantiate SecurityContext with a custom token file name
|
|
16
|
+
// const security = new SecurityContext(configDir, 'accessTokenRu.json');
|
|
17
|
+
const tokenFile = this.security.getTokenRuPath();
|
|
18
|
+
if (flags.force && fs.existsSync(tokenFile)) {
|
|
19
|
+
fs.unlinkSync(tokenFile);
|
|
20
|
+
this.log(chalk.yellow('Existing GitLabRu token removed due to force flag.'));
|
|
21
|
+
}
|
|
22
|
+
// Here we simply store the token in the same JSON format
|
|
23
|
+
fs.writeFileSync(tokenFile, JSON.stringify({ accessTokenRu: flags.token }), 'utf8');
|
|
24
|
+
this.log(chalk.green('GitLabRu token stored successfully!'));
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
LoginRu.aliases = ['login:ru'];
|
|
29
|
+
LoginRu.description = 'Log in to use ops services with GitLabRu token';
|
|
30
|
+
LoginRu.usage = 'login:ru --token <token>';
|
|
31
|
+
LoginRu.examples = [`$ ops login:ru --token abc123`];
|
|
32
|
+
LoginRu.flags = {
|
|
33
|
+
token: Flags.string({
|
|
34
|
+
description: 'The GitLabRu token to store',
|
|
35
|
+
required: true,
|
|
36
|
+
}),
|
|
37
|
+
force: Flags.boolean({
|
|
38
|
+
description: 'Force update of token',
|
|
39
|
+
default: false,
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
export default LoginRu;
|
|
@@ -35,7 +35,7 @@ class NpmCheckPublish extends CommandBase {
|
|
|
35
35
|
return __awaiter(this, void 0, void 0, function* () {
|
|
36
36
|
_super.run.call(this);
|
|
37
37
|
try {
|
|
38
|
-
const { flags } = (yield this.parse(NpmCheckPublish))
|
|
38
|
+
const { flags } = (yield this.parse(NpmCheckPublish));
|
|
39
39
|
const npmContext = new NpmContext();
|
|
40
40
|
ux.action.start('Parsing packages to check', undefined, { stdout: true });
|
|
41
41
|
const packages = yield npmContext.packageList(this, flags.package, flags.exclude);
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
export default class OpsConfig {
|
|
3
|
+
constructor(filePath) {
|
|
4
|
+
this.data = {};
|
|
5
|
+
this.filePath = filePath;
|
|
6
|
+
// Load existing config or initialize an empty one
|
|
7
|
+
if (fs.existsSync(this.filePath)) {
|
|
8
|
+
const fileContent = fs.readFileSync(this.filePath, 'utf8');
|
|
9
|
+
try {
|
|
10
|
+
this.data = JSON.parse(fileContent);
|
|
11
|
+
}
|
|
12
|
+
catch (_a) {
|
|
13
|
+
console.log("Could not read data from config.json");
|
|
14
|
+
this.data = {};
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get(key) {
|
|
19
|
+
return this.data[key];
|
|
20
|
+
}
|
|
21
|
+
set(key, value) {
|
|
22
|
+
this.data[key] = value;
|
|
23
|
+
}
|
|
24
|
+
unset(key) {
|
|
25
|
+
delete this.data[key];
|
|
26
|
+
}
|
|
27
|
+
list() {
|
|
28
|
+
return this.data;
|
|
29
|
+
}
|
|
30
|
+
save() {
|
|
31
|
+
fs.writeFileSync(this.filePath, JSON.stringify(this.data, null, 2), 'utf8');
|
|
32
|
+
}
|
|
33
|
+
}
|