Ejemplo n.º 1
0
def unwrap_envelope(envelope, key):
    payload = envelope[:-hash_len]
    expected_hmc = envelope[-hash_len:]
    calculated_hmc = get_hmac(payload, key)
    if not secretutils.constant_time_compare(expected_hmc, calculated_hmc):
        LOG.warn(
            _LW('calculated hmac: %(s1)s not equal to msg hmac: '
                '%(s2)s dropping packet'), {
                    's1': to_hex(calculated_hmc),
                    's2': to_hex(expected_hmc)
                })
        fmt = 'calculated hmac: {0} not equal to msg hmac: {1} dropping packet'
        raise exceptions.InvalidHMACException(
            fmt.format(to_hex(calculated_hmc), to_hex(expected_hmc)))
    obj = decode_obj(payload)
    return obj
Ejemplo n.º 2
0
    def dorecv(self, *args, **kw):
        """Waits for a UDP heart beat to be sent.

        :return: Returns the unwrapped payload and addr that sent the
                 heartbeat.
        """
        (data, srcaddr) = self.sock.recvfrom(UDP_MAX_SIZE)
        LOG.debug('Received packet from %s', srcaddr)
        try:
            obj = status_message.unwrap_envelope(data, self.key)
        except Exception as e:
            LOG.warning('Health Manager experienced an exception processing a '
                        'heartbeat message from %s. Ignoring this packet. '
                        'Exception: %s', srcaddr, str(e))
            raise exceptions.InvalidHMACException()
        obj['recv_time'] = time.time()
        return obj, srcaddr[0]
Ejemplo n.º 3
0
def get_payload(envelope, key, hex=True):
    len = hex_hash_len if hex else hash_len
    payload = envelope[:-len]
    expected_hmc = envelope[-len:]
    calculated_hmc = get_hmac(payload, key, hex=hex)
    if not secretutils.constant_time_compare(expected_hmc, calculated_hmc):
        LOG.warning(
            'calculated hmac(hex=%(hex)s): %(s1)s not equal to msg hmac: '
            '%(s2)s dropping packet', {
                'hex': hex,
                's1': to_hex(calculated_hmc),
                's2': to_hex(expected_hmc)
            })
        fmt = 'calculated hmac: {0} not equal to msg hmac: {1} dropping packet'
        raise exceptions.InvalidHMACException(
            fmt.format(to_hex(calculated_hmc), to_hex(expected_hmc)))
    obj = decode_obj(payload)
    return obj
Ejemplo n.º 4
0
    def dorecv(self, *args, **kw):
        """Waits for a UDP heart beat to be sent.

        :return: Returns the unwrapped payload and addr that sent the
                 heartbeat. The format of the obj from the UDP sender
                 can be seen below. Note that listener_1 has no pools
                 and listener_4 has no members.

        Example::

            {
              "listeners": {
                "listener_uuid_1": {
                  "pools": {},
                  "status": "OPEN",
                  "stats": {
                    "conns": 0,
                    "rx": 0,
                    "tx": 0
                  }
                },
                "listener_uuid_2": {
                  "pools": {
                    "pool_uuid_1": {
                      "members": [{
                          "member_uuid_1": "DOWN"
                        },
                        {
                          "member_uuid_2": "DOWN"
                        },
                        {
                          "member_uuid_3": "DOWN"
                        },
                        {
                          "member_uuid_4": "DOWN"
                        }
                      ]
                    }
                  },
                  "status": "OPEN",
                  "stats": {
                    "conns": 0,
                    "rx": 0,
                    "tx": 0
                  }
                },
                "listener_uuid_3": {
                  "pools": {
                    "pool_uuid_2": {
                      "members": [{
                          "member_uuid_5": "DOWN"
                        },
                        {
                          "member_uuid_6": "DOWN"
                        },
                        {
                          "member_uuid_7": "DOWN"
                        },
                        {
                          "member_uuid_8": "DOWN"
                        }
                      ]
                    }
                  },
                  "status": "OPEN",
                  "stats": {
                    "conns": 0,
                    "rx": 0,
                    "tx": 0
                  }
                },
                "listener_uuid_4": {
                  "pools": {
                    "pool_uuid_3": {
                      "members": []
                    }
                  },
                  "status": "OPEN",
                  "stats": {
                    "conns": 0,
                    "rx": 0,
                    "tx": 0
                  }
                }
              },
              "id": "amphora_uuid",
              "seq": 1033
            }

        """
        (data, srcaddr) = self.sock.recvfrom(UDP_MAX_SIZE)
        LOG.debug('Received packet from %s', srcaddr)
        try:
            obj = status_message.unwrap_envelope(data, self.key)
        except Exception as e:
            LOG.warning(
                'Health Manager experienced an exception processing a '
                'heartbeat message from %s. Ignoring this packet. '
                'Exception: %s', srcaddr, e)
            raise exceptions.InvalidHMACException()
        obj['recv_time'] = time.time()
        return obj, srcaddr