changeset 150:2a8c97753381

Make the backup stuff compile-time optional.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 28 Aug 2017 11:24:42 +0300
parents fd960e586678
children 753ae3569cb7
files Makefile Makefile.cross-mingw-win32 src/main.cpp src/main.h
diffstat 4 files changed, 132 insertions(+), 80 deletions(-) [+]
line wrap: on
line diff
--- a/Makefile	Mon Aug 28 11:11:16 2017 +0300
+++ b/Makefile	Mon Aug 28 11:24:42 2017 +0300
@@ -2,9 +2,11 @@
 ### Configuration settings for Linux and generic UNIX
 ### See other Makefile.* files for more options.
 ###
+USE_QTHTTP ?= yes
+
 
 # Miscellaneous
-QT5_MODULES = Core Gui Widgets Sql PrintSupport Network
+QT5_MODULES = Core Gui Widgets Sql PrintSupport
 QT5_PREFIX = 
 BINTOOL_PREFIX =
 
@@ -14,7 +16,11 @@
 EXEEXT =
 
 # Compiler flags and linker flags
-DEFINES = 
+ifeq ($(USE_QTHTTP),yes)
+QT5_MODULES += Network
+DEFINES += -DUSE_QTHTTP
+endif
+DEFINES += 
 INCPATH = -I. `pkg-config --cflags $(addprefix Qt5,$(QT5_MODULES))`
 
 CFLAGS += -pipe -O2 -Wall -W -D_REENTRANT -fPIC
--- a/Makefile.cross-mingw-win32	Mon Aug 28 11:11:16 2017 +0300
+++ b/Makefile.cross-mingw-win32	Mon Aug 28 11:24:42 2017 +0300
@@ -1,9 +1,11 @@
 ###
 ### For win32 version cross-compilation with MinGW suite @ Linux
 ###
+USE_QTHTTP ?= yes
+
 
 # Miscellaneous
-QT5_MODULES = Core Gui Widgets Sql PrintSupport Network
+QT5_MODULES = Core Gui Widgets Sql PrintSupport
 QT5_PREFIX ?= /misc/packages/qt5-src
 QT5_BASE ?= $(QT5_PREFIX)/qtbase
 BINTOOL_PREFIX ?= i686-w64-mingw32-
@@ -14,6 +16,10 @@
 
 # Compiler flags and linker flags
 DEFINES = -DUNICODE -DQT_NEEDS_QMAIN
+ifeq ($(USE_QTHTTP),yes)
+QT5_MODULES += Network
+DEFINES += -DUSE_QTHTTP
+endif
 INCPATH = -I. \
 	-I$(QT5_BASE)/include \
 	$(addprefix -I$(QT5_BASE)/include/Qt,$(QT5_MODULES)) \
--- a/src/main.cpp	Mon Aug 28 11:11:16 2017 +0300
+++ b/src/main.cpp	Mon Aug 28 11:24:42 2017 +0300
@@ -28,6 +28,9 @@
     double uiScale;              // Global UI scale factor
 
     QString dataPath;            // Application data path/directory
+
+    // Backup related settings
+    int     dbBackupMode;
     QString dbBackupURL;
     QString dbBackupSecret;
 } settings;
@@ -246,14 +249,16 @@
     settings.uiPos = tmpst.value("pos", QPoint(100, 100)).toPoint();
     settings.uiSize = tmpst.value("size", QSize(1000, 600)).toSize();
     settings.uiScale = tmpst.value("scale", 1.0f).toDouble();
+    settings.dbBackupMode = BACKUP_NONE;
     settings.dbBackupURL = tmpst.value("dbBackupURL", QString()).toString();
     settings.dbBackupSecret = tmpst.value("dbBackupSecret", QString()).toString();
 
     // Check commandline arguments for configuring backup settings
-    if (argc >= 4 && strcmp(argv[1], "config") == 0)
+    if (argc >= 5 && strcmp(argv[1], "config") == 0)
     {
-        settings.dbBackupURL = QString(argv[2]);
-        settings.dbBackupSecret = QString(argv[3]);
+        settings.dbBackupMode = QString(argv[2]).toInt();
+        settings.dbBackupURL = QString(argv[3]);
+        settings.dbBackupSecret = QString(argv[4]);
     }
 
     // Also possibility of resetting the UI settings
@@ -447,7 +452,8 @@
     QSqlDatabase::database().close();
 
     // Back up the database
-    backupDatabase();
+    if (settings.dbBackupMode != BACKUP_NONE)
+        backupDatabase();
 }
 
 
