Skip to content

Instantly share code, notes, and snippets.

@iitenkida7
Forked from tanaka-takayoshi/monitor.js
Last active January 14, 2021 02:28
Show Gist options
  • Save iitenkida7/01c977c9511cb06f50d06d97d38bf041 to your computer and use it in GitHub Desktop.
Save iitenkida7/01c977c9511cb06f50d06d97d38bf041 to your computer and use it in GitHub Desktop.
var assert = require('assert');
var request = require('request');
var util = require('util');
const requestPromise = util.promisify(request);
var newrelicApiKey = $secure.NEWRELIC_API_KEY;
var insightKey = $secure.INSIGHTKEY;
var accountId = $secure.ACCOUNTID;
var options = {
uri: 'https://synthetics.newrelic.com/synthetics/api/v3/monitors',
headers: {
'X-Api-Key': newrelicApiKey,
'Accept': 'application/json'
}
};
function callback(err, response, body) {
var result = JSON.parse(body).monitors
var urls = [];
result.map(function (item) {
if (item.uri !== "" && urls.indexOf(uniqUrl(item.uri)) < 0) {
urls.push(uniqUrl(item.uri));
}
});
urls.forEach(url => {processSite(url)});
}
function uniqUrl(url) {
if (url.match("^https")) {
return "https://" + url.split('/')[2] + "/";
}
return false;
}
function treatAsUTC(date) {
var result = new Date(date);
result.setMinutes(result.getMinutes() - result.getTimezoneOffset());
return result;
}
function daysBetween(startDate, endDate) {
var millisecondsPerDay = 24 * 60 * 60 * 1000;
return Math.round((treatAsUTC(endDate) - treatAsUTC(startDate)) / millisecondsPerDay);
}
function insertInsightsEvent(urlMonitored, certificateIssuer, daysToExpiration, expirationMilliseconds){
var options = {
uri: `https://insights-collector.newrelic.com/v1/accounts/${accountId}/events`,
body: JSON.stringify([{
'eventType': 'SSLCertificateCheck',
'Url': urlMonitored,
'Issuer': certificateIssuer,
'DaysToExpiration': daysToExpiration,
'ExpirationDate': expirationMilliseconds
}
]),
// '[{"eventType":"SSLCertificateCheck","Url":"'+urlMonitored+'","Issuer":"'+certificateIssuer+'","DaysToExpiration":'+daysToExpiration+', "ExpirationDate":'+expirationMilliseconds+'}]',
headers:{
'X-Insert-Key': insightKey,
'Content-Type': 'application/json'
}
};
console.log("Posting event for: "+urlMonitored);
request.post(options, function(error,response, body){
console.log(response.statusMessage);
console.log(`status code: ${response.statusCode}`);
assert.ok(response.statusCode == 200, `${urlMonitored}のInsight Custom Eventの送信ステータスが200以外です`);
var info = JSON.parse(body);
assert.ok(info.success == true, `${urlMonitored}のInsight Custom Eventの送信結果にtrue以外のレスポンスが含まれています: ${info.success}`);
console.log('SSL cert check が完了してCustom Eventの送信が完了しました');
});
}
function processSite(urlToMonitor)
{
console.log(`チェック対象のサイト]: ${urlToMonitor}`);
var options = {
url: urlToMonitor,
method: 'HEAD',
gzip: true,
followRedirect: false,
followAllRedirects: false
};
requestPromise(options).then((response) => {
var certDetails = (response.req.connection.getPeerCertificate());
var currentDate = new Date();
var certExpirationDate = new Date(certDetails.valid_to);
var daysToExpiration = daysBetween(currentDate, certExpirationDate);
var certificateIssuer = certDetails.issuer.O;
console.log(`証明書発行元: ${certificateIssuer}`);
console.log(`証明書期限日 ${certExpirationDate}`);
console.log(`テスト実施日: ${currentDate}`);
console.log(`失効するまであと ${daysToExpiration}日`);
console.log(`${options.url}のCustom EventをInsightに送信します...`);
insertInsightsEvent(options.url, certificateIssuer, daysToExpiration, certExpirationDate.getTime());
}).catch((error) => {
assert.fail(error);
});
}
$http.get(options, callback);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment