cob-cli 2.51.0 → 2.52.0-beta-2
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/bin/cob-cli.js +31 -0
- package/lib/commands/cleanup.js +116 -0
- package/lib/commands/deploy.js +33 -26
- package/lib/commands/package.js +20 -0
- package/lib/commands/tagDefs.js +67 -0
- package/lib/commands/test.js +29 -9
- package/lib/commands/updateFromServer.js +149 -13
- package/lib/task_lists/common_definitions.js +26 -0
- package/lib/task_lists/common_enviromentHandler.js +14 -8
- package/lib/task_lists/common_helpers.js +95 -17
- package/lib/task_lists/common_operationState.js +28 -0
- package/lib/task_lists/common_releaseManager.js +10 -8
- package/lib/task_lists/common_syncFiles.js +9 -4
- package/lib/task_lists/package_execute.js +45 -0
- package/lib/task_lists/tagDefs_execute.js +121 -0
- package/lib/task_lists/test_customUIsContinuosReload.js +36 -7
- package/lib/task_lists/test_otherFilesContiousReload.js +44 -22
- package/lib/task_lists/test_syncFile.js +5 -4
- package/lib/task_lists/test_validate.js +3 -2
- package/lib/task_lists/updateFromServer_definitions.js +135 -0
- package/lib/task_lists/updateFromServer_domains.js +50 -0
- package/lib/task_lists/updateFromServer_groups.js +111 -0
- package/lib/task_lists/updateFromServer_instances.js +76 -0
- package/lib/task_lists/updateFromServer_kibana.js +88 -0
- package/lib/task_lists/updateFromServer_validate.js +3 -3
- package/lib/webpack/webpack.config.js +1 -1
- package/package.json +5 -1
package/bin/cob-cli.js
CHANGED
|
@@ -10,7 +10,10 @@ const init = require("../lib/commands/init");
|
|
|
10
10
|
const customize = require("../lib/commands/customize");
|
|
11
11
|
const test = require("../lib/commands/test");
|
|
12
12
|
const deploy = require("../lib/commands/deploy");
|
|
13
|
+
const cleanup = require("../lib/commands/cleanup");
|
|
14
|
+
const package = require("../lib/commands/package");
|
|
13
15
|
const updateFromServer = require("../lib/commands/updateFromServer");
|
|
16
|
+
const tagDefs = require("../lib/commands/tagDefs.js");
|
|
14
17
|
const getDefs = require("../lib/commands/getDefs");
|
|
15
18
|
const generateMermaid = require("../lib/commands/generateMermaid");
|
|
16
19
|
const { upgradeRepo } = require("../lib/commands/upgradeRepo");
|
|
@@ -73,12 +76,30 @@ program
|
|
|
73
76
|
.description('Deploy customization to the server')
|
|
74
77
|
.action( deploy );
|
|
75
78
|
|
|
79
|
+
program
|
|
80
|
+
.command('cleanup')
|
|
81
|
+
.option('-e --environment <name>', 'environment to use')
|
|
82
|
+
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
83
|
+
.option('-l --localOnly', 'only clean local state, skip server cleanup')
|
|
84
|
+
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
85
|
+
.description('Clean up repository state after an interrupted test or deploy')
|
|
86
|
+
.action( cleanup );
|
|
87
|
+
|
|
88
|
+
program
|
|
89
|
+
.command('package')
|
|
90
|
+
.option('-e --environment <name>', 'environment to use')
|
|
91
|
+
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
92
|
+
.description('Package customization for out-of-band deploying')
|
|
93
|
+
.action( package );
|
|
94
|
+
|
|
76
95
|
program
|
|
77
96
|
.command('updateFromServer')
|
|
78
97
|
.description('Updates local copy with current files on server, in case of changes made out of standard process.')
|
|
79
98
|
.option('-e --environment <name>', 'environment to use')
|
|
80
99
|
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
81
100
|
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
101
|
+
.option('-c --code', 'By adding this flag you indicate that you want to bring the code and not the data')
|
|
102
|
+
.option('--cookie <path>', '')
|
|
82
103
|
.action( updateFromServer );
|
|
83
104
|
|
|
84
105
|
program
|
|
@@ -91,6 +112,16 @@ program
|
|
|
91
112
|
.option('-e --environment <name>', 'environment to use')
|
|
92
113
|
.description('Updates local copy with definitions on server')
|
|
93
114
|
.action( getDefs );
|
|
115
|
+
|
|
116
|
+
program
|
|
117
|
+
.command('tagDefs')
|
|
118
|
+
.description('Allows the user to tag un-tagged Changes in Definitions configured on exported solutions.')
|
|
119
|
+
.option('-e --environment <name>', 'environment to use')
|
|
120
|
+
.option('-s --servername <servername>', 'use <servername>.cultofbits.pt (i.e. name without the FQDN)')
|
|
121
|
+
.option('-V --verbose', 'verbose execution of tasks', increaseVerbosity, 0)
|
|
122
|
+
.option('--all', 'tag all Definitions of all exported solutions. Use with care!')
|
|
123
|
+
.option('--cookie <path>', '')
|
|
124
|
+
.action( tagDefs );
|
|
94
125
|
|
|
95
126
|
program
|
|
96
127
|
.command('generateMermaid')
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require('colors');
|
|
2
|
+
const git = require('simple-git');
|
|
3
|
+
const fs = require('fs-extra');
|
|
4
|
+
const fg = require('fast-glob');
|
|
5
|
+
const execa = require('execa');
|
|
6
|
+
const Listr = require('listr');
|
|
7
|
+
const UpdaterRenderer = require('listr-update-renderer');
|
|
8
|
+
const verboseRenderer = require('listr-verbose-renderer');
|
|
9
|
+
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
10
|
+
const { SERVER_COB_CLI_DIRECTORY } = require("../task_lists/common_helpers");
|
|
11
|
+
const { restoreServerFilesToLastDeployed } = require("../task_lists/test_otherFilesContiousReload");
|
|
12
|
+
const { loadOperationState, clearOperationState } = require("../task_lists/common_operationState");
|
|
13
|
+
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
14
|
+
const { getSshArgs } = require("../task_lists/common_helpers");
|
|
15
|
+
|
|
16
|
+
const LOCAL_TEST_LOCK_FILE = ".test.in.execution";
|
|
17
|
+
const SERVER_TEST_LOCK_FILE = SERVER_COB_CLI_DIRECTORY + "test.in.execution";
|
|
18
|
+
|
|
19
|
+
async function cleanup(args) {
|
|
20
|
+
try {
|
|
21
|
+
checkRepoVersion()
|
|
22
|
+
|
|
23
|
+
const savedState = loadOperationState();
|
|
24
|
+
if (!savedState && !args.environment) {
|
|
25
|
+
console.log("No saved state and no explicit environment, aborting".bold);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (savedState) {
|
|
29
|
+
if (!args.environment) args.environment = savedState.environment;
|
|
30
|
+
if (!args.servername) args.servername = savedState.servername;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
console.log("Cleaning up interrupted test/deploy state...".bold)
|
|
34
|
+
|
|
35
|
+
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
36
|
+
console.log(` environment: ${cmdEnv.name.bold} server: ${cmdEnv.serverStr}`)
|
|
37
|
+
|
|
38
|
+
await new Listr([
|
|
39
|
+
{
|
|
40
|
+
title: "Undo environment-specific file changes".bold,
|
|
41
|
+
skip: async () => {
|
|
42
|
+
const backupFiles = await fg(
|
|
43
|
+
['**/*.ENV__ORIGINAL_BACKUP__.*', '**/*.ENV__DELETE__.*'],
|
|
44
|
+
{ onlyFiles: false, dot: true }
|
|
45
|
+
);
|
|
46
|
+
return backupFiles.length === 0 ? "No environment-specific changes found" : false;
|
|
47
|
+
},
|
|
48
|
+
task: () => cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
// Runs after the local env undo so the working tree is clean before
|
|
52
|
+
// stashing and checking out the last-deployed SHA.
|
|
53
|
+
title: "Restore server files to last deployed version".bold,
|
|
54
|
+
skip: () => args.localOnly ? "Skipping server restore (--localOnly)" : false,
|
|
55
|
+
task: async () => {
|
|
56
|
+
let changedFiles = [];
|
|
57
|
+
try {
|
|
58
|
+
const result = await execa('ssh', [...getSshArgs(cmdEnv.server), "cat " + SERVER_TEST_LOCK_FILE]);
|
|
59
|
+
changedFiles = result.stdout.split("\n")
|
|
60
|
+
.map(l => l.split(" ")[0].trim())
|
|
61
|
+
.filter(f => f);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
if (error.exitCode === 255) {
|
|
64
|
+
throw new Error(`SSH connection to '${cmdEnv.server}' failed: ${error.shortMessage}`);
|
|
65
|
+
}
|
|
66
|
+
/* no test.in.execution on server = nothing to restore */
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (changedFiles.length === 0) return;
|
|
70
|
+
|
|
71
|
+
await restoreServerFilesToLastDeployed(cmdEnv, changedFiles);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
title: "Restore git branch from detached HEAD".bold,
|
|
76
|
+
skip: async () => {
|
|
77
|
+
const branch = await git().revparse(["--abbrev-ref", "HEAD"]);
|
|
78
|
+
return branch.trim() !== "HEAD" ? "Not in detached HEAD state" : false;
|
|
79
|
+
},
|
|
80
|
+
task: () => git().checkout("-")
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
title: "Remove local test lock file".bold,
|
|
84
|
+
skip: () => !fs.existsSync(LOCAL_TEST_LOCK_FILE) ? "No local test lock file found" : false,
|
|
85
|
+
task: () => fs.unlinkSync(LOCAL_TEST_LOCK_FILE)
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
title: "Remove server test lock file".bold,
|
|
89
|
+
skip: () => args.localOnly ? "Skipping server cleanup (--localOnly)" : false,
|
|
90
|
+
task: () => execa('ssh', [...getSshArgs(cmdEnv.server), "rm -f " + SERVER_TEST_LOCK_FILE])
|
|
91
|
+
.catch(() => {}) // non-critical if server unreachable
|
|
92
|
+
},
|
|
93
|
+
], {
|
|
94
|
+
renderer: args.verbose ? verboseRenderer : UpdaterRenderer,
|
|
95
|
+
collapse: false
|
|
96
|
+
}).run()
|
|
97
|
+
|
|
98
|
+
clearOperationState()
|
|
99
|
+
|
|
100
|
+
// Inform about stashes — don't auto-pop since user may have unrelated stashes
|
|
101
|
+
const stashList = await git().stash(["list"]);
|
|
102
|
+
if (stashList) {
|
|
103
|
+
console.log("\n" + "Note:".yellow.bold
|
|
104
|
+
+ " Stashed changes detected (may be from the interrupted operation):")
|
|
105
|
+
console.log(stashList.split("\n").slice(0, 3).map(l => " " + l).join("\n"))
|
|
106
|
+
console.log("Run " + "git stash pop".yellow + " if you want to restore your uncommitted changes.\n")
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
console.log("\nDone!".green, "\nYou can now run 'cob-cli test' or 'cob-cli deploy' again.\n")
|
|
110
|
+
|
|
111
|
+
} catch(err) {
|
|
112
|
+
console.error("\n", err.message)
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
module.exports = cleanup;
|
package/lib/commands/deploy.js
CHANGED
|
@@ -4,40 +4,47 @@ const { confirmExecutionOfChanges } = require("../task_lists/common_syncFiles");
|
|
|
4
4
|
const { validateDeployConditions } = require("../task_lists/deploy_validate");
|
|
5
5
|
const { executeTasks } = require("../task_lists/deploy_execute");
|
|
6
6
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
7
|
+
const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
|
|
7
8
|
|
|
8
9
|
async function deploy(args) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
checkRepoVersion()
|
|
11
|
+
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
12
|
+
await checkNoInterruptedRun()
|
|
13
|
+
saveOperationState(cmdEnv.name, cmdEnv.servername)
|
|
14
|
+
if(args.resync) args.force = true;
|
|
13
15
|
|
|
14
|
-
|
|
16
|
+
console.log(`Checking conditions to deploy ${cmdEnv.branchStr} to ${cmdEnv.serverStr}...` );
|
|
15
17
|
|
|
18
|
+
try {
|
|
16
19
|
await validateDeployConditions(cmdEnv,args).run()
|
|
20
|
+
} catch (err) {
|
|
21
|
+
// we should clear the operation state
|
|
22
|
+
clearOperationState();
|
|
23
|
+
throw err
|
|
24
|
+
}
|
|
17
25
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
27
|
+
let changes = [];
|
|
28
|
+
try {
|
|
29
|
+
changes = await confirmExecutionOfChanges(cmdEnv)
|
|
30
|
+
} catch (err) {
|
|
31
|
+
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
32
|
+
clearOperationState()
|
|
33
|
+
throw err
|
|
34
|
+
}
|
|
26
35
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
console.log(" Just updating deploy information.")
|
|
36
|
+
if(changes.length == 0) {
|
|
37
|
+
if(!args.force) {
|
|
38
|
+
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
39
|
+
clearOperationState()
|
|
40
|
+
throw new Error("Canceled:".yellow + " nothing todo\n")
|
|
33
41
|
}
|
|
42
|
+
console.log(" Just updating deploy information.")
|
|
43
|
+
}
|
|
34
44
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
console.log("\nDone!".green, "\nEnjoy!")
|
|
45
|
+
await executeTasks(cmdEnv, args).run();
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
47
|
+
clearOperationState()
|
|
48
|
+
console.log("\nDone!".green, "\nEnjoy!")
|
|
42
49
|
}
|
|
43
|
-
module.exports = deploy;
|
|
50
|
+
module.exports = deploy;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
require('colors');
|
|
2
|
+
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
3
|
+
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
4
|
+
const { executeTasks } = require("../task_lists/package_execute");
|
|
5
|
+
|
|
6
|
+
async function package(args) {
|
|
7
|
+
try {
|
|
8
|
+
checkRepoVersion()
|
|
9
|
+
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
10
|
+
if(args.resync) args.force = true;
|
|
11
|
+
|
|
12
|
+
await executeTasks(cmdEnv, args).run();
|
|
13
|
+
|
|
14
|
+
console.log("\nDone!".green, "\nEnjoy!")
|
|
15
|
+
|
|
16
|
+
} catch(err) {
|
|
17
|
+
console.error("\n",err.message);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
module.exports = package;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require('colors');
|
|
2
|
+
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
3
|
+
const { promptCredentials, readYamlFile } = require("../task_lists/common_helpers.js");
|
|
4
|
+
const { tagDefinitions } = require("../task_lists/tagDefs_execute.js");
|
|
5
|
+
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
6
|
+
const axios = require('axios');
|
|
7
|
+
const tough = require('tough-cookie');
|
|
8
|
+
const axiosCookieJarSupport = require('axios-cookiejar-support')
|
|
9
|
+
const path = require('path')
|
|
10
|
+
const FileCookieStore = require('file-cookie-store');
|
|
11
|
+
|
|
12
|
+
async function tagDefs(args) {
|
|
13
|
+
try {
|
|
14
|
+
checkRepoVersion()
|
|
15
|
+
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
16
|
+
|
|
17
|
+
axiosCookieJarSupport.wrapper(axios)
|
|
18
|
+
axios.defaults.ignoreCookieErrors = true
|
|
19
|
+
axios.defaults.withCredentials = true
|
|
20
|
+
const cookieJar = new tough.CookieJar()
|
|
21
|
+
axios.defaults.jar = cookieJar
|
|
22
|
+
|
|
23
|
+
if( args.cookie ) {
|
|
24
|
+
const p = path.resolve(args.cookie);
|
|
25
|
+
const cookieFile = new FileCookieStore(p, {auto_sync: false, force_parse: true});
|
|
26
|
+
try{
|
|
27
|
+
let c = await new Promise((resolve, reject) => {
|
|
28
|
+
cookieFile.findCookie(`${cmdEnv.servername}.cultofbits.com`, '/', 'cobtoken', (err, result) => {
|
|
29
|
+
if(err != null) reject(err);
|
|
30
|
+
else resolve(result)
|
|
31
|
+
})
|
|
32
|
+
});
|
|
33
|
+
if(!c){
|
|
34
|
+
throw Error( `couldn't find a cookie for ${cmdEnv.servername} in ${p}`)
|
|
35
|
+
}
|
|
36
|
+
cookieJar.setCookie(c.toString(), `https://${cmdEnv.servername}.cultofbits.com`)
|
|
37
|
+
} catch(e){
|
|
38
|
+
console.error(e)
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
} else {
|
|
43
|
+
|
|
44
|
+
const credentials = await promptCredentials()
|
|
45
|
+
|
|
46
|
+
await axios.post(`https://${cmdEnv.servername}.cultofbits.com/recordm/security/auth`, credentials, {
|
|
47
|
+
headers: {
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
},
|
|
50
|
+
})
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const solutions = await readYamlFile("solutions.yml")
|
|
54
|
+
|
|
55
|
+
for (const solution of solutions) {
|
|
56
|
+
console.log("\nStarting to tag Defs of solution " + solution.name, solution.definitions)
|
|
57
|
+
if (solution.definitions) {
|
|
58
|
+
await tagDefinitions(cmdEnv.servername, solution.name, solution.definitions, args)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
} catch (err) {
|
|
63
|
+
console.error("\n", err.message);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
module.exports = tagDefs;
|
package/lib/commands/test.js
CHANGED
|
@@ -6,19 +6,33 @@ const { otherFilesContiousReload } = require("../task_lists/test_otherFilesConti
|
|
|
6
6
|
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
7
7
|
const { getKeypress } = require("../task_lists/common_helpers");
|
|
8
8
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
9
|
+
const { saveOperationState, clearOperationState, checkNoInterruptedRun } = require("../task_lists/common_operationState");
|
|
9
10
|
|
|
10
|
-
async function test (args) {
|
|
11
|
+
async function test (args) {
|
|
11
12
|
let restoreChanges, error = "";
|
|
12
13
|
let cmdEnv
|
|
13
14
|
let spawned
|
|
15
|
+
let stateSaved = false
|
|
16
|
+
let envChangesApplied = false
|
|
17
|
+
|
|
18
|
+
let rejectOnSignal;
|
|
19
|
+
const signalPromise = new Promise((_, reject) => { rejectOnSignal = reject; });
|
|
20
|
+
const handleSignal = () => rejectOnSignal(new Error('signal'));
|
|
21
|
+
process.once('SIGTERM', handleSignal);
|
|
22
|
+
process.once('SIGHUP', handleSignal);
|
|
23
|
+
|
|
14
24
|
try {
|
|
15
25
|
checkRepoVersion()
|
|
16
26
|
console.log("Start testing… ")
|
|
17
27
|
cmdEnv = await getCurrentCommandEnviroment(args)
|
|
28
|
+
await checkNoInterruptedRun()
|
|
29
|
+
saveOperationState(cmdEnv.name, cmdEnv.servername)
|
|
30
|
+
stateSaved = true
|
|
18
31
|
|
|
19
32
|
if(!args.localOnly) {
|
|
20
|
-
await validateTestingConditions(cmdEnv, args)
|
|
33
|
+
await validateTestingConditions(cmdEnv, args)
|
|
21
34
|
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
35
|
+
envChangesApplied = true
|
|
22
36
|
restoreChanges = await otherFilesContiousReload(cmdEnv)
|
|
23
37
|
} else {
|
|
24
38
|
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
@@ -27,16 +41,22 @@ async function test (args) {
|
|
|
27
41
|
|
|
28
42
|
let key;
|
|
29
43
|
do {
|
|
30
|
-
key = await getKeypress()
|
|
31
|
-
if(key == "o") opn(
|
|
32
|
-
} while( key != "q" && key != "ctrl+c" )
|
|
44
|
+
key = await Promise.race([getKeypress(), signalPromise, spawned.failed]);
|
|
45
|
+
if(key == "o") opn(`http://localhost:${spawned.port}/recordm/index.html`)
|
|
46
|
+
} while( key != "q" && key != "ctrl+c" )
|
|
33
47
|
|
|
34
|
-
} catch (err) {
|
|
35
|
-
|
|
36
|
-
|
|
48
|
+
} catch (err) {
|
|
49
|
+
if(err.message !== 'signal' && err.message !== 'processes-failed') {
|
|
50
|
+
error = err.message
|
|
51
|
+
console.log("\n",error)
|
|
52
|
+
}
|
|
37
53
|
} finally {
|
|
54
|
+
process.off('SIGTERM', handleSignal);
|
|
55
|
+
process.off('SIGHUP', handleSignal);
|
|
56
|
+
try { process.stdin.setRawMode(false); } catch {}
|
|
38
57
|
restoreChanges && await restoreChanges()
|
|
39
|
-
cmdEnv && await cmdEnv.unApplyCurrentCommandEnvironmentChanges() // Repõe as configurações
|
|
58
|
+
envChangesApplied && cmdEnv && await cmdEnv.unApplyCurrentCommandEnvironmentChanges() // Repõe as configurações
|
|
59
|
+
if (stateSaved) clearOperationState()
|
|
40
60
|
spawned && await spawned.stop();
|
|
41
61
|
// Dá tempo aos subprocessos para morrer (acho que já não é preciso)
|
|
42
62
|
setTimeout(() => {
|
|
@@ -1,31 +1,167 @@
|
|
|
1
1
|
require('colors');
|
|
2
2
|
const { getCurrentCommandEnviroment } = require("../task_lists/common_enviromentHandler");
|
|
3
3
|
const { copyFiles } = require("../task_lists/common_syncFiles");
|
|
4
|
+
const { promptCredentials, readYamlFile } = require("../task_lists/common_helpers.js");
|
|
4
5
|
const { validateUpdateFromServerConditions } = require("../task_lists/updateFromServer_validate");
|
|
6
|
+
const { getGroupsFromServer } = require("../task_lists/updateFromServer_groups");
|
|
7
|
+
const { getDefinitionsFromServer } = require("../task_lists/updateFromServer_definitions");
|
|
8
|
+
const { getInstancesFromServer } = require("../task_lists/updateFromServer_instances");
|
|
9
|
+
const { getKibanaFromServer } = require("../task_lists/updateFromServer_kibana");
|
|
10
|
+
const { getDomainsFromServer } = require("../task_lists/updateFromServer_domains");
|
|
5
11
|
const { checkRepoVersion } = require("../commands/upgradeRepo");
|
|
12
|
+
const axios = require('axios');
|
|
13
|
+
const tough = require('tough-cookie');
|
|
14
|
+
const fs = require("fs/promises");
|
|
15
|
+
const axiosCookieJarSupport = require('axios-cookiejar-support')
|
|
16
|
+
const path = require('path')
|
|
17
|
+
const FileCookieStore = require('file-cookie-store');
|
|
6
18
|
|
|
7
19
|
async function updateFromServer(args) {
|
|
8
20
|
try {
|
|
9
21
|
checkRepoVersion()
|
|
10
22
|
const cmdEnv = await getCurrentCommandEnviroment(args)
|
|
11
23
|
|
|
12
|
-
|
|
24
|
+
if (args.code) {
|
|
13
25
|
|
|
14
|
-
|
|
15
|
-
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
16
|
-
let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
|
|
17
|
-
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
26
|
+
await validateUpdateFromServerConditions(cmdEnv).run()
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
console.log("\nOk to proceed. Getting files from server's live directories...");
|
|
29
|
+
await cmdEnv.applyCurrentCommandEnvironmentChanges()
|
|
30
|
+
let changes = await copyFiles(cmdEnv, "serverLive", "localCopy", args)
|
|
31
|
+
await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
|
|
32
|
+
|
|
33
|
+
if (changes.length == 0) {
|
|
34
|
+
console.log("\nFinished.".green, "Nothing todo, no changes detected.");
|
|
35
|
+
} else {
|
|
36
|
+
console.log("\n " + changes.join("\n "));
|
|
37
|
+
console.log("\nUpdate done!".yellow, "Check", "git status".bold.blue, "and", "git diff".bold.blue, "to see the resulting differences.");
|
|
38
|
+
console.log("Notice that", "any changes since last deploy migth be lost.".underline)
|
|
39
|
+
console.log("Notice also that you will need to do a", "cob-cli deploy --force".bold.blue, "on next deploy.")
|
|
40
|
+
}
|
|
21
41
|
} else {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
42
|
+
|
|
43
|
+
axiosCookieJarSupport.wrapper(axios)
|
|
44
|
+
axios.defaults.ignoreCookieErrors = true
|
|
45
|
+
axios.defaults.withCredentials = true
|
|
46
|
+
const cookieJar = new tough.CookieJar()
|
|
47
|
+
axios.defaults.jar = cookieJar
|
|
48
|
+
|
|
49
|
+
if( args.cookie ) {
|
|
50
|
+
const p = path.resolve(args.cookie);
|
|
51
|
+
const cookieFile = new FileCookieStore(p, {auto_sync: false, force_parse: true});
|
|
52
|
+
try{
|
|
53
|
+
let c = await new Promise((resolve, reject) => {
|
|
54
|
+
cookieFile.findCookie(`${cmdEnv.servername}.cultofbits.com`, '/', 'cobtoken', (err, result) => {
|
|
55
|
+
if(err != null) reject(err);
|
|
56
|
+
else resolve(result)
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
if(!c){
|
|
60
|
+
throw Error( `couldn't find a cookie for ${cmdEnv.servername} in ${p}`)
|
|
61
|
+
}
|
|
62
|
+
cookieJar.setCookie(c.toString(), `https://${cmdEnv.servername}.cultofbits.com`)
|
|
63
|
+
} catch(e){
|
|
64
|
+
console.error(e)
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
} else {
|
|
69
|
+
const credentials = await promptCredentials()
|
|
70
|
+
await axios.post(`https://${cmdEnv.servername}.cultofbits.com/recordm/security/auth`, credentials, {
|
|
71
|
+
headers: {
|
|
72
|
+
"Content-Type": "application/json",
|
|
73
|
+
},
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
console.log("\n Removing existing Data")
|
|
78
|
+
try{ await fs.access("others/solutionsData") } catch { await fs.mkdir("others/solutionsData") }
|
|
79
|
+
const dataFiles = await fs.readdir("others/solutionsData");
|
|
80
|
+
for (const file of dataFiles) {
|
|
81
|
+
const filePath = path.join("others/solutionsData", file);
|
|
82
|
+
await fs.rm(filePath, {recursive: true, force: true} )
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const solutions = await readYamlFile("solutions.yml")
|
|
86
|
+
|
|
87
|
+
for (const solution of solutions) {
|
|
88
|
+
|
|
89
|
+
console.log("\nStarting updateFromServer of solution " + solution.name)
|
|
90
|
+
|
|
91
|
+
const dataPath = `others/solutionsData/${solution.name}`
|
|
92
|
+
fs.mkdir(dataPath, { recursive: true })
|
|
93
|
+
|
|
94
|
+
if (solution.permissions) {
|
|
95
|
+
await getGroupsFromServer(
|
|
96
|
+
cmdEnv.servername,
|
|
97
|
+
solution.groups,
|
|
98
|
+
dataPath + "/permissions.json",
|
|
99
|
+
solution.name,
|
|
100
|
+
args
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (solution.definitions) {
|
|
105
|
+
const definitionPath = dataPath + '/definitions/'
|
|
106
|
+
fs.mkdir(definitionPath, { recursive: true })
|
|
107
|
+
const viewsPath = dataPath + '/views/'
|
|
108
|
+
fs.mkdir(viewsPath, { recursive: true })
|
|
109
|
+
await getDefinitionsFromServer(
|
|
110
|
+
cmdEnv.servername,
|
|
111
|
+
solution.definitions,
|
|
112
|
+
definitionPath,
|
|
113
|
+
viewsPath,
|
|
114
|
+
solution.name,
|
|
115
|
+
args
|
|
116
|
+
).run()
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (solution.instances) {
|
|
120
|
+
const instancesPath = dataPath + '/instances/'
|
|
121
|
+
fs.mkdir(instancesPath, { recursive: true })
|
|
122
|
+
await getInstancesFromServer(
|
|
123
|
+
cmdEnv.servername,
|
|
124
|
+
solution.instances,
|
|
125
|
+
instancesPath,
|
|
126
|
+
solution.name,
|
|
127
|
+
args
|
|
128
|
+
)
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if(solution.kibana){
|
|
132
|
+
const kibanaPath = dataPath + '/kibana/'
|
|
133
|
+
fs.mkdir(kibanaPath, { recursive: true })
|
|
134
|
+
await getKibanaFromServer(
|
|
135
|
+
cmdEnv.servername,
|
|
136
|
+
solution.kibana.spaces,
|
|
137
|
+
kibanaPath,
|
|
138
|
+
solution.name,
|
|
139
|
+
args
|
|
140
|
+
)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if(solution.domains){
|
|
144
|
+
const domainsPath = dataPath + '/domains/'
|
|
145
|
+
fs.mkdir(domainsPath, { recursive: true })
|
|
146
|
+
await getDomainsFromServer(
|
|
147
|
+
cmdEnv.servername,
|
|
148
|
+
solution.domains.filter,
|
|
149
|
+
domainsPath,
|
|
150
|
+
solution.name,
|
|
151
|
+
args
|
|
152
|
+
)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
await fs.writeFile('others/solutionsData/_index', solutions.map(c => c.name).join('\n'), 'utf-8')
|
|
26
158
|
}
|
|
27
|
-
|
|
28
|
-
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
} catch (err) {
|
|
162
|
+
console.error("\n", err.message);
|
|
29
163
|
}
|
|
30
164
|
}
|
|
165
|
+
|
|
166
|
+
|
|
31
167
|
module.exports = updateFromServer;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
const axios = require("axios");
|
|
2
|
+
|
|
3
|
+
async function getFilteredDefinitions(servername, defConfigs) {
|
|
4
|
+
const uri = `https://${servername}.cultofbits.com/recordm/recordm/definitions`
|
|
5
|
+
const response = await axios.get( uri );
|
|
6
|
+
|
|
7
|
+
if(response.status != 200){
|
|
8
|
+
throw new Error(`HTTP Error Response: ${response.status} ${response.statusText}`);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let result = defConfigs.flatMap(c => {
|
|
12
|
+
return response.data.filter(def => match(c.filter, def))
|
|
13
|
+
.map(m => ({...m, ...c}))
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
return result
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function match(query, definition) {
|
|
20
|
+
// simple matching for now
|
|
21
|
+
return definition.name.includes(query) || definition.description?.includes(query)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
module.exports = {
|
|
25
|
+
getFilteredDefinitions: getFilteredDefinitions
|
|
26
|
+
}
|