支持读取安装状态
This commit is contained in:
parent
07c164a11d
commit
4c4cb578eb
@ -1,6 +1,7 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/shell">
|
<qresource prefix="/shell">
|
||||||
<file>kernel-installer-template.sh</file>
|
<file>kernel-installer-template.sh</file>
|
||||||
|
<file>kernel-installer-root-loader-template.sh</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/icon"/>
|
<qresource prefix="/icon"/>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
5
kernel-installer-root-loader-template.sh
Normal file
5
kernel-installer-root-loader-template.sh
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||||
|
pkexec bash "${kernelInstallerShellTempPath}"
|
||||||
|
echo $? > /tmp/gxde-kernel-manager-installer-status
|
||||||
|
rm -f "${kernelInstallerRootLoaderShellTempPath}"
|
||||||
@ -1,3 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
rm /tmp/gxde-kernel-manager-installer-status -f
|
||||||
apt update
|
apt update
|
||||||
apt install ${KernelList} -y
|
apt install ${KernelList} -y
|
||||||
|
rm -f "${kernelInstallerShellTempPath}"
|
||||||
@ -4,6 +4,8 @@
|
|||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
#define MAX_TMP_NUM 1024
|
#define MAX_TMP_NUM 1024
|
||||||
#define MIN_TMP_NUM 0
|
#define MIN_TMP_NUM 0
|
||||||
@ -13,27 +15,39 @@ KernelInstaller::KernelInstaller(QStringList kernelList, QWidget *parent) :
|
|||||||
ui(new Ui::KernelInstaller)
|
ui(new Ui::KernelInstaller)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
ui->m_installerStatus->setHidden(true);
|
||||||
this->kernelList = kernelList;
|
this->kernelList = kernelList;
|
||||||
terminal = new QTermWidget(0);
|
terminal = new QTermWidget(0);
|
||||||
terminal->setColorScheme("DarkPastels");
|
terminal->setColorScheme("DarkPastels");
|
||||||
terminal->setAutoClose(true);
|
terminal->setAutoClose(false);
|
||||||
ui->verticalLayout->addWidget(terminal);
|
ui->verticalLayout->addWidget(terminal);
|
||||||
StartInstaller();
|
StartInstaller();
|
||||||
}
|
}
|
||||||
|
|
||||||
void KernelInstaller::StartInstaller()
|
void KernelInstaller::StartInstaller()
|
||||||
{
|
{
|
||||||
terminal->setShellProgram("/usr/bin/pkexec");
|
|
||||||
// 随机生成目录
|
// 随机生成目录
|
||||||
srand(time(0));
|
srand(time(0));
|
||||||
int randomNumber = (rand() % (MAX_TMP_NUM - MIN_TMP_NUM)) + 1; // 左闭右闭
|
int randomNumber = (rand() % (MAX_TMP_NUM - MIN_TMP_NUM)) + 1; // 左闭右闭
|
||||||
QString tempPath = tempDir + "/gxde-kernel-manager-installer-" + QString::number(randomNumber) + ".sh";
|
QString tempPath = tempDir + "/gxde-kernel-manager-installer-" + QString::number(randomNumber) + ".sh";
|
||||||
|
QString tempLoaderPath = tempDir + "/gxde-kernel-manager-root-loader-installer-" + QString::number(randomNumber) + ".sh";
|
||||||
QFile file(tempPath);
|
QFile file(tempPath);
|
||||||
file.open(QFile::WriteOnly);
|
file.open(QFile::WriteOnly);
|
||||||
file.write(BuildKernelInstallerBash(this->kernelList, tempPath).toUtf8());
|
file.write(BuildKernelInstallerBash(this->kernelList, tempPath).toUtf8());
|
||||||
file.close();
|
file.close();
|
||||||
terminal->setArgs(QStringList() << "bash" << tempPath);
|
QFile loaderFile(tempLoaderPath);
|
||||||
|
loaderFile.open(QFile::WriteOnly);
|
||||||
|
loaderFile.write(BuildKernelRootLoaderInstallerBash(tempPath, tempLoaderPath).toUtf8());
|
||||||
|
loaderFile.close();
|
||||||
|
terminal->setShellProgram("/usr/bin/bash");
|
||||||
|
terminal->setArgs(QStringList() << tempLoaderPath);
|
||||||
terminal->startShellProgram();
|
terminal->startShellProgram();
|
||||||
|
processID = terminal->getShellPID();
|
||||||
|
// 使用 QTimer 用于判断内核是否安装完成
|
||||||
|
QTimer *runStatusTimer = new QTimer();
|
||||||
|
runStatusTimer->setInterval(100);
|
||||||
|
connect(runStatusTimer, &QTimer::timeout, this, &KernelInstaller::CheckInstallerStatusTimer);
|
||||||
|
runStatusTimer->start();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString KernelInstaller::BuildKernelInstallerBash(QStringList kernelList, QString tempFilePath) const
|
QString KernelInstaller::BuildKernelInstallerBash(QStringList kernelList, QString tempFilePath) const
|
||||||
@ -47,11 +61,57 @@ QString KernelInstaller::BuildKernelInstallerBash(QStringList kernelList, QStrin
|
|||||||
file.open(QFile::ReadOnly);
|
file.open(QFile::ReadOnly);
|
||||||
QString data = file.readAll();
|
QString data = file.readAll();
|
||||||
data = data.replace("${KernelList}", kernel);
|
data = data.replace("${KernelList}", kernel);
|
||||||
data += "\nrm -v '" + tempFilePath + "'";
|
data = data.replace("${kernelInstallerShellTempPath}", tempFilePath);
|
||||||
file.close();
|
file.close();
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString KernelInstaller::BuildKernelRootLoaderInstallerBash(QString tempFilePath, QString tempLoaderFilePath) const
|
||||||
|
{
|
||||||
|
QFile file(":/shell/kernel-installer-root-loader-template.sh");
|
||||||
|
file.open(QFile::ReadOnly);
|
||||||
|
QString data = file.readAll();
|
||||||
|
data = data.replace("${kernelInstallerShellTempPath}", tempFilePath);
|
||||||
|
data = data.replace("${kernelInstallerRootLoaderShellTempPath}", tempLoaderFilePath);
|
||||||
|
file.close();
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* -1 为进程正在运行(正常)
|
||||||
|
* -2 为无法读取进程信息(异常)
|
||||||
|
*/
|
||||||
|
int KernelInstaller::CheckInstallerStatus()
|
||||||
|
{
|
||||||
|
if(QFile::exists("/proc/" + QString::number(processID))) {
|
||||||
|
// 如果进程存在
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
QFile file("/tmp/gxde-kernel-manager-installer-status");
|
||||||
|
if(!file.exists()) {
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
file.open(QFile::ReadOnly);
|
||||||
|
QString data = file.readAll();
|
||||||
|
file.close();
|
||||||
|
data = data.replace("\n", "").replace(" ", "");
|
||||||
|
return data.toInt();
|
||||||
|
}
|
||||||
|
|
||||||
|
void KernelInstaller::CheckInstallerStatusTimer()
|
||||||
|
{
|
||||||
|
int status = CheckInstallerStatus();
|
||||||
|
if(status == -1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 安装完成
|
||||||
|
if(status == 0) {
|
||||||
|
ui->m_status->setText(tr("Done"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ui->m_status->setText(tr("Something error, exit code: ") + QString::number(status));
|
||||||
|
}
|
||||||
|
|
||||||
KernelInstaller::~KernelInstaller()
|
KernelInstaller::~KernelInstaller()
|
||||||
{
|
{
|
||||||
delete ui;
|
delete ui;
|
||||||
|
|||||||
@ -17,15 +17,23 @@ public:
|
|||||||
explicit KernelInstaller(QStringList kernelList, QWidget *parent = nullptr);
|
explicit KernelInstaller(QStringList kernelList, QWidget *parent = nullptr);
|
||||||
~KernelInstaller();
|
~KernelInstaller();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void InstallFinished(int status);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Ui::KernelInstaller *ui;
|
Ui::KernelInstaller *ui;
|
||||||
QTermWidget *terminal;
|
QTermWidget *terminal;
|
||||||
QStringList kernelList;
|
QStringList kernelList;
|
||||||
|
int processID;
|
||||||
|
|
||||||
QString tempDir = "/tmp";
|
QString tempDir = "/tmp";
|
||||||
|
|
||||||
void StartInstaller();
|
void StartInstaller();
|
||||||
QString BuildKernelInstallerBash(QStringList kernelList, QString tempFilePath) const;
|
QString BuildKernelInstallerBash(QStringList kernelList, QString tempFilePath) const;
|
||||||
|
QString BuildKernelRootLoaderInstallerBash(QString tempFilePath, QString tempLoaderFilePath) const;
|
||||||
|
|
||||||
|
int CheckInstallerStatus();
|
||||||
|
void CheckInstallerStatusTimer();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // KERNELINSTALLER_H
|
#endif // KERNELINSTALLER_H
|
||||||
|
|||||||
@ -16,7 +16,20 @@
|
|||||||
<widget class="QWidget" name="centralwidget">
|
<widget class="QWidget" name="centralwidget">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="m_statue">
|
<widget class="QLabel" name="m_installerStatus">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="m_status">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user