registrobrupdater
Version:
Updates brazilian registrar DNS records with user's dynamic IP
213 lines (163 loc) • 5.18 kB
JavaScript
/* eslint-disable max-len */
;
import inquirer from 'inquirer';
import publicIP from 'public-ip';
import chalk from 'chalk';
import moment from 'moment';
import configs from './configs';
import lastUpdate from './lastupdate';
import updater from './updater';
import log from './log';
class Application {
run() {
log.println(chalk.green.bold('+-----------------------------------+'));
log.println(chalk.green.bold('| Registro.br DNS Updater |'));
log.println(chalk.green.bold('+-----------------------------------+'));
log.println(chalk.green.bold(' by evsar3 v2.0.3\n'));
log.print('Acquiring your public IP...');
publicIP.v4().then(myPublicIP => {
log.updateln(`Your public IP is ${chalk.green.bold(myPublicIP)}`);
log.println(`Your last IP update was ${moment(lastUpdate.dateTime).fromNow()} at ${moment(lastUpdate.dateTime).format('L LTS')}`);
if (!lastUpdate.compare(myPublicIP) || process.argv.includes('--force')) {
log.println(`${chalk.red('Your network has changed. Your old IP was')} ${chalk.red.bold(lastUpdate.previousIP)}`);
log.println('Proceed to host name updates');
configs.accounts.forEach(async account => {
log.println(`Updating host names for ${chalk.green.bold(account.userName)}...`);
account.domains.forEach(async domain => {
domain.records.forEach(record => {
log.println(` • ${chalk.blue(record + '.' + domain.name)}`);
});
});
log.print(chalk.yellow(' * Wait...'));
await updater(account, myPublicIP, {
headless: !process.argv.includes('--no-headless')
});
log.updateln(chalk.green(' ✓ Done.'));
lastUpdate.setUpdate(myPublicIP);
});
} else {
log.println(chalk.green.bold('No network change detected. Bye'));
}
});
}
addAccount() {
let questions = [
{
type: 'input',
name: 'userName',
message: 'User Name:'
},
{
type: 'password',
name: 'password',
message: 'Password:'
}
];
inquirer.prompt(questions).then(answers => {
if (answers.userName === '' || answers.password === '') {
log.lnprint('Canceled.');
return false;
}
configs.addAccount(answers.userName, answers.password).save();
log.lnprint('Account successfully saved.');
});
}
addDomain() {
let accounts = [];
configs.accounts.forEach(a => accounts.push(a.userName));
accounts.sort();
accounts.push(new inquirer.Separator());
accounts.push('Cancel');
let questions = [
{
type: 'input',
name: 'fqdn',
message: 'FQDN:'
},
{
type: 'list',
choices: accounts,
name: 'userName',
message: 'Which account this domain belongs to?'
},
];
inquirer.prompt(questions).then(answers => {
if (answers.fqdn === '' || answers.userName === 'Cancel') {
log.lnprint('Canceled.');
return false;
}
// eslint-disable-next-line max-len
configs.addRecord(answers.userName, this.__parseFqdn(answers.fqdn)).save();
log.lnprint('Domain successfully added.');
});
}
removeAccount() {
let list = [];
configs.accounts.forEach(a => list.push(a.userName));
list.sort();
list.push(new inquirer.Separator());
list.push('Cancel');
inquirer.prompt([
{
type: 'list',
choices: list,
name: 'userName',
message: 'Pick an account to remove:'
}
]).then(answers => {
if (answers.userName === 'Cancel') {
log.lnprint('Canceled.');
return false;
}
configs.removeAccount(answers.userName).save();
log.lnprint('Account successfully removed.');
});
}
removeDomain() {
let domains = [];
configs.accounts.forEach(account => {
account.domains.forEach(domain => {
domains.push(`*.${domain.name}`);
domain.records.forEach(record => {
domains.push(`${record}.${domain.name}`);
});
});
});
domains.push(new inquirer.Separator());
domains.push('Cancel');
inquirer.prompt([
{
type: 'list',
choices: domains,
name: 'fqdn',
message: 'Pick a domain to remove:'
}
]).then(answers => {
if (answers.fqdn === 'Cancel') {
log.lnprint('Canceled.');
return false;
}
configs.removeRecord(this.__parseFqdn(answers.fqdn)).save();
log.lnprint('Domain successfully removed.');
});
}
list() {
configs.accounts.forEach(account => {
log.lnprint(account.userName);
account.domains.forEach(domain => {
domain.records.forEach(record => {
log.lnprint(`⤷ ${record}.${domain.name}`);
});
});
});
}
createCronJob() {}
removeCronJob() {}
__parseFqdn(fqdn) {
if (fqdn.substr(-1) === '.') {
fqdn = fqdn.substr(0, fqdn.length - 1);
}
return fqdn;
}
}
export default new Application();