Commit 0beec2ce authored by Axel Auweter's avatar Axel Auweter
Browse files

Properly handle malformed MQTT messages in CollectAgent.

parent ca2f4ff8
...@@ -37,7 +37,6 @@ void sigHandler(int sig) ...@@ -37,7 +37,6 @@ void sigHandler(int sig)
void mqttCallback(SimpleMQTTMessage *msg) void mqttCallback(SimpleMQTTMessage *msg)
{ {
/* /*
* Increment the msgCtr/vmsgCtr for statistics. * Increment the msgCtr/vmsgCtr for statistics.
*/ */
...@@ -49,29 +48,35 @@ void mqttCallback(SimpleMQTTMessage *msg) ...@@ -49,29 +48,35 @@ void mqttCallback(SimpleMQTTMessage *msg)
* Decode the message and put into the database. * Decode the message and put into the database.
*/ */
if (msg->isPublish()) { if (msg->isPublish()) {
uint64_t val; uint64_t val;
uint64_t ts; uint64_t ts;
//In the 64 bit message case, the collect agent provides a timestamp //In the 64 bit message case, the collect agent provides a timestamp
if(msg->getPayloadLength()==sizeof(uint64_t)) { if(msg->getPayloadLength()==sizeof(uint64_t)) {
//printf("Providing timestamp...\n"); //printf("Providing timestamp...\n");
val = *((uint64_t*)msg->getPayload()); val = *((uint64_t*)msg->getPayload());
ts = Messaging::calculateTimestamp(); ts = Messaging::calculateTimestamp();
//printf("Val = %" PRIu64 ", timestamp = %" PRIu64 "\n", val, ts); //printf("Val = %" PRIu64 ", timestamp = %" PRIu64 "\n", val, ts);
} }
//...otherwise it just retrieves it from the MQTT message payload. //...otherwise it just retrieves it from the MQTT message payload.
else if((msg->getPayloadLength()%sizeof(mqttPayload)==0) && (msg->getPayloadLength()>0)){ else if((msg->getPayloadLength()%sizeof(mqttPayload)==0) && (msg->getPayloadLength()>0)){
//printf("Retrieving timestamp...\n"); //printf("Retrieving timestamp...\n");
mqttPayload *payload = (mqttPayload*)msg->getPayload(); mqttPayload *payload = (mqttPayload*)msg->getPayload();
val = payload->value; // payload[n].value val = payload->value; // payload[n].value
ts = payload->timestamp; ts = payload->timestamp;
//printf("Val = %" PRIu64 ", timestamp = %" PRIu64 "\n", val, ts); //printf("Val = %" PRIu64 ", timestamp = %" PRIu64 "\n", val, ts);
} }
//...otherwise this message is malformed -> ignore...
else {
delete msg;
return;
}
/* /*
* Check if we can decode the message topic * Check if we can decode the message topic
...@@ -82,22 +87,22 @@ void mqttCallback(SimpleMQTTMessage *msg) ...@@ -82,22 +87,22 @@ void mqttCallback(SimpleMQTTMessage *msg)
if (mySensorDataStore->topicToSid(&sid,msg->getTopic())) { if (mySensorDataStore->topicToSid(&sid,msg->getTopic())) {
#if 0 #if 0
cout << "Topic decode successful:" cout << "Topic decode successful:"
<< "\nRaw: " << hex << setw(16) << setfill('0') << sid.raw[0] << " " << hex << setw(16) << setfill('0') << sid.raw[1] << "\nRaw: " << hex << setw(16) << setfill('0') << sid.raw[0] << " " << hex << setw(16) << setfill('0') << sid.raw[1]
<< "\ndatacenter_id: " << hex << ((sid.dl & 0xFF00000000000000) >> 56) << "\ndatacenter_id: " << hex << ((sid.dl & 0xFF00000000000000) >> 56)
<< "\ncluster_id: " << hex << ((sid.dl & 0x00FF000000000000) >> 48) << "\ncluster_id: " << hex << ((sid.dl & 0x00FF000000000000) >> 48)
<< "\nrack_id: " << hex << ((sid.dl & 0x0000FFFF00000000) >> 32) << "\nrack_id: " << hex << ((sid.dl & 0x0000FFFF00000000) >> 32)
<< "\nchassis_id: " << hex << ((sid.dl & 0x00000000FF000000) >> 24) << "\nchassis_id: " << hex << ((sid.dl & 0x00000000FF000000) >> 24)
<< "\nbic_id: " << hex << ((sid.dl & 0x0000000000FF0000) >> 16) << "\nbic_id: " << hex << ((sid.dl & 0x0000000000FF0000) >> 16)
<< "\nbmc_id: " << hex << ((sid.dl & 0x000000000000FF00) >> 8) << "\nbmc_id: " << hex << ((sid.dl & 0x000000000000FF00) >> 8)
<< "\nknc_id: " << hex << ((sid.dl & 0x00000000000000FF)) << "\nknc_id: " << hex << ((sid.dl & 0x00000000000000FF))
<< "\ndevice_id: " << hex << sid.dsid.device_id << "\ndevice_id: " << hex << sid.dsid.device_id
<< "\nreserved: " << hex << sid.dsid.rsvd << "\nreserved: " << hex << sid.dsid.rsvd
<< "\nsensor_number: " << hex << sid.dsid.sensor_number << "\nsensor_number: " << hex << sid.dsid.sensor_number
<< "\n"; << "\n";
#endif #endif
mySensorDataStore->insert(&sid, ts, val); mySensorDataStore->insert(&sid, ts, val);
} }
#if 0 #if 1
else { else {
cout << "Wrong topic format: " << msg->getTopic() << "\n"; cout << "Wrong topic format: " << msg->getTopic() << "\n";
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment