add amateur put api

This commit is contained in:
Michaela Wheeler 2022-01-17 10:20:15 +11:00
parent dd28947833
commit a058f17464
2 changed files with 144 additions and 0 deletions

View File

@ -0,0 +1,102 @@
import json
import boto3
import zlib
import base64
import datetime
from email.utils import parsedate
import os
def set_connection_header(request, operation_name, **kwargs):
request.headers['Connection'] = 'keep-alive'
sns = boto3.client("sns",region_name="us-east-1")
sns.meta.events.register('request-created.sns', set_connection_header)
def telemetry_filter(telemetry):
if "dev" in telemetry:
return (False, "All checks passed however payload contained dev flag so will not be uploaded to the database")
return (True, "")
def post(payload):
sns.publish(
TopicArn=os.getenv("HAM_SNS_TOPIC"),
Message=json.dumps(payload)
)
def upload(event, context):
if "isBase64Encoded" in event and event["isBase64Encoded"] == True:
event["body"] = base64.b64decode(event["body"])
if (
"content-encoding" in event["headers"]
and event["headers"]["content-encoding"] == "gzip"
):
event["body"] = zlib.decompress(event["body"], 16 + zlib.MAX_WBITS)
payloads = json.loads(event["body"])
to_sns = []
errors = []
for payload in payloads:
if "user-agent" in event["headers"]:
event["time_server"] = datetime.datetime.now().isoformat()
payload["user-agent"] = event["headers"]["user-agent"]
payload["position"] = f'{payload["lat"]},{payload["lon"]}'
valid, error_message = telemetry_filter(payload)
if not valid:
errors.append({
"error_message": error_message,
"payload": payload
})
else:
if "uploader_position" in payload:
if not payload["uploader_position"]:
payload.pop("uploader_position")
elif payload['uploader_position'][0] == None or payload['uploader_position'][1] == None:
payload.pop("uploader_position")
else:
(payload["uploader_alt"], payload["uploader_position"]) = (
payload["uploader_position"][2],
f"{payload['uploader_position'][0]},{payload['uploader_position'][1]}",
)
to_sns.append(payload)
post(to_sns)
return errors
def lambda_handler(event, context):
try:
errors = upload(event, context)
except zlib.error:
return {"statusCode": 400, "body": "Could not decompress"}
except json.decoder.JSONDecodeError:
return {"statusCode": 400, "body": "Not valid json"}
error_message = {
"message": "some or all payloads could not be processed",
"errors": errors
}
if errors:
output = {
"statusCode": 202,
"body": json.dumps(error_message),
"headers": {
"content-type": "application/json"
}
}
print({
"statusCode": 202,
"body": error_message,
"headers": {
"content-type": "application/json"
}
})
return output
else:
return {"statusCode": 200, "body": "^v^ telm logged"}

View File

@ -0,0 +1,42 @@
from . import *
payload = {
"version": "2.0",
"routeKey": "PUT /sondes/telemetry",
"rawPath": "/sondes/telemetry",
"rawQueryString": "",
"headers": {
"accept": "*/*",
"accept-encoding": "gzip, deflate",
"content-encoding": "gzip",
"content-length": "2135",
"content-type": "application/json",
"host": "api.v2.sondehub.org",
"user-agent": "autorx-1.4.1-beta4",
"x-amzn-trace-id": "Root=1-6015f571-6aef2e73165042d53fcc317a",
"x-forwarded-for": "103.107.130.22",
"x-forwarded-port": "443",
"x-forwarded-proto": "https",
"date": "Sun, 31 Jan 2021 00:21:45 GMT",
},
"requestContext": {
"accountId": "143841941773",
"apiId": "r03szwwq41",
"domainName": "api.v2.sondehub.org",
"domainPrefix": "api",
"http": {
"method": "PUT",
"path": "/sondes/telemetry",
"protocol": "HTTP/1.1",
"sourceIp": "103.107.130.22",
"userAgent": "autorx-1.4.1-beta4",
},
"requestId": "Z_NJvh0RoAMEJaw=",
"routeKey": "PUT /sondes/telemetry",
"stage": "$default",
"time": "31/Jan/2021:00:10:25 +0000",
"timeEpoch": 1612051825409,
},
"body": "H4sIAOItzWEAA42STVPCMBCG7/wKhjPEpGlty1nx4HhR9CDDdJZ2gc6kSU3TIuP4300qqQxczCGHd5/9eDdZjcb2fPX3pFFbcwCNmYQKJ/PxRENRqkbJAjNojcr052R6gXaom1JJRzMSkcgDbS0UFKizHIRoyl1PvD3yxevzbHn/srziQBqUEvpCN+H4AB2OKyVVrQR62JQVZhpzLDssHBnQgM1YMON0Sfk8iubUjsDobZK8+5wCDLq8f+IVyHYLuWk1apfyoOEwtD/WfZm7xdOwh3ZzptJ00FGXIJxMT8dHtvp3uYwzzlPbPDwFBBgrhzFJOEu91m+WUZKkYexBEA5kMYtJyv1oWNVWjImHOhRZZ5XAGjyT9lZKCEtO0h7tC8udE9kf2IBprOSH2IBxDSPCg8EDfrQo86MbmNoW1LON1L034gerVVOa0wfx3ryf6z/QO4vC6DJwVmUlWyGmw7W25Pdo/QMTMaTbyAIAAA==",
"isBase64Encoded": True,
}
print(lambda_handler(payload, {}))