add a check when scanning devices if support for all file systems we found is

present. if not, show a messagebox with detailed information what is missing.

svn path=/trunk/extragear/sysadmin/partitionmanager/; revision=1128887
This commit is contained in:
Volker Lanz 2010-05-20 15:25:55 +00:00
parent 68ccea7ac2
commit e9871e0e82
37 changed files with 408 additions and 1 deletions

View File

@ -65,6 +65,28 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool btrfs::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
// m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool btrfs::supportToolName() const
{
return SupportTool("e2fsprogs", KUrl("http://e2fsprogs.sf.net"));
}
qint64 btrfs::maxCapacity() const
{
return Capacity::unitFactor(Capacity::Byte, Capacity::EiB);

View File

@ -65,6 +65,8 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -61,9 +61,31 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool ext2::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool ext2::supportToolName() const
{
return SupportTool("e2fsprogs", KUrl("http://e2fsprogs.sf.net"));
}
qint64 ext2::maxCapacity() const
{
return Capacity::unitFactor(Capacity::Byte, Capacity::EiB);
return Capacity::unitFactor(Capacity::Byte, Capacity::EiB);
}
qint64 ext2::readUsedCapacity(const QString& deviceNode) const

View File

@ -65,6 +65,8 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -54,6 +54,8 @@ namespace FS
virtual CommandSupportType supportShrink() const { return m_Shrink; }
virtual CommandSupportType supportMove() const { return m_Move; }
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_Create;
static CommandSupportType m_Grow;

View File

@ -69,6 +69,30 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool fat16::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool fat16::supportToolName() const
{
// also, dd for updating the UUID, but let's assume it's there ;-)
return SupportTool("dosfstools", KUrl("http://www.daniel-baumann.ch/software/dosfstools/"));
}
qint64 fat16::minCapacity() const
{
return 16 * Capacity::unitFactor(Capacity::Byte, Capacity::MiB);

View File

@ -65,6 +65,8 @@ namespace FS
virtual qint64 minCapacity() const;
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -355,3 +355,13 @@ FileSystem::Type FileSystem::defaultFileSystem()
{
return static_cast<FileSystem::Type>(Config::defaultFileSystem());
}
bool FileSystem::supportToolFound() const
{
return false;
}
FileSystem::SupportTool FileSystem::supportToolName() const
{
return SupportTool();
}

View File

@ -21,6 +21,8 @@
#define FILESYSTEM__H
#include <kurl.h>
#include <qglobal.h>
#include <QStringList>
#include <QString>
@ -41,6 +43,15 @@ class FileSystem
Q_DISABLE_COPY(FileSystem)
public:
class SupportTool
{
public:
SupportTool(const QString& n = QString(), const KUrl& u = KUrl()) : name(n), url(u) {}
const QString name;
const KUrl url;
};
/** Supported FileSystem types */
enum Type
{
@ -128,6 +139,9 @@ class FileSystem
virtual qint64 minCapacity() const;
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
virtual QString name() const;
virtual FileSystem::Type type() const { return m_Type; } /**< @return the FileSystem's type */

View File

@ -54,6 +54,29 @@ namespace FS
m_Backup = cmdSupportCore;
}
bool hfs::supportToolFound() const
{
return
// m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
// m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
// m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone;
// m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool hfs::supportToolName() const
{
return SupportTool("hfsutils", KUrl("http://www.mars.org/home/rob/proj/hfs/"));
}
qint64 hfs::maxCapacity() const
{
return 2 * Capacity::unitFactor(Capacity::Byte, Capacity::TiB);

View File

@ -57,6 +57,8 @@ namespace FS
virtual CommandSupportType supportBackup() const { return m_Backup; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -49,6 +49,28 @@ namespace FS
m_Backup = cmdSupportCore;
}
bool hfsplus::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
// m_GetLabel != cmdSupportNone &&
// m_SetLabel != cmdSupportNone &&
// m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
// m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone;
// m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool hfsplus::supportToolName() const
{
return SupportTool("hfsplus", KUrl());
}
qint64 hfsplus::maxCapacity() const
{
return Capacity::unitFactor(Capacity::Byte, Capacity::EiB);

View File

@ -54,6 +54,8 @@ namespace FS
virtual CommandSupportType supportBackup() const { return m_Backup; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -58,6 +58,7 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_GetUsed;

View File

@ -59,11 +59,38 @@ namespace FS
m_Backup = cmdSupportCore;
}
bool jfs::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone;
// m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool jfs::supportToolName() const
{
return SupportTool("jfsutils", KUrl("http://jfs.sourceforge.net/"));
}
qint64 jfs::minCapacity() const
{
return 16 * Capacity::unitFactor(Capacity::Byte, Capacity::MiB);
}
qint64 jfs::maxCapacity() const
{
return 32 * Capacity::unitFactor(Capacity::Byte, Capacity::PiB);
}
qint64 jfs::readUsedCapacity(const QString& deviceNode) const
{
ExternalCommand cmd("jfs_debugfs", QStringList() << deviceNode);

View File

@ -61,6 +61,9 @@ namespace FS
virtual CommandSupportType supportSetLabel() const { return m_SetLabel; }
virtual qint64 minCapacity() const;
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -48,6 +48,28 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool linuxswap::supportToolFound() const
{
return
// m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
// m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
// m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool linuxswap::supportToolName() const
{
return SupportTool("util-linux", KUrl("http://www.kernel.org/pub/linux/utils/util-linux-ng/"));
}
bool linuxswap::create(Report& report, const QString& deviceNode) const
{
ExternalCommand cmd(report, "mkswap", QStringList() << deviceNode);

View File

@ -66,6 +66,9 @@ namespace FS
virtual CommandSupportType supportSetLabel() const { return m_SetLabel; }
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_Create;
static CommandSupportType m_Grow;

View File

@ -58,6 +58,7 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_GetUsed;

View File

@ -68,6 +68,28 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool ntfs::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool ntfs::supportToolName() const
{
return SupportTool("ntfsprogs", KUrl("http://www.linux-ntfs.org/doku.php?id=ntfsprogs"));
}
qint64 ntfs::maxCapacity() const
{
return 256 * Capacity::unitFactor(Capacity::Byte, Capacity::TiB);

View File

@ -67,6 +67,8 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -68,6 +68,28 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool ocfs2::supportToolFound() const
{
return
// m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool ocfs2::supportToolName() const
{
return SupportTool("ocfs2-tools", KUrl("http://oss.oracle.com/projects/ocfs2-tools/"));
}
qint64 ocfs2::maxCapacity() const
{
return Capacity::unitFactor(Capacity::Byte, Capacity::EiB);

View File

@ -65,6 +65,8 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -50,6 +50,28 @@ namespace FS
m_Backup = cmdSupportCore;
}
bool reiser4::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
// m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
// m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone;
// m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool reiser4::supportToolName() const
{
return SupportTool("reiser4progs", KUrl("http://www.kernel.org/pub/linux/utils/fs/reiser4/reiser4progs/"));
}
qint64 reiser4::maxCapacity() const
{
// looks like it's actually unknown. see

View File

@ -57,6 +57,8 @@ namespace FS
virtual CommandSupportType supportBackup() const { return m_Backup; }
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -62,6 +62,28 @@ namespace FS
m_GetUUID = cmdSupportCore;
}
bool reiserfs::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone &&
m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool reiserfs::supportToolName() const
{
return SupportTool("reiserfsprogs", KUrl("http://www.kernel.org/pub/linux/utils/fs/reiserfs/"));
}
qint64 reiserfs::minCapacity() const
{
return 32 * Capacity::unitFactor(Capacity::Byte, Capacity::MiB);

View File

@ -68,6 +68,8 @@ namespace FS
virtual qint64 minCapacity() const;
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -46,6 +46,8 @@ namespace FS
virtual CommandSupportType supportCopy() const { return m_Copy; }
virtual CommandSupportType supportBackup() const { return m_Backup; }
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_Move;
static CommandSupportType m_Copy;

View File

@ -48,6 +48,8 @@ namespace FS
virtual CommandSupportType supportCreate() const { return m_Create; }
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_Create;
};

View File

@ -39,6 +39,7 @@ namespace FS
public:
static void init() {}
virtual bool supportToolFound() const { return true; }
};
}

View File

@ -62,11 +62,38 @@ namespace FS
m_Backup = cmdSupportCore;
}
bool xfs::supportToolFound() const
{
return
m_GetUsed != cmdSupportNone &&
m_GetLabel != cmdSupportNone &&
m_SetLabel != cmdSupportNone &&
m_Create != cmdSupportNone &&
m_Check != cmdSupportNone &&
// m_UpdateUUID != cmdSupportNone &&
m_Grow != cmdSupportNone &&
// m_Shrink != cmdSupportNone &&
m_Copy != cmdSupportNone &&
m_Move != cmdSupportNone &&
m_Backup != cmdSupportNone;
// m_GetUUID != cmdSupportNone;
}
FileSystem::SupportTool xfs::supportToolName() const
{
return SupportTool("xfsprogs", KUrl("http://oss.sgi.com/projects/xfs/"));
}
qint64 xfs::minCapacity() const
{
return 32 * Capacity::unitFactor(Capacity::Byte, Capacity::MiB);
}
qint64 xfs::maxCapacity() const
{
return 8 * Capacity::unitFactor(Capacity::Byte, Capacity::EiB);
}
qint64 xfs::readUsedCapacity(const QString& deviceNode) const
{
ExternalCommand cmd("xfs_db", QStringList() << "-c" << "sb 0" << "-c" << "print" << deviceNode);

View File

@ -62,6 +62,9 @@ namespace FS
virtual CommandSupportType supportSetLabel() const { return m_SetLabel; }
virtual qint64 minCapacity() const;
virtual qint64 maxCapacity() const;
virtual SupportTool supportToolName() const;
virtual bool supportToolFound() const;
public:
static CommandSupportType m_GetUsed;

View File

@ -58,6 +58,7 @@ namespace FS
virtual CommandSupportType supportGetUUID() const { return m_GetUUID; }
virtual qint64 maxCapacity() const;
virtual bool supportToolFound() const { return true; }
public:
static CommandSupportType m_GetUsed;

View File

@ -88,6 +88,8 @@ void FileSystemSupportDialog::setupDialog()
// if a file is an image of a supported or unsupported (or even invalid) filesystem
item->setIcon(i++, yes);
item->setText(i++, fs->supportToolName().name.isEmpty() ? "---" : fs->supportToolName().name);
dialogWidget().tree().addTopLevelItem(item);
}

View File

@ -120,6 +120,11 @@ Some file systems need external tools to be installed for them to be supported.
<string>Restore</string>
</property>
</column>
<column>
<property name="text">
<string>Support Tools</string>
</property>
</column>
</widget>
</item>
<item>

View File

@ -623,6 +623,7 @@ void MainWindow::on_m_DeviceScanner_finished()
listDevices().setSelectedDevice(operationStack().previewDevices()[0]->deviceNode());
updateSeletedDeviceMenu();
checkFileSystemSupport();
}
void MainWindow::updateSeletedDeviceMenu()
@ -1040,3 +1041,63 @@ void MainWindow::onPropertiesDevice(const QString&)
delete dlg;
}
}
static QStringList checkSupportInNode(const PartitionNode* parent)
{
QStringList rval;
foreach(const PartitionNode* node, parent->children())
{
const Partition* p = dynamic_cast<const Partition*>(node);
if (p == NULL)
continue;
if (node->children().size() > 0)
rval << checkSupportInNode(node);
if (!p->fileSystem().supportToolFound() && !p->fileSystem().supportToolName().name.isEmpty())
rval << QString("<tr>"
"<td>%1</td>"
"<td>%2</td>"
"<td>%3</td>"
"<td><a href=\"%4\">%4</a></td>"
"</tr>")
.arg(p->deviceNode())
.arg(p->fileSystem().name())
.arg(p->fileSystem().supportToolName().name)
.arg(p->fileSystem().supportToolName().url.prettyUrl());
}
return rval;
}
void MainWindow::checkFileSystemSupport()
{
QStringList supportList;
foreach(const Device* d, operationStack().previewDevices())
supportList << checkSupportInNode(d->partitionTable());
supportList.sort();
supportList.removeDuplicates();
if (!supportList.isEmpty())
KMessageBox::information(this,
i18nc("@info",
"<para>No support tools were found for file systems currently present on hard disks in this computer:</para>"
"<table style='margin-top:12px'>"
"<tr>"
"<td style='font-weight:bold;padding-right:12px;white-space:nowrap;'>Partition</td>"
"<td style='font-weight:bold;padding-right:12px;white-space:nowrap;'>File System</td>"
"<td style='font-weight:bold;padding-right:12px;white-space:nowrap;'>Support Tools</td>"
"<td style='font-weight:bold;padding-right:12px;white-space:nowrap;'>URL</td>"
"</tr>"
"%1"
"</table>"
"<para>As long as the support tools for these file systems are not installed you will not be able to modify them.</para>"
"<para>You should find packages with these support tools in your distribution's package manager.</para>",
supportList.join("\n")),
i18nc("@title:window", "Missing File System Support Packages"),
"showInformationOnMissingFileSystemSupport", KMessageBox::Notify | KMessageBox::AllowLink);
}

View File

@ -66,6 +66,7 @@ class LIBPARTITIONMANAGERPRIVATE_EXPORT MainWindow : public KXmlGuiWindow, publi
void saveConfig() const;
void updateWindowTitle();
void updateSeletedDeviceMenu();
void checkFileSystemSupport();
void enableActions();