Partitions: split device-listing (and winnowing) into separate source file.
The grab-list-of-writable-devices code is usable for the partition module, but also useful for welcome module, so reduce its footprint.
This commit is contained in:
parent
9c79a961df
commit
aa35224ab1
@ -32,6 +32,7 @@ calamares_add_plugin( partition
|
|||||||
SOURCES
|
SOURCES
|
||||||
core/BootLoaderModel.cpp
|
core/BootLoaderModel.cpp
|
||||||
core/ColorUtils.cpp
|
core/ColorUtils.cpp
|
||||||
|
core/DeviceList.cpp
|
||||||
core/DeviceModel.cpp
|
core/DeviceModel.cpp
|
||||||
core/KPMHelpers.cpp
|
core/KPMHelpers.cpp
|
||||||
core/PartitionActions.cpp
|
core/PartitionActions.cpp
|
||||||
|
133
src/modules/partition/core/DeviceList.cpp
Normal file
133
src/modules/partition/core/DeviceList.cpp
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2015-2016, Teo Mrnjavac <teo@kde.org>
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "PartUtils.h"
|
||||||
|
|
||||||
|
#include "PartitionCoreModule.h"
|
||||||
|
|
||||||
|
#include "core/DeviceModel.h"
|
||||||
|
#include "core/KPMHelpers.h"
|
||||||
|
#include "core/PartitionIterator.h"
|
||||||
|
|
||||||
|
#include <kpmcore/backend/corebackend.h>
|
||||||
|
#include <kpmcore/backend/corebackendmanager.h>
|
||||||
|
#include <kpmcore/core/device.h>
|
||||||
|
#include <kpmcore/core/partition.h>
|
||||||
|
|
||||||
|
#include <utils/Logger.h>
|
||||||
|
#include <JobQueue.h>
|
||||||
|
#include <GlobalStorage.h>
|
||||||
|
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QTemporaryDir>
|
||||||
|
|
||||||
|
namespace PartUtils
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the given @p device contain the root filesystem? This is true if
|
||||||
|
* the device contains a partition which is currently mounted at / .
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
hasRootPartition( Device* device )
|
||||||
|
{
|
||||||
|
for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it )
|
||||||
|
if ( ( *it )->mountPoint() == "/" )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
isMounted( Device* device )
|
||||||
|
{
|
||||||
|
cDebug() << "Checking for mounted partitions in" << device->deviceNode();
|
||||||
|
for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it )
|
||||||
|
{
|
||||||
|
cDebug() << " .." << ( *it )->partitionPath() << "mount" << ( *it )->mountPoint();
|
||||||
|
if ( ! ( *it )->mountPoint().isEmpty() )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
isIso9660( const Device* device )
|
||||||
|
{
|
||||||
|
QString path = device->deviceNode();
|
||||||
|
if ( path.isEmpty() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QProcess blkid;
|
||||||
|
blkid.start( "blkid", { path } );
|
||||||
|
blkid.waitForFinished();
|
||||||
|
QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() );
|
||||||
|
if ( output.contains( "iso9660" ) )
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if ( device->partitionTable() &&
|
||||||
|
!device->partitionTable()->children().isEmpty() )
|
||||||
|
{
|
||||||
|
for ( const Partition* partition : device->partitionTable()->children() )
|
||||||
|
{
|
||||||
|
path = partition->partitionPath();
|
||||||
|
blkid.start( "blkid", { path } );
|
||||||
|
blkid.waitForFinished();
|
||||||
|
QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() );
|
||||||
|
if ( output.contains( "iso9660" ) )
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QList< Device* > getDevices( bool writableOnly )
|
||||||
|
{
|
||||||
|
using DeviceList = QList< Device* >;
|
||||||
|
|
||||||
|
CoreBackend* backend = CoreBackendManager::self()->backend();
|
||||||
|
DeviceList devices = backend->scanDevices( true );
|
||||||
|
|
||||||
|
cDebug() << "Winnowing" << devices.count() << "devices.";
|
||||||
|
|
||||||
|
// Remove the device which contains / from the list
|
||||||
|
for ( DeviceList::iterator it = devices.begin(); it != devices.end(); )
|
||||||
|
if ( ! ( *it ) ||
|
||||||
|
( *it )->deviceNode().startsWith( "/dev/zram" )
|
||||||
|
)
|
||||||
|
{
|
||||||
|
cDebug() << " .. Winnowing" << ( ( *it ) ? ( *it )->deviceNode() : QString( "<null device>" ) );
|
||||||
|
it = devices.erase( it );
|
||||||
|
|
||||||
|
}
|
||||||
|
else if ( writableOnly && (
|
||||||
|
hasRootPartition( *it ) ||
|
||||||
|
isIso9660( *it ) ||
|
||||||
|
isMounted( *it ) )
|
||||||
|
)
|
||||||
|
{
|
||||||
|
cDebug() << " .. Winnowing" << ( ( *it ) ? ( *it )->deviceNode() : QString( "<null device>" ) );
|
||||||
|
it = devices.erase( it );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
|
||||||
|
return devices;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace PartUtils
|
41
src/modules/partition/core/DeviceList.h
Normal file
41
src/modules/partition/core/DeviceList.h
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/* === This file is part of Calamares - <http://github.com/calamares> ===
|
||||||
|
*
|
||||||
|
* Copyright 2014-2017, Teo Mrnjavac <teo@kde.org>
|
||||||
|
* Copyright 2017, Adriaan de Groot <groot@kde.org>
|
||||||
|
*
|
||||||
|
* Calamares is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Calamares is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Calamares. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DEVICELIST_H
|
||||||
|
#define DEVICELIST_H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class Device;
|
||||||
|
|
||||||
|
namespace PartUtils
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Gets a list of storage devices.
|
||||||
|
* @param writableOnly if set to true, only devices which can be overwritten
|
||||||
|
* safely are returned (e.g. RO-media are ignored, as are mounted partitions).
|
||||||
|
* @return a list of Devices meeting this criterium.
|
||||||
|
*/
|
||||||
|
QList< Device* > getDevices( bool writableOnly = false );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // DEVICELIST_H
|
@ -328,96 +328,4 @@ runOsprober( PartitionCoreModule* core )
|
|||||||
return osproberEntries;
|
return osproberEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the given @p device contain the root filesystem? This is true if
|
|
||||||
* the device contains a partition which is currently mounted at / .
|
|
||||||
*/
|
|
||||||
static bool
|
|
||||||
hasRootPartition( Device* device )
|
|
||||||
{
|
|
||||||
for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it )
|
|
||||||
if ( ( *it )->mountPoint() == "/" )
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
isMounted( Device* device )
|
|
||||||
{
|
|
||||||
cDebug() << "Checking for mounted partitions in" << device->deviceNode();
|
|
||||||
for ( auto it = PartitionIterator::begin( device ); it != PartitionIterator::end( device ); ++it )
|
|
||||||
{
|
|
||||||
cDebug() << " .." << ( *it )->partitionPath() << "mount" << ( *it )->mountPoint();
|
|
||||||
if ( ! ( *it )->mountPoint().isEmpty() )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
isIso9660( const Device* device )
|
|
||||||
{
|
|
||||||
QString path = device->deviceNode();
|
|
||||||
if ( path.isEmpty() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
QProcess blkid;
|
|
||||||
blkid.start( "blkid", { path } );
|
|
||||||
blkid.waitForFinished();
|
|
||||||
QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() );
|
|
||||||
if ( output.contains( "iso9660" ) )
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if ( device->partitionTable() &&
|
|
||||||
!device->partitionTable()->children().isEmpty() )
|
|
||||||
{
|
|
||||||
for ( const Partition* partition : device->partitionTable()->children() )
|
|
||||||
{
|
|
||||||
path = partition->partitionPath();
|
|
||||||
blkid.start( "blkid", { path } );
|
|
||||||
blkid.waitForFinished();
|
|
||||||
QString output = QString::fromLocal8Bit( blkid.readAllStandardOutput() );
|
|
||||||
if ( output.contains( "iso9660" ) )
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QList< Device* > getDevices( bool writableOnly )
|
|
||||||
{
|
|
||||||
using DeviceList = QList< Device* >;
|
|
||||||
|
|
||||||
CoreBackend* backend = CoreBackendManager::self()->backend();
|
|
||||||
DeviceList devices = backend->scanDevices( true );
|
|
||||||
|
|
||||||
cDebug() << "Winnowing" << devices.count() << "devices.";
|
|
||||||
|
|
||||||
// Remove the device which contains / from the list
|
|
||||||
for ( DeviceList::iterator it = devices.begin(); it != devices.end(); )
|
|
||||||
if ( ! ( *it ) ||
|
|
||||||
( *it )->deviceNode().startsWith( "/dev/zram" )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
cDebug() << " .. Winnowing" << ( ( *it ) ? ( *it )->deviceNode() : QString( "<null device>" ) );
|
|
||||||
it = devices.erase( it );
|
|
||||||
|
|
||||||
}
|
|
||||||
else if ( writableOnly && (
|
|
||||||
hasRootPartition( *it ) ||
|
|
||||||
isIso9660( *it ) ||
|
|
||||||
isMounted( *it ) )
|
|
||||||
)
|
|
||||||
{
|
|
||||||
cDebug() << " .. Winnowing" << ( ( *it ) ? ( *it )->deviceNode() : QString( "<null device>" ) );
|
|
||||||
it = devices.erase( it );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
|
|
||||||
return devices;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // nmamespace PartUtils
|
} // nmamespace PartUtils
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
|
|
||||||
class Device;
|
|
||||||
class PartitionCoreModule;
|
class PartitionCoreModule;
|
||||||
class Partition;
|
class Partition;
|
||||||
|
|
||||||
@ -63,14 +62,6 @@ bool canBeResized( PartitionCoreModule* core, const QString& partitionPath );
|
|||||||
*/
|
*/
|
||||||
OsproberEntryList runOsprober( PartitionCoreModule* core );
|
OsproberEntryList runOsprober( PartitionCoreModule* core );
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Gets a list of storage devices.
|
|
||||||
* @param writableOnly if set to true, only devices which can be overwritten
|
|
||||||
* safely are returned (e.g. RO-media are ignored, as are mounted partitions).
|
|
||||||
* @return a list of Devices meeting this criterium.
|
|
||||||
*/
|
|
||||||
QList< Device* > getDevices( bool writableOnly = false );
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // PARTUTILS_H
|
#endif // PARTUTILS_H
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
#include "core/BootLoaderModel.h"
|
#include "core/BootLoaderModel.h"
|
||||||
#include "core/ColorUtils.h"
|
#include "core/ColorUtils.h"
|
||||||
|
#include "core/DeviceList.h"
|
||||||
#include "core/DeviceModel.h"
|
#include "core/DeviceModel.h"
|
||||||
#include "core/PartitionInfo.h"
|
#include "core/PartitionInfo.h"
|
||||||
#include "core/PartitionIterator.h"
|
#include "core/PartitionIterator.h"
|
||||||
|
Loading…
Reference in New Issue
Block a user