Skip to content

Commit

Permalink
feat: New command for updating reload task custom properties
Browse files Browse the repository at this point in the history
Implements #106
  • Loading branch information
Göran Sander committed Oct 27, 2022
1 parent 9c1e0c9 commit 288672b
Show file tree
Hide file tree
Showing 25 changed files with 533 additions and 149 deletions.
127 changes: 76 additions & 51 deletions src/ctrl-q.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
const { Command, Option } = require('commander');
const { logger, appVersion } = require('./globals');

const { logger, appVersion, setLoggingLevel } = require('./globals');
const { logStartupInfo } = require('./lib/util/log');

// const { createUserActivityCustomProperty } = require('./lib/createuseractivitycp');

const { getMasterDimension } = require('./lib/getdim');
const { deleteMasterDimension } = require('./lib/deletedim');
const { getMasterDimension } = require('./lib/cmd/getdim');
const { deleteMasterDimension } = require('./lib/cmd/deletedim');

const { getMasterMeasure } = require('./lib/cmd/getmeasure');
const { deleteMasterMeasure } = require('./lib/cmd/deletemeasure');

const { getMasterMeasure } = require('./lib/getmeasure');
const { deleteMasterMeasure } = require('./lib/deletemeasure');
const { getBookmark } = require('./lib/cmd/getbookmark');

const { getBookmark } = require('./lib/getbookmark');
const { importMasterItemFromFile } = require('./lib/cmd/import-masteritem-excel');

const { importMasterItemFromFile } = require('./lib/import-masteritem-excel');
const { scrambleField } = require('./lib/cmd/scramblefield');
const { getScript } = require('./lib/cmd/getscript');

const { scrambleField } = require('./lib/scramblefield');
const { getScript } = require('./lib/getscript');
const { getTask } = require('./lib/task/gettask');
const { getTask } = require('./lib/cmd/gettask');
const { setTaskCustomProperty } = require('./lib/cmd/settaskcp');

const {
sharedParamAssertOptions,
Expand All @@ -27,7 +31,8 @@ const {
getScriptAssertOptions,
getBookmarkAssertOptions,
getTaskAssertOptions,
} = require('./lib/assert-options');
setTaskCustomPropertyAssertOptions,
} = require('./lib/util/assert-options');

const program = new Command();

Expand All @@ -41,7 +46,16 @@ const program = new Command();
.version(appVersion)
.description(
'Ctrl-Q is a command line utility for interacting with client-managed Qlik Sense Enterprise on Windows servers.\nAmong other things the tool manipulates master items and scrambles in-app data.'
);
)
.hook('preAction', (thisCommand, actionCommand) => {
const options = actionCommand.opts();

// Set log level & show startup info
setLoggingLevel(options.logLevel);
logStartupInfo(options, 'task-custom-property-set', 'Update task custom property with new values');

logger.verbose(`About to call action handler for subcommand: ${actionCommand.name()}`);
});

// Create custom properties for tracking user activity buckets, i.e. how long ago a user was last active (last login) in Sense
// program
Expand All @@ -52,10 +66,7 @@ const program = new Command();
// .action(async (options) => {
// try {
// let optionsLocal = options;
// logger.verbose(`appid=${options.appId}`);
// logger.verbose(`itemid=${options.itemid}`);

// sharedParamAssertOptions(options);
// await sharedParamAssertOptions(options);
// optionsLocal = userActivityCustomPropertyAssertOptions(options);
// createUserActivityCustomProperty(optionsLocal);
// } catch (err) {
Expand Down Expand Up @@ -103,10 +114,7 @@ const program = new Command();
.description('create master items based on definitions in a file on disk')
.action(async (options) => {
try {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
masterItemImportAssertOptions(options);
importMasterItemFromFile(options);
} catch (err) {
Expand Down Expand Up @@ -162,10 +170,7 @@ const program = new Command();
.command('master-item-measure-get')
.description('get info about one or more master measures')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
masterItemGetAssertOptions(options);

getMasterMeasure(options);
Expand Down Expand Up @@ -198,10 +203,7 @@ const program = new Command();
.command('master-item-measure-delete')
.description('delete master measure(s)')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
masterItemMeasureDeleteAssertOptions(options);

deleteMasterMeasure(options);
Expand Down Expand Up @@ -233,10 +235,7 @@ const program = new Command();
.command('master-item-dim-get')
.description('get info about one or more master dimensions')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);

getMasterDimension(options);
})
Expand Down Expand Up @@ -268,10 +267,7 @@ const program = new Command();
.command('master-item-dim-delete')
.description('delete master dimension(s)')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
masterItemDimDeleteAssertOptions(options);

