captainduckduck
Version:
CLI tool for CaptainDuckDuck. See CaptainDuckDuck.com for more details.
203 lines • 10.1 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const inquirer = require("inquirer");
const Constants_1 = require("../utils/Constants");
const StdOutUtil_1 = require("../utils/StdOutUtil");
const ValidationsHandler_1 = require("../utils/ValidationsHandler");
const CliApiManager_1 = require("../api/CliApiManager");
const Utils_1 = require("../utils/Utils");
const CliHelper_1 = require("../utils/CliHelper");
const StorageHelper_1 = require("../utils/StorageHelper");
const ErrorFactory_1 = require("../utils/ErrorFactory");
const SpinnerHelper_1 = require("../utils/SpinnerHelper");
let newPasswordFirstTry = undefined;
let lastWorkingPassword = Constants_1.default.DEFAULT_PASSWORD;
let serverIpAddress = '';
let captainMachine = {
authToken: '',
baseUrl: '',
name: ''
};
const questions = [
{
type: 'list',
name: 'hasInstalledCaptain',
message: 'Have you already installed Captain on your server by running the following line:' +
'\nmkdir /captain && docker run -p 80:80 -p 443:443 -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock dockersaturn/captainduckduck ?',
default: 'Yes',
choices: ['Yes', 'No'],
filter: (value) => {
const answerFromUser = value.trim();
if (answerFromUser === 'Yes')
return answerFromUser;
StdOutUtil_1.default.printMessage('\n\nCannot start the setup process if Captain is not installed.');
StdOutUtil_1.default.printMessageAndExit('Please read tutorial on CaptainDuckDuck.com to learn how to install CaptainDuckDuck on a server.');
}
},
{
type: 'input',
default: Constants_1.default.SAMPLE_IP,
name: 'captainAddress',
message: 'Enter IP address of your captain server:',
filter: (value) => __awaiter(this, void 0, void 0, function* () {
const ipFromUser = value.trim();
if (ipFromUser === Constants_1.default.SAMPLE_IP || !ValidationsHandler_1.isIpAddress(ipFromUser)) {
StdOutUtil_1.default.printError(`\nThis is an invalid IP Address: ${ipFromUser}`, true);
}
try {
// login using captain42. and set the ipAddressToServer
captainMachine.baseUrl = `http://${ipFromUser}:3000`;
yield CliApiManager_1.default.get(captainMachine).getAuthToken(lastWorkingPassword);
serverIpAddress = ipFromUser;
}
catch (e) {
// User may have used a different default password
if (e.captainStatus === ErrorFactory_1.default.STATUS_WRONG_PASSWORD)
return '';
StdOutUtil_1.default.errorHandler(e);
}
return ipFromUser;
})
},
{
type: 'password',
name: 'captainOriginalPassword',
message: 'Enter your current password:',
when: () => !captainMachine.authToken,
filter: (value) => __awaiter(this, void 0, void 0, function* () {
try {
yield CliApiManager_1.default.get(captainMachine).getAuthToken(value);
lastWorkingPassword = value;
return '';
}
catch (e) {
StdOutUtil_1.default.errorHandler(e);
}
})
},
{
type: 'input',
name: 'captainRootDomain',
message: 'Enter a root domain for this Captain server. For example, enter test.yourdomain.com if you' +
' setup your DNS to point *.test.yourdomain.com to ip address of your server.',
filter: (value) => __awaiter(this, void 0, void 0, function* () {
const captainRootDomainFromUser = value.trim();
try {
yield CliApiManager_1.default.get(captainMachine).updateRootDomain(captainRootDomainFromUser);
captainMachine = Utils_1.default.copyObject(captainMachine);
captainMachine.baseUrl = `http://captain.${captainRootDomainFromUser}`;
}
catch (e) {
StdOutUtil_1.default.printError('\n\n');
if (e.captainStatus === ErrorFactory_1.default.VERIFICATION_FAILED) {
if (captainRootDomainFromUser.indexOf('/') >= 0) {
StdOutUtil_1.default.printError('DO NOT include http in your base domain, it should be just plain domain, e.g., test.domain.com');
}
if (captainRootDomainFromUser.indexOf('*') >= 0) {
StdOutUtil_1.default.printError('DO NOT include * in your base domain, it should be just plain domain, e.g., test.domain.com');
}
StdOutUtil_1.default.printError(`\n\nCannot verify that http://captain.${captainRootDomainFromUser} points to your server IP.\n` +
`\nAre you sure that you set *.${captainRootDomainFromUser} points to ${serverIpAddress}\n\n` +
`Double check your DNS. If everything looks correct, note that, DNS changes take up to 24 hrs to work properly. Check with your Domain Provider.`);
}
StdOutUtil_1.default.errorHandler(e);
}
return captainRootDomainFromUser;
})
},
{
type: 'password',
name: 'newPasswordFirstTry',
message: 'Enter a new password:',
filter: (value) => {
newPasswordFirstTry = value;
if (!newPasswordFirstTry) {
StdOutUtil_1.default.printError('Password empty.', true);
throw new Error('Password empty');
}
return value;
}
},
{
type: 'password',
name: 'newPassword',
message: 'Enter your new password again:',
filter: (value) => __awaiter(this, void 0, void 0, function* () {
const confirmPasswordValueFromUser = value;
if ((newPasswordFirstTry !== confirmPasswordValueFromUser)) {
StdOutUtil_1.default.printError('Passwords do not match. Try serversetup again.', true);
throw new Error('Password mismatch');
}
return '';
})
},
{
type: 'input',
name: 'emailAddress',
message: "Enter your 'valid' email address to enable HTTPS: ",
filter: (value) => __awaiter(this, void 0, void 0, function* () {
const emailAddressFromUser = value.trim();
let forcedSsl = false;
try {
SpinnerHelper_1.default.start('Enabling SSL... Takes a few seconds...');
yield CliApiManager_1.default.get(captainMachine).enableRootSsl(emailAddressFromUser);
captainMachine = Utils_1.default.copyObject(captainMachine);
captainMachine.baseUrl = captainMachine.baseUrl.replace('http://', 'https://');
yield CliApiManager_1.default.get(captainMachine).forceSsl(true);
forcedSsl = true;
yield CliApiManager_1.default.get(captainMachine).changePass(lastWorkingPassword, newPasswordFirstTry);
lastWorkingPassword = newPasswordFirstTry;
yield CliApiManager_1.default.get(captainMachine).getAuthToken(lastWorkingPassword);
SpinnerHelper_1.default.stop();
}
catch (e) {
if (forcedSsl) {
StdOutUtil_1.default.printError('Server is setup, but password was not changed due to an error. You cannot use serversetup again.');
StdOutUtil_1.default.printError(`Instead, go to ${captainMachine.baseUrl} and change your password on settings page.`);
StdOutUtil_1.default.printError(`Then, Use captainduckduck login on your local machine to connect to your server.`);
}
SpinnerHelper_1.default.fail();
StdOutUtil_1.default.errorHandler(e);
}
return emailAddressFromUser;
})
},
{
type: 'input',
name: 'captainName',
message: 'Enter a name for this Captain machine:',
default: CliHelper_1.default.get().findDefaultCaptainName(),
validate: (value) => {
const newMachineName = value.trim();
let errorMessage = undefined;
if (StorageHelper_1.default.get().findMachine(newMachineName)) {
return `${newMachineName} already exist. If you want to replace the existing entry, you have to first use <logout> command, and then re-login.`;
}
if (CliHelper_1.default.get().isNameValid(newMachineName)) {
captainMachine.name = newMachineName;
return true;
}
return 'Please enter a valid Captain Name. Small letters, numbers, single hyphen.';
}
}
];
function serversetup() {
return __awaiter(this, void 0, void 0, function* () {
StdOutUtil_1.default.printMessage('\nSetup your Captain server\n');
const answersIgnore = yield inquirer.prompt(questions);
StorageHelper_1.default.get().saveMachine(captainMachine);
StdOutUtil_1.default.printMessage(`\n\nCaptain is available at ${captainMachine.baseUrl}`);
StdOutUtil_1.default.printMessage('\nFor more details and docs see http://www.captainduckduck.com\n\n');
});
}
exports.default = serversetup;
//# sourceMappingURL=serversetup.js.map