Move from regex to LVM Field options

This commit is contained in:
Chantara Tith 2016-06-12 20:09:46 +07:00 committed by Andrius Štikonas
parent 3170e0a6a9
commit aeaecad6fb
5 changed files with 61 additions and 63 deletions

View File

@ -61,7 +61,7 @@ void LvmDevice::initPartitions()
pTable->append(p); pTable->append(p);
} }
this->setPartitionTable(pTable); setPartitionTable(pTable);
} }
/** /**
@ -78,7 +78,7 @@ QList<Partition*> LvmDevice::scanPartitions(const Device& dev, PartitionTable* p
QStringLiteral("B"), QStringLiteral("B"),
dev.name()}); dev.name()});
if (cmd.run(-1) && cmd.exitCode() == 0) { if (cmd.run(-1) && cmd.exitCode() == 0) {
QRegularExpression pathRE(QStringLiteral("LV Path\\h+((\\w|\/)+)")); QRegularExpression pathRE(QStringLiteral("LV Path\\h+((\\w|/)+)"));
QRegularExpressionMatchIterator pathMatch = pathRE.globalMatch(cmd.output()); QRegularExpressionMatchIterator pathMatch = pathRE.globalMatch(cmd.output());
while (pathMatch.hasNext()) { while (pathMatch.hasNext()) {
QRegularExpressionMatch path = pathMatch.next(); QRegularExpressionMatch path = pathMatch.next();
@ -87,7 +87,7 @@ QList<Partition*> LvmDevice::scanPartitions(const Device& dev, PartitionTable* p
} }
foreach (QString lvNode, lvNodeList) { foreach (QString lvNode, lvNodeList) {
pList.append(this->scanPartition(lvNode, dev, pTable)); pList.append(scanPartition(lvNode, dev, pTable));
} }
return pList; return pList;
@ -136,87 +136,66 @@ Partition* LvmDevice::scanPartition(const QString& lvPath, const Device& dev, Pa
return part; return part;
} }
qint32 LvmDevice::getPeSize(const QString& vgname) QList<QString> LvmDevice::deviceNodeList() const
{ {
ExternalCommand cmd(QStringLiteral("lvm"), QList<QString> devPathList;
{ QStringLiteral("vgdisplay"), QString cmdOutput = getField(QStringLiteral("pv_name"), name());
QStringLiteral("--units"),
QStringLiteral("B"), if (cmdOutput.size()) {
vgname}); QList<QString> tempPathList = cmdOutput.split(QStringLiteral("\n"), QString::SkipEmptyParts);
if (cmd.run(-1) && cmd.exitCode() == 0) { foreach(QString devPath, tempPathList) {
QRegularExpression re(QStringLiteral("PE Size\\h+(\\d+)")); devPathList.append(devPath.trimmed());
QRegularExpressionMatch match = re.match(cmd.output());
if (match.hasMatch()) {
return match.captured(1).toInt();
} }
} }
return -1;
return devPathList;
}
qint32 LvmDevice::getPeSize(const QString& vgname)
{
QString val = getField(QStringLiteral("vg_extent_size"), vgname);
return val.isEmpty() ? -1 : val.toInt();
} }
qint32 LvmDevice::getTotalPE(const QString& vgname) qint32 LvmDevice::getTotalPE(const QString& vgname)
{ {
ExternalCommand cmd(QStringLiteral("lvm"), QString val = getField(QStringLiteral("vg_extent_count"), vgname);
{ QStringLiteral("vgdisplay"), return val.isEmpty() ? -1 : val.toInt();
QStringLiteral("--units"),
QStringLiteral("B"),
vgname});
if (cmd.run(-1) && cmd.exitCode() == 0) {
QRegularExpression re(QStringLiteral("Total PE\\h+(\\d+)"));
QRegularExpressionMatch match = re.match(cmd.output());
if (match.hasMatch()) {
return match.captured(1).toInt();
}
}
return -1;
} }
qint32 LvmDevice::getAllocatedPE(const QString& vgname) qint32 LvmDevice::getAllocatedPE(const QString& vgname)
{ {
ExternalCommand cmd(QStringLiteral("lvm"), return getTotalPE(vgname) - getFreePE(vgname);
{ QStringLiteral("vgdisplay"),
QStringLiteral("--units"),
QStringLiteral("B"),
vgname});
if (cmd.run(-1) && cmd.exitCode() == 0) {
QRegularExpression re(QStringLiteral("Alloc PE / Size\\h+(\\d+)"));
QRegularExpressionMatch match = re.match(cmd.output());
if (match.hasMatch()) {
return match.captured(1).toInt();
}
}
return -1;
} }
qint32 LvmDevice::getFreePE(const QString& vgname) qint32 LvmDevice::getFreePE(const QString& vgname)
{ {
ExternalCommand cmd(QStringLiteral("lvm"), QString val = getField(QStringLiteral("vg_free_count"), vgname);
{ QStringLiteral("vgdisplay"), return val.isEmpty() ? -1 : val.toInt();
QStringLiteral("--units"),
QStringLiteral("B"),
vgname});
if (cmd.run(-1) && cmd.exitCode() == 0) {
QRegularExpression re(QStringLiteral("Free PE / Size\\h+(\\d+)"));
QRegularExpressionMatch match = re.match(cmd.output());
if (match.hasMatch()) {
return match.captured(1).toInt();
}
}
return -1;
} }
QString LvmDevice::getUUID(const QString& vgname) QString LvmDevice::getUUID(const QString& vgname)
{
QString val = getField(QStringLiteral("vg_uuid"), vgname);
return val.isEmpty() ? QStringLiteral("---") : val;
}
QString LvmDevice::getField(const QString& fieldName, const QString& vgname)
{ {
ExternalCommand cmd(QStringLiteral("lvm"), ExternalCommand cmd(QStringLiteral("lvm"),
{ QStringLiteral("vgdisplay"), { QStringLiteral("vgs"),
QStringLiteral("--foreign"),
QStringLiteral("--readonly"),
QStringLiteral("--noheadings"),
QStringLiteral("--units"), QStringLiteral("--units"),
QStringLiteral("B"), QStringLiteral("B"),
vgname}); QStringLiteral("--nosuffix"),
QStringLiteral("--options"),
fieldName,
vgname });
if (cmd.run(-1) && cmd.exitCode() == 0) { if (cmd.run(-1) && cmd.exitCode() == 0) {
QRegularExpression re(QStringLiteral("LV UUID\\h+(\\w+)")); return cmd.output().trimmed();
QRegularExpressionMatch match = re.match(cmd.output());
if (match.hasMatch()) {
return match.captured(1);
}
} }
return QStringLiteral("---"); return QString();
} }

View File

@ -56,9 +56,11 @@ public:
static qint32 getAllocatedPE(const QString& name); static qint32 getAllocatedPE(const QString& name);
static qint32 getFreePE(const QString& name); static qint32 getFreePE(const QString& name);
static QString getUUID(const QString& name); static QString getUUID(const QString& name);
static QString getField(const QString& fieldName, const QString& vgname = QString());
protected: protected:
void initPartitions(); void initPartitions();
QList<QString> deviceNodeList() const override;
public: public:
qint32 peSize() const { qint32 peSize() const {

View File

@ -34,3 +34,16 @@ VolumeManagerDevice::VolumeManagerDevice(const QString& name,
: Device(name, devicenode, logicalSize, totalLogical, iconname, type) : Device(name, devicenode, logicalSize, totalLogical, iconname, type)
{ {
} }
QString VolumeManagerDevice::prettyDeviceNodeList() const
{
QString rval;
foreach (QString devNode, deviceNodeList()) {
rval += devNode + QStringLiteral(",");
}
if (rval.size()) {
rval.chop(1);
}
return rval;
}

View File

@ -45,10 +45,14 @@ class LIBKPMCORE_EXPORT VolumeManagerDevice : public Device
protected: protected:
VolumeManagerDevice(const QString& name, const QString& devicenode, const qint32 logicalSize, const qint64 totalLogical, const QString& iconname = QString(), Device::Type type = Device::Unknown_Device); VolumeManagerDevice(const QString& name, const QString& devicenode, const qint32 logicalSize, const qint64 totalLogical, const QString& iconname = QString(), Device::Type type = Device::Unknown_Device);
virtual QList<QString> deviceNodeList() const = 0; /** Return list of physical device or partitions that makes up volumeManagerDevice */
public: public:
//virtual void refresh() const = 0; /* VG infos can be changed, unlike disk_device */ //virtual void refresh() const = 0; /* VG infos can be changed, unlike disk_device */
//virtual Qlist<Partition*> listDevices() const = 0; //virtual Qlist<Partition*> listDevices() const = 0;
virtual QString prettyDeviceNodeList() const;
private:
}; };
#endif #endif

View File

@ -60,7 +60,7 @@ ExternalCommand::ExternalCommand(Report& report, const QString& cmd, const QStri
void ExternalCommand::setup() void ExternalCommand::setup()
{ {
setEnvironment(QStringList() << QStringLiteral("LC_ALL=C") << QStringLiteral("PATH=") + QString::fromUtf8(getenv("PATH"))); setEnvironment(QStringList() << QStringLiteral("LC_ALL=C") << QStringLiteral("PATH=") + QString::fromUtf8(getenv("PATH")) << QStringLiteral("LVM_SUPPRESS_FD_WARNINGS=1"));
setProcessChannelMode(MergedChannels); setProcessChannelMode(MergedChannels);
connect(this, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &ExternalCommand::onFinished); connect(this, static_cast<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &ExternalCommand::onFinished);