Compare commits

...

2 Commits

Author SHA1 Message Date
agp8x c641eda6f6 refactor snapshotter config 2018-08-02 15:42:52 +02:00
agp8x d2a452b848 add snapshotter 2018-08-02 15:40:20 +02:00
7 changed files with 115 additions and 0 deletions

3
snapshotter/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.pyc
data/
env

View File

@ -0,0 +1,10 @@
version: "3"
services:
test:
build: src
volumes:
- ./src/:/app
- ./data:/data
env_file: env
working_dir: /app
command: python3 scheduler.py

8
snapshotter/env.sample Normal file
View File

@ -0,0 +1,8 @@
USER=grafana_user
PASSWORD=grafana_password
SSH_USER=ssh_user
SSH_PASSWORD=ssh_pass
SSH_HOST=ssh_target
PYTHONUNBUFFERED=1

View File

@ -0,0 +1,7 @@
FROM alpine:3.8
ADD ["requirements.txt", "/"]
RUN apk add --update --no-cache python3 libssl1.0 && \
apk add --no-cache --virtual .build-deps g++ python3-dev libffi-dev openssl-dev make && \
pip3 install --upgrade pip && \
pip3 install -r requirements.txt && \
apk del .build-deps

View File

@ -0,0 +1,3 @@
requests
fs.sshfs
schedule

View File

@ -0,0 +1,22 @@
import logging
import time
import schedule
import snapshot
log = logging
def setup(interval=10):
schedule.every(interval).minutes.do(snapshot.update)
if __name__ == "__main__":
interval = 1
sleep = (interval*60) / 10.0
setup(interval)
while True:
try:
time.sleep(sleep)
schedule.run_pending()
except Exception as e:
log.exception(e)

View File

@ -0,0 +1,62 @@
from collections import namedtuple
from datetime import date, timedelta, datetime as dt
import os
import shutil
import tempfile
import fs
import requests
Day = namedtuple("Day", ["start", "end"])
SSHConfig = namedtuple("SSHConfig", ["user", "password", "host", "port", "dir"])
URL = 'http://192.168.2.30:3000/render/d-solo/j4171pFmk/in-vs-outdoor?orgId=1&panelId=2&from={start}&to={to}&width=1000&height=500&tz=Europe%2FBerlin'
def today_str():
return date.today().strftime("temp_%d.%m.%Y.png")
def today():
today = dt.today()
t = today.timetuple()
delta = timedelta(hours=t.tm_hour, minutes=t.tm_min, seconds=t.tm_sec)
start = today - delta
end = start + timedelta(days=1)
print(start, end)
start = int(start.timestamp() * 1000)
end = int(end.timestamp() * 1000)
return Day(start=start, end=end)
def download(url, target, **kwargs):
response = requests.get(url, stream=True, **kwargs)
response.raw.decode_content = True
with open(target, "wb") as out:
shutil.copyfileobj(response.raw, out)
def upload(local_file, filename, config):
url = f"ssh://{config.user}:{config.password}@{config.host}:{config.port}/{config.dir}"
with fs.open_fs(url) as remote:
return fs.copy.copy_file("/", local_file, remote, filename)
def _update(auth, ssh_config):
day = today()
url = URL.format(start=day.start, to=day.end)
with tempfile.NamedTemporaryFile() as tmp:
download(url, tmp.name, auth=auth)
upload(tmp.name, today_str(), ssh_config)
def auth_from_env():
return (os.getenv("USER"), os.getenv("PASSWORD"))
def ssh_from_env():
return SSHConfig(user=os.getenv("SSH_USER"), password=os.getenv("SSH_PASSWORD"), host=os.getenv("SSH_HOST"), port=os.getenv("SSH_PORT", 22), dir=os.getenv("SSH_DIR", "/"))
def update():
auth = auth_from_env()
config = ssh_from_env()
_update(auth, config)
if __name__ == "__main__":
update()