File indexing completed on 2024-05-12 05:48:14

0001 /*
0002     SPDX-FileCopyrightText: 2018 Caio Jordão Carvalho <caiojcarvalho@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-3.0-or-later
0005 */
0006 
0007 #ifndef KPMCORE_SOFTWARERAID_H
0008 #define KPMCORE_SOFTWARERAID_H
0009 
0010 #include "core/volumemanagerdevice.h"
0011 #include "util/libpartitionmanagerexport.h"
0012 #include "util/report.h"
0013 
0014 class LIBKPMCORE_EXPORT SoftwareRAID : public VolumeManagerDevice
0015 {
0016     Q_DISABLE_COPY(SoftwareRAID)
0017 
0018     friend class VolumeManagerDevice;
0019 
0020 public:
0021     enum class Status {
0022         Active,
0023         Inactive,
0024         Resync,
0025         Recovery,
0026     };
0027 
0028     explicit SoftwareRAID(const QString& name,
0029                  SoftwareRAID::Status status = SoftwareRAID::Status::Active,
0030                  const QString& iconName = QString());
0031 
0032     const QStringList deviceNodes() const override;
0033     const QStringList& partitionNodes() const override;
0034     qint64 partitionSize(QString &partitionPath) const override;
0035 
0036     virtual bool growArray(Report& report, const QStringList& devices);
0037 
0038     virtual bool shrinkArray(Report& report, const QStringList& devices);
0039 
0040     virtual QString prettyName() const override;
0041 
0042     virtual bool operator==(const Device& other) const override;
0043 
0044     qint32 raidLevel() const;
0045     qint64 chunkSize() const;
0046     qint64 totalChunk() const;
0047     qint64 arraySize() const;
0048     QString uuid() const;
0049     QStringList devicePathList() const;
0050     SoftwareRAID::Status status() const;
0051 
0052     void setStatus(SoftwareRAID::Status status);
0053 
0054 public:
0055     static qint32 getRaidLevel(const QString& path);
0056     static qint64 getChunkSize(const QString& path);
0057     static qint64 getTotalChunk(const QString& path);
0058     static qint64 getArraySize(const QString& path);
0059     static QString getUUID(const QString& path);
0060     static QStringList getDevicePathList(const QString& path);
0061 
0062     static bool isRaidPath(const QString& path);
0063 
0064     static bool createSoftwareRAID(Report& report,
0065                                    const QString& name,
0066                                    const QStringList devicePathList,
0067                                    const qint32 raidLevel,
0068                                    const qint32 chunkSize);
0069 
0070     static bool deleteSoftwareRAID(Report& report,
0071                                    SoftwareRAID& raidDevice);
0072 
0073     static bool assembleSoftwareRAID(const QString& deviceNode);
0074 
0075     static bool stopSoftwareRAID(const QString& deviceNode);
0076 
0077     static bool reassembleSoftwareRAID(const QString& deviceNode);
0078 
0079     static bool isRaidMember(const QString& path);
0080 
0081 protected:
0082     void initPartitions() override;
0083 
0084     qint64 mappedSector(const QString &partitionPath, qint64 sector) const override;
0085 
0086 private:
0087     static void scanSoftwareRAID(QList<Device*>& devices);
0088 
0089     static QString getDetail(const QString& path);
0090 
0091     static QString getRAIDConfiguration(const QString& configurationPath);
0092 };
0093 
0094 #endif // SOFTWARERAID_H