From aeaecad6fbcfa6d8a3e5b1271911315ed3877a89 Mon Sep 17 00:00:00 2001 From: Chantara Tith Date: Sun, 12 Jun 2016 20:09:46 +0700 Subject: [PATCH] Move from regex to LVM Field options --- src/core/lvmdevice.cpp | 103 ++++++++++++------------------- src/core/lvmdevice.h | 2 + src/core/volumemanagerdevice.cpp | 13 ++++ src/core/volumemanagerdevice.h | 4 ++ src/util/externalcommand.cpp | 2 +- 5 files changed, 61 insertions(+), 63 deletions(-) diff --git a/src/core/lvmdevice.cpp b/src/core/lvmdevice.cpp index 341dca5..4fa4308 100644 --- a/src/core/lvmdevice.cpp +++ b/src/core/lvmdevice.cpp @@ -61,7 +61,7 @@ void LvmDevice::initPartitions() pTable->append(p); } - this->setPartitionTable(pTable); + setPartitionTable(pTable); } /** @@ -78,7 +78,7 @@ QList LvmDevice::scanPartitions(const Device& dev, PartitionTable* p QStringLiteral("B"), dev.name()}); 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()); while (pathMatch.hasNext()) { QRegularExpressionMatch path = pathMatch.next(); @@ -87,7 +87,7 @@ QList LvmDevice::scanPartitions(const Device& dev, PartitionTable* p } foreach (QString lvNode, lvNodeList) { - pList.append(this->scanPartition(lvNode, dev, pTable)); + pList.append(scanPartition(lvNode, dev, pTable)); } return pList; @@ -136,87 +136,66 @@ Partition* LvmDevice::scanPartition(const QString& lvPath, const Device& dev, Pa return part; } -qint32 LvmDevice::getPeSize(const QString& vgname) +QList LvmDevice::deviceNodeList() const { - ExternalCommand cmd(QStringLiteral("lvm"), - { QStringLiteral("vgdisplay"), - QStringLiteral("--units"), - QStringLiteral("B"), - vgname}); - if (cmd.run(-1) && cmd.exitCode() == 0) { - QRegularExpression re(QStringLiteral("PE Size\\h+(\\d+)")); - QRegularExpressionMatch match = re.match(cmd.output()); - if (match.hasMatch()) { - return match.captured(1).toInt(); + QList devPathList; + QString cmdOutput = getField(QStringLiteral("pv_name"), name()); + + if (cmdOutput.size()) { + QList tempPathList = cmdOutput.split(QStringLiteral("\n"), QString::SkipEmptyParts); + foreach(QString devPath, tempPathList) { + devPathList.append(devPath.trimmed()); } } - 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) { - ExternalCommand cmd(QStringLiteral("lvm"), - { QStringLiteral("vgdisplay"), - 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; + QString val = getField(QStringLiteral("vg_extent_count"), vgname); + return val.isEmpty() ? -1 : val.toInt(); } qint32 LvmDevice::getAllocatedPE(const QString& vgname) { - ExternalCommand cmd(QStringLiteral("lvm"), - { 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; + return getTotalPE(vgname) - getFreePE(vgname); } qint32 LvmDevice::getFreePE(const QString& vgname) { - ExternalCommand cmd(QStringLiteral("lvm"), - { QStringLiteral("vgdisplay"), - 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 val = getField(QStringLiteral("vg_free_count"), vgname); + return val.isEmpty() ? -1 : val.toInt(); } 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"), - { QStringLiteral("vgdisplay"), + { QStringLiteral("vgs"), + QStringLiteral("--foreign"), + QStringLiteral("--readonly"), + QStringLiteral("--noheadings"), QStringLiteral("--units"), QStringLiteral("B"), - vgname}); + QStringLiteral("--nosuffix"), + QStringLiteral("--options"), + fieldName, + vgname }); if (cmd.run(-1) && cmd.exitCode() == 0) { - QRegularExpression re(QStringLiteral("LV UUID\\h+(\\w+)")); - QRegularExpressionMatch match = re.match(cmd.output()); - if (match.hasMatch()) { - return match.captured(1); - } + return cmd.output().trimmed(); } - return QStringLiteral("---"); + return QString(); } diff --git a/src/core/lvmdevice.h b/src/core/lvmdevice.h index 8f28474..47ab17d 100644 --- a/src/core/lvmdevice.h +++ b/src/core/lvmdevice.h @@ -56,9 +56,11 @@ public: static qint32 getAllocatedPE(const QString& name); static qint32 getFreePE(const QString& name); static QString getUUID(const QString& name); + static QString getField(const QString& fieldName, const QString& vgname = QString()); protected: void initPartitions(); + QList deviceNodeList() const override; public: qint32 peSize() const { diff --git a/src/core/volumemanagerdevice.cpp b/src/core/volumemanagerdevice.cpp index 89136d1..255c692 100644 --- a/src/core/volumemanagerdevice.cpp +++ b/src/core/volumemanagerdevice.cpp @@ -34,3 +34,16 @@ VolumeManagerDevice::VolumeManagerDevice(const QString& name, : 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; +} diff --git a/src/core/volumemanagerdevice.h b/src/core/volumemanagerdevice.h index 5bdf0f7..da5764f 100644 --- a/src/core/volumemanagerdevice.h +++ b/src/core/volumemanagerdevice.h @@ -45,10 +45,14 @@ class LIBKPMCORE_EXPORT VolumeManagerDevice : public Device protected: 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 deviceNodeList() const = 0; /** Return list of physical device or partitions that makes up volumeManagerDevice */ public: //virtual void refresh() const = 0; /* VG infos can be changed, unlike disk_device */ //virtual Qlist listDevices() const = 0; + virtual QString prettyDeviceNodeList() const; + +private: }; #endif diff --git a/src/util/externalcommand.cpp b/src/util/externalcommand.cpp index 9fe8e0e..c08b2d6 100644 --- a/src/util/externalcommand.cpp +++ b/src/util/externalcommand.cpp @@ -60,7 +60,7 @@ ExternalCommand::ExternalCommand(Report& report, const QString& cmd, const QStri 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); connect(this, static_cast(&QProcess::finished), this, &ExternalCommand::onFinished);