@@ -455,7 +461,6 @@
 {
     QString dbFilename = settings.dataPath + QDir::separator() + APP_SQLITE_FILE;
     QString backupFilename = APP_SQLITE_FILE;
-    backupReply = NULL;
     backupDialog = NULL;
 
     if (settings.dbBackupURL == QString() || settings.dbBackupURL == "")
@@ -470,73 +475,92 @@
         return;
     }
 
-    // Check for network access
-    QNetworkAccessManager *manager = new QNetworkAccessManager();
-    if (manager->networkAccessible() != QNetworkAccessManager::Accessible)
-    {
-        slLog("ERROR", QStringLiteral("Network not available, cannot backup the database."));
-        return;
-    }
-
-    // Attempt to open the database file 
-    QFile *file = new QFile(dbFilename);
-    if (!file->open(QIODevice::ReadOnly))
+    if (settings.dbBackupMode == BACKUP_HTTP)
     {
-        slLog("ERROR", QStringLiteral("Failed to open database file '%1' for backup.").arg(dbFilename));
-        return;
-    }
+#ifdef USE_QTHTTP
+        // Check for network access
+        httpBackupReply = NULL;
 
-    // Okay, we seem to be "go" ..
-    slLog("INFO",
-        QStringLiteral("Attempting database backup from '%1' to '%2'.").
-        arg(dbFilename).arg(settings.dbBackupURL));
+        QNetworkAccessManager *manager = new QNetworkAccessManager();
+        if (manager->networkAccessible() != QNetworkAccessManager::Accessible)
+        {
+            slLog("ERROR", QStringLiteral("Network not available, cannot backup the database."));
+            return;
+        }
+
+        // Attempt to open the database file 
+        QFile *file = new QFile(dbFilename);
+        if (!file->open(QIODevice::ReadOnly))
+        {
+            slLog("ERROR", QStringLiteral("Failed to open database file '%1' for backup.").arg(dbFilename));
+            return;
+        }
 
-    // Create the HTTP POST request
-    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
+        // Okay, we seem to be "go" ..
+        slLog("INFO",
+            QStringLiteral("Attempting database backup from '%1' to '%2'.").
+            arg(dbFilename).arg(settings.dbBackupURL));
+
+        // Create the HTTP POST request
+        QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);
 
-    // The "secret" key as POST parameter
-    QHttpPart postPart;
-    postPart.setHeader(QNetworkRequest::ContentDispositionHeader,
-        QVariant("form-data; name=\"secret\";"));
-    postPart.setBody(QByteArray(settings.dbBackupSecret.toUtf8()));
+        // The "secret" key as POST parameter
+        QHttpPart postPart;
+        postPart.setHeader(QNetworkRequest::ContentDispositionHeader,
+            QVariant("form-data; name=\"secret\";"));
+        postPart.setBody(QByteArray(settings.dbBackupSecret.toUtf8()));
+
+        // Actual data as binary octet-stream
+        QHttpPart dataPart;
+        dataPart.setHeader(QNetworkRequest::ContentTypeHeader,
+            QVariant("binary/octet-stream"));
+
+        dataPart.setHeader(QNetworkRequest::ContentDispositionHeader,
+            QVariant("form-data; name=\"file\"; filename=\""+ backupFilename +"\""));
 
-    // Actual data as binary octet-stream
-    QHttpPart dataPart;
-    dataPart.setHeader(QNetworkRequest::ContentTypeHeader,
-        QVariant("binary/octet-stream"));
+        dataPart.setBodyDevice(file);
+        file->setParent(multiPart); // we cannot delete the QFile object now, so delete it with the multiPart
+
+        multiPart->append(postPart);
+        multiPart->append(dataPart);
 
-    dataPart.setHeader(QNetworkRequest::ContentDispositionHeader,
-        QVariant("form-data; name=\"file\"; filename=\""+ backupFilename +"\""));
+        // Attempt to POST the whole thing
+        QUrl url(settings.dbBackupURL);
+        QNetworkRequest request(url);
+        httpBackupReply = manager->post(request, multiPart);
+        multiPart->setParent(httpBackupReply);
 
-    dataPart.setBodyDevice(file);
-    file->setParent(multiPart); // we cannot delete the QFile object now, so delete it with the multiPart
-
-    multiPart->append(postPart);
-    multiPart->append(dataPart);
+        connect(
+            httpBackupReply,
+            SIGNAL(finished()),
+            this,
+            SLOT(httpBackupFinished()));
 
-    // Attempt to POST the whole thing
-    QUrl url(settings.dbBackupURL);
-    QNetworkRequest request(url);
-    backupReply = manager->post(request, multiPart);
-    multiPart->setParent(backupReply);
-
-    connect(
-        backupReply,
-        SIGNAL(finished()),
-        this,
-        SLOT(backupFinished()));
+        connect(
+            httpBackupReply,
+            SIGNAL(uploadProgress(qint64, qint64)),
+            this,
+            SLOT(httpBackupProgress(qint64, qint64)));
 
