Skip to content

Commit

Permalink
feat: add bookmark list command
Browse files Browse the repository at this point in the history
  • Loading branch information
mountaindude committed Jul 7, 2021
1 parent 1d0098b commit 0c6b7c1
Show file tree
Hide file tree
Showing 2 changed files with 193 additions and 7 deletions.
42 changes: 35 additions & 7 deletions src/ctrl-q-cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ const { deleteMasterDimension } = require('./deletedim.js');
const { getMasterMeasure } = require('./getmeasure.js');
const { deleteMasterMeasure } = require('./deletemeasure.js');

const { getBookmark } = require('./getbookmark.js');

const { importFromExcel } = require('./importexcel.js');

const { scrambleField } = require('./scramblefield.js');
Expand Down Expand Up @@ -40,7 +42,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand Down Expand Up @@ -74,7 +76,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand All @@ -99,7 +101,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand All @@ -123,7 +125,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand Down Expand Up @@ -172,7 +174,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand All @@ -196,7 +198,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand All @@ -221,7 +223,7 @@ const program = new Command();
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app whose master items should be modified')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
Expand All @@ -230,6 +232,32 @@ const program = new Command();
.requiredOption('--userdir <directory>', 'user directory for user to connect with')
.requiredOption('--userid <userid>', 'user ID for user to connect with');

// Get bookmark command
program
.command('getbookmark')
.description('get info about one or more bookmarks')
.action(async (options, command) => {
logger.verbose('appid=' + options.appid);
logger.verbose('itemid=' + options.itemid);
getBookmark(options, command);
})
.option('--loglevel <level>', 'log level (error, warning, info, verbose, debug, silly). "Info" level is default', 'info')
.requiredOption('--host <host>', 'Qlik Sense server IP/FQDN')
.option('--port <port>', 'Qlik Sense server engine port', '4747')
.option('--schemaversion <string>', 'Qlik Sense engine schema version', '12.612.0')
.requiredOption('--appid <id>', 'Qlik Sense app ID')
.requiredOption('--certfile <file>', 'Qlik Sense certificate file (exported from QMC)', './cert/client.pem')
.requiredOption('--certkeyfile <file>', 'Qlik Sense certificate key file (exported from QMC)', './cert/client_key.pem')
.requiredOption('--rootcertfile <file>', 'Qlik Sense root certificate file (exported from QMC)', './cert/root.pem')
.requiredOption('--prefix <prefix>', 'Qlik Sense virtual proxy prefix', '')
.requiredOption('--secure <true|false>', 'connection to Qlik Sense engine is via https', true)
.requiredOption('--userdir <directory>', 'user directory for user to connect with')
.requiredOption('--userid <userid>', 'user ID for user to connect with')

.option('--itemid <id>', 'bookmark to retrieve. If not specified all bookmarks will be retrieved')
.option('--outputformat <json|table>', 'output format', 'json');


// Parse command line params
let a = await program.parseAsync(process.argv);
})();
158 changes: 158 additions & 0 deletions src/getbookmark.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,158 @@
'use strict';

const enigma = require('enigma.js');
const { setupEnigmaConnection } = require('./enigma.js');
const { table } = require('table');
const { logger, setLoggingLevel } = require('./globals.js');

var consoleTableConfig = {
border: {
topBody: `─`,
topJoin: `┬`,
topLeft: `┌`,
topRight: `┐`,

bottomBody: `─`,
bottomJoin: `┴`,
bottomLeft: `└`,
bottomRight: `┘`,

bodyLeft: `│`,
bodyRight: `│`,
bodyJoin: `│`,

joinBody: `─`,
joinLeft: `├`,
joinRight: `┤`,
joinJoin: `┼`,
},
columns: {
3: { width: 40 },
// 4: { width: 30 },
// 5: { width: 30 },
// 6: { width: 30 },
},
};

/**
*
* @param {*} options
* @param {*} command
*/
const getBookmark = async (options, command) => {
try {
// Set log level
setLoggingLevel(options.loglevel);

logger.verbose('Get bookmarks');
logger.debug('Options: ' + JSON.stringify(options, null, 2));

// Configure Enigma.js
const configEnigma = setupEnigmaConnection(options);

var session = enigma.create(configEnigma);
if (options.loglevel == 'silly') {
session.on('traffic:sent', (data) => console.log('sent:', data));
session.on('traffic:received', (data) => console.log('received:', data));
}
var global = await session.open();

const engineVersion = await global.engineVersion();
logger.verbose(`Created session to server ${options.host}, engine version is ${engineVersion.qComponentVersion}.`);

var app = await global.openDoc(options.appid, '', '', '', false);
logger.verbose(`Opened app ${options.appid}.`);

// Get bookmarks in app
const bookmarkCall = {
qInfo: {
qId: 'bookmarkList',
qType: 'BookmarkListExt',
},
qBookmarkListDef: {
qType: 'bookmark',
qData: {
bookmark: '/qBookmark',
},
},
};

const genericBookmarkObj = await app.createSessionObject(bookmarkCall);
const bookmarkObj = await genericBookmarkObj.getLayout();

if (bookmarkObj) {
const bookmarks = bookmarkObj.qBookmarkList.qItems;

if (options.outputformat === 'json') {
let bookmarkObj = [];

for (const bookmark of bookmarks) {
if (options.itemid === undefined || options.itemid === bookmark.qInfo.qId) {
bookmarkObj.push(bookmark);
}
}

logger.info(JSON.stringify(bookmarkObj));
} else if (options.outputformat === 'table') {
let bookmarkTable = [];
bookmarkTable.push([
'Id',
'Type',
'Title',
'Description',
'Bookmark definition',
'Approved',
'Published',
'Publish time',
'Created date',
'Modified date',
'Owner'
]);

consoleTableConfig.header = {
alignment: 'center',
content: `Bookmarks (${bookmarks.length} bookmarks found in the app)`,
};

for (const bookmark of bookmarks) {
if (options.itemid === undefined || options.itemid === bookmark.qInfo.qId) {
bookmarkTable.push([
bookmark.qInfo.qId,
bookmark.qInfo.qType,
bookmark.qMeta.title,
bookmark.qMeta.description,
JSON.stringify(bookmark.qData.qBookmark),
bookmark.qMeta.approved,
bookmark.qMeta.published,
bookmark.qMeta.publishTime,
bookmark.qMeta.createdDate,
bookmark.qMeta.modifiedDate,
bookmark.qMeta.owner.userDirectory + '\\' + bookmark.qMeta.owner.userId,
]);
}
}

// Print table to console
logger.info(`Bookmarks\n${table(bookmarkTable, consoleTableConfig)}`);
}
}

if ((await app.destroySessionObject(genericBookmarkObj.id)) === true) {
logger.debug(`Destroyed session object after managing bookmarks in app ${options.appid} on host ${options.host}`);

if ((await session.close()) === true) {
logger.verbose(`Closed session after managing bookmarks in app ${options.appid} on host ${options.host}`);
} else {
logger.error(`Error closing session for app ${options.appid} on host ${options.host}`);
}
} else {
logger.error(`Error destroying session object for bookmarks`);
}
} catch (err) {
logger.error(err);
}
};

module.exports = {
getBookmark,
};

0 comments on commit 0c6b7c1

Please sign in to comment.