Add SoftwareRAID::Status enum.

Check for RAID before modelCommand in SfdiskBackend::scanDevice.
This commit is contained in:
Caio Carvalho 2018-07-15 13:11:50 -03:00
parent fae6cd4d61
commit f3fac7eac7
4 changed files with 57 additions and 39 deletions

View File

@ -39,10 +39,10 @@ public:
qint64 m_arraySize; qint64 m_arraySize;
QString m_UUID; QString m_UUID;
QStringList m_devicePathList; QStringList m_devicePathList;
bool m_active; SoftwareRAID::Status m_status;
}; };
SoftwareRAID::SoftwareRAID(const QString& name, bool active, const QString& iconName) SoftwareRAID::SoftwareRAID(const QString& name, SoftwareRAID::Status status, const QString& iconName)
: VolumeManagerDevice(std::make_shared<SoftwareRAIDPrivate>(), : VolumeManagerDevice(std::make_shared<SoftwareRAIDPrivate>(),
name, name,
(QStringLiteral("/dev/") + name), (QStringLiteral("/dev/") + name),
@ -57,7 +57,7 @@ SoftwareRAID::SoftwareRAID(const QString& name, bool active, const QString& icon
d_ptr->m_arraySize = getArraySize(deviceNode()); d_ptr->m_arraySize = getArraySize(deviceNode());
d_ptr->m_UUID = getUUID(deviceNode()); d_ptr->m_UUID = getUUID(deviceNode());
d_ptr->m_devicePathList = getDevicePathList(deviceNode()); d_ptr->m_devicePathList = getDevicePathList(deviceNode());
d_ptr->m_active = active; d_ptr->m_status = status;
initPartitions(); initPartitions();
} }
@ -94,9 +94,14 @@ bool SoftwareRAID::shrinkArray(Report &report, const QStringList &devices)
QString SoftwareRAID::prettyName() const QString SoftwareRAID::prettyName() const
{ {
return VolumeManagerDevice::prettyName() + QString raidInfo;
(isActive() ? xi18nc("@item:inlistbox [RAID level]", " [RAID %1]", raidLevel()) :
QStringLiteral(" [RAID]")); if (status() != SoftwareRAID::Status::Inactive)
raidInfo = xi18nc("@item:inlistbox [RAID level]", " [RAID %1]", raidLevel());
else
raidInfo = QStringLiteral(" [RAID]");
return VolumeManagerDevice::prettyName() + raidInfo;
} }
bool SoftwareRAID::operator ==(const Device& other) const bool SoftwareRAID::operator ==(const Device& other) const
@ -143,14 +148,14 @@ QStringList SoftwareRAID::devicePathList() const
return d_ptr->m_devicePathList; return d_ptr->m_devicePathList;
} }
bool SoftwareRAID::isActive() const SoftwareRAID::Status SoftwareRAID::status() const
{ {
return d_ptr->m_active; return d_ptr->m_status;
} }
void SoftwareRAID::setActive(bool active) void SoftwareRAID::setStatus(SoftwareRAID::Status status)
{ {
d_ptr->m_active = active; d_ptr->m_status = status;
} }
void SoftwareRAID::scanSoftwareRAID(QList<Device*>& devices) void SoftwareRAID::scanSoftwareRAID(QList<Device*>& devices)
@ -168,7 +173,8 @@ void SoftwareRAID::scanSoftwareRAID(QList<Device*>& devices)
QRegularExpressionMatch reMatch = i.next(); QRegularExpressionMatch reMatch = i.next();
QString deviceName = reMatch.captured(2).trimmed(); QString deviceName = reMatch.captured(2).trimmed();
SoftwareRAID *raidDevice = new SoftwareRAID(deviceName, false); SoftwareRAID *raidDevice = new SoftwareRAID(deviceName,
SoftwareRAID::Status::Inactive);
scannedRaid << raidDevice; scannedRaid << raidDevice;
} }
@ -188,19 +194,24 @@ void SoftwareRAID::scanSoftwareRAID(QList<Device*>& devices)
SoftwareRAID* d = static_cast<SoftwareRAID *>(CoreBackendManager::self()->backend()->scanDevice(deviceNode)); SoftwareRAID* d = static_cast<SoftwareRAID *>(CoreBackendManager::self()->backend()->scanDevice(deviceNode));
if (scannedRaid.contains(d)) { if (scannedRaid.contains(d)) {
d->setActive(status.toLower() == QStringLiteral("active")); if (status == QStringLiteral("inactive"))
d->setStatus(SoftwareRAID::Status::Inactive);
if (d->raidLevel() > 0) {
QRegularExpression reMirrorStatus(QStringLiteral("\\[[=>.]+\\]\\s+(resync|recovery)"));
QRegularExpressionMatch reMirrorStatusMatch = reMirrorStatus.match(scanRaid.output());
if (reMirrorStatusMatch.hasMatch())
d->setActive(false);
}
} }
else else
scannedRaid << d; scannedRaid << d;
if (d->raidLevel() > 0) {
QRegularExpression reMirrorStatus(QStringLiteral("\\[[=>.]+\\]\\s+(resync|recovery)"));
QRegularExpressionMatch reMirrorStatusMatch = reMirrorStatus.match(scanRaid.output());
if (reMirrorStatusMatch.hasMatch()) {
if (reMirrorStatusMatch.captured(1) == QStringLiteral("resync"))
d->setStatus(SoftwareRAID::Status::Resync);
else if (reMirrorStatusMatch.captured(1) == QStringLiteral("recovery"))
d->setStatus(SoftwareRAID::Status::Recovery);
}
}
} }
} }

