Add catchsegv to Docker Container, and Delete Nodes/Values from MQTT when necessary

This commit is contained in:
Justin Hammond 2019-11-04 12:58:35 +08:00
parent 6a088c931b
commit fe7daab975
7 changed files with 69 additions and 31 deletions

View file

@ -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

View file

@ -87,6 +87,7 @@ COPIES += copyrepheaders
unix {
target.path = /usr/local/lib
INSTALLS += target
QMAKE_CXXFLAGS += -g1
}
#LIBS += -L../../open-zwave -lopenzwave

View file

@ -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
}

View file

@ -1,3 +1,8 @@
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <QCoreApplication>
#include <QLoggingCategory>
#include <QCommandLineParser>
@ -5,8 +10,24 @@
#include "mqttpublisher.h"
#include <qt-openzwave/qt-openzwavedatabase.h>
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");

View file

@ -29,13 +29,13 @@ bool mqttNodeModel::populateJsonObject(QJsonObject *jsonobject, quint8 node, QTO
}
default: {
QMetaEnum metaEnum = QMetaEnum::fromType<NodeColumns>();
if (data.type() == QMetaType::QString) {
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
jsonobject->insert(metaEnum.valueToKey(i), data.toString());
} else if (data.type() == QMetaType::Bool) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
jsonobject->insert(metaEnum.valueToKey(i), data.toBool());
} else if (data.type() == QMetaType::Int) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
jsonobject->insert(metaEnum.valueToKey(i), data.toInt());
} else if (data.type() == QMetaType::UInt) {
} else if (static_cast<QMetaType::Type>(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<quint8> 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<ValueIdColumns>();
if (data.type() == QMetaType::QString) {
if (static_cast<QMetaType::Type>(data.type()) == QMetaType::QString) {
jsonobject->insert(metaEnum.valueToKey(i), data.toString());
} else if (data.type() == QMetaType::Bool) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
jsonobject->insert(metaEnum.valueToKey(i), data.toBool());
} else if (data.type() == QMetaType::Int) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
jsonobject->insert(metaEnum.valueToKey(i), data.toInt());
} else if (data.type() == QMetaType::UInt) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
jsonobject->insert(metaEnum.valueToKey(i), data.toInt());
} else if (data.type() == QMetaType::Float) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float) {
jsonobject->insert(metaEnum.valueToKey(i), data.toDouble());
} else if (data.type() == QMetaType::ULongLong) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::ULongLong) {
jsonobject->insert(metaEnum.valueToKey(i), static_cast<qint64>(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<QMetaType::Type>(data.type()) == QMetaType::QString) {
value = data.toString();
} else if (data.type() == QMetaType::Bool) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Bool) {
value = data.toBool();
} else if (data.type() == QMetaType::Int) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Int) {
value = data.toInt();
} else if (data.type() == QMetaType::UInt) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::UInt) {
value = data.toInt();
} else if (data.type() == QMetaType::Float) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Float) {
value = data.toDouble();
} else if (data.type() == QMetaType::ULongLong) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::ULongLong) {
value = static_cast<qint64>(data.toULongLong());
} else if (data.type() == QMetaType::Short) {
} else if (static_cast<QMetaType::Type>(data.type()) == QMetaType::Short) {
value = static_cast<qint16>(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<quint8>();
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<quint8>();
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;

View file

@ -101,7 +101,8 @@ private:
bool sendStatusUpdate();
bool sendNodeUpdate(quint8);
bool sendValueUpdate(quint64);
bool delNodeTopic(quint8);
bool delValueTopic(quint64);
QJsonObject m_ozwstatus;
QMap<quint8, QJsonObject> m_nodes;

View file

@ -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