Skip to content

Instantly share code, notes, and snippets.

@mahees
Created April 11, 2020 12:29
Show Gist options
  • Save mahees/4f7a4454edfe4e5552ae09ee5d8534a2 to your computer and use it in GitHub Desktop.
Save mahees/4f7a4454edfe4e5552ae09ee5d8534a2 to your computer and use it in GitHub Desktop.
aws lambda iot-update-handler signed s3 update file
'use strict';
var AWS = require('aws-sdk');
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_ACCESS_KEY_SECRET,
region: 'us-east-1'
});
var s3 = new AWS.S3();
var supportedDevices = {
"18:FE:AA:AA:AA:AA": "ah.m3u",
"18:FE:34:A5:4E:56": {
bucket: process.env.S3_BUCKET_NAME,
latestFirmwareFilename: "httpUpdate.ino.bin"
}
}
////[HTTP_USER_AGENT] => ESP8266-http-Update [HTTP_X_ESP8266_STA_MAC] => 18:FE:AA:AA:AA:AA [HTTP_X_ESP8266_AP_MAC] => 1A:FE:AA:AA:AA:AA [HTTP_X_ESP8266_FREE_SPACE] => 671744 [HTTP_X_ESP8266_SKETCH_SIZE] => 373940 [HTTP_X_ESP8266_CHIP_SIZE] => 524288 [HTTP_X_ESP8266_SDK_VERSION] => 1.3.0 [HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19
var getRequestHandler = function(event, context, callback) {
//Used in testing using query params
if (!event.queryStringParameters ||
!event.queryStringParameters.sketch ||
!event.queryStringParameters.mac ||
!supportedDevices[event.queryStringParameters.mac]
) {
return callback(null, {
statusCode: 403,
body: JSON.stringify({ message: `Unsupported params` }),
headers: {
'Content-Type': 'application/json',
}
})
}
var sketchName = event.queryStringParameters.sketch;
var deviceMacAddress = event.queryStringParameters.mac;
var firmwareDetails = supportedDevices[event.queryStringParameters.mac];
// if (!event.headers ||
// !event.headers["HTTP_X_ESP8266_VERSION"] ||
// !event.headers["HTTP_X_ESP8266_STA_MAC"] ||
// !supportedDevices[event.headers["HTTP_X_ESP8266_STA_MAC"]]
// ) {
// return callback(null, {
// statusCode: 403,
// body: JSON.stringify({ message: `Unsupported params` }),
// headers: {
// 'Content-Type': 'application/json',
// }
// })
// }
// var sketchName = event.headers["HTTP_X_ESP8266_VERSION"] ;
// var deviceMacAddress = event.headers["HTTP_X_ESP8266_STA_MAC"];
// var firmwareDetails = supportedDevices[event.headers["HTTP_X_ESP8266_STA_MAC"]];
if (firmwareDetails.latestFirmwareFilename == sketchName) {
var response = {
statusCode: 304
};
return callback(null, response);
}
var options = {
Bucket: firmwareDetails.bucket,
Key: firmwareDetails.latestFirmwareFilename,
Expires: 60
};
var url = s3.getSignedUrl('getObject', options);
//testing
var response = {
statusCode: 200,
headers: {
'Content-Type': 'text/plain'
},
body: url
};
//Unfortunatly unsupported by esp, so using a "hack" to get the s3 url first then calling for the file.
//https://github.com/esp8266/Arduino/issues/3811
// var response = {
// statusCode: 301,
// headers: {
// "Location": url
// },
// body: null
// };
return callback(null, response);
};
exports.handler = (event, context, callback) => {
console.log(event);
if (event.httpMethod != 'GET') {
return callback(null, {
statusCode: 403,
body: JSON.stringify({ message: `Unsupported method "${event.httpMethod}"` }),
headers: {
'Content-Type': 'application/json',
}
})
}
return getRequestHandler(event, context, callback);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment