[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kpmcore/raid-support] src/core/raid: Initial Software RAID creation.
From:       Caio Carvalho <null () kde ! org>
Date:       2018-07-31 19:23:41
Message-ID: E1fkaFB-0003LI-RK () code ! kde ! org
[Download RAW message or body]

Git commit fed87159da7b9ddf065554270b3512d24e8a0e14 by Caio Carvalho.
Committed on 31/07/2018 at 19:21.
Pushed by cdelimacarvalho into branch 'raid-support'.

Initial Software RAID creation.

M  +44   -1    src/core/raid/softwareraid.cpp
M  +4    -0    src/core/raid/softwareraid.h

https://commits.kde.org/kpmcore/fed87159da7b9ddf065554270b3512d24e8a0e14

diff --git a/src/core/raid/softwareraid.cpp b/src/core/raid/softwareraid.cpp
index 21aebd9..4802f05 100644
--- a/src/core/raid/softwareraid.cpp
+++ b/src/core/raid/softwareraid.cpp
@@ -380,7 +380,26 @@ bool SoftwareRAID::createSoftwareRAID(Report &report,
                                       const qint32 raidLevel,
                                       const qint32 chunkSize)
 {
-    return false;
+    QStringList args;
+    args << QStringLiteral("--create") << name;
+    args << QStringLiteral("--level=") + QString::number(raidLevel);
+    args << QStringLiteral("--chunk=") + QString::number(chunkSize);
+    args << QStringLiteral("--raid-devices=") + QString::number(devicePathList.size());
+
+    for (const QString path : qAsConst(devicePathList)) {
+        if (!eraseDeviceMDSuperblock(path))
+            return false;
+
+        args << path;
+    }
+
+    ExternalCommand cmd(QStringLiteral("mdadm"), args);
+
+    if (!cmd.run(-1) || cmd.exitCode() != 0)
+        return false;
+
+    // TODO: Support custom config files.
+    return updateConfigurationFile(QStringLiteral("/etc/mdadm.conf"), cmd.output());
 }
 
 bool SoftwareRAID::deleteSoftwareRAID(Report &report,
@@ -456,6 +475,30 @@ qint64 SoftwareRAID::mappedSector(const QString &partitionPath, qint64 sector) c
     return -1;
 }
 
+bool SoftwareRAID::eraseDeviceMDSuperblock(const QString &path)
+{
+    ExternalCommand cmd(QStringLiteral("mdadm"),
+                        { QStringLiteral("--misc"), QStringLiteral("--zero-superblock"), path});
+
+    return cmd.run(-1) && cmd.exitCode() == 0;
+}
+
+bool SoftwareRAID::updateConfigurationFile(const QString &configurationPath, const QString &info)
+{
+    QFile config(configurationPath);
+
+    if (!config.open(QIODevice::WriteOnly | QIODevice::Append))
+        return false;
+
+    QTextStream out(&config);
+
+    out << info << QLatin1Char('\n');
+
+    config.close();
+
+    return true;
+}
+
 QString SoftwareRAID::getDetail(const QString &path)
 {
     ExternalCommand cmd(QStringLiteral("mdadm"),
diff --git a/src/core/raid/softwareraid.h b/src/core/raid/softwareraid.h
index 803ec54..9269b97 100644
--- a/src/core/raid/softwareraid.h
+++ b/src/core/raid/softwareraid.h
@@ -95,6 +95,10 @@ protected:
     qint64 mappedSector(const QString &partitionPath, qint64 sector) const override;
 
 private:
+    static bool eraseDeviceMDSuperblock(const QString& path);
+
+    static bool updateConfigurationFile(const QString& configurationPath, const QString& info);
+
     static QString getDetail(const QString& path);
 
     static QString getRAIDConfiguration(const QString& configurationPath);
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic