In questo tutorial vedremo come effettuare delle query DNS usando il comando dig in Node.js.
Creiamo una classe di utility che accetta come parametri il nome del dominio e il tipo di record da ricercare.
'use strict';
const { exec } = require('child_process');
class Dig {
constructor(domain, record) {
this.domain = domain;
this.record = record;
this.cmd = `dig +nocmd ${this.domain} ${this.record} +noall +answer`;
}
lookup() {
const self = this;
return new Promise(( resolve, reject ) => {
exec(self.cmd, (error, stdout, stderr) => {
if(error || stderr) {
reject('DNS lookup failed');
}
resolve(stdout);
});
});
}
}
module.exports = Dig;
Utilizziamo il metodo exec()
della classe core child_process
per eseguire il comando dig
dalla shell. Con le Promise possiamo restituire l'output del comando o l'eventuale errore generato.
Quindi usiamo questa classe nella nostra applicazione nel modo seguente.
'use strict';
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const port = process.env.PORT || 3000;
const app = express();
const Dig = require('./lib/Dig');
app.disable('x-powered-by');
app.use('/public', express.static(path.join(__dirname, '/public'), {
maxAge: 0,
dotfiles: 'ignore',
etag: false
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.get('/', (req, res) => {
res.sendFile(path.join(__dirname) + '/views/index.html');
});
app.post('/api/lookup', async (req, res) => {
const { domain, type } = req.body;
const dig = new Dig(domain, type);
try {
const lookup = await dig.lookup();
res.send(lookup);
} catch(err) {
res.send(err);
}
});
if (app.get('env') === 'development') {
app.use((err, req, res, next) => {
res.status(err.status || 500);
});
}
app.use((err, req, res, next) => {
res.status(err.status || 500);
});
app.listen(port);