Exemplo n.º 1
0
    def _get_switch_descriptor_from_request_headers(self, hostname):
        headers_present = [
            h in request.headers
            for h in ['Netman-Model', 'Netman-Username', 'Netman-Password']
        ]

        if not any(headers_present):
            return None

        if not all(headers_present):
            raise BadRequest(
                'For anonymous switch usage, please specify headers: Netman-Model, Netman-Username and Netman-Password.'
            )

        port = None
        if "Netman-Port" in request.headers:
            try:
                port = int(request.headers["Netman-Port"])
            except ValueError:
                raise BadRequest(
                    'Netman-Port optional header should be an integer')

        netman_server = request.headers.get("Netman-Proxy-Server", None)
        if netman_server is not None and "," in netman_server:
            netman_server = [e.strip() for e in netman_server.split(",")]

        self.logger.info("Anonymous Switch Access ({}) {}@{}".format(
            request.headers['Netman-Model'],
            request.headers['Netman-Username'], hostname))
        return SwitchDescriptor(hostname=hostname,
                                model=request.headers['Netman-Model'],
                                username=request.headers['Netman-Username'],
                                password=request.headers['Netman-Password'],
                                port=port,
                                netman_server=netman_server)
Exemplo n.º 2
0
 def m(data, **_):
     try:
         result = json.loads(data)
     except ValueError:
         raise BadRequest("Malformed JSON request")
     for field, validator in fields.iteritems():
         validator(result, field)
     for field, validator in result.iteritems():
         if field not in fields:
             raise BadRequest("Unknown key: {}".format(field))
     return result
Exemplo n.º 3
0
def is_vrrp_group(data, **_):
    try:
        data = json.loads(data)
    except ValueError:
        raise BadRequest("Malformed content, should be a JSON object")

    if data.get('id') is None:
        raise BadRequest("VRRP group id is mandatory")

    return dict(group_id=data.pop('id'),
                ips=[validate_ip_address(i) for i in data.pop('ips', [])],
                **data)
Exemplo n.º 4
0
def is_int(number, **_):
    try:
        value = int(number)
    except ValueError:
        raise BadRequest('Expected integer content, got "{}"'.format(number))

    return {'value': value}
Exemplo n.º 5
0
def is_boolean(option, **_):
    option = option.lower()
    if option not in ['true', 'false']:
        raise BadRequest(
            'Unreadable content "{}". Should be either "true" or "false"'.
            format(option))

    return {'state': option == 'true'}
Exemplo n.º 6
0
def is_session(data, **_):
    try:
        json_data = json.loads(data)
    except ValueError:
        raise BadRequest("Malformed content, should be a JSON object")

    if "hostname" not in json_data:
        raise MalformedSwitchSessionRequest()
    return {'hostname': json_data["hostname"]}
Exemplo n.º 7
0
def is_ip_network(data, **_):
    try:
        try:
            json_addr = json.loads(data)
            ip = IPNetwork("{}/{}".format(json_addr["address"], json_addr["mask"]))
        except ValueError:
            ip = IPNetwork(data)
    except (KeyError, AddrFormatError):
        raise BadRequest('Malformed content, should be : x.x.x.x/xx or {"address": "x.x.x.x", "mask": "xx"}')

    return {'validated_ip_network': ip}
Exemplo n.º 8
0
def is_bond(data, **_):
    try:
        json_data = json.loads(data)
    except ValueError:
        raise BadRequest("Malformed content, should be a JSON object")

    if "number" not in json_data:
        raise BadBondNumber()

    return {
        'bond_number': is_bond_number(json_data["number"])['bond_number'],
    }
Exemplo n.º 9
0
def is_vlan(data, **_):
    try:
        json_data = json.loads(data)
    except ValueError:
        raise BadRequest("Malformed content, should be a JSON object")

    if "number" not in json_data:
        raise BadVlanNumber()

    name = json_data["name"] if "name" in json_data and len(json_data["name"]) > 0 else None
    if name and " " in name:
        raise BadVlanName()

    return {
        'number': is_vlan_number(json_data["number"])['vlan_number'],
        'name': name
    }
Exemplo n.º 10
0
    def set_port_mode(self, switch, interface_id):
        """
        Sets the port mode of an interface

        :arg str hostname: Hostname or IP of the switch
        :arg str interface_id: Interface name (ex. ``FastEthernet0/1``, ``ethernet1/11``)
        :body:
            ``trunk`` or ``access``
        """

        mode = request.get_data().lower()
        if mode == 'trunk':
            switch.set_trunk_mode(interface_id)
        elif mode == 'access':
            switch.set_access_mode(interface_id)
        else:
            raise BadRequest('Unknown port mode detected {}'.format(mode))

        return 204, None
Exemplo n.º 11
0
    def set_bond_port_mode(self, switch, bond_number):
        """
        Sets the port mode of a bond

        :arg str hostname: Hostname or IP of the switch
        :arg int bond_number: Bond number
        :body:
            ``trunk`` or ``access``
        """

        mode = request.get_data().lower()
        if mode == 'trunk':
            switch.set_bond_trunk_mode(bond_number)
        elif mode == 'access':
            switch.set_bond_access_mode(bond_number)
        else:
            raise BadRequest('Unknown port mode detected {}'.format(mode))

        return 204, None
Exemplo n.º 12
0
    def act_on_session(self, session_id):
        """
        Commit or rollback a session on a switch

        :arg str session: ID of the session
        :body:
            ``commit`` or ``rollback``
        """

        action = request.data.lower()
        if action == 'start_transaction':
            self.sessions_manager.start_transaction(session_id)
        elif action == 'end_transaction':
            self.sessions_manager.end_transaction(session_id)
        elif action == 'commit':
            self.sessions_manager.commit_session(session_id)
        elif action == 'rollback':
            self.sessions_manager.rollback_session(session_id)
        else:
            raise BadRequest('Unknown action {}'.format(action))

        return 204, None
Exemplo n.º 13
0
def is_access_group_name(data, **_):
    if data == "" or " " in data:
        raise BadRequest('Malformed access group name')

    return {'access_group_name': data}
Exemplo n.º 14
0
def is_unincast_rpf_mode(data, **_):
    if data not in [STRICT]:
        raise BadRequest('Invalid unicast rpf mode')

    return {'mode': data}
Exemplo n.º 15
0
 def process(self, parameters):
     try:
         self.ip_network = is_ip_network(
             parameters.pop('ip_network'))['validated_ip_network']
     except BadRequest:
         raise BadRequest('Malformed IP, should be : x.x.x.x/xx')
Exemplo n.º 16
0
 def m(params, key):
     if not isinstance(params[key], obj_type):
         raise BadRequest('Expected "{}" type for key {}, got "{}"'.format(
             obj_type.__name__, key,
             type(params[key]).__name__))
Exemplo n.º 17
0
def validate_ip_address(data):
    try:
        return IPAddress(data)
    except:
        raise BadRequest(
            "Incorrect IP Address: \"{}\", should be x.x.x.x".format(data))
Exemplo n.º 18
0
def is_vrf_name(data, **_):
    if data == "" or " " in data:
        raise BadRequest('Malformed VRF name')

    return {'vrf_name': data}