import socket
import gevent
import requests
from functools import wraps

from consul import Consul
from flask import jsonify, request, Blueprint, send_file, safe_join, Response

from ooi_instrument_agent.client import TimeoutException, ParameterException
from ooi_instrument_agent.common import get_sniffer_socket, stopwatch
from ooi_instrument_agent.lock import LockManager, Locked
from ooi_instrument_agent.utils import list_drivers, get_client, get_port_agent, get_from_request, get_timeout


page = Blueprint('instrument', __name__)
page.lock_manager = None
page.consul = None

log = logging.getLogger(__name__)
sniff_sockfile = get_sniffer_socket()


def lockout(func):
    """
    Decorator which requires that the target instrument be unlocked or the supplied key matches the lock holder
    """
    @wraps(func)
    def inner(driver_id):
        key = get_from_request('key')
        locker = page.lock_manager[driver_id]
        if locker is None or locker == key: