mirror of https://github.com/D4-project/d4-core
114 lines
4.2 KiB
Python
Executable File
114 lines
4.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# -*-coding:UTF-8 -*
|
|
|
|
import os
|
|
import time
|
|
import uuid
|
|
import redis
|
|
|
|
from flask import escape
|
|
|
|
host_redis_metadata = os.getenv('D4_REDIS_METADATA_HOST', "localhost")
|
|
port_redis_metadata = int(os.getenv('D4_REDIS_METADATA_PORT', 6380))
|
|
|
|
r_serv_db = redis.StrictRedis(
|
|
host=host_redis_metadata,
|
|
port=port_redis_metadata,
|
|
db=0,
|
|
decode_responses=True)
|
|
|
|
def is_valid_uuid_v4(UUID):
|
|
UUID = UUID.replace('-', '')
|
|
try:
|
|
uuid_test = uuid.UUID(hex=UUID, version=4)
|
|
return uuid_test.hex == UUID
|
|
except:
|
|
return False
|
|
|
|
def _get_sensor_metadata(sensor_uuid, first_seen=True, last_seen=True, mail=True, description=True):
|
|
|
|
meta_sensor = {}
|
|
meta_sensor['uuid'] = sensor_uuid
|
|
if first_seen:
|
|
meta_sensor['first_seen'] = r_serv_db.hget('metadata_uuid:{}'.format(sensor_uuid), 'first_seen')
|
|
if last_seen:
|
|
meta_sensor['last_seen'] = r_serv_db.hget('metadata_uuid:{}'.format(sensor_uuid), 'last_seen')
|
|
if description:
|
|
meta_sensor['description'] = r_serv_db.hget('metadata_uuid:{}'.format(sensor_uuid), 'description')
|
|
if mail:
|
|
meta_sensor['mail'] = r_serv_db.hget('metadata_uuid:{}'.format(sensor_uuid), 'user_mail')
|
|
return meta_sensor
|
|
|
|
## TODO: add description
|
|
def register_sensor(req_dict):
|
|
sensor_uuid = req_dict.get('uuid', None)
|
|
hmac_key = req_dict.get('hmac_key', None)
|
|
user_id = req_dict.get('mail', None)
|
|
# verify uuid
|
|
if not is_valid_uuid_v4(sensor_uuid):
|
|
return ({"status": "error", "reason": "Invalid uuid"}, 400)
|
|
sensor_uuid = sensor_uuid.replace('-', '')
|
|
# sensor already exist
|
|
if r_serv_db.exists('metadata_uuid:{}'.format(sensor_uuid)):
|
|
return ({"status": "error", "reason": "Sensor already registred"}, 409)
|
|
|
|
# hmac key
|
|
if not hmac_key:
|
|
return ({"status": "error", "reason": "Mandatory parameter(s) not provided"}, 400)
|
|
else:
|
|
hmac_key = escape(hmac_key)
|
|
if len(hmac_key)>100:
|
|
hmac_key=hmac_key[:100]
|
|
|
|
|
|
res = _register_sensor(sensor_uuid, hmac_key, user_id=user_id, description=None)
|
|
return res
|
|
|
|
|
|
def _register_sensor(sensor_uuid, secret_key, user_id=None, description=None):
|
|
r_serv_db.hset('metadata_uuid:{}'.format(sensor_uuid), 'hmac_key', secret_key)
|
|
if user_id:
|
|
r_serv_db.hset('metadata_uuid:{}'.format(sensor_uuid), 'user_mail', user_id)
|
|
if description:
|
|
r_serv_db.hset('metadata_uuid:{}'.format(sensor_uuid), 'description', description)
|
|
r_serv_db.sadd('sensor_pending_registration', sensor_uuid)
|
|
return ({'uuid': sensor_uuid}, 200)
|
|
|
|
def get_pending_sensor():
|
|
return list(r_serv_db.smembers('sensor_pending_registration'))
|
|
|
|
def approve_sensor(req_dict):
|
|
sensor_uuid = req_dict.get('uuid', None)
|
|
if not is_valid_uuid_v4(sensor_uuid):
|
|
return ({"status": "error", "reason": "Invalid uuid"}, 400)
|
|
sensor_uuid = sensor_uuid.replace('-', '')
|
|
# sensor not registred
|
|
#if r_serv_db.sismember('sensor_pending_registration', sensor_uuid):
|
|
# return ({"status": "error", "reason": "Sensor not registred"}, 404)
|
|
# sensor already approved
|
|
if r_serv_db.sismember('registered_uuid', sensor_uuid):
|
|
return ({"status": "error", "reason": "Sensor already approved"}, 409)
|
|
return _approve_sensor(sensor_uuid)
|
|
|
|
def _approve_sensor(sensor_uuid):
|
|
r_serv_db.sadd('registered_uuid', sensor_uuid)
|
|
r_serv_db.srem('sensor_pending_registration', sensor_uuid)
|
|
return ({'uuid': sensor_uuid}, 200)
|
|
|
|
def delete_pending_sensor(req_dict):
|
|
sensor_uuid = req_dict.get('uuid', None)
|
|
if not is_valid_uuid_v4(sensor_uuid):
|
|
return ({"status": "error", "reason": "Invalid uuid"}, 400)
|
|
sensor_uuid = sensor_uuid.replace('-', '')
|
|
# sensor not registred
|
|
#if r_serv_db.sismember('sensor_pending_registration', sensor_uuid):
|
|
# return ({"status": "error", "reason": "Sensor not registred"}, 404)
|
|
# sensor already approved
|
|
if not r_serv_db.sismember('sensor_pending_registration', sensor_uuid):
|
|
return ({"status": "error", "reason": "Not Pending Sensor"}, 409)
|
|
return _delete_pending_sensor(sensor_uuid)
|
|
|
|
def _delete_pending_sensor(sensor_uuid):
|
|
r_serv_db.srem('sensor_pending_registration', sensor_uuid)
|
|
return ({'uuid': sensor_uuid}, 200)
|