Initial import
Not much there yet, just a login dialog and an app list JSON parser
This commit is contained in:
commit
7f0cd77b4e
15
CMakeLists.txt
Normal file
15
CMakeLists.txt
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
project(configurator)
|
||||||
|
|
||||||
|
set(CMAKE_AUTOMOC ON)
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
set(CMAKE_CXX_STANDARD 23)
|
||||||
|
|
||||||
|
set(QT_VERSION 6 CACHE STRING "Major version of Qt to use (6 will work, anything else may or may not work)")
|
||||||
|
|
||||||
|
find_package(Qt${QT_VERSION} COMPONENTS Core Gui Widgets WebEngineWidgets REQUIRED)
|
||||||
|
add_subdirectory(dialogs)
|
||||||
|
add_executable(configurator main.cpp Configurator.cpp)
|
||||||
|
target_link_libraries(configurator Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui Qt${QT_VERSION}::Widgets Qt${QT_VERSION}::WebEngineWidgets Qt${QT_VERSION}::Network dialogs)
|
||||||
|
|
||||||
|
install(TARGETS configurator DESTINATION bin)
|
51
Configurator.cpp
Normal file
51
Configurator.cpp
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
#include "Configurator.h"
|
||||||
|
#include <iostream>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
|
Configurator::Configurator(int &argc, char **&argv):QApplication(argc, argv),_nam(this) {
|
||||||
|
setQuitOnLastWindowClosed(false);
|
||||||
|
_loginDialog = new FederatedLogin(0);
|
||||||
|
_loginDialog->setModal(true);
|
||||||
|
connect(_loginDialog, &QDialog::accepted, this, &Configurator::loginRequested);
|
||||||
|
connect(_loginDialog, &QDialog::rejected, this, &QApplication::quit);
|
||||||
|
_loginDialog->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Configurator::loginRequested() {
|
||||||
|
QNetworkRequest *req=new QNetworkRequest("https://dashboard." + _loginDialog->domain() + "/apps");
|
||||||
|
connect(&_nam, &QNetworkAccessManager::finished, this, &Configurator::appListReceived);
|
||||||
|
QNetworkReply *r=_nam.get(*req);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Configurator::appListReceived(QNetworkReply *reply) {
|
||||||
|
disconnect(&_nam, &QNetworkAccessManager::finished, this, &Configurator::appListReceived);
|
||||||
|
if(reply->error() != QNetworkReply::NoError) {
|
||||||
|
_loginDialog->setMessage(tr("Failed to retrieve app list. Is the domain name correct?"));
|
||||||
|
_loginDialog->show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_services=QJsonDocument::fromJson(reply->readAll());
|
||||||
|
if(!_services.isArray()) {
|
||||||
|
_loginDialog->setMessage(tr("App list did not return an array. Is the domain name correct?"));
|
||||||
|
_loginDialog->show();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QJsonArray a=_services.array();
|
||||||
|
for(auto i : a) {
|
||||||
|
if(!i.isObject()) {
|
||||||
|
std::cerr << "Non-object in JSON array" << std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
QJsonObject o = i.toObject();
|
||||||
|
// We can assume the object has:
|
||||||
|
// o["Title"].toString()
|
||||||
|
// o["Url"].toString()
|
||||||
|
// o["DocumentationUrl"].toString()
|
||||||
|
// o["Image"].toString()
|
||||||
|
// o["Description"].toString()
|
||||||
|
// o["SpecialNote"].toString()
|
||||||
|
// o["LDAP"].toBool()
|
||||||
|
std::cerr << qPrintable(o["Title"].toString()) << " " << o["LDAP"].toBool() << std::endl;
|
||||||
|
}
|
||||||
|
}
|
20
Configurator.h
Normal file
20
Configurator.h
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <dialogs/FederatedLogin.h>
|
||||||
|
|
||||||
|
class Configurator:public QApplication {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
Configurator(int &argc, char **&argv);
|
||||||
|
protected Q_SLOTS:
|
||||||
|
void loginRequested();
|
||||||
|
void appListReceived(QNetworkReply *reply);
|
||||||
|
private:
|
||||||
|
QNetworkAccessManager _nam;
|
||||||
|
FederatedLogin * _loginDialog;
|
||||||
|
QJsonDocument _services;
|
||||||
|
};
|
2
dialogs/CMakeLists.txt
Normal file
2
dialogs/CMakeLists.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
add_library(dialogs STATIC FederatedLogin.cpp)
|
||||||
|
target_link_libraries(dialogs Qt${QT_VERSION}::Core Qt${QT_VERSION}::Gui Qt${QT_VERSION}::Widgets)
|
35
dialogs/FederatedLogin.cpp
Normal file
35
dialogs/FederatedLogin.cpp
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
#include "FederatedLogin.h"
|
||||||
|
|
||||||
|
FederatedLogin::FederatedLogin(QWidget *parent):QDialog(parent),_layout(this) {
|
||||||
|
int y = 0;
|
||||||
|
_message = new QLabel(this);
|
||||||
|
setMessage("");
|
||||||
|
_layout.addWidget(_message, y, 0, 1, 2);
|
||||||
|
_domainLbl = new QLabel(tr("&Domain:"), this);
|
||||||
|
_layout.addWidget(_domainLbl, ++y, 0);
|
||||||
|
_domain = new QLineEdit("f11890a1.fedcom.net", this);
|
||||||
|
_domainLbl->setBuddy(_domain);
|
||||||
|
_layout.addWidget(_domain, y, 1);
|
||||||
|
_userLbl = new QLabel(tr("&User/Email:"), this);
|
||||||
|
_layout.addWidget(_userLbl, ++y, 0);
|
||||||
|
_user = new QLineEdit(this);
|
||||||
|
_userLbl->setBuddy(_user);
|
||||||
|
_layout.addWidget(_user, y, 1);
|
||||||
|
_passwordLbl = new QLabel(tr("&Password:"), this);
|
||||||
|
_layout.addWidget(_passwordLbl, ++y, 0);
|
||||||
|
_password = new QLineEdit(this);
|
||||||
|
_password->setEchoMode(QLineEdit::Password);
|
||||||
|
_passwordLbl->setBuddy(_password);
|
||||||
|
_layout.addWidget(_password, y, 1);
|
||||||
|
_ok = new QPushButton(tr("&OK"), this);
|
||||||
|
_layout.addWidget(_ok, ++y, 0);
|
||||||
|
_cancel = new QPushButton(tr("&Cancel"), this);
|
||||||
|
_layout.addWidget(_cancel, y, 1);
|
||||||
|
connect(_ok, &QPushButton::clicked, this, &QDialog::accept);
|
||||||
|
connect(_cancel, &QPushButton::clicked, this, &QDialog::reject);
|
||||||
|
}
|
||||||
|
|
||||||
|
void FederatedLogin::setMessage(QString const &m) {
|
||||||
|
_message->setText(m);
|
||||||
|
_message->setHidden(m.isEmpty());
|
||||||
|
}
|
28
dialogs/FederatedLogin.h
Normal file
28
dialogs/FederatedLogin.h
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
#include <QGridLayout>
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
class FederatedLogin:public QDialog {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
FederatedLogin(QWidget *parent=0);
|
||||||
|
QString domain() const { return _domain->text(); }
|
||||||
|
QString user() const { return _user->text(); }
|
||||||
|
QString password() const { return _password->text(); }
|
||||||
|
void setMessage(QString const &m);
|
||||||
|
protected:
|
||||||
|
QGridLayout _layout;
|
||||||
|
QLabel * _message;
|
||||||
|
QLabel * _domainLbl;
|
||||||
|
QLineEdit * _domain;
|
||||||
|
QLabel * _userLbl;
|
||||||
|
QLineEdit * _user;
|
||||||
|
QLabel * _passwordLbl;
|
||||||
|
QLineEdit * _password;
|
||||||
|
QPushButton * _ok;
|
||||||
|
QPushButton * _cancel;
|
||||||
|
};
|
10
lib/DnfPackageInstaller.h
Normal file
10
lib/DnfPackageInstaller.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "PackageInstaller.h"
|
||||||
|
|
||||||
|
class DnfPackageInstaller:public PackageInstaller {
|
||||||
|
public:
|
||||||
|
bool installPackages(QString const &packages) const;
|
||||||
|
bool installPackage(QString const &package) const;
|
||||||
|
bool installed(QString const &package) const;
|
||||||
|
};
|
10
lib/PackageInstaller.h
Normal file
10
lib/PackageInstaller.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QString>
|
||||||
|
|
||||||
|
class PackageInstaller {
|
||||||
|
public:
|
||||||
|
virtual bool installPackages(QStringList const &packages) const;
|
||||||
|
virtual bool installPackage(QString const &package) const = 0;
|
||||||
|
virtual bool installed(QString const &package) const = 0;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user