Skip to content

Instantly share code, notes, and snippets.

@misablaha
Last active June 9, 2018 11:10
Show Gist options
  • Save misablaha/275f43bbfe42751d86195c768e287c99 to your computer and use it in GitHub Desktop.
Save misablaha/275f43bbfe42751d86195c768e287c99 to your computer and use it in GitHub Desktop.
firmware semver proof of concept
const path = require('path');
const fs = require('fs');
const express = require('express');
const semver = require('semver');
const app = express();
/**
* Get list of available files
*/
app.get('/:name', (req, res, next) => {
const { name } = req.params;
const folder = path.resolve(__dirname, 'fw', name);
fs.readdir(folder, (err, files) => {
if (err) return next(err);
res.send(files.sort(semver.compare));
});
});
/**
* Find and serve best matching version
*/
app.get('/:name/:version', (req, res, next) => {
const { name, version } = req.params;
const root = path.resolve(__dirname, 'fw', name);
fs.readdir(root, (err, files) => {
if (err) return next(err);
const satisfy = files
// sort descending
.sort((v1, v2) => semver.compare(v2, v1))
// find first hit
.find(v => semver.satisfies(v, version));
if (satisfy === undefined) return next(new Error(`No firmware matches version: ${version}`));
const options = {
root: root,
dotfiles: 'deny',
headers: {
'x-timestamp': Date.now(),
'x-sent': true
}
};
res.sendFile(satisfy, options, err => {
if (err) {
next(err);
} else {
console.log('Sent:', satisfy);
}
});
});
});
app.listen(5000, () => console.log('Example app listening on port 5000!'));
const https = require('https');
const path = require('path');
const fs = require('fs');
const crypto = require('crypto');
const mkdir = (dir) => {
!fs.existsSync(dir) && fs.mkdirSync(dir);
};
const writeFile = (name) => {
const fileName = path.resolve(__dirname, 'fw', 'ibr', name);
crypto.randomBytes(256, (err, buf) => {
if (err) throw err;
fs.writeFileSync(fileName, `v.${name} data: ${buf}`);
});
};
mkdir(path.resolve(__dirname, 'fw'));
mkdir(path.resolve(__dirname, 'fw', 'ibr'));
https.get('https://registry.npmjs.org/lodash', (res) => {
let data = '';
res.on('data', buf => data += buf);
res.on('end', () => {
const versions = Object.keys(JSON.parse(data).versions);
versions.forEach(writeFile);
});
}).on('error', (e) => {
console.error(e);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment