diff --git a/config/default.js b/config/default.js index 9f84128f9..48b7ecd09 100644 --- a/config/default.js +++ b/config/default.js @@ -59,4 +59,5 @@ module.exports = { certemail: 'certificate@mozilla-iot.org', }, bcryptRounds: 2, + updateUrl: 'https://api.github.com/repos/mozilla-iot/gateway/releases', }; diff --git a/src/controllers/updates_controller.js b/src/controllers/updates_controller.js index 091301b14..0ac2369d4 100644 --- a/src/controllers/updates_controller.js +++ b/src/controllers/updates_controller.js @@ -1,9 +1,12 @@ const childProcess = require('child_process'); +const config = require('config'); const fs = require('fs'); const fetch = require('node-fetch'); const semver = require('semver'); const PromiseRouter = require('express-promise-router'); +const pkg = require('../../package.json'); + const UpdatesController = PromiseRouter(); function readVersion(packagePath) { @@ -65,8 +68,10 @@ UpdatesController.get('/latest', async function(request, response) { } } - const res = await - fetch('https://api.github.com/repos/mozilla-iot/gateway/releases'); + const res = await fetch( + config.get('updateUrl'), + {headers: {'User-Agent': `mozilla-iot-gateway/${pkg.version}`}}); + const releases = await res.json(); if (!releases || !releases.filter) { console.warn('API returned invalid releases, rate limit likely exceeded'); diff --git a/src/test/integration/updates-test.js b/src/test/integration/updates-test.js index a4e90604b..a9c60d807 100644 --- a/src/test/integration/updates-test.js +++ b/src/test/integration/updates-test.js @@ -2,7 +2,9 @@ /* globals it */ +const config = require('config'); const nock = require('nock'); +const {URL} = require('url'); const {server, chai} = require('../common'); const Constants = require('../../constants'); @@ -35,6 +37,8 @@ const releases = [ }, ]; +const updateUrl = new URL(config.get('updateUrl')); + describe('updates/', function() { let jwt; beforeEach(async () => { @@ -42,8 +46,8 @@ describe('updates/', function() { }); it('should get /latest with a normal response', async() => { - nock('https://api.github.com') - .get('/repos/mozilla-iot/gateway/releases') + nock(updateUrl.origin) + .get(updateUrl.pathname) .reply(200, releases); const res = await chai.request(server) @@ -57,8 +61,8 @@ describe('updates/', function() { }); it('should get /latest with no good releases', async() => { - nock('https://api.github.com') - .get('/repos/mozilla-iot/gateway/releases') + nock(updateUrl.origin) + .get(updateUrl.pathname) .reply(200, releases.slice(0, 2)); const res = await chai.request(server) @@ -71,8 +75,8 @@ describe('updates/', function() { }); it('should get /latest with a strange error', async() => { - nock('https://api.github.com') - .get('/repos/mozilla-iot/gateway/releases') + nock(updateUrl.origin) + .get(updateUrl.pathname) .reply(200, {error: true}); const res = await chai.request(server) diff --git a/tools/check-for-update.js b/tools/check-for-update.js index 3aec47f40..8f7e1b6b6 100644 --- a/tools/check-for-update.js +++ b/tools/check-for-update.js @@ -1,61 +1,61 @@ +const config = require('config'); +const exec = require('child_process').exec; const fetch = require('node-fetch'); -const fs = require('fs'); const semver = require('semver'); -const exec = require('child_process').exec; - -const remote = 'mozilla-iot'; - -const pkg = JSON.parse(fs.readFileSync('package.json', {encoding: 'utf-8'})); +const pkg = require('../package.json'); -fetch(`https://api.github.com/repos/${remote}/gateway/releases`).then(res => { - return res.json(); -}).then(releases => { - // Assumes that releases are in chronological order, latest-first - return releases.filter(release => { - return !release.prerelease && !release.draft; - })[0]; -}).then(latestRelease => { - if (!latestRelease) { - console.error('No releases found'); - return; - } - let releaseVer = latestRelease.tag_name; - let currentVer = pkg.version; - if (semver.lt(currentVer, releaseVer)) { - // do upgrade here woo - // download latestRelease.assets[:].browser_download_url - let gatewayUrl = null; - let nodeModulesUrl = null; - let validAssetRe = new RegExp( - `^https://github.com/${remote}/gateway/releases/download/` + releaseVer - + '/[a-z0-9_-]+.tar.gz$'); - for (let asset of latestRelease.assets) { - if (!asset.browser_download_url.match(validAssetRe)) { - continue; - } - if (asset.name.match(/^gateway-[a-f0-9]+\.tar\.gz$/)) { - gatewayUrl = asset.browser_download_url; - } - if (asset.name.match(/^node_modules-[a-f0-9]+\.tar\.gz$/)) { - nodeModulesUrl = asset.browser_download_url; - } +fetch(config.get('updateUrl'), + {headers: {'User-Agent': `mozilla-iot-gateway/${pkg.version}`}}) + .then(res => { + return res.json(); + }) + .then(releases => { + // Assumes that releases are in chronological order, latest-first + return releases.filter(release => { + return !release.prerelease && !release.draft; + })[0]; + }) + .then(latestRelease => { + if (!latestRelease) { + console.error('No releases found'); + return; } - - if (nodeModulesUrl && gatewayUrl) { - exec(`./gateway/tools/upgrade.sh ${gatewayUrl} ${nodeModulesUrl}`, - {cwd: '..'}, function(err, stdout, stderr) { - if (err) { - console.error('Upgrade failed', err, stdout, stderr); - } else { - console.log('Upgrade succeeded'); + let releaseVer = latestRelease.tag_name; + let currentVer = pkg.version; + if (semver.lt(currentVer, releaseVer)) { + // do upgrade here woo + // download latestRelease.assets[:].browser_download_url + let gatewayUrl = null; + let nodeModulesUrl = null; + let validAssetRe = new RegExp( + `/download/${releaseVer}/[a-z0-9_-]+.tar.gz$`); + for (let asset of latestRelease.assets) { + if (!asset.browser_download_url.match(validAssetRe)) { + continue; + } + if (asset.name.match(/^gateway-[a-f0-9]+\.tar\.gz$/)) { + gatewayUrl = asset.browser_download_url; + } + if (asset.name.match(/^node_modules-[a-f0-9]+\.tar\.gz$/)) { + nodeModulesUrl = asset.browser_download_url; } - }); + } + + if (nodeModulesUrl && gatewayUrl) { + exec(`./gateway/tools/upgrade.sh ${gatewayUrl} ${nodeModulesUrl}`, + {cwd: '..'}, function(err, stdout, stderr) { + if (err) { + console.error('Upgrade failed', err, stdout, stderr); + } else { + console.log('Upgrade succeeded'); + } + }); + } else { + console.warn(`Release ${releaseVer} does not include archives`, + latestRelease.assets); + } } else { - console.warn(`Release ${releaseVer} does not include archives`, - latestRelease.assets); + console.log(`Our version ${currentVer} >= ${releaseVer}, exiting`); } - } else { - console.log(`Our version ${currentVer} >= ${releaseVer}, exiting`); - } -}); + });