From 8eb82faeef83efc8023ad3ba7d125b34403db48f Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Sat, 4 Jan 2020 01:32:10 +0800 Subject: [PATCH 1/5] Binary Resource File for the ozw config database --- Docker/Dockerfile | 1 + .../qt-openzwave/qt-openzwavedatabase.h | 1 + qt-openzwavedatabase/qt-openzwavedatabase.pro | 13 +++---- .../source/qt-openzwavedatabase.cpp | 36 +++++++++++++++++++ qt-ozwdaemon/main.cpp | 18 +++++----- 5 files changed, 54 insertions(+), 15 deletions(-) diff --git a/Docker/Dockerfile b/Docker/Dockerfile index 6f46ffd..98b01b1 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -35,6 +35,7 @@ COPY --from=builder /usr/local/lib/libqt* /usr/local/lib/ COPY --from=builder /usr/local/lib*/libopenzwave* /usr/local/lib/ COPY --from=builder /usr/lib/*/libQt5Mqtt* /usr/local/lib/ COPY --from=builder /opt/qt-openzwave/tools/* /usr/local/bin/ +COPY --from=builder /usr/share/OpenZWave/qt-openzwavedatabase.rcc /usr/share/OpenZWave/ RUN mkdir -p /opt/ozw/config/crashes/ ENV LD_LIBRARY_PATH="/usr/local/lib:/usr/local/lib64:$LD_LIBRARY_PATH" ENV USBPATH="/dev/ttyUSB0" diff --git a/qt-openzwavedatabase/include/qt-openzwave/qt-openzwavedatabase.h b/qt-openzwavedatabase/include/qt-openzwave/qt-openzwavedatabase.h index b855c6d..e9a9dd4 100644 --- a/qt-openzwavedatabase/include/qt-openzwave/qt-openzwavedatabase.h +++ b/qt-openzwavedatabase/include/qt-openzwave/qt-openzwavedatabase.h @@ -2,6 +2,7 @@ #define QTOPENZWAVEDATABASE_H #include +bool initConfigDatabase(QStringList paths); bool copyConfigDatabase(QDir configpath); #endif // QTOPENZWAVEDATABASE_H diff --git a/qt-openzwavedatabase/qt-openzwavedatabase.pro b/qt-openzwavedatabase/qt-openzwavedatabase.pro index 481cd10..532f6dd 100644 --- a/qt-openzwavedatabase/qt-openzwavedatabase.pro +++ b/qt-openzwavedatabase/qt-openzwavedatabase.pro @@ -8,15 +8,16 @@ CONFIG += silent file_copies resources_big !versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2") -ozwconfig.target=config/qrc_ozwconfig.cpp -ozwconfig.commands=cp -R ../../open-zwave/config config/ && cd config && $$[QT_INSTALL_BINS]/rcc -project -o ozwconfig.qrc && $$[QT_INSTALL_BINS]/rcc --name="ozwconfig" --root="/config/" ozwconfig.qrc -o qrc_ozwconfig.cpp +ozwconfig.target=qt-openzwavedatabase.rcc +ozwconfig.commands=cp -R ../../open-zwave/config config/ && cd config && $$[QT_INSTALL_BINS]/rcc -project -o ozwconfig.qrc && $$[QT_INSTALL_BINS]/rcc --name="ozwconfig" --root="/config/" ozwconfig.qrc --binary -o ../qt-openzwavedatabase.rcc +ozwconfigdb.path = $$[QT_INSTALL_PREFIX]/share/OpenZWave/ +ozwconfigdb.files=qt-openzwavedatabase.rcc !win32 { QMAKE_EXTRA_TARGETS += ozwconfig - PRE_TARGETDEPS += config/qrc_ozwconfig.cpp - SOURCES += config/qrc_ozwconfig.cpp \ - source/qt-openzwavedatabase.cpp - + PRE_TARGETDEPS += qt-openzwavedatabase.rcc + SOURCES += source/qt-openzwavedatabase.cpp + INSTALLS += ozwconfigdb macx { QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/ } diff --git a/qt-openzwavedatabase/source/qt-openzwavedatabase.cpp b/qt-openzwavedatabase/source/qt-openzwavedatabase.cpp index 5d99af6..5dee3f1 100644 --- a/qt-openzwavedatabase/source/qt-openzwavedatabase.cpp +++ b/qt-openzwavedatabase/source/qt-openzwavedatabase.cpp @@ -1,7 +1,43 @@ #include #include +#include +#include #include "qt-openzwave/qt-openzwavedatabase.h" +bool initConfigDatabase(QStringList path) { + for (int i = 0; i < path.size(); ++i) { + QString test = path.at(i); + test.append("/qt-openzwavedatabase.rcc"); + qDebug() << "Testing " << test; + if (QResource::registerResource(test)) { + qInfo() << "Found qt-openzwavedatabase.rcc at " << test; + return true; + } + } + if (QResource::registerResource("qt-openzwavedatabase/qt-openzwavedatabase.rcc")) { + qInfo() << "Found qt-openzwavedatabase.rcc at qt-openzwavedatabase/qt-openzwavedatabase.rcc"; + return true; + } + if (QResource::registerResource("./qt-openzwavedatabase.rcc")) { + qInfo() << "Found qt-openzwavedatabase.rcc at ./qt-openzwavedatabase.rcc"; + return true; + } + + for (int i = 0; i < QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation).size(); ++i) { + QString test = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation).at(i); + test.append("/OpenZWave/qt-openzwavedatabase.rcc"); + qDebug() << "Testing Standard Paths" << test; + if (QResource::registerResource(test)) { + qInfo() << "Found qt-openzwavedatabase.rcc at " << test; + return true; + } + } + + return true; + +} + + bool copyConfigDatabase(QDir configpath) { QDirIterator it(":/config/", QStringList() << "*.xml" << "*.png" << "*.xsd", QDir::NoFilter, QDirIterator::Subdirectories); diff --git a/qt-ozwdaemon/main.cpp b/qt-ozwdaemon/main.cpp index d7d9ade..cb002ff 100644 --- a/qt-ozwdaemon/main.cpp +++ b/qt-ozwdaemon/main.cpp @@ -219,7 +219,6 @@ int main(int argc, char *argv[]) PossibleDBPaths << parser.value(userDir); PossibleDBPaths << "./config/"; PossibleDBPaths << QDir::toNativeSeparators("../../../config/"); -// PossibleDBPaths << settings.value("openzwave/UserPath", QDir::toNativeSeparators("../../../config/")).toString().append("/"); PossibleDBPaths << QStandardPaths::standardLocations(QStandardPaths::AppDataLocation); foreach(path, PossibleDBPaths) { @@ -235,20 +234,21 @@ int main(int argc, char *argv[]) } } -// if (userPath.isEmpty()) { -// fputs(qPrintable("userPath is Not Set or Missing\n"), stderr); -// exit(-1); -// } + if (dbPath.isEmpty()) { - copyConfigDatabase(QFileInfo("./").absoluteFilePath().append("/")); - dbPath = "./config/"; - userPath = "./config/"; + if (initConfigDatabase(PossibleDBPaths)) { + copyConfigDatabase(QFileInfo("./").absoluteFilePath().append("/")); + dbPath = "./config/"; + userPath = "./config/"; + } else { + qWarning() << "Cant find qt-openzwavedatabase.rcc"; + } } qDebug() << "DBPath: " << dbPath; qDebug() << "userPath: " << userPath; QSettings settings(userPath.append("/ozwdaemon.ini"), QSettings::IniFormat); - + exit(-1); #ifdef HAVE_MQTT if (parser.isSet(MQTTServer)) { From 95487686557b186c231582f0a386b5020296a3bd Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Sat, 4 Jan 2020 02:08:26 +0800 Subject: [PATCH 2/5] remove this exit --- qt-ozwdaemon/main.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/qt-ozwdaemon/main.cpp b/qt-ozwdaemon/main.cpp index cb002ff..43787b0 100644 --- a/qt-ozwdaemon/main.cpp +++ b/qt-ozwdaemon/main.cpp @@ -248,7 +248,6 @@ int main(int argc, char *argv[]) qDebug() << "userPath: " << userPath; QSettings settings(userPath.append("/ozwdaemon.ini"), QSettings::IniFormat); - exit(-1); #ifdef HAVE_MQTT if (parser.isSet(MQTTServer)) { From 38def4902a229fcbd94432a84304ff5b0187aaa1 Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Sat, 4 Jan 2020 12:46:00 +0800 Subject: [PATCH 3/5] fix up installation of openzwavedatabase --- qt-openzwavedatabase/qt-openzwavedatabase.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qt-openzwavedatabase/qt-openzwavedatabase.pro b/qt-openzwavedatabase/qt-openzwavedatabase.pro index 532f6dd..b8ddfef 100644 --- a/qt-openzwavedatabase/qt-openzwavedatabase.pro +++ b/qt-openzwavedatabase/qt-openzwavedatabase.pro @@ -10,7 +10,7 @@ CONFIG += silent file_copies resources_big ozwconfig.target=qt-openzwavedatabase.rcc ozwconfig.commands=cp -R ../../open-zwave/config config/ && cd config && $$[QT_INSTALL_BINS]/rcc -project -o ozwconfig.qrc && $$[QT_INSTALL_BINS]/rcc --name="ozwconfig" --root="/config/" ozwconfig.qrc --binary -o ../qt-openzwavedatabase.rcc -ozwconfigdb.path = $$[QT_INSTALL_PREFIX]/share/OpenZWave/ +ozwconfigdb.path=$$[QT_INSTALL_PREFIX]/share/OpenZWave/ ozwconfigdb.files=qt-openzwavedatabase.rcc !win32 { From c64d7650559112c919e9640b66e5a817cec57f00 Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Mon, 6 Jan 2020 14:45:41 +0800 Subject: [PATCH 4/5] use binary resource files instead --- .dockerignore | 10 ++++++ Docker/Dockerfile | 18 +++++------ qt-openzwavedatabase/qt-openzwavedatabase.pro | 31 +++++++++++-------- qt-ozwdaemon/qt-ozwdaemon.pro | 2 +- 4 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..60fee21 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,10 @@ +.git +.cache +Docker/Dockerfile +**/*.o +**/moc_*.cpp +**/moc_*.o +**/rep_*.cpp +**/rep_*.o +.qmake.stash +qt-openzwavedatabase/config/** \ No newline at end of file diff --git a/Docker/Dockerfile b/Docker/Dockerfile index 98b01b1..070984d 100644 --- a/Docker/Dockerfile +++ b/Docker/Dockerfile @@ -7,7 +7,7 @@ FROM debian:buster-slim as builder # File Author / Maintainer -MAINTAINER Justin Hammond +LABEL maintainer="justin@dynam.ac" WORKDIR /opt @@ -17,18 +17,16 @@ ENV PATH=$PATH:/opt/depot_tools/ RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git && mkdir breakpad && cd breakpad && fetch breakpad && cd src && ./configure --disable-processor && make && make install RUN git clone https://github.com/qt/qtmqtt.git && cd qtmqtt && git checkout 5.12 && /usr/lib/qt5/bin/qmake QT_BUILD_PARTS="libs tools" && 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 && /usr/lib/qt5/bin/qmake "CONFIG += BreakPad" && make -j4 && make install - - +COPY . /opt/qt-openzwave/ +RUN cd qt-openzwave && if [ -f Makefile ]; then /usr/lib/qt5/bin/qmake -r; make distclean; fi && /usr/lib/qt5/bin/qmake -r "CONFIG+=BreakPad" && make -j4 && make install + FROM debian:buster-slim -MAINTAINER Justin Hammond + +LABEL maintainer="justin@dynam.ac" + WORKDIR /opt -RUN echo 'APT::Default-Release "stable";' > /etc/apt/apt.conf.d/99defaultrelease && echo 'deb http://ftp.debian.org/debian/ unstable main contrib non-free' > /etc/apt/sources.list.d/unstable.list && echo 'deb http://ftp.debian.org/debian/ experimental main contrib non-free' >> /etc/apt/sources.list.d/unstable.list && apt update -RUN apt-get -y install libunwind8 libcurl4 -RUN apt-get -y -t unstable install libqt5core5a libqt5network5 -RUN apt-get -y -t experimental install libqt5remoteobjects5 - +RUN echo 'APT::Default-Release "stable";' > /etc/apt/apt.conf.d/99defaultrelease && echo 'deb http://ftp.debian.org/debian/ unstable main contrib non-free' > /etc/apt/sources.list.d/unstable.list && echo 'deb http://ftp.debian.org/debian/ experimental main contrib non-free' >> /etc/apt/sources.list.d/unstable.list && apt update && apt-get -y install libunwind8 libcurl4 && apt-get -y -t unstable install libqt5core5a libqt5network5 && apt-get -y -t experimental install libqt5remoteobjects5 && apt-get clean && rm -rf /var/lib/apt/lists/* && mkdir -p /opt/ozw/config/crashes/ COPY --from=builder /usr/local/bin/* /usr/local/bin/ COPY --from=builder /usr/local/lib/libqt* /usr/local/lib/ diff --git a/qt-openzwavedatabase/qt-openzwavedatabase.pro b/qt-openzwavedatabase/qt-openzwavedatabase.pro index b8ddfef..0c7b8dc 100644 --- a/qt-openzwavedatabase/qt-openzwavedatabase.pro +++ b/qt-openzwavedatabase/qt-openzwavedatabase.pro @@ -9,28 +9,33 @@ CONFIG += silent file_copies resources_big !versionAtLeast(QT_VERSION, 5.11.2):error("Use at least Qt version 5.11.2") ozwconfig.target=qt-openzwavedatabase.rcc -ozwconfig.commands=cp -R ../../open-zwave/config config/ && cd config && $$[QT_INSTALL_BINS]/rcc -project -o ozwconfig.qrc && $$[QT_INSTALL_BINS]/rcc --name="ozwconfig" --root="/config/" ozwconfig.qrc --binary -o ../qt-openzwavedatabase.rcc -ozwconfigdb.path=$$[QT_INSTALL_PREFIX]/share/OpenZWave/ -ozwconfigdb.files=qt-openzwavedatabase.rcc +ozwconfig.commands=@echo "Generating qt-openzwavedatabase.rcc" && cp -R ../../open-zwave/config config/ && cd config && $$[QT_INSTALL_BINS]/rcc -project -o ozwconfig.qrc && $$[QT_INSTALL_BINS]/rcc --name="ozwconfig" --root="/config/" ozwconfig.qrc --binary -o ../qt-openzwavedatabase.rcc + +ozwrccdb.path=$$[QT_INSTALL_PREFIX]/share/OpenZWave/ +ozwrccdb.files+=qt-openzwavedatabase.rcc +ozwrccdb.CONFIG+=no_check_exist + +extraclean.commands=rm -rf config qt-openzwavedatabase.rcc +clean.depends=extraclean !win32 { - QMAKE_EXTRA_TARGETS += ozwconfig - PRE_TARGETDEPS += qt-openzwavedatabase.rcc SOURCES += source/qt-openzwavedatabase.cpp - INSTALLS += ozwconfigdb - macx { - QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/ - } - - HEADERS += \ include/qt-openzwave/qt-openzwavedatabase.h INCLUDEPATH += include/ - QMAKE_CXXFLAGS += -g1 + target.path = /usr/local/lib/ - INSTALLS += target + QMAKE_EXTRA_TARGETS += clean extraclean ozwconfig + PRE_TARGETDEPS += qt-openzwavedatabase.rcc + INSTALLS+=target ozwrccdb + QMAKE_STRIP=@echo + QMAKE_CXXFLAGS += -g1 QMAKE_CXXFLAGS += -g1 QMAKE_LFLAGS += -rdynamic + + macx { + QMAKE_LFLAGS_SONAME = -Wl,-install_name,@rpath/ + } } diff --git a/qt-ozwdaemon/qt-ozwdaemon.pro b/qt-ozwdaemon/qt-ozwdaemon.pro index 1b6eef6..ae71cc4 100644 --- a/qt-ozwdaemon/qt-ozwdaemon.pro +++ b/qt-ozwdaemon/qt-ozwdaemon.pro @@ -145,7 +145,7 @@ unix { QMAKE_CXXFLAGS += -g QMAKE_CFLAGS += -g QMAKE_LFLAGS += -rdynamic - QMAKE_STRIP = echo + QMAKE_STRIP = echo } win32 { LIBS += -lDnsapi -L../qt-openzwave/$$BUILDTYPE/ -lqt-openzwave1 From adcdfffedd4bdaa4a209955409760f4d26e5b516 Mon Sep 17 00:00:00 2001 From: Justin Hammond Date: Mon, 6 Jan 2020 14:48:18 +0800 Subject: [PATCH 5/5] update documentation --- README.md | 5 ++++- docs/MQTT.md | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3b67386..363f7ee 100644 --- a/README.md +++ b/README.md @@ -16,12 +16,15 @@ Running: ------------- Start a container with the following command line: -```docker run -it --device=/dev/ttyUSB0 -v /tmp/ozw:/opt/ozw/config -e MQTT_SERVER="10.100.200.102" -e USBPATH=/dev/ttyUSB0 openzwave/ozwdaemon:latest``` +```docker run -it --security-opt seccomp=unconfined --device=/dev/ttyUSB0 -v /tmp/ozw:/opt/ozw/config -e MQTT_SERVER="10.100.200.102" -e USBPATH=/dev/ttyUSB0 openzwave/ozwdaemon:latest``` * replace MQTT_SERVER with the IP address of the MQTT Server * replace all /dev/ttyUSB0 entries with the path to your USB Stick. * OpenZWave Config Files are copied on startup to the host directory specified by /tmp/ozw - You should replace it with a directory that is persistent. +the `--security-opt seccomp=unconfined` is needed to generate meaningfull +backtraces, otherwise it will be difficult for us to debug. + Please see [docs/MQTT.md](docs/MQTT.md) for further information ## QT Wrapper Interface diff --git a/docs/MQTT.md b/docs/MQTT.md index 8e0dce0..fb42603 100755 --- a/docs/MQTT.md +++ b/docs/MQTT.md @@ -1,13 +1,13 @@ MQTT Client for OpenZWave ========================= -Docker Repo: https://hub.docker.com/r/openzwave/ozw-mqtt +Docker Repo: https://hub.docker.com/r/openzwave/ozwdaemon Copy the "config" folder from OZW to `/tmp/ozw/`. Start a container with the following command line: ``` -docker run -it --device=/dev/ttyUSB0 -v /tmp/ozw:/opt/ozw/config -e MQTT_SERVER="10.100.200.102" -e USBPATH=/dev/ttyUSB0 openzwave/ozw-mqtt:latest +docker run -it --security-opt seccomp=unconfined --device=/dev/ttyUSB0 -v /tmp/ozw:/opt/ozw/config -e MQTT_SERVER="10.100.200.102" -e USBPATH=/dev/ttyUSB0 openzwave/ozwdaemon:latest ``` (replace `MQTT_SERVER` with the IP address of the MQTT Server and all `/dev/ttyUSB0` entries with the path to your USB Stick.