diff options
author | Kristofer Hallin <kristofer@sunet.se> | 2022-01-04 22:12:26 +0100 |
---|---|---|
committer | Kristofer Hallin <kristofer@sunet.se> | 2022-01-04 22:12:26 +0100 |
commit | 2ea8d3a44d89934f7b22ddb932c76322601028a5 (patch) | |
tree | 84d210f850ea745f787cff403fcc553767b5c38c /src/routers/collector.py | |
parent | a3b5cde94981b9a98d367004b4c513c81e5870e4 (diff) |
Use FastAPI routers and split things to multiple files.
Diffstat (limited to 'src/routers/collector.py')
-rw-r--r-- | src/routers/collector.py | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/routers/collector.py b/src/routers/collector.py new file mode 100644 index 0000000..3cda23a --- /dev/null +++ b/src/routers/collector.py @@ -0,0 +1,101 @@ +import sys +import time + +import requests +from db.db import DictDB +from db.index import CouchIindex +from fastapi import APIRouter, Depends, Request +from fastapi.responses import JSONResponse +from fastapi_jwt_auth import AuthJWT + +router = APIRouter() + +for i in range(10): + try: + db = DictDB() + except requests.exceptions.ConnectionError: + print('Database not responding, will try again soon.' + + f'Attempt {i + 1} of 10.') + else: + break + time.sleep(10) +else: + print('Database did not respond after 10 attempts, quitting.') + sys.exit(-1) + + +def get_data(key=None, limit=25, skip=0, ip=None, + port=None, asn=None, domain=None): + if key: + return db.get(key) + + selectors = dict() + indexes = CouchIindex().dict() + selectors['domain'] = domain + + if ip and 'ip' in indexes: + selectors['ip'] = ip + if port and 'port' in indexes: + selectors['port'] = port + if asn and 'asn' in indexes: + selectors['asn'] = asn + + data = db.search(**selectors, limit=limit, skip=skip) + + return data + + +@router.get('/get') +async def get(key=None, limit=25, skip=0, ip=None, port=None, + asn=None, Authorize: AuthJWT = Depends()): + Authorize.jwt_required() + + data = [] + raw_jwt = Authorize.get_raw_jwt() + + if 'domains' not in raw_jwt: + return JSONResponse(content={"status": "error", + "message": "Could not find domains" + + "claim in JWT token"}, + status_code=400) + else: + domains = raw_jwt['domains'] + + for domain in domains: + data.extend(get_data(key, limit, skip, ip, port, asn, domain)) + + return JSONResponse(content={"status": "success", "docs": data}) + + +@router.get('/get/{key}') +async def get_key(key=None, Authorize: AuthJWT = Depends()): + Authorize.jwt_required() + + # TODO: Use JWT authz and check e.g. domain here + + data = get_data(key) + + return JSONResponse(content={"status": "success", "docs": data}) + + +@router.post('/add') +async def add(data: Request, Authorize: AuthJWT = Depends()): + Authorize.jwt_required() + + json_data = await data.json() + + key = db.add(json_data) + + return JSONResponse(content={"status": "success", "docs": key}) + + +@router.delete('/delete/{key}') +async def delete(key, Authorize: AuthJWT = Depends()): + Authorize.jwt_required() + + if db.delete(key) is None: + return JSONResponse(content={"status": "error", + "message": "Document not found"}, + status_code=400) + + return JSONResponse(content={"status": "success", "docs": {}}) |