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);
}
this->setPartitionTable(pTable);
setPartitionTable(pTable);
}
/**
@ -78,7 +78,7 @@ QList<Partition*> 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<Partition*> 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<QString> 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<QString> devPathList;
QString cmdOutput = getField(QStringLiteral("pv_name"), name());
if (cmdOutput.size()) {
QList<QString> 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();
}

View File

@ -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<QString> deviceNodeList() const override;
public:
qint32 peSize() const {

View File

@ -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;
}

View File

@ -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<QString> 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<Partition*> listDevices() const = 0;
virtual QString prettyDeviceNodeList() const;
private:
};
#endif

View File

@ -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<void(QProcess::*)(int, QProcess::ExitStatus)>(&QProcess::finished), this, &ExternalCommand::onFinished);