deleteMasterDimension(options);
Expand Down Expand Up @@ -303,10 +299,7 @@ const program = new Command();
.command('field-scramble')
.description('scramble one or more fields in an app. A new app with the scrambled data is created.')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`fieldname=${options.fieldname}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);

scrambleField(options);
})
Expand Down Expand Up @@ -335,9 +328,7 @@ const program = new Command();
.command('script-get')
.description('get script from Qlik Sense app')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
getScriptAssertOptions(options);

getScript(options);
Expand All @@ -364,10 +355,7 @@ const program = new Command();
.command('bookmark-get')
.description('get info about one or more bookmarks')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
getBookmarkAssertOptions(options);

getBookmark(options);
Expand Down Expand Up @@ -402,10 +390,7 @@ const program = new Command();
.command('task-get')
.description('get info about one or more tasks')
.action(async (options) => {
logger.verbose(`appid=${options.appId}`);
logger.verbose(`itemid=${options.itemid}`);

sharedParamAssertOptions(options);
await sharedParamAssertOptions(options);
getTaskAssertOptions(options);

getTask(options);
Expand Down Expand Up @@ -460,6 +445,46 @@ const program = new Command();
.default('')
);

// Set tasks command
program
.command('task-custom-property-set')
.description('update a custom property of one or more tasks')
.action(async (options) => {
await sharedParamAssertOptions(options);
setTaskCustomPropertyAssertOptions(options);

setTaskCustomProperty(options);
})
.addOption(
new Option('--log-level <level>', 'log level').choices(['error', 'warn', 'info', 'verbose', 'debug', 'silly']).default('info')
)
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense repository service (QRS) port', '4242')
.option('--schema-version <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--virtual-proxy <prefix>', 'Qlik Sense virtual proxy prefix', '')
.requiredOption('--secure <true|false>', 'connection to Qlik Sense engine is via https', true)
.requiredOption('--auth-user-dir <directory>', 'user directory for user to connect with')
.requiredOption('--auth-user-id <userid>', 'user ID for user to connect with')

.addOption(new Option('-a, --auth-type <type>', 'authentication type').choices(['cert']).default('cert'))
.option('--auth-cert-file <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.option('--auth-cert-key-file <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.option('--auth-root-cert-file <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')

.addOption(new Option('--task-type <type>', 'type of tasks to list').choices(['reload']).default('reload'))
.option('--task-id <ids...>', 'use task IDs to select which tasks to retrieve')
.option('--task-tag <tags...>', 'use tags to select which tasks to retrieve')

.requiredOption('--custom-property-name <name>', 'name of custom property that will be updated')
.requiredOption('--custom-property-value <values...>', 'one or more values name of custom property that will be updated')
.option('--overwrite', 'overwrite output file without asking')
.addOption(
new Option('--update-mode <mode>', 'append or replace value(s) to existing custom property')
.choices(['append', 'replace'])
.default('append')
)
.option('--dry-run', 'do a dry run, i.e. do not modify any reload tasks - just show what would be updated');

// Parse command line params
await program.parseAsync(process.argv);
})();
4 changes: 2 additions & 2 deletions src/lib/createdim.js → src/lib/cmd/createdim.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const enigma = require('enigma.js');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

/**
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const qrsInteract = require('qrs-interact');
const path = require('path');

const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');
const {
getUserActivityProfessional,
getUserActivityAnalyzer,
Expand Down Expand Up @@ -184,7 +184,7 @@ const createUserActivityCustomProperty = async (options) => {
break;
}
}

// Set custom property for user
try {
result = await qrsInteractInstance.Post(
Expand Down
4 changes: 2 additions & 2 deletions src/lib/deletedim.js → src/lib/cmd/deletedim.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const enigma = require('enigma.js');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

/**
*
Expand Down
4 changes: 2 additions & 2 deletions src/lib/deletemeasure.js → src/lib/cmd/deletemeasure.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const enigma = require('enigma.js');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

/**
*
Expand Down
4 changes: 2 additions & 2 deletions src/lib/getbookmark.js → src/lib/cmd/getbookmark.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const enigma = require('enigma.js');
const { table } = require('table');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

const consoleTableConfig = {
border: {
Expand Down
4 changes: 2 additions & 2 deletions src/lib/getdim.js → src/lib/cmd/getdim.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const enigma = require('enigma.js');
const { table } = require('table');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

const consoleTableConfig = {
border: {
Expand Down
4 changes: 2 additions & 2 deletions src/lib/getmeasure.js → src/lib/cmd/getmeasure.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
const enigma = require('enigma.js');
const { table } = require('table');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

const consoleTableConfig = {
border: {
Expand Down
4 changes: 2 additions & 2 deletions src/lib/getscript.js → src/lib/cmd/getscript.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const enigma = require('enigma.js');
const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

/**
*
Expand Down
4 changes: 2 additions & 2 deletions src/lib/task/gettask.js → src/lib/cmd/gettask.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ const { stringify } = require('csv-stringify/sync');
const yesno = require('yesno');

const { logger, setLoggingLevel, isPkg, execPath, verifyFileExists } = require('../../globals');
const { QlikSenseTasks } = require('./class_alltasks');
const { mapEventType, mapIncrementOption, mapDaylightSavingTime, mapRuleState } = require('../lookups');
const { QlikSenseTasks } = require('../task/class_alltasks');
const { mapEventType, mapIncrementOption, mapDaylightSavingTime, mapRuleState } = require('../util/lookups');

const consoleTableConfig = {
border: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
const enigma = require('enigma.js');
const xlsx = require('node-xlsx').default;

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath, verifyFileExists } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath, verifyFileExists } = require('../util/enigma');

/**
* Find of column's positioon (zero based) given a column name.
Expand Down
4 changes: 2 additions & 2 deletions src/lib/scramblefield.js → src/lib/cmd/scramblefield.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const enigma = require('enigma.js');

const { setupEnigmaConnection } = require('./enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../globals');
const { setupEnigmaConnection } = require('../util/enigma');
const { logger, setLoggingLevel, isPkg, execPath } = require('../../globals');

/**
*
Expand Down

0 comments on commit 288672b

Please sign in to comment.