-    connect(
-        backupReply,
-        SIGNAL(uploadProgress(qint64, qint64)),
-        this,
-        SLOT(backupProgress(qint64, qint64)));
-
-    connect(
-        backupReply,
-        SIGNAL(error(QNetworkReply::NetworkError)),
-        this,
-        SLOT(backupError(QNetworkReply::NetworkError)));
+        connect(
+            httpBackupReply,
+            SIGNAL(error(QNetworkReply::NetworkError)),
+            this,
+            SLOT(httpBackupError(QNetworkReply::NetworkError)));
+#else
+        slLog("ERROR", QStringLiteral("Backup method is HTTP/HTTPS, but support is not compiled in!"));
+        return;
+#endif
+    }
+    else
+    if (settings.dbBackupMode == BACKUP_CURL_SFTP)
+    {
+#ifdef USE_LIBCURL
+#else
+        slLog("ERROR", QStringLiteral("Backup method is SFTP via libcurl, but support is not compiled in!"));
+        return;
+#endif
+    }
 
     // Create progress dialog
     backupDialog = new QProgressDialog(
@@ -553,7 +577,8 @@
 }
 
 
-void SyntilistaMainWindow::backupProgress(qint64 bytesSent, qint64 bytesTotal)
+#ifdef USE_QTHTTP
+void SyntilistaMainWindow::httpBackupProgress(qint64 bytesSent, qint64 bytesTotal)
 {
     if (bytesTotal > 0)
     {
@@ -567,7 +592,7 @@
 }
 
 
-void SyntilistaMainWindow::backupError(QNetworkReply::NetworkError code)
+void SyntilistaMainWindow::httpBackupError(QNetworkReply::NetworkError code)
 {
     slLog("ERROR",
         QStringLiteral("Backup failed with network error %1.").
@@ -576,11 +601,11 @@
 }
 
 
-void SyntilistaMainWindow::backupFinished()
+void SyntilistaMainWindow::httpBackupFinished()
 {
-    if (backupReply)
+    if (httpBackupReply)
     {
-        QVariant status = backupReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
+        QVariant status = httpBackupReply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
         if (status.isValid())
         {
             int code = status.toInt();
@@ -597,7 +622,7 @@
                 default:
                     slLog("ERROR",
                         QStringLiteral("Backup server responded with error:\n")+
-                        QString::fromUtf8(backupReply->readAll()));
+                        QString::fromUtf8(httpBackupReply->readAll()));
                     break;
             }
         }
@@ -609,6 +634,7 @@
 
     backupDialog->close();
 }
+#endif
 
 
 //
--- a/src/main.h	Mon Aug 28 11:11:16 2017 +0300
+++ b/src/main.h	Mon Aug 28 11:24:42 2017 +0300
@@ -17,10 +17,15 @@
 #include <QPainter>
 #include <QPrinter>
 #include <QProgressDialog>
-#include <QNetworkAccessManager>
-#include <QNetworkRequest>
-#include <QNetworkReply>
-#include <QHttpMultiPart>
+#ifdef USE_QTHTTP
+#    include <QNetworkAccessManager>
+#    include <QNetworkRequest>
+#    include <QNetworkReply>
+#    include <QHttpMultiPart>
+#endif
+#ifdef USE_LIBCURL
+#    include <curl/curl.h>
+#endif
 
 
 //
@@ -37,6 +42,11 @@
 #define SQL_LEN_LAST_NAME    128
 #define SQL_LEN_EXTRA_INFO   2048
 
+// Supported database backup modes
+#define BACKUP_NONE          0  // No backup
+#define BACKUP_HTTP          1  // HTTP(s) POST to a PHP script
+#define BACKUP_CURL_SFTP     2  // SFTP via libcurl
+
 
 //
 // Custom SQL models
@@ -178,16 +188,20 @@
 
     void printDocument(QPrinter *printer);
 
-    void backupProgress(qint64 bytesSent, qint64 bytesTotal);
-    void backupFinished();
-    void backupError(QNetworkReply::NetworkError code);
+#ifdef USE_QTHTTP
+    void httpBackupProgress(qint64 bytesSent, qint64 bytesTotal);
+    void httpBackupFinished();
+    void httpBackupError(QNetworkReply::NetworkError code);
+#endif
 
 
 private:
     Ui::SyntilistaMainWindow *ui;
 
     QProgressDialog *backupDialog;
-    QNetworkReply *backupReply;
+#ifdef USE_QTHTTP
+    QNetworkReply *httpBackupReply;
+#endif
 
     TransactionSQLModel *model_Latest;
     PersonInfo currPerson;