From 9c89e3ada2dd30d683c44364e8eea5de757b74eb Mon Sep 17 00:00:00 2001 From: Sean Rhodes Date: Fri, 12 Nov 2021 08:54:50 +0000 Subject: [PATCH] util: Add coreboot-configurator A simple GUI to change settings in coreboot's CBFS, via the nvramtool utility. Test on the StarBook Mk IV running coreboot 4.15 with: * Ubuntu 20.04 * Ubuntu 21.10 * MX Linux 21 * elementary OS 6 * Manjaro 21 Signed-off-by: Sean Rhodes Change-Id: I491922bf55ed87c2339897099634a38f8d055876 Reviewed-on: https://review.coreboot.org/c/coreboot/+/59256 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth --- util/coreboot-configurator/README.md | 65 ++ .../images/StarLabs_Logo.png | Bin 0 -> 2958 bytes .../images/coreboot-configurator.gif | Bin 0 -> 121075 bytes util/coreboot-configurator/meson.build | 12 + util/coreboot-configurator/meson_options.txt | 12 + util/coreboot-configurator/src/README.md | 31 + .../src/application/AboutDialog.cpp | 21 + .../src/application/AboutDialog.h | 21 + .../src/application/AboutDialog.ui | 141 ++++ .../src/application/Configuration.cpp | 41 + .../src/application/Configuration.h | 18 + .../src/application/MainWindow.cpp | 388 +++++++++ .../src/application/MainWindow.h | 54 ++ .../src/application/MainWindow.ui | 118 +++ .../src/application/NvramToolCli.cpp | 120 +++ .../src/application/NvramToolCli.h | 21 + .../src/application/ToggleSwitch.cpp | 38 + .../src/application/ToggleSwitch.h | 39 + .../src/application/ToggleSwitch.svg.h | 78 ++ .../src/application/Util.h | 26 + .../src/application/lang.qrc | 3 + .../src/application/main.cpp | 20 + .../src/application/meson.build | 35 + .../src/application/qrc/categories.yaml | 119 +++ .../src/application/qrc/star.svg | 391 +++++++++ .../src/application/qrc/toggle-off.svg | 4 + .../src/application/qrc/toggle-on.svg | 65 ++ .../src/application/resources.qrc | 12 + util/coreboot-configurator/src/meson.build | 4 + .../resources/coreboot-configurator.desktop | 9 + .../src/resources/coreboot_configurator.svg | 748 ++++++++++++++++++ .../src/resources/meson.build | 43 + .../resources/org.coreboot.nvramtool.policy | 13 + .../src/resources/org.coreboot.reboot.policy | 12 + 34 files changed, 2722 insertions(+) create mode 100644 util/coreboot-configurator/README.md create mode 100644 util/coreboot-configurator/images/StarLabs_Logo.png create mode 100644 util/coreboot-configurator/images/coreboot-configurator.gif create mode 100644 util/coreboot-configurator/meson.build create mode 100644 util/coreboot-configurator/meson_options.txt create mode 100644 util/coreboot-configurator/src/README.md create mode 100644 util/coreboot-configurator/src/application/AboutDialog.cpp create mode 100644 util/coreboot-configurator/src/application/AboutDialog.h create mode 100644 util/coreboot-configurator/src/application/AboutDialog.ui create mode 100644 util/coreboot-configurator/src/application/Configuration.cpp create mode 100644 util/coreboot-configurator/src/application/Configuration.h create mode 100644 util/coreboot-configurator/src/application/MainWindow.cpp create mode 100644 util/coreboot-configurator/src/application/MainWindow.h create mode 100644 util/coreboot-configurator/src/application/MainWindow.ui create mode 100644 util/coreboot-configurator/src/application/NvramToolCli.cpp create mode 100644 util/coreboot-configurator/src/application/NvramToolCli.h create mode 100644 util/coreboot-configurator/src/application/ToggleSwitch.cpp create mode 100644 util/coreboot-configurator/src/application/ToggleSwitch.h create mode 100644 util/coreboot-configurator/src/application/ToggleSwitch.svg.h create mode 100644 util/coreboot-configurator/src/application/Util.h create mode 100644 util/coreboot-configurator/src/application/lang.qrc create mode 100644 util/coreboot-configurator/src/application/main.cpp create mode 100644 util/coreboot-configurator/src/application/meson.build create mode 100644 util/coreboot-configurator/src/application/qrc/categories.yaml create mode 100644 util/coreboot-configurator/src/application/qrc/star.svg create mode 100644 util/coreboot-configurator/src/application/qrc/toggle-off.svg create mode 100644 util/coreboot-configurator/src/application/qrc/toggle-on.svg create mode 100644 util/coreboot-configurator/src/application/resources.qrc create mode 100644 util/coreboot-configurator/src/meson.build create mode 100644 util/coreboot-configurator/src/resources/coreboot-configurator.desktop create mode 100644 util/coreboot-configurator/src/resources/coreboot_configurator.svg create mode 100644 util/coreboot-configurator/src/resources/meson.build create mode 100644 util/coreboot-configurator/src/resources/org.coreboot.nvramtool.policy create mode 100644 util/coreboot-configurator/src/resources/org.coreboot.reboot.policy diff --git a/util/coreboot-configurator/README.md b/util/coreboot-configurator/README.md new file mode 100644 index 0000000000..baf04903b2 --- /dev/null +++ b/util/coreboot-configurator/README.md @@ -0,0 +1,65 @@ +# coreboot-configurator ![alt text](images/StarLabs_Logo.png "Star Labs Systems") + +A simple GUI to change settings in coreboot's CBFS, via the nvramtool utility. + +![coreboot-configurator](images/coreboot-configurator.gif) +# How to install +## Ubuntu, Linux Mint, elementary OS, Zorin OS and other derivates +##### Install +``` +sudo add-apt-repository ppa:starlabs/coreboot +sudo apt update +sudo apt install coreboot-configurator +``` +##### Uninstall +``` +sudo apt purge coreboot-configurator +``` + +## Debian 11 +##### Install +``` +echo "deb http://ppa.launchpad.net/starlabs/ppa/ubuntu focal main" | sudo tee -a /etc/apt/sources.list.d/starlabs-ubuntu-ppa-focal.list +sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 17A20BAF70BEC3904545ACFF8F21C26C794386E3 +sudo apt update +sudo apt install coreboot-configurator +``` + +##### Uninstall +``` +sudo apt purge coreboot-configurator +``` + +## Manjaro +##### Install +``` +sudo pamac install coreboot-configurator +``` +##### Uninstall +``` +sudo pamac remove coreboot-configurator +``` + +## Other Distributions +##### Install +``` +git clone https://github.com/StarLabsLtd/coreboot-configurator.git +cd coreboot-configurator +meson build +ninja -C build install +``` +##### Uninstall +``` +sudo ninja -C uninstall +``` + +# Advanced Mode +Enabling advanced mode will all you to see all settings contained inside coreboot. Tread carefully :) + +## Copying or Reusing +Included scripts are free software licensed under the terms of the [GNU General Public License, version 2](https://www.gnu.org/licenses/gpl-2.0.txt). + +# [© Star Labs® / All Rights Reserved.](https://starlabs.systems) +Any issues or questions, please contact us at [support@starlabs.systems](mailto:supportstarlabs.systems) + +View our full range of Linux laptops at: [https://starlabs.systems](https://starlabs.systems) diff --git a/util/coreboot-configurator/images/StarLabs_Logo.png b/util/coreboot-configurator/images/StarLabs_Logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bea381b799ef77de99488ba0bea5fe4bf0509d67 GIT binary patch literal 2958 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 Ef;5$f<^TWy literal 0 HcmV?d00001 diff --git a/util/coreboot-configurator/images/coreboot-configurator.gif b/util/coreboot-configurator/images/coreboot-configurator.gif new file mode 100644 index 0000000000000000000000000000000000000000..64e0a2f44cec9e56dd50211bc62aa4c27d6241a1 GIT binary patch literal 121075 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
    JJ3Qx3Lnf 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 literal 0 HcmV?d00001 diff --git a/util/coreboot-configurator/meson.build b/util/coreboot-configurator/meson.build new file mode 100644 index 0000000000..b3175ccdba --- /dev/null +++ b/util/coreboot-configurator/meson.build @@ -0,0 +1,12 @@ +## SPDX-License-Identifier: GPL-2.0-only + +project('coreboot-configurator', + 'cpp', + version: '8', + license: ['GPL2', 'CC BY-SA 4.0'], + meson_version: '>= 0.53.0', + default_options: ['prefix=/usr', + 'cpp_std=c++14'], +) + +subdir('src') diff --git a/util/coreboot-configurator/meson_options.txt b/util/coreboot-configurator/meson_options.txt new file mode 100644 index 0000000000..2dedd74024 --- /dev/null +++ b/util/coreboot-configurator/meson_options.txt @@ -0,0 +1,12 @@ +## SPDX-License-Identifier: GPL-2.0-only + +option('sizes', + type: 'array', + choices: ['24', '48', '96', '16', '32', '64', '128', '256', '512'], + description: 'Choose icon size(s)', +) + +option('mock', + type : 'boolean', + value : false +) diff --git a/util/coreboot-configurator/src/README.md b/util/coreboot-configurator/src/README.md new file mode 100644 index 0000000000..e3386242a2 --- /dev/null +++ b/util/coreboot-configurator/src/README.md @@ -0,0 +1,31 @@ +# Categories ![alt text](images/StarLabs_Logo.png "Star Labs Systems") + +CMOS values should be added to [categories.yaml](src/application/categories.yaml]. + +This allows `coreboot-configurator` to display them in a relavant tab, with a nice +name and help text. Without this, they will still be visible in the **Raw** tab. + +An example entry is below: +``` +processor: + displayName: Processor + me_state: + displayName: Intel Management Engine + type: bool + help: Enable or disable the Intel Management Engine +``` + +To explain the options: +``` +**tabgroup**: <- This is the reference to the tab group + displayName: **Hello World** <- This is the name of the group that the user + will see + **setting_1**: <- This is the value that should match the CMOS + option. + displayName: **Hi World** <- This is the name of the option that the user + will see. + type: **bool** <- Valid type are: bool (checkbox) and enum + <- (dropdown). + help: **Greet the World** <- Help text that is displayed when hovering on the + option. +``` diff --git a/util/coreboot-configurator/src/application/AboutDialog.cpp b/util/coreboot-configurator/src/application/AboutDialog.cpp new file mode 100644 index 0000000000..8282e0c063 --- /dev/null +++ b/util/coreboot-configurator/src/application/AboutDialog.cpp @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include "AboutDialog.h" +#include "NvramToolCli.h" +#include "ui_AboutDialog.h" + +AboutDialog::AboutDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::AboutDialog) +{ + ui->setupUi(this); + + ui->logoLabel->setPixmap(QPixmap(":/images/star.svg")); + + ui->versionLabel->setText(""+NvramToolCli::version()+""); +} + +AboutDialog::~AboutDialog() +{ + delete ui; +} diff --git a/util/coreboot-configurator/src/application/AboutDialog.h b/util/coreboot-configurator/src/application/AboutDialog.h new file mode 100644 index 0000000000..7a3123335d --- /dev/null +++ b/util/coreboot-configurator/src/application/AboutDialog.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include + +namespace Ui { +class AboutDialog; +} + +class AboutDialog : public QDialog +{ + Q_OBJECT + +public: + explicit AboutDialog(QWidget *parent = nullptr); + ~AboutDialog(); + +private: + Ui::AboutDialog *ui; +}; diff --git a/util/coreboot-configurator/src/application/AboutDialog.ui b/util/coreboot-configurator/src/application/AboutDialog.ui new file mode 100644 index 0000000000..009acc24b9 --- /dev/null +++ b/util/coreboot-configurator/src/application/AboutDialog.ui @@ -0,0 +1,141 @@ + + + AboutDialog + + + + 0 + 0 + 412 + 273 + + + + About + + + + + + <html><head/><body><p><span style=" font-size:16pt; font-weight:600;">coreboot configurator</span></p></body></html> + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + <html><head/><body><p>A simple GUI to change settings in coreboot's CBFS, via the nvramtool utility.</p></body></html> + + + Qt::AlignCenter + + + true + + + + + + + + + + Qt::AlignCenter + + + + + + + + 0 + 0 + + + + <html><head/><body><p><a href="https://support.starlabs.systems"><span style=" text-decoration: underline; color:#0000ff;">starlabs.systems</span></a></p></body></html> + + + Qt::AlignCenter + + + true + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Ok + + + true + + + + + + + + + buttonBox + accepted() + AboutDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AboutDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/util/coreboot-configurator/src/application/Configuration.cpp b/util/coreboot-configurator/src/application/Configuration.cpp new file mode 100644 index 0000000000..9f383f83e2 --- /dev/null +++ b/util/coreboot-configurator/src/application/Configuration.cpp @@ -0,0 +1,41 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include + +#include "Configuration.h" +#include "Util.h" + +QMap Configuration::fromFile(const QString &curr_path) +{ + QFile curr_file(curr_path); + + if ( !curr_file.open(QFile::ReadOnly) + || !curr_file.isReadable() + || curr_file.atEnd()) { + return {}; + } + + auto result = Util::parseParameters(curr_file); + + curr_file.close(); + return result; +} + + +bool Configuration::toFile(const QString &curr_path, const Parameters ¶ms) +{ + QFile output(curr_path); + + if(!output.open(QFile::WriteOnly|QFile::Truncate)){ + return false; + } + QTextStream outStream(&output); + for(auto it = params.begin(); it != params.end(); ++it){ + outStream << it.key() << " = " << it.value() << "\n"; + } + + output.close(); + return true; +} diff --git a/util/coreboot-configurator/src/application/Configuration.h b/util/coreboot-configurator/src/application/Configuration.h new file mode 100644 index 0000000000..b2559d4960 --- /dev/null +++ b/util/coreboot-configurator/src/application/Configuration.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include +#include +#include +#include + + +namespace Configuration { + +using Parameters = QMap; + +Parameters fromFile(const QString& curr_path); +bool toFile(const QString& curr_path, const Parameters& params); + +} diff --git a/util/coreboot-configurator/src/application/MainWindow.cpp b/util/coreboot-configurator/src/application/MainWindow.cpp new file mode 100644 index 0000000000..d51937d161 --- /dev/null +++ b/util/coreboot-configurator/src/application/MainWindow.cpp @@ -0,0 +1,388 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include +#include + +#include "AboutDialog.h" +#include "Configuration.h" +#include "MainWindow.h" +#include "NvramToolCli.h" +#include "ToggleSwitch.h" +#include "ui_MainWindow.h" + +static auto s_errorWindowTitle = MainWindow::tr("Error Occured"); +static auto s_nvramErrorMessage = MainWindow::tr("Nvramtool was not able to access cmos settings. Look at documentation for possible causes of errors."); + +QString makeNvramErrorMessage(const QString& error){ + if(!error.trimmed().isEmpty()){ + return QString(MainWindow::tr("%1

    Error message:
    %2")).arg(s_nvramErrorMessage, + Qt::convertFromPlainText(error)); + } + return s_nvramErrorMessage; +} + +namespace YAML { +template <> +struct convert{ + static Node encode(const QString& rhs) { return Node(rhs.toUtf8().data()); } + + static bool decode(const Node& node, QString& rhs) { + if (!node.IsScalar()) + return false; + rhs = QString::fromStdString(node.Scalar()); + return true; + } +}; +} + +static auto s_metadataErrorMessage = MainWindow::tr("Can't load categories metadata file. Check your installation."); +static constexpr char s_sudoProg[] = "/usr/bin/pkexec"; + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + connect(ui->actionAbout, &QAction::triggered, this, [](){ + AboutDialog().exec(); + }); + +#if MOCK + this->setWindowTitle("coreboot configurator "+tr("[MOCKED DATA]")); +#else + this->setWindowTitle("coreboot configurator"); +#endif + this->setWindowIcon(QIcon::fromTheme("coreboot_configurator")); + + QFile catFile(":/config/categories.yaml"); + + if(!catFile.open(QFile::ReadOnly)){ + QMessageBox::critical(this, s_errorWindowTitle, s_metadataErrorMessage); + this->close(); + return; + } + + m_categories = YAML::Load(catFile.readAll()); + + if(m_categories.IsNull() || !m_categories.IsDefined()){ + QMessageBox::critical(this, s_errorWindowTitle, s_metadataErrorMessage); + this->close(); + return; + } + + QShortcut* returnAction = new QShortcut(QKeySequence("Ctrl+Return"), this); + connect(returnAction, &QShortcut::activated, this, &MainWindow::on_saveButton_clicked); + + generateUi(); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void MainWindow::pullSettings() +{ + QString error; + m_parameters = NvramToolCli::readParameters(&error); + + if(m_parameters.isEmpty()){ + QMessageBox::critical(this, s_errorWindowTitle, makeNvramErrorMessage(error)); + + /* we need delayed close as initialization error happened before event loop start so we can't stop application properly */ + QTimer::singleShot(0, this, &MainWindow::close); + } +} + +void MainWindow::pushSettings() +{ + QString error; + if(!NvramToolCli::writeParameters(m_parameters, &error)){ + QMessageBox::critical(this, s_errorWindowTitle, makeNvramErrorMessage(error)); + } +} + + +QComboBox* MainWindow::createComboBox(const QString& key) { + auto box = new QComboBox(this); + + auto opts = NvramToolCli::readOptions(key); + + box->addItems(opts); + box->setCurrentText(m_parameters[key]); + + connect(ui->advancedModeCheckBox, &QCheckBox::clicked, this, [box](bool clicked){ + box->setEditable(clicked); + }); + + connect(this, &MainWindow::updateValue, this, [box, this, key](const QString& name){ + if(key!=name || m_parameters[name]==box->currentText()){ + return; + } + box->setCurrentText(m_parameters[name]); + }); + + connect(box, &QComboBox::currentTextChanged, this, [key, this](const QString& value){ + if(value==m_parameters[key]){ + return; + } + m_parameters[key] = value; + emit updateValue(key); + }); + + return box; +} +QString boolToString(bool value){ + return value?QStringLiteral("Enable"):QStringLiteral("Disable"); +} +bool stringToBool(const QString& str){ + return str==QStringLiteral("Enable"); +} +QCheckBox* MainWindow::createCheckBox(const QString& key) { + auto box = new ToggleSwitch(this); + + box->setChecked(stringToBool(m_parameters[key])); + + connect(this, &MainWindow::updateValue, this, [box, this, key](const QString& name){ + + if(key!=name || m_parameters[name]==boolToString(box->isChecked())){ + return; + } + auto newValue = stringToBool(m_parameters[name]); + + box->setChecked(newValue); + }); + + connect(box, &QCheckBox::clicked, this, [key, this](bool checked){ + auto value = boolToString(checked); + if(value==m_parameters[key]){ + return; + } + m_parameters[key] = value; + emit updateValue(key); + }); + + return box; +} + + +QTableWidget *MainWindow::createRawTable() +{ + /* Create Raw values table */ + auto table = new QTableWidget(m_parameters.size(), 2); + table->setHorizontalHeaderLabels({tr("Key"), tr("Value")}); + table->horizontalHeader()->setSectionResizeMode(0,QHeaderView::Stretch); + table->verticalHeader()->hide(); + table->setSelectionBehavior(QTableWidget::SelectRows); + + connect(table, &QTableWidget::cellChanged, this, [table, this](int row, int column){ + if(column != 1 || row >= table->rowCount() || row < 0 ){ + /* Weird state when changed cell is not a value cell */ + return; + } + auto keyItem = table->item(row, 0); + auto valueItem = table->item(row, 1); + + if(keyItem == nullptr || valueItem == nullptr){ + /* Invalid cells */ + return; + } + + if(valueItem->text()==m_parameters[keyItem->text()]){ + return; + } + + m_parameters[keyItem->text()] = valueItem->text(); + emit updateValue(keyItem->text()); + }); + + auto it = m_parameters.begin(); + for(int i = 0; isetFlags(item->flags() ^ Qt::ItemIsEditable); + table->setItem(i,0,item); + + item = new QTableWidgetItem(it.value()); + connect(this, &MainWindow::updateValue, this, [item, it, this](const QString& name){ + if(it.key()!=name || m_parameters[name]==item->text()){ + return; + } + item->setText(m_parameters[name]); + }); + + table->setItem(i,1,item); + } + return table; +} + +void MainWindow::generateUi() +{ + pullSettings(); + + if(!m_categories.IsMap()){ + return; + } + for(const auto& category : m_categories){ + if(!category.second.IsMap()){ + continue; + } + auto name = category.second["displayName"].as(); + + auto layout = new QVBoxLayout; + + auto tabPage = new QWidget(this); + tabPage->setLayout(layout); + + ui->centralTabWidget->addTab(tabPage, name); + + for(const auto& value : category.second){ + if(!value.second.IsMap() || !m_parameters.contains(value.first.as())){ + continue; + } + auto displayName = value.second["displayName"]; + if(!displayName.IsDefined()){ + continue; + } + auto type = value.second["type"]; + if(!type.IsDefined()){ + continue; + } + + auto controlLayout = new QHBoxLayout(); + + auto help = value.second["help"]; + + if(help.IsDefined()){ + auto labelWithTooltip = new QWidget; + labelWithTooltip->setToolTip(help.as()); + labelWithTooltip->setCursor({Qt::WhatsThisCursor}); + labelWithTooltip->setLayout(new QHBoxLayout); + + auto helpButton = new QLabel(); + helpButton->setPixmap(QIcon::fromTheme("help-hint").pixmap(16,16)); + + { + auto layout = qobject_cast(labelWithTooltip->layout()); + layout->addWidget(new QLabel(displayName.as())); + layout->addWidget(helpButton,1); + } + controlLayout->addWidget(labelWithTooltip, 0); + } else { + controlLayout->addWidget(new QLabel(displayName.as()), 0); + } + + controlLayout->addStretch(1); + + QWidget* res = nullptr; + + if(type.as() == QStringLiteral("bool")){ + res = createCheckBox(value.first.as()); + } else if (type.as() == QStringLiteral("enum")){ + res = createComboBox(value.first.as()); + } else { + controlLayout->deleteLater(); + continue; + } + res->setObjectName(value.first.as()); + + controlLayout->addWidget(res, 0); + + layout->addLayout(controlLayout); + } + } + + auto table = createRawTable(); + + connect(ui->advancedModeCheckBox, &QCheckBox::clicked, this, [table,this](bool clicked){ + if(clicked && ui->centralTabWidget->widget(ui->centralTabWidget->count()-1) != table){ + ui->centralTabWidget->addTab(table, tr("Raw")); + } else if(!clicked && ui->centralTabWidget->widget(ui->centralTabWidget->count()-1) == table) { + ui->centralTabWidget->removeTab(ui->centralTabWidget->count()-1); + } + }); +} + +void MainWindow::askForReboot() +{ + QMessageBox rebootDialog(QMessageBox::Question, + tr("Reboot"), + tr("Changes are saved. Do you want to reboot to apply changes?")); + + auto nowButton = rebootDialog.addButton(tr("Reboot now"), QMessageBox::AcceptRole); + rebootDialog.addButton(tr("Reboot later"), QMessageBox::RejectRole); + + rebootDialog.exec(); + if(rebootDialog.clickedButton()==nowButton){ + QProcess::startDetached(s_sudoProg, {"/usr/bin/systemctl", "reboot"}); + this->close(); + } +} + +void MainWindow::readSettings(const QString &fileName) +{ + if(fileName.isEmpty()){ + return; + } + + auto configValues = Configuration::fromFile(fileName); + + for(auto it = configValues.begin(); it != configValues.end(); ++it){ + if(!m_parameters.contains(it.key())){ + continue; + } + m_parameters[it.key()]=it.value(); + emit updateValue(it.key()); + } +} + +void MainWindow::writeSettings(const QString &fileName) +{ + if(fileName.isEmpty()){ + return; + } + if(!Configuration::toFile(fileName, m_parameters)){ + QMessageBox::critical(this, tr("Error Occured"), tr("Can't open file to write")); + this->close(); + } +} + + +void MainWindow::on_actionSave_triggered() +{ + auto filename = QFileDialog::getSaveFileName(this, + tr("Select File To Save"), + QDir::homePath(), + tr("Coreboot Configuration Files")+"(*.cfg)"); + writeSettings(filename); +} + + +void MainWindow::on_actionLoad_triggered() +{ + auto filename = QFileDialog::getOpenFileName(this, + tr("Select File To Load"), + QDir::homePath(), + tr("Coreboot Configuration Files")+"(*.cfg)"); + + readSettings(filename); +} + + +void MainWindow::on_saveButton_clicked() +{ + ui->centralwidget->setEnabled(false); + ui->menubar->setEnabled(false); + + pushSettings(); + + askForReboot(); + + ui->centralwidget->setEnabled(true); + ui->menubar->setEnabled(true); +} diff --git a/util/coreboot-configurator/src/application/MainWindow.h b/util/coreboot-configurator/src/application/MainWindow.h new file mode 100644 index 0000000000..bf317a814f --- /dev/null +++ b/util/coreboot-configurator/src/application/MainWindow.h @@ -0,0 +1,54 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include +#include +#include +#include +#include +#include +#include + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + +signals: + void updateValue(const QString& key); + +private slots: + void on_actionSave_triggered(void); + + void on_actionLoad_triggered(void); + + void on_saveButton_clicked(void); + +private: + void pullSettings(void); + void pushSettings(void); + + void generateUi(void); + void askForReboot(void); + + void readSettings(const QString& fileName); + void writeSettings(const QString& fileName); + + Configuration::Parameters m_parameters; + YAML::Node m_categories; + + Ui::MainWindow *ui; + + QComboBox *createComboBox(const QString &key); + QCheckBox *createCheckBox(const QString &key); + + QTableWidget *createRawTable(); +}; diff --git a/util/coreboot-configurator/src/application/MainWindow.ui b/util/coreboot-configurator/src/application/MainWindow.ui new file mode 100644 index 0000000000..0f59d80585 --- /dev/null +++ b/util/coreboot-configurator/src/application/MainWindow.ui @@ -0,0 +1,118 @@ + + + MainWindow + + + + 0 + 0 + 600 + 400 + + + + + 0 + 0 + + + + + 600 + 400 + + + + + 600 + 400 + + + + coreboot configurator + + + + + + + + + + + + Advanced mode + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Save + + + + + + + + + + + + + + 0 + 0 + 600 + 25 + + + + + File + + + + + + + Help + + + + + + + + + Save to File... + + + + + Load from File... + + + + + About... + + + + + + diff --git a/util/coreboot-configurator/src/application/NvramToolCli.cpp b/util/coreboot-configurator/src/application/NvramToolCli.cpp new file mode 100644 index 0000000000..da844a043b --- /dev/null +++ b/util/coreboot-configurator/src/application/NvramToolCli.cpp @@ -0,0 +1,120 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +#include "NvramToolCli.h" +#include "Util.h" + +static constexpr char s_sudoProg[] = "/usr/bin/pkexec"; +static constexpr char s_nvramToolProg[] = "/usr/sbin/nvramtool"; + +#if MOCK + +QMap NvramToolCli::readParameters(QString *error) { + return QMap({ + {"boot_option","Normal"}, + {"reboot_counter","0x0"}, + {"debug_level","Spew"}, + {"vtd","Enable"}, + {"power_profile","Performance"}, + {"wireless","Enable"}, + {"webcam","Enable"}, + {"microphone","Enable"}, + {"legacy_8254_timer","Enable"}, + {"usb_always_on","Disable"}, + {"kbl_timeout","Never"}, + {"fn_ctrl_swap","Enable"}, + {"max_charge","100%"}, + {"power_on_after_fail","Disable"}, + {"fn_lock_state","0x2"}, + {"trackpad_state","0x40"}, + {"kbl_brightness","0xc4"}, + {"kbl_state","0x22"} + }); +} + +QStringList NvramToolCli::readOptions(const QString ¶meter, QString *error){ + return (parameter=="power_profile")? + QStringList{ + "Power Saver","Balanced","Performance" + } : QStringList{}; +} + +#else + +QMap NvramToolCli::readParameters(QString *error) +{ + QProcess nvramtoolProcess; + nvramtoolProcess.start(s_sudoProg, {s_nvramToolProg, "-a"}); + + nvramtoolProcess.waitForFinished(); + + if(error) *error = nvramtoolProcess.readAllStandardError(); + + if(nvramtoolProcess.exitCode() != 0){ + return {}; + } + + return Util::parseParameters(nvramtoolProcess); +} + +QStringList NvramToolCli::readOptions(const QString ¶meter, QString *error) +{ + QStringList result; + + QProcess nvramtoolProcess; + nvramtoolProcess.start(s_sudoProg, {s_nvramToolProg, "-e", parameter}); + nvramtoolProcess.waitForFinished(); + + if(error) *error = nvramtoolProcess.readAllStandardError(); + + while (nvramtoolProcess.canReadLine()) { + result.append(nvramtoolProcess.readLine().trimmed()); + } + + return result; +} +#endif + +bool NvramToolCli::writeParameters(const QMap ¶meters, QString *error) +{ + +#if MOCK + QTextStream outStream(stdout); +#else + QProcess nvramtoolProcess; + nvramtoolProcess.start(s_sudoProg, {s_nvramToolProg, "-i"}); + nvramtoolProcess.waitForStarted(); + QTextStream outStream(&nvramtoolProcess); +#endif + for(auto it = parameters.begin(); it != parameters.end(); ++it){ + outStream << it.key() << " = " << it.value() << "\n"; + } + + outStream.flush(); +#if MOCK + return true; +#else + nvramtoolProcess.closeWriteChannel(); + nvramtoolProcess.waitForFinished(); + + if(error){ + *error = nvramtoolProcess.readAllStandardError(); + } + + return nvramtoolProcess.exitCode()==0; +#endif +} + + + +QString NvramToolCli::version() +{ + QProcess nvramtoolProcess; + nvramtoolProcess.start(s_nvramToolProg, {"-v"}); + + nvramtoolProcess.waitForFinished(); + + return nvramtoolProcess.readAll(); +} diff --git a/util/coreboot-configurator/src/application/NvramToolCli.h b/util/coreboot-configurator/src/application/NvramToolCli.h new file mode 100644 index 0000000000..3bb5d0a6ea --- /dev/null +++ b/util/coreboot-configurator/src/application/NvramToolCli.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include +#include +#include + +#include "Configuration.h" + +/* + * Namespace for convinient functions to work with nvramtool CLI utility + */ +namespace NvramToolCli { + +Configuration::Parameters readParameters(QString* error = nullptr); +QStringList readOptions(const QString& parameter, QString* error = nullptr); +bool writeParameters(const Configuration::Parameters& parameters, QString* error = nullptr); +QString version(); + +} diff --git a/util/coreboot-configurator/src/application/ToggleSwitch.cpp b/util/coreboot-configurator/src/application/ToggleSwitch.cpp new file mode 100644 index 0000000000..b0a399e01c --- /dev/null +++ b/util/coreboot-configurator/src/application/ToggleSwitch.cpp @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include +#include +#include +#include + +#include "ToggleSwitch.h" +#include "ToggleSwitch.svg.h" + +const QByteArray ToggleSwitch::s_toggleOffSvgContent = ToggleSwitchSVG::s_toggledOffContent; +const QByteArray ToggleSwitch::s_toggleOnSvgContent = ToggleSwitchSVG::s_toggledOnContent; +const int ToggleSwitch::s_colorPosInToggleOn = ToggleSwitch::s_toggleOnSvgContent.indexOf("#1a73e8"); + +ToggleSwitch::ToggleSwitch(QWidget *parent) : QCheckBox(parent){ + + setFixedWidth(50); + setFixedHeight(width()/2); + + m_toggleOnSvgContentColored = s_toggleOnSvgContent; +} + +void ToggleSwitch::paintEvent(QPaintEvent *event){ + QPainter p(this); + + if(isChecked()){ + auto accent = palette().highlight().color(); + m_toggleOnSvgContentColored = m_toggleOnSvgContentColored.replace(s_colorPosInToggleOn, 7, accent.name().toLatin1()); + + m_svgr.load(m_toggleOnSvgContentColored); + } else { + m_svgr.load(s_toggleOffSvgContent); + } + + m_svgr.render(&p, this->rect()); + p.end(); +} diff --git a/util/coreboot-configurator/src/application/ToggleSwitch.h b/util/coreboot-configurator/src/application/ToggleSwitch.h new file mode 100644 index 0000000000..191dc5ef96 --- /dev/null +++ b/util/coreboot-configurator/src/application/ToggleSwitch.h @@ -0,0 +1,39 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include +#include +#include +#include + + +/* + * The ToggleSwitch class represents Toggle Switch widget based on QCheckBox and toggles svg with colorscheme support + */ +class ToggleSwitch : public QCheckBox { + Q_OBJECT +public: + explicit ToggleSwitch(QWidget* parent = nullptr); + +private: + QSvgRenderer m_svgr; + + static const QByteArray s_toggleOnSvgContent; + static const QByteArray s_toggleOffSvgContent; + static const int s_colorPosInToggleOn; + + QByteArray m_toggleOnSvgContentColored; + + /* QWidget interface */ +protected: + void paintEvent(QPaintEvent *event) override; + + /* QAbstractButton interface */ +protected: + bool hitButton(const QPoint &pos) const override + { + /* needs to be clickable on */ + return rect().contains(pos); + } +}; diff --git a/util/coreboot-configurator/src/application/ToggleSwitch.svg.h b/util/coreboot-configurator/src/application/ToggleSwitch.svg.h new file mode 100644 index 0000000000..4aeb12b122 --- /dev/null +++ b/util/coreboot-configurator/src/application/ToggleSwitch.svg.h @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +/* Embed SVG files into code as debian packages does weird things when svgs are included as qrc */ +namespace ToggleSwitchSVG { +static constexpr char s_toggledOnContent[] = + "\n" + "\n" + " \n" + " \n" + " \n" + " image/svg+xml\n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + " \n" + "\n"; +static constexpr char s_toggledOffContent[] = + "\n" + " \n" + " \n" + ""; +} diff --git a/util/coreboot-configurator/src/application/Util.h b/util/coreboot-configurator/src/application/Util.h new file mode 100644 index 0000000000..55553f2981 --- /dev/null +++ b/util/coreboot-configurator/src/application/Util.h @@ -0,0 +1,26 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#pragma once + +#include +#include +#include + +namespace Util { + inline QMap parseParameters(QIODevice& dev){ + QString curr_line; + QMap result; + + while (!dev.atEnd()) { + curr_line = dev.readLine().trimmed(); + + auto split = curr_line.split('='); + if(split.size()!=2){ + continue; + } + + result.insert(split[0].trimmed(), split[1].trimmed()); + } + return result; + } +} diff --git a/util/coreboot-configurator/src/application/lang.qrc b/util/coreboot-configurator/src/application/lang.qrc new file mode 100644 index 0000000000..e25d9df240 --- /dev/null +++ b/util/coreboot-configurator/src/application/lang.qrc @@ -0,0 +1,3 @@ + + + diff --git a/util/coreboot-configurator/src/application/main.cpp b/util/coreboot-configurator/src/application/main.cpp new file mode 100644 index 0000000000..94b10d9fff --- /dev/null +++ b/util/coreboot-configurator/src/application/main.cpp @@ -0,0 +1,20 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +#include "MainWindow.h" + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + + QTranslator translator; + if (translator.load(QLocale(), QLatin1String("corebootconfigurator"), QLatin1String("_"), QLatin1String(":/lang/i18n"))){ + a.installTranslator(&translator); + } + + MainWindow w; + w.show(); + return a.exec(); +} diff --git a/util/coreboot-configurator/src/application/meson.build b/util/coreboot-configurator/src/application/meson.build new file mode 100644 index 0000000000..cb9b50e8d1 --- /dev/null +++ b/util/coreboot-configurator/src/application/meson.build @@ -0,0 +1,35 @@ +## SPDX-License-Identifier: GPL-2.0-only + +# Documentation: https://mesonbuild.com/Qt5-module.html +qt5 = import('qt5') +qt5_dep = dependency('qt5', modules : ['Core', 'Widgets', 'Svg']) +yamlcpp_dep = dependency('yaml-cpp', version: '>= 0.5.1', required: true) + +# TODO: Translations +# lang_cpp = qt5.compile_translations(qresource: 'lang.qrc') + +generated_files = qt5.preprocess( + moc_headers : ['MainWindow.h', 'AboutDialog.h', 'ToggleSwitch.h'], + ui_files : ['MainWindow.ui', 'AboutDialog.ui'], + dependencies : [qt5_dep], + qresources : ['resources.qrc'], +) + +mock = get_option('mock') + +if mock + add_project_arguments('-DMOCK', language : 'cpp') +endif + +executable('coreboot-configurator', + 'main.cpp', + 'MainWindow.cpp', + 'AboutDialog.cpp', + 'Configuration.cpp', + 'ToggleSwitch.cpp', + 'NvramToolCli.cpp', +# lang_cpp, + generated_files, + dependencies : [qt5_dep, yamlcpp_dep], + install : true +) diff --git a/util/coreboot-configurator/src/application/qrc/categories.yaml b/util/coreboot-configurator/src/application/qrc/categories.yaml new file mode 100644 index 0000000000..21419511fe --- /dev/null +++ b/util/coreboot-configurator/src/application/qrc/categories.yaml @@ -0,0 +1,119 @@ + processor: + displayName: Processor + hyper_threading: + displayName: Hyper-Threading + type: bool + help: Enable or disable Hyper-Threading + vtd: + displayName: Intel VT-d + type: bool + help: Enable or disable Intel VT-d (virtualisation) + power_profile: + displayName: Power Profile + type: enum + help: Select whether to maximise performance, battery life or both + me_state: + displayName: Intel Management Engine + type: bool + help: Enable or disable the Intel Management Engine + + devices: + displayName: Devices + wireless: + displayName: Wireless + type: bool + help: Enable or disable the built-in wireless card + wlan: + displayName: Wireless + type: bool + help: Enable or disable the built-in wireless card + bluetooth: + displayName: Bluetooth + type: bool + help: Enable or disable the built-in bluetooth + wwan: + displayName: Mobile Network + type: bool + help: Enable or disable the built-in mobile network + ethernet1: + displayName: Ethernet 1 + type: bool + help: Enable or disable the built-in Ethernet Port 1 + ethernet2: + displayName: Ethernet 2 + type: bool + help: Enable or disable the built-in Ethernet Port 2 + ethernet3: + displayName: Ethernet 3 + type: bool + help: Enable or disable the built-in Ethernet Port 3 + webcam: + displayName: Webcam + type: bool + help: Enable or disable the built-in webcam + microphone: + displayName: Microphone + type: bool + help: Enable or disable the built-in microphone + legacy_8254_timer: + displayName: Clock Gating + type: bool + help: Enable or disable the legacy 8254 timer. Reduces power consumption when enabled but must be disabled for certain distributions such as Qubes + usb_always_on: + displayName: USB Always On + type: bool + help: Allow the USB ports to provide power to connected devices when the computer is suspended + touchpad: + displayName: Touchpad + type: bool + help: Enable or disable the built-in touchpad + trackpoint: + displayName: Trackpoint + type: bool + help: Enable or disable the built-in trackpoint + sata_mode: + displayName: SATA Mode + type: enum + help: Set the mode of the SATA controller from AHCI or Compatible + thunderbolt: + displayName: Thunderbolt + type: bool + help: Enable or disable Thunderbolt functionality + + system: + displayName: System + kbl_timeout: + displayName: Keyboard Backlight Timeout + type: enum + help: Adjust the amout of time before the keyboard backlight turns off when un-used + fn_ctrl_swap: + displayName: Fn Ctrl Reverse + type: bool + help: Swap the functions of the [Fn] and [Ctrl] keys + max_charge: + displayName: Max Charge + type: enum + help: Set the maximum level the battery will charge to + fan_mode: + displayName: Fan Mode + type: enum + help: Adjust the fan curve to priotise performance or noise levels + f1_to_f12_as_primary: + displayName: Function Lock + type: bool + help: Make the F-keys behave as if you are holding down the Fn key + + advanced: + displayName: Advanced + boot_option: + displayName: Boot Options + type: enum + help: Change the boot device in the event of a failed boot + debug_level: + displayName: Debug Level + type: enum + help: Set the verbosity of the debug output + power_on_after_fail: + displayName: Power on Behaviour + type: enum + help: Select whether to power on in the event of a power failure diff --git a/util/coreboot-configurator/src/application/qrc/star.svg b/util/coreboot-configurator/src/application/qrc/star.svg new file mode 100644 index 0000000000..3bb9802ff5 --- /dev/null +++ b/util/coreboot-configurator/src/application/qrc/star.svg @@ -0,0 +1,391 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/util/coreboot-configurator/src/application/qrc/toggle-off.svg b/util/coreboot-configurator/src/application/qrc/toggle-off.svg new file mode 100644 index 0000000000..504ea58c5f --- /dev/null +++ b/util/coreboot-configurator/src/application/qrc/toggle-off.svg @@ -0,0 +1,4 @@ + + + + diff --git a/util/coreboot-configurator/src/application/qrc/toggle-on.svg b/util/coreboot-configurator/src/application/qrc/toggle-on.svg new file mode 100644 index 0000000000..0b8e61848c --- /dev/null +++ b/util/coreboot-configurator/src/application/qrc/toggle-on.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/util/coreboot-configurator/src/application/resources.qrc b/util/coreboot-configurator/src/application/resources.qrc new file mode 100644 index 0000000000..06264d63d1 --- /dev/null +++ b/util/coreboot-configurator/src/application/resources.qrc @@ -0,0 +1,12 @@ + + + qrc/toggle-off.svg + qrc/toggle-on.svg + + + qrc/categories.yaml + + + qrc/star.svg + + diff --git a/util/coreboot-configurator/src/meson.build b/util/coreboot-configurator/src/meson.build new file mode 100644 index 0000000000..cb73f0818b --- /dev/null +++ b/util/coreboot-configurator/src/meson.build @@ -0,0 +1,4 @@ +## SPDX-License-Identifier: GPL-2.0-only + +subdir('application') +subdir('resources') diff --git a/util/coreboot-configurator/src/resources/coreboot-configurator.desktop b/util/coreboot-configurator/src/resources/coreboot-configurator.desktop new file mode 100644 index 0000000000..5f17d000e4 --- /dev/null +++ b/util/coreboot-configurator/src/resources/coreboot-configurator.desktop @@ -0,0 +1,9 @@ +[Desktop Entry] +Name=coreboot configurator +StartupWMCLass=coreboot_configurator +Exec=/usr/bin/coreboot-configurator +Icon=coreboot-configurator.png +Type=Application +Categories=Settings;System +Comment=A graphical interface to set options on devices with coreboot firmware. +Keywords=coreboot;BIOS;Firmware;uefi; diff --git a/util/coreboot-configurator/src/resources/coreboot_configurator.svg b/util/coreboot-configurator/src/resources/coreboot_configurator.svg new file mode 100644 index 0000000000..33a7229891 --- /dev/null +++ b/util/coreboot-configurator/src/resources/coreboot_configurator.svg @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/util/coreboot-configurator/src/resources/meson.build b/util/coreboot-configurator/src/resources/meson.build new file mode 100644 index 0000000000..12270ab14e --- /dev/null +++ b/util/coreboot-configurator/src/resources/meson.build @@ -0,0 +1,43 @@ +## SPDX-License-Identifier: GPL-2.0-only + +# Polkit Files +polkit_dir = join_paths(get_option('datadir'), 'polkit-1', 'actions') +polkit_sources = [ + 'org.coreboot.nvramtool.policy', + 'org.coreboot.reboot.policy', +] + +install_data(polkit_sources, + install_dir: polkit_dir) + +# Desktop Entry +desktop_dir = join_paths(get_option('datadir'), 'applications') +desktop_sources = [ + 'coreboot-configurator.desktop', +] + +install_data(desktop_sources, + install_dir: desktop_dir) + +# Icon +inkscape = find_program('inkscape') +icon_dir = join_paths(get_option('datadir'),'icons', 'hicolor') +foreach size: get_option('sizes') + target_temp_name = '@0@'.format(size) + dpi=size.to_int() * 2 + png = configure_file( + input: 'coreboot_configurator.svg', + output: target_temp_name + '.png', + command: [ + inkscape, + '--export-height=@0@'.format(size), + '--export-width=@0@'.format(size), + '--export-png=@OUTPUT@', + '@INPUT@', + ] + ) + + install_data(png, + rename: meson.project_name() + '.png', + install_dir: join_paths(icon_dir, '@0@x@1@'.format(size, size), 'apps')) +endforeach diff --git a/util/coreboot-configurator/src/resources/org.coreboot.nvramtool.policy b/util/coreboot-configurator/src/resources/org.coreboot.nvramtool.policy new file mode 100644 index 0000000000..c95bc8b9a3 --- /dev/null +++ b/util/coreboot-configurator/src/resources/org.coreboot.nvramtool.policy @@ -0,0 +1,13 @@ + + + + + Authentication is required to read and write to coreboot settings. + + auth_admin_keep + + /usr/sbin/nvramtool + + diff --git a/util/coreboot-configurator/src/resources/org.coreboot.reboot.policy b/util/coreboot-configurator/src/resources/org.coreboot.reboot.policy new file mode 100644 index 0000000000..5364c8c22c --- /dev/null +++ b/util/coreboot-configurator/src/resources/org.coreboot.reboot.policy @@ -0,0 +1,12 @@ + + + + + + yes + + /usr/sbin/reboot + +