Skip to content
Snippets Groups Projects
Commit cdb492d1 authored by ale's avatar ale
Browse files

Initial commit

parents
No related branches found
No related tags found
No related merge requests found
FROM debian:stable AS build
RUN apt-get -q update && env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends git ca-certificates
RUN git clone --depth=1 https://git.schokokeks.org/git/freewvs.git /src
FROM debian:stable
RUN apt-get -q update && env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends python3 xxd ca-certificates && ln -s python3 /usr/bin/python
COPY --from=build /src/freewvs /usr/bin/freewvs
COPY --from=build /src/freewvsdb/ /var/lib/freewvs
COPY --from=build /src/update-freewvsdb /usr/bin/update-freewvsdb
COPY upload.py /upload.py
COPY cron.sh /cron.sh
#CMD ["freewvs", "--all", "--xml"]
This diff is collapsed.
cron.sh 0 → 100644
#!/bin/sh
# If dynamic updates are desired, ensure that /var/lib/freewvs is writable.
#update-freewsvdb
# Cron job interval (seconds).
period_secs=${SCAN_PERIOD_SECS:-86400}
# Directory to scan.
scan_dir=${SCAN_DIR:-.}
offset_secs=$(printf '%d' 0x$(head -c 2 /dev/urandom | xxd -p))
offset_secs=$(( $offset_secs % $period_secs ))
echo "sleeping for $offset_secs seconds..."
sleep $offset_secs
while true; do
echo "scanning..."
freewvs --all --xml $scan_dir \
| /upload.py $UPLOAD_ARGS
echo "sleeping for $period_secs seconds..."
sleep $period_secs
done
#!/usr/bin/python3
from xml.etree import ElementTree
import backoff
import json
import sys
import requests
import urllib
class StatusError(Exception):
def __init__(self, resp):
super(StatusError, self).__init__('%s %s: HTTP error %d: %s' % (
resp.request.method, resp.request.url, resp.status_code, resp.text))
class RetriableStatusError(StatusError):
pass
class Backend(object):
def __init__(self, url, ssl_cert=None, ssl_key=None,
ssl_ca=None, timeout=60):
self._url = url
self._session = requests.Session()
if ssl_cert and ssl_key:
self._session.cert = (ssl_cert, ssl_key)
self._session.verify = ssl_ca
self._session.timeout = timeout
@backoff.on_exception(backoff.expo,
(requests.exceptions.Timeout,
requests.exceptions.ConnectionError,
RetriableStatusError),
max_time=1800)
def submit(self, data):
req = self._session.prepare_request(
requests.Request(
'POST',
self._url,
data=json.dumps(data),
headers={'Content-Type': 'application/json'},
))
resp = self._session.send(req)
status = resp.status_code
if status == 429 or status > 500:
raise RetriableStatusError(resp)
return resp
def read_input(fd, shard):
tree = ElementTree.parse(fd)
entries = []
for app in tree.iter('app'):
entry = dict((x.tag, x.text) for x in app.iter())
entry['state'] = app.attrib.get('state')
entry['shard'] = shard
entries.append(entry)
return entries
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--report-url', metavar='url')
parser.add_argument('--ssl-cert', metavar='file')
parser.add_argument('--ssl-key', metavar='file')
parser.add_argument('--ssl-ca', metavar='file')
parser.add_argument('--shard', metavar='id')
opts = parser.parse_args()
be = Backend(opts.report_url, opts.ssl_cert, opts.ssl_key, opts.ssl_ca)
entries = read_input(sys.stdin, opts.shard)
be.submit({'entries': entries})
if __name__ == '__main__':
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment