summaryrefslogtreecommitdiff
path: root/cron/handler.py
diff options
context:
space:
mode:
Diffstat (limited to 'cron/handler.py')
-rw-r--r--cron/handler.py102
1 files changed, 102 insertions, 0 deletions
diff --git a/cron/handler.py b/cron/handler.py
new file mode 100644
index 0000000..8c52d0f
--- /dev/null
+++ b/cron/handler.py
@@ -0,0 +1,102 @@
+import json
+import re
+
+import boto3
+import requests
+import urllib3
+
+from requests_ntlm import HttpNtlmAuth
+
+from datetime import datetime, timedelta
+from io import BytesIO
+from os import environ
+
+urllib3.disable_warnings()
+
+
+class GeshemUpdate():
+
+ def __init__(self):
+ self.s3 = boto3.client('s3')
+ self.BUCKET = 'imgs.geshem.space'
+ self.IMG_PREFIX = 'imgs/'
+
+ self.BASE_URL = environ.get("BASE_URL")
+ self.NTLM_AUTH = (environ.get("AUTH_USER"), environ.get("AUTH_PASS"))
+
+ self.session = requests.Session()
+ self.session.auth = HttpNtlmAuth(*self.NTLM_AUTH)
+
+ def get_latest_images(self):
+ imgres = self.session.get(self.BASE_URL, verify=False)
+ imgs = list(set(re.findall(r"radar280comp_\d+.png", imgres.text)))
+ return sorted(imgs)[-10:]
+
+ def get_latest_bucket_keys(self):
+ latest_keys = []
+ yesterday = (datetime.utcnow().date() - timedelta(days=1)).strftime('%Y%m%d')
+
+ try:
+ latest_imgs = self.s3.list_objects_v2(Bucket=self.BUCKET, Prefix=self.IMG_PREFIX, StartAfter=self.IMG_PREFIX + yesterday)['Contents']
+ latest_keys = [i['Key'] for i in latest_imgs]
+ except KeyError:
+ pass
+
+ return latest_keys
+
+ def fetch_missing_images(self):
+ imgs = self.get_latest_images()
+ s3_imgs = self.get_latest_bucket_keys()
+ updated = False
+
+ for img in imgs:
+ key = self.key_from_filename(img)
+ if key not in s3_imgs:
+ self.fetch_image(img, key)
+ updated = True
+
+ return updated
+
+ def fetch_image(self, img_name, key):
+ print(f"Downloading {img_name} from web server")
+ img = self.session.get(f"{self.BASE_URL}/{img_name}").content
+ print(f"Uploading to {key}")
+ self.s3.put_object(Bucket=self.BUCKET, Key=key, Body=img, ContentType='image/png', CacheControl='public, max-age=31536000')
+
+ def key_from_filename(self, filename):
+ _name, date = filename.split(".")[0].split("_")
+ res = 280
+ # date conversion isn't really needed but we do it anyway just to make sure
+ dt = datetime.strptime(date, '%Y%m%d%H%M')
+ d = dt.strftime('%Y%m%d')
+ t = dt.strftime('%H%M')
+ return f'{self.IMG_PREFIX}{d}/{t}/{res}.png'
+
+ def generate_json(self):
+ latest_keys = self.get_latest_bucket_keys()
+ keys = sorted(list(filter(lambda k: k.endswith('280.png'), latest_keys)))[-10:]
+ index = json.dumps({'280': keys})
+ self.s3.put_object(Bucket=self.BUCKET, Key='imgs.json', Body=index, ContentType='application/json', CacheControl='public, max-age=60')
+
+ def run(self):
+ updated = self.fetch_missing_images()
+ if updated:
+ self.generate_json()
+ return f"Updated: {updated}"
+
+
+def update(event, context):
+ res = GeshemUpdate().run()
+ body = {
+ "message": "SUCCESS: \n" + res,
+ "input": event
+ }
+ response = {
+ "statusCode": 200,
+ "body": json.dumps(body)
+ }
+ return response
+
+
+if __name__ == "__main__":
+ GeshemUpdate().run()