mirror of
https://github.com/projecthorus/sondehub-infra.git
synced 2025-02-20 17:12:50 +00:00
add amateur put api
This commit is contained in:
parent
dd28947833
commit
a058f17464
102
lambda/ham_put_api/__init__.py
Normal file
102
lambda/ham_put_api/__init__.py
Normal 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"}
|
||||
|
42
lambda/ham_put_api/__main__.py
Normal file
42
lambda/ham_put_api/__main__.py
Normal 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, {}))
|
Loading…
x
Reference in New Issue
Block a user