2019-07-23 21:50:30 -06:00

129 lines
3.6 KiB
JavaScript

"use strict";
//var auth = require('./auth.js');
var defaults = {
baseUrl: "https://www.googleapis.com/dns/v1/"
};
module.exports.create = function(config) {
var request;
var baseUrl = (config.baseUrl || defaults.baseUrl).replace(/\/$/, "");
var token = config.token;
var sa = getServiceAccount(config);
var plugin = {
init: function(opts) {
request = opts.request;
return null;
},
zones: function(data) {
//console.info('List Zones', data);
return api({
url: baseUrl + "/projects/" + sa.project_id + "/managedZones",
json: true
}).then(function(resp) {
return resp.body.managedZones.map(function(zone) {
// slice out the trailing dot.
// ex: "example.com." => "example.com"
// (assuming that all 'dnsName's probably look the same)
var name = zone.dnsName.slice(0, zone.dnsName.length - 1);
console.log("the is name", name);
return name;
});
});
},
set: function(data) {
console.info("Add TXT", data);
var ch = data.challenge;
return getZoneNameByDnsName(ch.dnsZone)
.then(function(gZoneName) {
return api({
method: "POST",
url:
baseUrl +
"/projects/" +
sa.project_id +
"/managedZones/" +
gZoneName +
"/changes",
json: {
kind: "dns#change",
additions: [
{
kind: "dns#resourceRecordSet",
name: ch.dnsHost,
type: "TXT",
ttl: 300, // TODO test for lowest allowed value
rrdatas: [ch.dnsAuthorization],
signatureRrdatas: []
}
],
deletions: []
//"startTime": "string",
//"id": "string",
//"status": "string",
//"isServing": true
}
});
})
.then(function(resp) {
if (resp.body.error) {
console.error(resp.headers);
console.error(resp.body);
throw new Error(resp.body.error);
}
});
},
remove: function(data) {
// console.info('Remove TXT', data);
throw Error("removing TXT not implemented");
},
get: function(data) {
// console.info('List TXT', data);
throw Error("listing TXTs not implemented");
}
};
return plugin;
function api(opts) {
//return auth.getToken(sa).then(function(token) {
opts.headers = opts.headers || {};
opts.headers.Authorization = "Bearer " + token;
return request(opts).then(function(resp) {
console.log(resp.headers);
console.log(resp.body);
return resp;
});
//});
}
function getZoneNameByDnsName(dnsZone) {
return api({
url: baseUrl + "/projects/" + sa.project_id + "/managedZones",
json: true
}).then(function(resp) {
// Google Zone Name is NOT the DNS Name, but an arbitrary string
return resp.body.managedZones.filter(function(zone) {
return dnsZone + "." === zone.dnsName;
})[0].name;
});
}
function getServiceAccount(config) {
var saPath =
config.serviceAccountPath || process.env.GOOGLE_APPLICATION_CREDENTIALS;
var sa = config.serviceAccount || require(saPath);
if (
!sa ||
!(sa.private_key && sa.private_key_id && sa.client_email && sa.project_id)
) {
throw new Error(
"missing or incomplete service_account.json: set serviceAccount serviceAccountPath"
);
}
return sa;
}
};