From f73535dba2c0ac1891da0ab81672d2a490d5d628 Mon Sep 17 00:00:00 2001 From: Andreas Loibl Date: Fri, 25 Mar 2011 04:19:48 +0100 Subject: added hdmap- and (initial) devicemapper-support to frontend --- backend/modules/hdmap | 9 ++++- backend/modules/partitions | 11 ++++++ mainwizard.cpp | 2 + mainwizard.h | 1 + wizard/hdmap.cpp | 97 ++++++++++++++++++++++++++++++++++++++++++++++ wizard/hdmap.h | 29 ++++++++++++++ wizard/hdmap.ui | 30 ++++++++++++++ wizard/rootpartition.cpp | 15 ++++++- wizard/rootpartition.h | 1 + wizard/rootpartition.ui | 3 -- 10 files changed, 191 insertions(+), 7 deletions(-) create mode 100644 wizard/hdmap.cpp create mode 100644 wizard/hdmap.h create mode 100644 wizard/hdmap.ui diff --git a/backend/modules/hdmap b/backend/modules/hdmap index 3056b93..ef669a3 100644 --- a/backend/modules/hdmap +++ b/backend/modules/hdmap @@ -339,8 +339,9 @@ function prepare_partitions_for_install() done <<<"$cfg_hdmap" } -function get_full_hd_map() +function fill_hdmap() { + cfg_set hdmap "$( ( echo "$cfg_hdmap" root_disk="$(get_disk "$(hdmap_get device of mountpoint /)")" @@ -360,6 +361,10 @@ function get_full_hd_map() echo "$part:/media/$(basename "$part")::auto" fi done - ) | sort -u -t: -k1,1 + for part in $(list_dm_partitions) + do + echo "$part:::" + done + ) | sort -u -t: -k1,1)" } diff --git a/backend/modules/partitions b/backend/modules/partitions index 0d59323..c869053 100644 --- a/backend/modules/partitions +++ b/backend/modules/partitions @@ -36,6 +36,17 @@ function list_all_partitions() awk -vli="$(awk '{if($2=="sd") print $1;}' /proc/devices)" 'BEGIN{m=split(li,list," ")}{for(i=1;i<=m;i++) if($1==list[i]&&$2%16!=0) print "/dev/"$4;}' /proc/partitions } +# Synopsis: list_dm_partitions +# +# This function lists all device-mapper partitions +# Output example: +# /dev/mapper/volg-home +# /dev/mapper/cryptoroot +function list_dm_partitions() +{ + ls /dev/mapper/* 2>/dev/null | fmt -w1 | grep -v "/control$" +} + # Synopsis: (e.g.) list_all_partitions | partitions_usage_details # # This function lists usage details for a list of partitions from STDIN diff --git a/mainwizard.cpp b/mainwizard.cpp index a54b98d..61b14a1 100644 --- a/mainwizard.cpp +++ b/mainwizard.cpp @@ -7,6 +7,7 @@ #include "wizard/partmansel.h" #include "wizard/partman.h" #include "wizard/rootpartition.h" +#include "wizard/hdmap.h" #include "wizard/bootloader.h" #include "wizard/rootpwd.h" #include "wizard/usercfg.h" @@ -30,6 +31,7 @@ MainWizard::MainWizard() setPage(Page_PartManSel, new wpPartManSel(this)); setPage(Page_PartMan, new wpPartMan(this)); setPage(Page_RootPartition, new wpRootPartition(this)); + setPage(Page_HdMap, new wpHdMap(this)); setPage(Page_Bootloader, new wpBootloader(this)); setPage(Page_RootPwd, new wpRootPwd(this)); setPage(Page_UserCfg, new wpUserCfg(this)); diff --git a/mainwizard.h b/mainwizard.h index 9fa9839..ec68de5 100644 --- a/mainwizard.h +++ b/mainwizard.h @@ -15,6 +15,7 @@ class MainWizard : public QWizard Page_PartManSel, Page_PartMan, Page_RootPartition, + Page_HdMap, Page_Bootloader, Page_RootPwd, Page_UserCfg, diff --git a/wizard/hdmap.cpp b/wizard/hdmap.cpp new file mode 100644 index 0000000..526ebef --- /dev/null +++ b/wizard/hdmap.cpp @@ -0,0 +1,97 @@ +#include +#include "hdmap.h" +#include "../listdelegate.h" +#include "../listitem.h" + +wpHdMap::wpHdMap(QWidget *parent) : QWizardPage(parent) +{ + setupUi(this); + backend = Backend::instance(); + connect(backend, SIGNAL(receivedDataLine(QString,QString)), this, SLOT(receivedDataLine(QString,QString))); + connect(backend, SIGNAL(finishedCommand(QString)), this, SLOT(backendFinishedCommand(QString))); + tableWidget->horizontalHeader()->setResizeMode(QHeaderView::Stretch); +} + +void wpHdMap::initializePage() +{ + clearPage(); +} + +void wpHdMap::clearPage() +{ + backend->exec("send_possible_root_filesystems"); + filesystems.clear(); + backend->exec("fill_hdmap"); + + tableWidget->setColumnCount(4); + tableWidget->setHorizontalHeaderLabels(QStringList() << tr("Partition") << tr("Mountpoint") << tr("Format with") << tr("Automount")); + +// tableWidget->horizontalHeader()->setResizeMode(1,QHeaderView::Stretch); +// tableWidget->horizontalHeader()->setResizeMode(2,QHeaderView::Stretch); +// tableWidget->horizontalHeader()->setResizeMode(3,QHeaderView::Stretch); +} + +void wpHdMap::receivedDataLine(QString data, QString line) +{ + if(data == "possible_root_filesystems") + { + filesystems << line.trimmed(); + } +} + +void wpHdMap::backendFinishedCommand(QString command) +{ + if(command == "fill_hdmap") + { + + QStringList hdmap = backend->cfg("hdmap").split("\n"); + + tableWidget->setRowCount(hdmap.count()); + for(int row = 0; row < hdmap.count(); row++) + { + QTableWidgetItem *partition = new QTableWidgetItem(hdmap.at(row).section(":",0,0)); + partition->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEnabled); + tableWidget->setItem(row, 0, partition); + QLineEdit *mountpoint = new QLineEdit(this); + mountpoint->setText(hdmap.at(row).section(":",1,1)); + tableWidget->setCellWidget(row, 1, mountpoint); + QComboBox *filesystem = new QComboBox(this); + filesystem->addItem(""); + filesystem->addItems(filesystems); + filesystem->setCurrentIndex(filesystems.indexOf(hdmap.at(row).section(":",2,2))+1); + tableWidget->setCellWidget(row, 2, filesystem); + QCheckBox *automount = new QCheckBox(this); + automount->setText(tr("mount on boot")); + if(hdmap.at(row).section(":",3,3) == "auto") automount->setChecked(true); else automount->setChecked(false); + tableWidget->setCellWidget(row, 3, automount); + } + } +} + +void wpHdMap::updateComplete() +{ + emit completeChanged(); +} + +bool wpHdMap::isComplete() const +{ +// if(!rootPartitionDev->currentItem()) return false; + return true; +} + +bool wpHdMap::validatePage() +{ + if(!isComplete()) return false; + QStringList* hdmap = new QStringList(); + for(int row = 0; row < tableWidget->rowCount(); row++) + { + hdmap->append(QString("%1:%2:%3:%4") + .arg(tableWidget->item(row,0)->text()) + .arg(qobject_cast(tableWidget->cellWidget(row,1))->text()) + .arg(qobject_cast(tableWidget->cellWidget(row,2))->currentText()) + .arg(qobject_cast(tableWidget->cellWidget(row,3))->isChecked() ? "auto" : "")); + } + backend->cfg("hdmap", hdmap->join("\n")); +// backend->exec(QString("hdmap_set %1").arg(hdmap->join("\n"))); + return true; +} diff --git a/wizard/hdmap.h b/wizard/hdmap.h new file mode 100644 index 0000000..306266c --- /dev/null +++ b/wizard/hdmap.h @@ -0,0 +1,29 @@ +#ifndef hdmap_H +#define hdmap_H + +#include "ui_hdmap.h" +#include "../backend.h" + +class wpHdMap : public QWizardPage, Ui::wpHdMap +{ + Q_OBJECT + + public: + wpHdMap(QWidget *parent = 0); + void initializePage(); + void clearPage(); + bool isComplete() const; + bool validatePage(); + + private: + Backend* backend; + QStringList filesystems; + + private slots: + void receivedDataLine(QString data, QString line); + void updateComplete(); + void backendFinishedCommand(QString command); + +}; + +#endif // hdmap_H diff --git a/wizard/hdmap.ui b/wizard/hdmap.ui new file mode 100644 index 0000000..ae01743 --- /dev/null +++ b/wizard/hdmap.ui @@ -0,0 +1,30 @@ + + + wpHdMap + + + + 0 + 0 + 400 + 300 + + + + WizardPage + + + Partitions + + + HD Map + + + + + + + + + + diff --git a/wizard/rootpartition.cpp b/wizard/rootpartition.cpp index 6341a0f..f60f5e8 100644 --- a/wizard/rootpartition.cpp +++ b/wizard/rootpartition.cpp @@ -2,6 +2,7 @@ #include "rootpartition.h" #include "../listdelegate.h" #include "../listitem.h" +#include "../mainwizard.h" wpRootPartition::wpRootPartition(QWidget *parent) : QWizardPage(parent) { @@ -9,6 +10,7 @@ wpRootPartition::wpRootPartition(QWidget *parent) : QWizardPage(parent) backend = Backend::instance(); connect(backend, SIGNAL(receivedDataLine(QString,QString)), this, SLOT(receivedDataLine(QString,QString))); connect(rootPartitionDev, SIGNAL(currentItemChanged(QListWidgetItem*,QListWidgetItem*)), this, SLOT(updateComplete())); + connect(chkAdvanced, SIGNAL(stateChanged(int)), this, SLOT(updateComplete())); } void wpRootPartition::initializePage() @@ -44,15 +46,24 @@ void wpRootPartition::updateComplete() bool wpRootPartition::isComplete() const { - if(!rootPartitionDev->currentItem()) return false; + if(!chkAdvanced->isChecked() && !rootPartitionDev->currentItem()) return false; return true; } bool wpRootPartition::validatePage() { if(!isComplete()) return false; - backend->exec(QString("hdmap_set %1:/:%2:auto") + if(rootPartitionDev->currentItem()) + backend->exec(QString("hdmap_set %1:/:%2:auto") .arg(rootPartitionDev->currentItem()->text().section(" ",0,0)) .arg(chkFormat->isChecked() ? rootPartitionFs->currentText() : "")); return true; } + +int wpRootPartition::nextId() const +{ + if(chkAdvanced->isChecked()) + return MainWizard::Page_HdMap; + else + return MainWizard::Page_Bootloader; +} diff --git a/wizard/rootpartition.h b/wizard/rootpartition.h index 16e95ef..393ec22 100644 --- a/wizard/rootpartition.h +++ b/wizard/rootpartition.h @@ -12,6 +12,7 @@ class wpRootPartition : public QWizardPage, Ui::wpRootPartition wpRootPartition(QWidget *parent = 0); void initializePage(); void clearPage(); + int nextId() const; bool isComplete() const; bool validatePage(); diff --git a/wizard/rootpartition.ui b/wizard/rootpartition.ui index 119c00f..f582e32 100644 --- a/wizard/rootpartition.ui +++ b/wizard/rootpartition.ui @@ -107,9 +107,6 @@ - - false - advanced partition options -- cgit v1.0