Mercurial > trustbridge
annotate ui/installwrapper.cpp @ 1045:7e07217240e5
Added tag 0.9.1 for changeset b5dc84ea5dac
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Thu, 04 Sep 2014 16:13:11 +0200 |
parents | db7e7156c824 |
children | 317ee9dc4684 |
rev | line source |
---|---|
404 | 1 /* Copyright (C) 2014 by Bundesamt für Sicherheit in der Informationstechnik |
2 * Software engineering by Intevation GmbH | |
3 * | |
4 * This file is Free Software under the GNU GPL (v>=2) | |
5 * and comes with ABSOLUTELY NO WARRANTY! | |
6 * See LICENSE.txt for details. | |
7 */ | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
8 #include "installwrapper.h" |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
9 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
10 #include <QFileInfo> |
364 | 11 #include <QProcess> |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
12 #include <QTemporaryFile> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
13 #include <QApplication> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
14 #include <QDir> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
15 #include <QDebug> |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
16 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
17 #include "logging.h" |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
18 #include "util.h" |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
19 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
20 #define INSTALL_TIMEOUT 3600000 /* Wait up to an hour */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
21 |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
22 InstallWrapper::InstallWrapper(QObject* parent, |
364 | 23 const QString& path, const QStringList& choices): |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
24 QThread(parent), |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
25 mCertListFile(path), |
364 | 26 mChoices(choices) |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
27 { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
28 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
29 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
30 QFileInfo getCinstProcInfo() { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
31 QFileInfo fi(QCoreApplication::applicationFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
32 QDir myDir = fi.absoluteDir(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
33 QString instProcName = "cinst"; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
34 if (!fi.suffix().isEmpty()) { |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
35 instProcName += "." + fi.suffix(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
36 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
37 return QFileInfo(myDir.absoluteFilePath(instProcName)); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
38 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
39 |
364 | 40 bool InstallWrapper::writeChoices(QTemporaryFile* choicesFile) const |
41 { | |
42 if (!choicesFile->open()) { | |
43 return false; | |
44 } | |
45 | |
46 foreach (const QString &b64data, mChoices) { | |
440
a7163018de2f
Fixed check on return value when trying to write temp file.
Raimund Renkert <rrenkert@intevation.de>
parents:
404
diff
changeset
|
47 if (choicesFile->write(b64data.toLatin1()) == -1) { |
364 | 48 return false; |
49 } | |
440
a7163018de2f
Fixed check on return value when trying to write temp file.
Raimund Renkert <rrenkert@intevation.de>
parents:
404
diff
changeset
|
50 if (choicesFile->write("\n") == -1) { |
364 | 51 return false; |
52 } | |
53 } | |
54 | |
55 choicesFile->close(); | |
56 | |
57 return true; | |
58 } | |
59 | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
60 void InstallWrapper::run() |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
61 { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
62 /* TODO: We need errorcodes here so that we can see if a user |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
63 * cancled the UAC elevation */ |
364 | 64 QTemporaryFile choicesFile; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
65 QFileInfo cinstProcInfo = getCinstProcInfo(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
66 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
67 QString cinstFileName = QDir::toNativeSeparators( |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
68 getCinstProcInfo().absoluteFilePath()); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
69 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
70 if (!cinstProcInfo.isExecutable()) { |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
71 emit error(tr("Could not find certificate installation process.")); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
72 return; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
73 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
74 |
364 | 75 if (!writeChoices(&choicesFile)) { |
76 emit error(tr("Failed to write temporary file.")); | |
77 return; | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
78 } |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
79 |
364 | 80 #ifdef WIN32 |
81 /* QProcess on Windows uses CreateProcess but we have to | |
82 * use the runas shell command to get the UAC prompt if necessary. | |
83 * So we have to handle the process ourself. Starting with | |
84 * shell execute also means that we can not have stdout and stderr | |
85 * redirection. This is the reason we use command line parameters | |
86 * and not a pipe for communication. In debug mode the installer | |
87 * also makes use of output debug string. */ | |
88 DWORD retval = 0; | |
89 SHELLEXECUTEINFOW shExecInfo; | |
90 | |
91 memset (&shExecInfo, 0, sizeof(SHELLEXECUTEINFOW)); | |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
92 |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
93 /* Windows needs each parameter packed in " */ |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
94 QString parameters = "\"list=" + mCertListFile + |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
95 "\" \"choices=" + choicesFile.fileName() + "\""; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
96 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
97 shExecInfo.cbSize = sizeof(SHELLEXECUTEINFOW); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
98 shExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; |
1003
db7e7156c824
(issue66) Only depend on is_system_install on windows to decide privilege raise
Andre Heinecke <andre.heinecke@intevation.de>
parents:
987
diff
changeset
|
99 if (!is_system_install()) { |
511
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
100 shExecInfo.lpVerb = L"open"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
101 } else { |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
102 shExecInfo.lpVerb = L"runas"; |
cef732072774
Use open instead of runas if not admin
Andre Heinecke <aheinecke@intevation.de>
parents:
440
diff
changeset
|
103 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
104 shExecInfo.lpFile = reinterpret_cast<LPCWSTR> (cinstFileName.utf16()); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
105 shExecInfo.lpParameters = reinterpret_cast<LPCWSTR> (parameters.utf16()); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
106 |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
107 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
108 |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
109 if (!ShellExecuteExW(&shExecInfo)) { |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
110 char* errmsg = getLastErrorMsg(); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
111 QString qerrmsg = QString::fromUtf8(errmsg); |
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
112 free(errmsg); |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
113 emit error(tr("Error executing process: %1").arg(qerrmsg)); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
114 return; |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
115 } |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
116 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
117 retval = WaitForSingleObject(shExecInfo.hProcess, INSTALL_TIMEOUT); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
118 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
119 if (retval != WAIT_OBJECT_0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
120 if (retval == WAIT_FAILED) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
121 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
122 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
123 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
124 emit error (tr("Error monitoring process: %1").arg(qerrmsg)); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
125 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
126 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
127 emit error (tr("Certificate installation timed out.")); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
128 return; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
129 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
130 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
131 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
132 if (GetExitCodeProcess(shExecInfo.hProcess, &retval)) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
133 if (retval == STILL_ACTIVE) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
134 qDebug() << "Process still running, huh.."; |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
135 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
136 } else { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
137 char* errmsg = getLastErrorMsg(); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
138 QString qerrmsg = QString::fromUtf8(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
139 free(errmsg); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
140 emit error (tr("Failed to check process status: %1").arg(qerrmsg)); |
387
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
141 CloseHandle(shExecInfo.hProcess); |
32309299bec9
Always return after error
Andre Heinecke <andre.heinecke@intevation.de>
parents:
385
diff
changeset
|
142 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
143 } |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
144 CloseHandle(shExecInfo.hProcess); |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
145 |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
146 if (retval != 0) { |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
147 /* TODO make this nicer */ |
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
148 emit error (tr("The process failed with return code. %1").arg(retval)); |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
149 return; |
285
f23e0ccd5d14
Fix call to windows process.
Andre Heinecke <aheinecke@intevation.de>
parents:
256
diff
changeset
|
150 } |
364 | 151 #else /* WIN32 */ |
152 QProcess installerProcess; | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
153 QStringList parameters; |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
154 |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
155 choicesFile.setAutoRemove(false); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
156 parameters << "list=" + mCertListFile << "choices=" + choicesFile.fileName(); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
157 |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
158 bool sudo_started = false; |
841
216a65d7fc4b
(issue66) Implement is_system_install and use it
Andre Heinecke <andre.heinecke@intevation.de>
parents:
647
diff
changeset
|
159 bool use_sudo = is_admin() && is_system_install(); |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
160 if (use_sudo) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
161 QStringList sudoPrograms; |
987
b8ae69bcc540
Use pkexec instead of gksudo.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
841
diff
changeset
|
162 sudoPrograms << "pkexec" << "kdesudo" << "sudo"; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
163 QStringList sudoParams; |
647
51830f4912c2
Minor style fix
Andre Heinecke <andre.heinecke@intevation.de>
parents:
646
diff
changeset
|
164 sudoParams << cinstProcInfo.absoluteFilePath() << parameters; |
646
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
165 installerProcess.setArguments(sudoParams); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
166 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
167 foreach (const QString &sProg, sudoPrograms) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
168 installerProcess.setProgram(sProg); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
169 qDebug() << "Starting process " << sProg <<" params: " << sudoParams; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
170 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
171 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
172 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
173 continue; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
174 } else { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
175 sudo_started = true; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
176 break; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
177 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
178 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
179 } |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
180 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
181 /* Fallback to start without sudo */ |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
182 if (!use_sudo || !sudo_started) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
183 installerProcess.setProgram(cinstProcInfo.absoluteFilePath()); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
184 installerProcess.setArguments(parameters); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
185 |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
186 qDebug() << "Starting process " << cinstFileName <<" params: " << parameters; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
187 installerProcess.start(); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
188 if (!installerProcess.waitForStarted() || |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
189 installerProcess.state() == QProcess::NotRunning) { |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
190 emit error (tr("Failed to start installer process.")); |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
191 return; |
a9a57dc1eb2f
Start installer process as sudo if possible.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
511
diff
changeset
|
192 } |
364 | 193 } |
194 | |
195 installerProcess.waitForFinished(); | |
196 | |
197 if (installerProcess.exitStatus() == QProcess::CrashExit) { | |
198 /* Woops */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
199 emit error (tr("Failed to complete installation.")); |
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
200 return; |
364 | 201 } else if (installerProcess.exitStatus() != QProcess::NormalExit) { |
202 /* Can not Happen. there are only those two values but maybe | |
203 * qt changed.. */ | |
385
72487438a180
More user visible errors. Correct parameters for installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
364
diff
changeset
|
204 emit error (tr("Failed to complete installation.")); |
364 | 205 return; |
206 } | |
207 | |
208 if (installerProcess.exitCode() == 0) { | |
209 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
210 } else { | |
211 /* TODO handle errors defined by errorcodes.h */ | |
212 qDebug() << "Installer Process returned: " << installerProcess.exitCode(); | |
213 qDebug() << "output: " << installerProcess.readAllStandardOutput(); | |
214 return; | |
215 } | |
216 #endif | |
388
a507e5f1b999
Emit a signal if no errors happened during installation.
Andre Heinecke <andre.heinecke@intevation.de>
parents:
387
diff
changeset
|
217 emit installationSuccessful(); |
256
84ae353688e0
Add installwrapper class to handle process communication
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
218 } |