cob-cli 2.52.0 → 2.53.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 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;
@@ -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
- try {
10
- checkRepoVersion()
11
- const cmdEnv = await getCurrentCommandEnviroment(args)
12
- if(args.resync) args.force = true;
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
- console.log(`Checking conditions to deploy ${cmdEnv.branchStr} to ${cmdEnv.serverStr}...` );
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
- await cmdEnv.applyCurrentCommandEnvironmentChanges()
19
- let changes = [];
20
- try {
21
- changes = await confirmExecutionOfChanges(cmdEnv)
22
- } catch (err) {
23
- await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
24
- throw err
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
- if(changes.length == 0) {
28
- if(!args.force) {
29
- await cmdEnv.unApplyCurrentCommandEnvironmentChanges()
30
- throw new Error("Canceled:".yellow + " nothing todo\n")
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
- await executeTasks(cmdEnv, args).run();
36
-
37
- console.log("\nDone!".green, "\nEnjoy!")
45
+ await executeTasks(cmdEnv, args).run();
38
46
 
39
- } catch(err) {
40
- console.error("\n",err.message);
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;
@@ -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("http://localhost:8040/recordm/index.html")
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
- error = err.message
36
- console.log("\n",error)
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
- await validateUpdateFromServerConditions(cmdEnv).run()
24
+ if (args.code) {
13
25
 
14
- console.log("\nOk to proceed. Getting files from server's live directories...");
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
- if(changes.length == 0) {
20
- console.log("\nFinished.".green,"Nothing todo, no changes detected.");
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
- console.log("\n " + changes.join("\n "));
23
- console.log("\nUpdate done!".yellow,"Check","git status".bold.blue,"and","git diff".bold.blue,"to see the resulting differences.");
24
- console.log("Notice that","any changes since last deploy migth be lost.".underline)
25
- console.log("Notice also that you will need to do a","cob-cli deploy --force".bold.blue,"on next deploy.")
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
- } catch(err) {
28
- console.error("\n",err.message);
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
+ }