支持读取安装状态
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