View File

@ -27,7 +27,16 @@ class LIBKPMCORE_EXPORT SoftwareRAID : public VolumeManagerDevice
Q_DISABLE_COPY(SoftwareRAID) Q_DISABLE_COPY(SoftwareRAID)
public: public:
SoftwareRAID(const QString& name, bool active = true, const QString& iconName = QString()); enum class Status {
Active,
Inactive,
Resync,
Recovery,
};
SoftwareRAID(const QString& name,
SoftwareRAID::Status status = SoftwareRAID::Status::Active,
const QString& iconName = QString());
const QStringList deviceNodes() const override; const QStringList deviceNodes() const override;
const QStringList& partitionNodes() const override; const QStringList& partitionNodes() const override;
@ -47,9 +56,9 @@ public:
qint64 arraySize() const; qint64 arraySize() const;
QString uuid() const; QString uuid() const;
QStringList devicePathList() const; QStringList devicePathList() const;
bool isActive() const; SoftwareRAID::Status status() const;
void setActive(bool active); void setStatus(SoftwareRAID::Status status);
public: public:
static void scanSoftwareRAID(QList<Device*>& devices); static void scanSoftwareRAID(QList<Device*>& devices);

View File

@ -100,7 +100,7 @@ bool CreatePartitionTableOperation::canCreate(const Device* device)
if (device->type() == Device::Type::SoftwareRAID_Device) { if (device->type() == Device::Type::SoftwareRAID_Device) {
const SoftwareRAID* raid = static_cast<const SoftwareRAID *>(device); const SoftwareRAID* raid = static_cast<const SoftwareRAID *>(device);
if (!raid->isActive()) if (raid->status() == SoftwareRAID::Status::Inactive)
return false; return false;
} }

View File

@ -136,7 +136,18 @@ Device* SfdiskBackend::scanDevice(const QString& deviceNode)
qint64 deviceSize = sizeCommand.output().trimmed().toLongLong(); qint64 deviceSize = sizeCommand.output().trimmed().toLongLong();
int logicalSectorSize = sizeCommand2.output().trimmed().toLongLong(); int logicalSectorSize = sizeCommand2.output().trimmed().toLongLong();
if ( modelCommand.run(-1) && modelCommand.exitCode() == 0 ) ExternalCommand softwareRaidCommand(QStringLiteral("mdadm"), { QStringLiteral("--detail"), deviceNode });
if ( softwareRaidCommand.run(-1) && softwareRaidCommand.exitCode() == 0 )
{
Log(Log::Level::information) << xi18nc("@info:status", "Software RAID Device found: %1", deviceNode);
QString deviceName = deviceNode.mid(5);
d = new SoftwareRAID( deviceName, SoftwareRAID::Status::Active );
}
if ( d == nullptr && modelCommand.run(-1) && modelCommand.exitCode() == 0 )
{ {
QString modelName = modelCommand.output(); QString modelName = modelCommand.output();
modelName = modelName.left(modelName.length() - 1); modelName = modelName.left(modelName.length() - 1);
@ -145,19 +156,6 @@ Device* SfdiskBackend::scanDevice(const QString& deviceNode)
d = new DiskDevice(modelName, deviceNode, 255, 63, deviceSize / logicalSectorSize / 255 / 63, logicalSectorSize); d = new DiskDevice(modelName, deviceNode, 255, 63, deviceSize / logicalSectorSize / 255 / 63, logicalSectorSize);
} }
else // check for software raid
{
ExternalCommand softwareRaidCommand(QStringLiteral("mdadm"), { QStringLiteral("--detail"), deviceNode });
if ( softwareRaidCommand.run(-1) && softwareRaidCommand.exitCode() == 0 )
{
Log(Log::Level::information) << xi18nc("@info:status", "Software RAID Device found: %1", deviceNode);
QString deviceName = deviceNode.mid(5);
d = new SoftwareRAID( deviceName );
}
}
if ( d ) if ( d )
{ {