@itentialopensource/adapter-godaddy
Version:
This adapter integrates with system described as: GoDaddy REST API v1 and v2.
240 lines (216 loc) • 7.68 kB
JavaScript
/* eslint-disable no-console */
/* eslint import/no-unresolved: warn */
/* eslint global-require: warn */
// suppress eslint rule in adapter
/* eslint arrow-parens: warn */
/* eslint import/no-extraneous-dependencies: warn */
/* eslint import/no-dynamic-require: warn */
const program = require('commander');
const rls = require('readline-sync');
const prompts = require('prompts');
const utils = require('./tbUtils');
const basicGet = require('./basicGet');
const { name } = require('../package.json');
const sampleProperties = require('../sampleProperties.json');
const adapterPronghorn = require('../pronghorn.json');
const { addAuthInfo } = require('./addAuth');
const { troubleshoot, offline } = require('./troubleshootingAdapter');
const executeInStandaloneMode = async (command) => {
console.info('\n> Executing the script outside of IAP installation directory');
console.info('> Using sampleProperties.json configuration');
switch (command) {
case 'install': {
console.error('Not currently in IAP directory - installation not possible');
break;
}
case 'connectivity': {
const { host } = sampleProperties.properties;
console.log(`perform networking diagnositics to ${host}`);
utils.runConnectivity(host);
break;
}
case 'healthcheck': {
const a = basicGet.getAdapterInstance({ properties: sampleProperties });
await utils.healthCheck(a);
break;
}
case 'basicget': {
utils.runBasicGet();
break;
}
default: {
if (rls.keyInYN('Troubleshooting without IAP?')) {
await offline();
}
}
}
process.exit(0);
};
const getAdapterInstanceConfig = async (command) => {
const instances = await utils.getAllAdapterInstances();
if (!instances || instances.length === 0) {
return console.log('None adapter instances found!');
}
let instance;
if (instances.length === 1) {
[instance] = instances;
} else {
const choices = instances.map((item) => ({ title: item.name }));
const menu = {
type: 'select',
name: 'index',
message: `Pick an adapter for ${command} check`,
choices
};
console.log('\n');
const selected = await prompts(menu);
console.log('\n');
instance = instances[selected.index];
}
if (!instance) {
console.error('No adapter instance selected');
return null;
}
const { serviceItem: adapterConfig } = await utils.getAdapterConfig(instance._id); /* eslint-disable-line no-underscore-dangle */
console.log('\nAdapter instance configuration =>');
console.log('======================================');
console.log(adapterConfig);
console.log('======================================');
return adapterConfig;
};
const executeCommandOnInstance = async (command) => {
const adapterConfig = await getAdapterInstanceConfig(command);
if (!adapterConfig) {
process.exit(0);
}
switch (command) {
case 'connectivity': {
const { host } = adapterConfig.properties.properties;
console.log(`perform networking diagnositics to ${host}`);
utils.runConnectivity(host, true);
break;
}
case 'healthcheck': {
const adapterInstance = basicGet.getAdapterInstance(adapterConfig);
await utils.healthCheck(adapterInstance);
break;
}
case 'basicget': {
utils.runBasicGet(true);
break;
}
case 'troubleshoot': {
const adapter = { properties: adapterConfig };
await troubleshoot({}, true, true, adapter);
break;
}
default: {
console.error(`Unknown command: ${command}`);
}
}
return process.exit(0);
};
const executeUnderIAPInstallationDirectory = async (command) => {
if (command === 'install') {
const { database, serviceItem, pronghornProps } = await utils.getAdapterConfig();
const filter = { id: pronghornProps.id };
const profileItem = await database.collection(utils.IAP_PROFILES_COLLECTION).findOne(filter);
if (!profileItem) {
console.log(`Could not find IAP profile for id ${pronghornProps.id}`);
process.exit(0);
}
if (serviceItem) {
console.log(`A service by the name ${name} already exits!`);
if (rls.keyInYN(`Do you want to completely remove ${name}?`)) {
console.log(`Removing ${name} from db...`);
await database.collection(utils.SERVICE_CONFIGS_COLLECTION).deleteOne({ model: name });
console.log(`${name} removed from db.`);
if (profileItem.services.includes(serviceItem.name)) {
const serviceIndex = profileItem.services.indexOf(serviceItem.name);
profileItem.services.splice(serviceIndex, 1);
const update = { $set: { services: profileItem.services } };
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
console.log(`${serviceItem.name} removed from profileItem.services.`);
console.log(`Rerun the script to reinstall ${serviceItem.name}.`);
process.exit(0);
} else {
process.exit(0);
}
} else {
console.log('Exiting...');
process.exit(0);
}
} else {
const dirname = utils.getCurrentExecutionPath();
utils.verifyInstallationDir(dirname, name);
utils.runTest();
if (rls.keyInYN(`Do you want to install ${name} to IAP?`)) {
console.log('Creating database entries...');
const adapter = utils.createAdapter(pronghornProps, profileItem, sampleProperties, adapterPronghorn);
adapter.properties.properties = await addAuthInfo(adapter.properties.properties);
await database.collection(utils.SERVICE_CONFIGS_COLLECTION).insertOne(adapter);
profileItem.services.push(adapter.name);
const update = { $set: { services: profileItem.services } };
await database.collection(utils.IAP_PROFILES_COLLECTION).updateOne({ id: pronghornProps.id }, update);
console.log('Database entry creation complete.');
}
console.log('Exiting...');
process.exit(0);
}
} else if (['healthcheck', 'basicget', 'connectivity', 'troubleshoot'].includes(command)) {
await executeCommandOnInstance(command);
}
};
const main = async (command) => {
if (!utils.areWeUnderIAPinstallationDirectory()) {
executeInStandaloneMode(command); // configuration from sampleproperties.json
} else {
executeUnderIAPInstallationDirectory(command); // configuration from $IAP_HOME/properties.json
}
};
program
.command('connectivity')
.alias('c')
.description('networking diagnostics')
.action(() => {
main('connectivity');
});
program
.command('install')
.alias('i')
.description('install current adapter')
.action(() => {
main('install');
});
program
.command('healthcheck')
.alias('hc')
.description('perfom none interative healthcheck with current setting')
.action(() => {
main('healthcheck');
});
program
.command('basicget')
.alias('bg')
.description('perfom basicget')
.action(() => {
main('basicget');
});
program
.command('troubleshoot')
.alias('tb')
.description('perfom troubleshooting')
.action(() => {
main('troubleshoot');
});
// Allow commander to parse `process.argv`
program.parse(process.argv);
if (process.argv.length < 3) {
main();
}
const allowedParams = ['install', 'healthcheck', 'basicget', 'connectivity', 'troubleshoot'];
if (process.argv.length === 3 && !allowedParams.includes(process.argv[2])) {
console.log(`unknown parameter ${process.argv[2]}`);
console.log('try `node troubleshootingAdapter.js -h` to see allowed parameters. Exiting...');
process.exit(0);
}