Skip to content

Instantly share code, notes, and snippets.

@tanaka-takayoshi
Created January 14, 2020 06:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save tanaka-takayoshi/e00d7e8a4ec2fff521204bf9d69e12fa to your computer and use it in GitHub Desktop.
Save tanaka-takayoshi/e00d7e8a4ec2fff521204bf9d69e12fa 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 urlsToMonitor = ['https://blog.newrelic.co.jp/', 'https://docs.newrelic.co.jp/'];
var insightKey = $secure.INSIGHTKEY;
var accountId = $secure.ACCOUNTID;
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);
});
}
urlsToMonitor.forEach(url => {processSite(url)});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment