From fe7daab975dc61ccdac85e28a772bd6e40a007a2 Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Mon, 4 Nov 2019 12:58:35 +0800 Subject: [PATCH] Add catchsegv to Docker Container, and Delete Nodes/Values from MQTT when necessary --- Docker/Dockerfile | 8 +-- qt-openzwave/qt-openzwave.pro | 1 + qt-openzwavedatabase/qt-openzwavedatabase.pro | 1 + qt-ozwdaemon/main.cpp | 21 ++++++ qt-ozwdaemon/mqttpublisher.cpp | 65 +++++++++++-------- qt-ozwdaemon/mqttpublisher.h | 3 +- qt-ozwdaemon/qt-ozwdaemon.pro | 1 + 7 files changed, 69 insertions(+), 31 deletions(-) diff --git a/Docker/Dockerfile b/Docker/Dockerfile index de99d56..e227de1 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -14,9 +14,9 @@ WORKDIR /opt RUN git clone https://github.com/qt/qtmqtt.git && cd qtmqtt && /opt/Qt/5.12.4/bin/qmake && make && make install RUN git clone https://github.com/OpenZWave/open-zwave.git && cd open-zwave && make -j4 && make install RUN git clone https://github.com/OpenZWave/qt-openzwave.git && cd qt-openzwave && git checkout mqtt && /opt/Qt/5.12.4/bin/qmake && make -j4 && make install -RUN ls -lah /usr/local/lib64/ -RUN ls /opt/ -RUN ls -lah /ozwdaemon/bin/ +#RUN ls -lah /usr/local/lib64/ +#RUN ls /opt/ +#RUN ls -lah /ozwdaemon/bin/ #RUN LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" /ozwdaemon/bin/ozwdaemon RUN mkdir /opt/ozw/ && mkdir /opt/ozw/config/ @@ -27,5 +27,5 @@ ENV MQTT_PORT="1883" WORKDIR /opt/ozw/ EXPOSE 1983 VOLUME ["/opt/ozw/config/"] -ENTRYPOINT /ozwdaemon/bin/ozwdaemon -s $USBPATH -c /opt/ozw/config/ -u /opt/ozw/config/ --mqtt-server $MQTT_SERVER --mqtt-port $MQTT_PORT +ENTRYPOINT /usr/bin/catchsegv /ozwdaemon/bin/ozwdaemon -s $USBPATH -c /opt/ozw/config/ -u /opt/ozw/config/ --mqtt-server $MQTT_SERVER --mqtt-port $MQTT_PORT diff --git a/qt-openzwave/qt-openzwave.pro b/qt-openzwave/qt-openzwave.pro index c07bf3d..a3a37d8 100644 --- a/qt-openzwave/qt-openzwave.pro +++ b/qt-openzwave/qt-openzwave.pro @@ -87,6 +87,7 @@ COPIES += copyrepheaders unix { target.path = /usr/local/lib INSTALLS += target + QMAKE_CXXFLAGS += -g1 } #LIBS += -L../../open-zwave -lopenzwave diff --git a/qt-openzwavedatabase/qt-openzwavedatabase.pro b/qt-openzwavedatabase/qt-openzwavedatabase.pro index 340e2cc..719bdc2 100644 --- a/qt-openzwavedatabase/qt-openzwavedatabase.pro +++ b/qt-openzwavedatabase/qt-openzwavedatabase.pro @@ -26,4 +26,5 @@ ozwconfig.commands=cp -R ../../open-zwave/config config/ && cd config && $$[QT_I include/qt-openzwave/qt-openzwavedatabase.h INCLUDEPATH += include/ + QMAKE_CXXFLAGS += -g1 } diff --git a/qt-ozwdaemon/main.cpp b/qt-ozwdaemon/main.cpp index 20c108c..2cb887b 100644 --- a/qt-ozwdaemon/main.cpp +++ b/qt-ozwdaemon/main.cpp @@ -1,3 +1,8 @@ +#include +#include +#include +#include + #include #include #include @@ -5,8 +10,24 @@ #include "mqttpublisher.h" #include +void handler(int sig) { + void *array[10]; + size_t size; + + // get void*'s for all entries on the stack + size = backtrace(array, 10); + + // print out all the frames to stderr + fprintf(stderr, "Error: signal %d:\n", sig); + backtrace_symbols_fd(array, size, STDERR_FILENO); + exit(1); +} + int main(int argc, char *argv[]) { + //signal(SIGSEGV, handler); // install our handler + + QCoreApplication a(argc, argv); QCoreApplication::setApplicationName("ozwdaemon"); QCoreApplication::setApplicationVersion("0.1"); diff --git a/qt-ozwdaemon/mqttpublisher.cpp b/qt-ozwdaemon/mqttpublisher.cpp index 7c153a2..ad2b267 100644 --- a/qt-ozwdaemon/mqttpublisher.cpp +++ b/qt-ozwdaemon/mqttpublisher.cpp @@ -29,13 +29,13 @@ bool mqttNodeModel::populateJsonObject(QJsonObject *jsonobject, quint8 node, QTO } default: { QMetaEnum metaEnum = QMetaEnum::fromType(); - if (data.type() == QMetaType::QString) { + if (static_cast(data.type()) == QMetaType::QString) { jsonobject->insert(metaEnum.valueToKey(i), data.toString()); - } else if (data.type() == QMetaType::Bool) { + } else if (static_cast(data.type()) == QMetaType::Bool) { jsonobject->insert(metaEnum.valueToKey(i), data.toBool()); - } else if (data.type() == QMetaType::Int) { + } else if (static_cast(data.type()) == QMetaType::Int) { jsonobject->insert(metaEnum.valueToKey(i), data.toInt()); - } else if (data.type() == QMetaType::UInt) { + } else if (static_cast(data.type()) == QMetaType::UInt) { jsonobject->insert(metaEnum.valueToKey(i), data.toInt()); } else { qWarning() << "Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << node; @@ -55,7 +55,7 @@ bool mqttNodeModel::populateJsonObject(QJsonObject *jsonobject, quint8 node, QTO metadata.insert("ProductPicBase64", QString(mgr->GetMetaDataProductPic(node).toBase64())); jsonobject->insert("MetaData", metadata); } - /* Neihbors */ + /* Neighbors */ QVector neighbors = mgr->GetNodeNeighbors(node); if (neighbors.size() > 0) { QJsonArray N; @@ -109,17 +109,17 @@ bool mqttValueIDModel::populateJsonObject(QJsonObject *jsonobject, quint64 vidKe default: { QMetaEnum metaEnum = QMetaEnum::fromType(); - if (data.type() == QMetaType::QString) { + if (static_cast(data.type()) == QMetaType::QString) { jsonobject->insert(metaEnum.valueToKey(i), data.toString()); - } else if (data.type() == QMetaType::Bool) { + } else if (static_cast(data.type()) == QMetaType::Bool) { jsonobject->insert(metaEnum.valueToKey(i), data.toBool()); - } else if (data.type() == QMetaType::Int) { + } else if (static_cast(data.type()) == QMetaType::Int) { jsonobject->insert(metaEnum.valueToKey(i), data.toInt()); - } else if (data.type() == QMetaType::UInt) { + } else if (static_cast(data.type()) == QMetaType::UInt) { jsonobject->insert(metaEnum.valueToKey(i), data.toInt()); - } else if (data.type() == QMetaType::Float) { + } else if (static_cast(data.type()) == QMetaType::Float) { jsonobject->insert(metaEnum.valueToKey(i), data.toDouble()); - } else if (data.type() == QMetaType::ULongLong) { + } else if (static_cast(data.type()) == QMetaType::ULongLong) { jsonobject->insert(metaEnum.valueToKey(i), static_cast(data.toULongLong())); } else { qWarning() << "Can't Convert " << data.type() << "(" << metaEnum.valueToKey(i) << ") to store in JsonObject: " << vidKey; @@ -137,19 +137,19 @@ bool mqttValueIDModel::populateJsonObject(QJsonObject *jsonobject, quint64 vidKe QJsonValue mqttValueIDModel::encodeValue(quint64 vidKey) { QJsonValue value; QVariant data = this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Value); - if (data.type() == QMetaType::QString) { + if (static_cast(data.type()) == QMetaType::QString) { value = data.toString(); - } else if (data.type() == QMetaType::Bool) { + } else if (static_cast(data.type()) == QMetaType::Bool) { value = data.toBool(); - } else if (data.type() == QMetaType::Int) { + } else if (static_cast(data.type()) == QMetaType::Int) { value = data.toInt(); - } else if (data.type() == QMetaType::UInt) { + } else if (static_cast(data.type()) == QMetaType::UInt) { value = data.toInt(); - } else if (data.type() == QMetaType::Float) { + } else if (static_cast(data.type()) == QMetaType::Float) { value = data.toDouble(); - } else if (data.type() == QMetaType::ULongLong) { + } else if (static_cast(data.type()) == QMetaType::ULongLong) { value = static_cast(data.toULongLong()); - } else if (data.type() == QMetaType::Short) { + } else if (static_cast(data.type()) == QMetaType::Short) { value = static_cast(data.toInt()); } else { qWarning() << "Can't Convert " << data.type() << " to store in JsonObject: " << vidKey << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Label).toString() << this->getValueData(vidKey, mqttValueIDModel::ValueIdColumns::Type); @@ -333,8 +333,10 @@ bool mqttpublisher::sendNodeUpdate(quint8 node) { bool mqttpublisher::sendValueUpdate(quint64 vidKey) { quint8 node = this->m_valueModel->getValueData(vidKey, QTOZW_ValueIds::Node).value(); - if (node == 0) + if (node == 0) { + qWarning() << "sendValueUpdate: Can't find Node for Value: " << vidKey; return false; + } this->m_client->publish(QMqttTopicName(getValueTopic(MQTT_OZW_VID_TOPIC, node, vidKey)), QJsonDocument(this->m_values[vidKey]).toJson(), 0, true); return true; } @@ -343,6 +345,21 @@ void mqttpublisher::sendCommandUpdate(QString command, QJsonObject js) { return; } +bool mqttpublisher::delNodeTopic(quint8 node) { + this->m_client->publish(QMqttTopicName(getNodeTopic(MQTT_OZW_NODE_TOPIC, node)), NULL, 0, false); + return true; +} + +bool mqttpublisher::delValueTopic(quint64 vidKey) { + quint8 node = this->m_valueModel->getValueData(vidKey, QTOZW_ValueIds::Node).value(); + if (node == 0) { + qWarning() << "delValueTopic: Can't find Node for Value: " << vidKey; + return false; + } + this->m_client->publish(QMqttTopicName(getValueTopic(MQTT_OZW_VID_TOPIC, node, vidKey)), NULL, 0, false); + return true; +} + void mqttpublisher::ready() { qDebug() << "Publishing Event ready:"; @@ -357,9 +374,7 @@ void mqttpublisher::valueAdded(quint64 vidKey) { } void mqttpublisher::valueRemoved(quint64 vidKey) { qDebug() << "Publishing Event valueRemoved:" << vidKey; - this->m_values[vidKey]["Event"] = "valueRemoved"; - this->sendValueUpdate(vidKey); - + this->delValueTopic(vidKey); } void mqttpublisher::valueChanged(quint64 vidKey) { qDebug() << "Publishing Event valueChanged:" << vidKey; @@ -388,13 +403,11 @@ void mqttpublisher::nodeAdded(quint8 node) { } void mqttpublisher::nodeRemoved(quint8 node) { qDebug() << "Publishing Event nodeRemoved:" << node; - this->m_nodes[node]["Event"] = "nodeRemoved"; - this->sendNodeUpdate(node); + this->delNodeTopic(node); } void mqttpublisher::nodeReset(quint8 node) { qDebug() << "Publishing Event nodeReset:" << node; - this->m_nodes[node]["Event"] = "nodeReset"; - this->sendNodeUpdate(node); + this->delNodeTopic(node); } void mqttpublisher::nodeNaming(quint8 node) { qDebug() << "Publishing Event nodeNaming:" << node; diff --git a/qt-ozwdaemon/mqttpublisher.h b/qt-ozwdaemon/mqttpublisher.h index c8d47f6..2ee1a72 100644 --- a/qt-ozwdaemon/mqttpublisher.h +++ b/qt-ozwdaemon/mqttpublisher.h @@ -101,7 +101,8 @@ private: bool sendStatusUpdate(); bool sendNodeUpdate(quint8); bool sendValueUpdate(quint64); - + bool delNodeTopic(quint8); + bool delValueTopic(quint64); QJsonObject m_ozwstatus; QMap m_nodes; diff --git a/qt-ozwdaemon/qt-ozwdaemon.pro b/qt-ozwdaemon/qt-ozwdaemon.pro index 4f7e98a..93fb01f 100644 --- a/qt-ozwdaemon/qt-ozwdaemon.pro +++ b/qt-ozwdaemon/qt-ozwdaemon.pro @@ -104,6 +104,7 @@ INCLUDEPATH += ../qt-openzwave/include/ unix { LIBS += -lresolv -L../qt-openzwave/ -lqt-openzwave -L../qt-openzwavedatabase/ -lqt-openzwavedatabase INCLUDEPATH += ../qt-openzwavedatabase/include/ + QMAKE_CXXFLAGS += -g1 } win32 { LIBS += -lDnsapi -L../qt-openzwave/$$BUILDTYPE/ -lqt-openzwave1