diff src/main.cpp @ 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 665421937ec8
children 753ae3569cb7
line wrap: on
line diff
--- 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
 
 
 //