From 382a7cc4a98f30a62761885f8b0d6902ce49ddfa Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Mon, 5 Nov 2018 11:10:22 -0700 Subject: [PATCH] add telemetry --- index.js | 7 +++++++ lib/community.js | 21 +++++++++++++++------ lib/core.js | 37 ++++++++++++++++++++++++------------- 3 files changed, 46 insertions(+), 19 deletions(-) diff --git a/index.js b/index.js index 7c61d2d..f8a7ef8 100644 --- a/index.js +++ b/index.js @@ -3,6 +3,7 @@ var DAY = 24 * 60 * 60 * 1000; //var MIN = 60 * 1000; var ACME = require('acme-v2/compat').ACME; +var package = require('./package.json'); var PromiseA; try { PromiseA = require('bluebird'); @@ -123,6 +124,11 @@ Greenlock.create = function (gl) { gl.challengeType = gl.challengeType || Greenlock.challengeType; gl._ipc = ipc; gl._communityPackage = gl._communityPackage || 'greenlock.js'; + if ('greenlock.js' === gl._communityPackage) { + gl._communityPackageVersion = package.version; + } else { + gl._communityPackageVersion = gl._communityPackageVersion || ('greenlock.js-' + package.version); + } gl.agreeToTerms = gl.agreeToTerms || function (args, agreeCb) { agreeCb(new Error("'agreeToTerms' was not supplied to Greenlock and 'agreeTos' was not supplied to Greenlock.register")); }; @@ -393,6 +399,7 @@ Greenlock.create = function (gl) { lexOpts.email = gl.email; lexOpts.agreeTos = gl.agreeTos; lexOpts.communityMember = lexOpts.communityMember; + lexOpts.telemetry = lexOpts.telemetry; return cb(null, { options: lexOpts, certs: certs }); } diff --git a/lib/community.js b/lib/community.js index 3116afc..e3c07c7 100644 --- a/lib/community.js +++ b/lib/community.js @@ -1,6 +1,7 @@ 'use strict'; -function addCommunityMember(pkg, action, email, domains, communityMember) { +function addCommunityMember(opts) { + // { name, version, email, domains, action, communityMember, telemetry } setTimeout(function () { var https = require('https'); var req = https.request({ @@ -15,19 +16,27 @@ function addCommunityMember(pkg, action, email, domains, communityMember) { if (err) { return; } resp.on('data', function () {}); }); + var os = require('os'); var data = { - address: email + address: opts.email // greenlock-security is transactional and security only - , list: communityMember ? (pkg + '@ppl.family') : 'greenlock-security@ppl.family' - , action: action // reg | renew - , package: pkg + , list: opts.communityMember ? (opts.name + '@ppl.family') : 'greenlock-security@ppl.family' + , action: opts.action // reg | renew + , package: opts.name // hashed for privacy, but so we can still get some telemetry and inform users // if abnormal things are happening (like several registrations for the same domain each day) - , domain: (domains||[]).map(function (d) { + , domain: (opts.domains||[]).map(function (d) { return require('crypto').createHash('sha1').update(d).digest('base64') .replace(/\//g, '_').replace(/\+/g, '-').replace(/=/g, ''); }).join(',') }; + if (false !== opts.telemetry) { + data.arch = process.arch || os.arch(); + data.platform = process.platform || os.platform(); + data.release = os.release(); + data.version = opts.version; + data.node = process.version; + } req.write(JSON.stringify(data, 2, null)); req.end(); }, 50); diff --git a/lib/core.js b/lib/core.js index 1cdd8c1..962cb1b 100644 --- a/lib/core.js +++ b/lib/core.js @@ -352,17 +352,8 @@ module.exports.create = function (gl) { // or we're forcing a refresh via 'dupliate: true' log(args.debug, "Renewing!"); - // TODO fetch email address / accountId (accountBydomain) if not present - // store.config.getAsync(args.domains).then(function (config) { /*...*/ }); - if (!args.domains || (args.domains.length || 0) <= 2) { - // this is a renewal, therefore we should renewal ALL of the domains - // associated with this certificate, unless args.domains is a list larger - // than example.com,www.example.com - // TODO check www. prefix - args.domains = certs.altnames; - if (Array.isArray(certs.domains) && certs.domains.length) { - args.domains = certs.domains; - } + if (!args.domains || !args.domains.length) { + args.domains = args.servernames || [certs.subject].concat(certs.altnames); } return core.certificates.registerAsync(args); @@ -410,7 +401,17 @@ module.exports.create = function (gl) { if (false !== args.securityUpdates && !args._communityMemberAdded) { try { // We will notify all greenlock users of mandatory and security updates - require('./community').add(args._communityPackage, 'reg', args.email, args.domains, args.communityMember); + // We'll keep track of versions and os so we can make sure things work well + // { name, version, email, domains, action, communityMember, telemetry } + require('./community').add({ + name: args._communityPackage + , version: args._communityPackageVersion + , email: args.email + , domains: args.domains || args.servernames + , action: 'reg' + , communityMember: args.communityMember + , telemetry: args.telemetry + }); } catch(e) { /* ignore */ } args._communityMemberAdded = true; } @@ -422,7 +423,17 @@ module.exports.create = function (gl) { if (false !== args.securityUpdates && !args._communityMemberAdded) { try { // We will notify all greenlock users of mandatory and security updates - require('./community').add(args._communityPackage, 'renew', args.email, args.domains, args.communityMember); + // We'll keep track of versions and os so we can make sure things work well + // { name, version, email, domains, action, communityMember, telemetry } + require('./community').add({ + name: args._communityPackage + , version: args._communityPackageVersion + , email: args.email + , domains: args.domains || args.servernames + , action: 'renew' + , communityMember: args.communityMember + , telemetry: args.telemetry + }); } catch(e) { /* ignore */ } args._communityMemberAdded = true; }