source: src-qt4/pc-updatecenter/updatecontroller.cpp @ 43257ed

releng/10.0releng/10.0.1releng/10.0.2releng/10.0.3
Last change on this file since 43257ed was 43257ed, checked in by yurkis <yurkis@…>, 10 months ago

Jail support prototype

  • Property mode set to 100644
File size: 7.9 KB
Line 
1/**************************************************************************
2*   Copyright (C) 2013- by Yuri Momotyuk                                   *
3*   yurkis@gmail.com                                                      *
4*                                                                         *
5*   Permission is hereby granted, free of charge, to any person obtaining *
6*   a copy of this software and associated documentation files (the       *
7*   "Software"), to deal in the Software without restriction, including   *
8*   without limitation the rights to use, copy, modify, merge, publish,   *
9*   distribute, sublicense, and/or sell copies of the Software, and to    *
10*   permit persons to whom the Software is furnished to do so, subject to *
11*   the following conditions:                                             *
12*                                                                         *
13*   The above copyright notice and this permission notice shall be        *
14*   included in all copies or substantial portions of the Software.       *
15*                                                                         *
16*   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       *
17*   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    *
18*   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
19*   IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR     *
20*   OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
21*   ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
22*   OTHER DEALINGS IN THE SOFTWARE.                                       *
23***************************************************************************/
24
25#include "updatecontroller.h"
26
27#include <QDebug>
28#include <unistd.h>
29
30const char* const EMULATION_PROC = "cat";
31const QStringList EMULATION_DEF_ARGS;
32
33///////////////////////////////////////////////////////////////////////////////
34CAbstractUpdateController::CAbstractUpdateController()
35{
36    mCurrentState= eNOT_INITIALIZED;
37    mUpdProc.setProcessChannelMode(QProcess::MergedChannels);
38    connect(&mUpdProc, SIGNAL(readyReadStandardOutput()),
39            this, SLOT(slotProcessRead()));
40    connect(&mUpdProc, SIGNAL(finished(int,QProcess::ExitStatus)),
41            this, SLOT(slotProcessFinished(int,QProcess::ExitStatus)));
42}
43
44///////////////////////////////////////////////////////////////////////////////
45void CAbstractUpdateController::setJailPrefix(QString prefix)
46{
47    mJailPrefix= prefix;
48}
49
50///////////////////////////////////////////////////////////////////////////////
51void CAbstractUpdateController::removeJailPrefix()
52{
53    mJailPrefix.clear();
54}
55
56///////////////////////////////////////////////////////////////////////////////
57CAbstractUpdateController::EUpdateControllerState CAbstractUpdateController::currentState()
58{
59    return mCurrentState;
60}
61
62///////////////////////////////////////////////////////////////////////////////
63QString CAbstractUpdateController::updateMessage()
64{
65    return mUpdateMasage;
66}
67
68///////////////////////////////////////////////////////////////////////////////
69QStringList CAbstractUpdateController::updateLog()
70{
71    return mLogMessages;
72}
73
74///////////////////////////////////////////////////////////////////////////////
75bool CAbstractUpdateController::hasLog()
76{
77    return (mLogMessages.size()!=0);
78}
79
80///////////////////////////////////////////////////////////////////////////////
81void CAbstractUpdateController::parseProcessLine(CAbstractUpdateController::EUpdateControllerState state, QString line)
82{
83    switch (state)
84    {
85        case eCHECKING:
86            onReadCheckLine(line);
87            break;
88        case eUPDATING:
89            onReadUpdateLine(line);
90            break;
91        case eNOT_INITIALIZED:
92            qDebug()<<"Updater internal state error";
93            break;
94        default:
95            break;
96    }
97}
98
99///////////////////////////////////////////////////////////////////////////////
100void CAbstractUpdateController::setCurrentState(CAbstractUpdateController::EUpdateControllerState new_state)
101{
102
103
104    //Set default start values for update progress
105    if((new_state == eUPDATING) && (mCurrentState!=eUPDATING))
106    {
107        mUpdateMasage = tr("Starting update...");
108        mCurrentProgress = SProgress();
109        mLogMessages.clear();
110    }
111
112    mCurrentState= new_state;
113
114    emit stateChanged(mCurrentState);
115}
116
117///////////////////////////////////////////////////////////////////////////////
118void CAbstractUpdateController::reportProgress(CAbstractUpdateController::SProgress curr_progress)
119{
120    mCurrentProgress= curr_progress;
121    emit progress(mCurrentProgress);
122}
123
124///////////////////////////////////////////////////////////////////////////////
125void CAbstractUpdateController::reportLogLine(QString line)
126{
127    mLogMessages.append(line);
128    emit logLinePresent(line);
129}
130
131///////////////////////////////////////////////////////////////////////////////
132void CAbstractUpdateController::reportUpdatesAvail(QString message)
133{
134    mUpdateMasage = message;
135    setCurrentState(eUPDATES_AVAIL);
136    emit updatesAvail(mUpdateMasage);
137}
138
139///////////////////////////////////////////////////////////////////////////////
140void CAbstractUpdateController::reportError(QString error_message)
141{
142    mErrorMessage = error_message;
143    setCurrentState(eUPDATING_ERROR);
144    emit updateError(mErrorMessage);
145}
146
147///////////////////////////////////////////////////////////////////////////////
148void CAbstractUpdateController::launchUpdate()
149{
150    QString proc;
151    QStringList args;
152    updateShellCommand(proc, args);
153
154    //if jail is present
155    if (mJailPrefix.length())
156    {
157        args.push_front(proc);
158        args.push_front(mJailPrefix);
159        proc = "chroot";
160    }
161
162    mUpdProc.start(proc,args);
163    if (!mUpdProc.waitForStarted())
164    {
165        reportError(tr("Can not execute update shell command"));
166        return;
167    }
168
169    if (currentState() != eUPDATING)
170        setCurrentState(eUPDATING);
171}
172
173///////////////////////////////////////////////////////////////////////////////
174void CAbstractUpdateController::launchCheck()
175{
176    QString proc;
177    QStringList args;
178    checkShellCommand(proc, args);
179
180    //if jail is present
181    if (mJailPrefix.length())
182    {
183        args.push_front(proc);
184        args.push_front(mJailPrefix);
185        proc = "chroot";
186    }
187
188    mUpdProc.start(proc,args);
189    if (!mUpdProc.waitForStarted())
190    {
191        reportError(tr("Can not execute update shell command"));
192        return;
193    }
194
195    setCurrentState(eCHECKING);
196}
197
198///////////////////////////////////////////////////////////////////////////////
199void CAbstractUpdateController::check()
200{
201    onCheckUpdates();
202    launchCheck();
203}
204
205///////////////////////////////////////////////////////////////////////////////
206void CAbstractUpdateController::updateAll()
207{
208    //TODO: correct current state check
209
210    onUpdateAll();
211
212    launchUpdate();
213}
214
215///////////////////////////////////////////////////////////////////////////////
216void CAbstractUpdateController::cancel()
217{
218    if (mCurrentProgress.misCanCancel)
219    {
220        onCancel();
221    }
222}
223
224///////////////////////////////////////////////////////////////////////////////
225void CAbstractUpdateController::slotProcessRead()
226{
227    /*qint64 size= mUpdProc.bytesAvailable();
228    for(qint64 i=0; i<size; i++)
229    {
230        char ch;
231        mUpdProc.getChar(&ch);
232        mUpdProc.putChar(ch);
233        onReadProcessChar(ch);
234    }*/
235
236    while (mUpdProc.canReadLine())
237    {
238        parseProcessLine(currentState(), mUpdProc.readLine().simplified());
239    }
240}
241
242///////////////////////////////////////////////////////////////////////////////
243void CAbstractUpdateController::slotProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)
244{
245    Q_UNUSED(exitStatus)
246
247    switch (currentState())
248    {
249        case eCHECKING:
250            onCheckProcessfinished(exitCode);
251            break;
252        case eUPDATING:
253            onUpdateProcessfinished(exitCode);
254            break;
255        default:
256            break;
257    }
258}
Note: See TracBrowser for help on using the repository browser.