2
* Copyright 2013 Canonical Ltd.
4
* This program is free software; you can redistribute it and/or modify
5
* it under the terms of the GNU Lesser General Public License as published by
6
* the Free Software Foundation; version 2.1.
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
* GNU Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public License
14
* along with this program. If not, see <http://www.gnu.org/licenses/>.
16
* Author: Juhapekka Piiroinen <juhapekka.piiroinen@canonical.com>
19
#include "ubuntudeviceswidget.h"
20
#include "ui_ubuntudeviceswidget.h"
22
#include "ubuntuconstants.h"
28
UbuntuDevicesWidget *UbuntuDevicesWidget::m_instance = 0;
30
UbuntuDevicesWidget *UbuntuDevicesWidget::instance()
35
UbuntuDevicesWidget::UbuntuDevicesWidget(QWidget *parent) :
37
ui(new Ui::UbuntuDevicesWidget)
42
m_deviceDetected = false;
43
m_aboutToClose = false;
44
//ui->widgetDeviceInfo->hide();
45
ui->widgetSshProperties->hide();
46
ui->pushButtonSshInstall->hide();
47
ui->pushButtonSshRemove->hide();
48
ui->widgetDeviceSerial->hide();
49
//ui->pushButtonCancel->hide();
50
ui->frameNoDevices->hide();
51
ui->lblLoading->hide();
52
ui->frameNoNetwork->hide();
54
ui->progressBar->setMinimum(0);
55
ui->progressBar->setMaximum(0);
57
connect(&m_ubuntuProcess,SIGNAL(started(QString)),this,SLOT(onStarted(QString)));
58
connect(&m_ubuntuProcess,SIGNAL(message(QString)),this,SLOT(onMessage(QString)));
59
connect(&m_ubuntuProcess,SIGNAL(finished(QString,int)),this,SLOT(onFinished(QString, int)));
60
connect(&m_ubuntuProcess,SIGNAL(error(QString)),this,SLOT(onError(QString)));
64
void UbuntuDevicesWidget::onMessage(QString msg) {
66
ui->plainTextEdit->appendPlainText(msg.trimmed());
69
void UbuntuDevicesWidget::onStarted(QString cmd) {
70
ui->stackedWidgetConnectedDevice->setCurrentIndex(1);
71
ui->lblDeviceProcessInfo->setText(QFileInfo(cmd).baseName());
72
//ui->widgetDeviceInfo->hide();
73
//ui->pushButtonCancel->show();
74
ui->lblLoading->show();
77
void UbuntuDevicesWidget::onFinished(QString cmd, int code) {
78
ui->stackedWidgetConnectedDevice->setCurrentIndex(0);
79
if (m_aboutToClose) { return; }
82
bool bHasNetwork = true;
84
if (cmd == QString::fromLatin1("%0/device_search").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
85
QStringList lines = m_reply.trimmed().split(QLatin1String("\n"));
87
foreach(QString line, lines) {
88
QStringList lineData = line.split(QLatin1String(" "));
89
if (lineData.count() == 2) {
90
QString sSerialNumber = lineData.takeFirst();
91
QString sDeviceInfo = lineData.takeFirst();
92
//QString sDeviceName = lineData.takeFirst();
94
//ui->lblDeviceName->setText(sDeviceName.trimmed());
95
ui->comboBoxSerialNumber->addItem(sSerialNumber.trimmed(),sDeviceInfo);
96
//ui->lblSerialnumber->setText(sSerialNumber.trimmed());
97
m_deviceSerialNumber = sSerialNumber.trimmed();
100
//qDebug() << lineData.count() << lineData;
104
// if there are no devices, or if there is no permission
105
if (lines.count() == 0 || ui->comboBoxSerialNumber->currentText().startsWith(QLatin1String("???"))) {
106
ui->frameNoDevices->show();
107
//ui->widgetDeviceInfo->hide();
108
ui->widgetDeviceSerial->hide();
109
ui->comboBoxSerialNumber->clear();
111
m_deviceDetected = false;
113
ui->stackedWidgetDeviceConnected->setCurrentIndex(0);
114
endAction(QString::fromLatin1(" * there is no device connected."));
116
if (lines.count() > 0) {
117
ui->frameNoDevices->hide();
118
ui->widgetDeviceSerial->show();
120
m_deviceDetected = true;
121
ui->stackedWidgetDeviceConnected->setCurrentIndex(1);
122
endAction(QString::fromLatin1(" * found %0 devices.").arg(lines.count()));
124
detectDeviceVersion();
126
emit updateDeviceActions();
128
} else if (cmd == QString::fromLatin1("%0/device_version").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
129
endAction(QString::fromLatin1("..device version detected."));
130
detectHasNetworkConnection();
131
} else if (cmd == QString::fromLatin1("%0/openssh_version").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
132
if (m_reply.trimmed() != QLatin1String("(none)") && m_reply.trimmed() != QLatin1String("")) {
133
endAction(QString::fromLatin1("..openssh-server (%0) is installed.").arg(m_reply.trimmed()));
134
ui->widgetSshProperties->show();
135
ui->pushButtonSshInstall->hide();
136
ui->pushButtonSshRemove->show();
137
ui->stackedWidgetDeveloperMode->setCurrentIndex(1);
138
on_pushButtonPortForward_clicked();
140
endAction(QString::fromLatin1("..openssh-server was not installed."));
141
ui->pushButtonSshInstall->show();
142
ui->pushButtonSshRemove->hide();
143
ui->widgetSshProperties->hide();
144
ui->stackedWidgetDeveloperMode->setCurrentIndex(0);
146
} else if (cmd == QString::fromLatin1("%0/openssh_remove").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
147
endAction(QString::fromLatin1("..openssh-server was removed."));
149
} else if (cmd == QString::fromLatin1("%0/openssh_install").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
150
endAction(QString::fromLatin1("..openssh-server was installed."));
152
} else if (cmd == QString::fromLatin1("%0/device_portforward").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
153
endAction(QString::fromLatin1("..ports forwarded."));
154
on_pushButtonSshSetupPublicKey_clicked();
155
} else if (cmd == QString::fromLatin1("%0/openssh_publickey").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
156
endAction(QString::fromLatin1("..public key authentication is now set."));
157
} else if (cmd == QString::fromLatin1("%0/device_network_clone").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
158
endAction(QString::fromLatin1("..network configuration copied."));
159
detectHasNetworkConnection();
160
} else if (cmd == QString::fromLatin1("%0/device_time_clone").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
161
endAction(QString::fromLatin1("..time configuration copied."));
162
} else if (cmd == QString::fromLatin1("%0/device_hasnetwork").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH)) {
163
if (m_reply.trimmed() == QString::fromLatin1("1")) {
165
ui->frameNoNetwork->hide();
171
ui->frameNoNetwork->show();
172
ui->stackedWidgetDeveloperMode->setCurrentIndex(2);
178
//if (bOk && bHasNetwork) {
179
// ui->widgetDeviceInfo->show();
181
// ui->pushButtonCancel->hide();
182
ui->lblLoading->hide();
186
void UbuntuDevicesWidget::on_pushButtonReboot_clicked() {
187
beginAction(QString::fromLatin1("Reboot device.."));
188
m_ubuntuProcess.stop();
189
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_reboot %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
190
m_ubuntuProcess.start(QString::fromLatin1("Reboot device.."));
193
void UbuntuDevicesWidget::on_pushButtonShutdown_clicked() {
194
beginAction(QString::fromLatin1("Shutdown device.."));
195
m_ubuntuProcess.stop();
196
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_shutdown %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
197
m_ubuntuProcess.start(QString::fromLatin1("Shutdown device.."));
200
void UbuntuDevicesWidget::on_pushButtonRebootToBootloader_clicked() {
201
beginAction(QString::fromLatin1("Reboot to bootloader.."));
202
m_ubuntuProcess.stop();
203
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_reboot2bootloader %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
204
m_ubuntuProcess.start(QString::fromLatin1("Reboot to bootloader.."));
207
void UbuntuDevicesWidget::on_pushButtonRebootToRecovery_clicked() {
208
beginAction(QString::fromLatin1("Reboot to recovery.."));
209
m_ubuntuProcess.stop();
210
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_reboot2recovery %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
211
m_ubuntuProcess.start(QString::fromLatin1("Reboot to recovery.."));
214
void UbuntuDevicesWidget::detectOpenSsh() {
215
beginAction(QString::fromLatin1("Detecting if openssh-server is installed.."));
216
m_ubuntuProcess.stop();
217
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/openssh_version %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
218
m_ubuntuProcess.start(QString::fromLatin1("Detecting openssh-server"));
221
void UbuntuDevicesWidget::detectDevices() {
222
beginAction(QString::fromLatin1("Detecting device.."));
223
m_ubuntuProcess.stop();
224
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_search").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH) << QApplication::applicationDirPath());
225
m_ubuntuProcess.start(QString::fromLatin1("Searching Ubuntu Touch device"));
228
void UbuntuDevicesWidget::on_pushButtonSshConnect_clicked() {
229
m_ubuntuProcess.stop();
230
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/openssh_connect %1 %2 %3").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()).arg(ui->spinBoxSshPort->value()).arg(ui->lineEditUserName->text()) << QApplication::applicationDirPath());
231
m_ubuntuProcess.start(QString::fromLatin1("Opening ssh connection to device"));
234
void UbuntuDevicesWidget::on_pushButtonCloneNetworkConfig_clicked() {
235
beginAction(QString::fromLatin1("Clone network configuration from host to device.."));
236
ui->frameNoNetwork->hide();
237
m_ubuntuProcess.stop();
238
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_network_clone %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
239
m_ubuntuProcess.start(QString::fromLatin1("Clone network configuration from host to device.."));
242
void UbuntuDevicesWidget::on_comboBoxSerialNumber_currentIndexChanged( const QString & text ) {
243
m_deviceSerialNumber = text;
244
if (!text.isEmpty()) {
245
ui->lblDeviceInfo->setText(ui->comboBoxSerialNumber->itemData(ui->comboBoxSerialNumber->currentIndex()).toString());
246
// FIXME this call should not be called on init
247
detectDeviceVersion();
251
void UbuntuDevicesWidget::onError(QString msg) {
252
ui->plainTextEdit->appendHtml(QString::fromLatin1("<p style=\"color: red\">%0</p>").arg(msg));
255
void UbuntuDevicesWidget::on_pushButtonRefresh_clicked() {
256
m_deviceDetected = false;
257
m_ubuntuProcess.stop();
259
ui->plainTextEdit->clear();
263
ui->frameNoDevices->hide();
265
//ui->widgetDeviceInfo->hide();
266
ui->lblLoading->show();
267
// ui->pushButtonCancel->show();
269
//ui->lblDeviceName->setText(QLatin1String(""));
270
ui->comboBoxSerialNumber->clear();
271
// ui->lblSerialnumber->setText(QLatin1String(""));
276
void UbuntuDevicesWidget::beginAction(QString msg) {
277
ui->plainTextEdit->appendHtml(QString::fromLatin1("<p style=\"color: #888\">%0</p>").arg(msg));
280
void UbuntuDevicesWidget::endAction(QString msg) {
281
ui->plainTextEdit->appendHtml(QString::fromLatin1("<p style=\"color: #888\">%0</p>").arg(msg));
284
void UbuntuDevicesWidget::on_pushButtonPortForward_clicked() {
285
beginAction(QString::fromLatin1("Enabling port forward.."));
286
m_ubuntuProcess.stop();
287
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_portforward %1 %2 %3").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()).arg(ui->spinBoxSshPort->value()).arg(ui->spinBoxQmlPort->value()) << QApplication::applicationDirPath());
288
m_ubuntuProcess.start(QString::fromLatin1("Enabling port forward.."));
291
void UbuntuDevicesWidget::on_pushButtonSshSetupPublicKey_clicked() {
292
beginAction(QString::fromLatin1("Setting up public key authentication.."));
293
m_ubuntuProcess.stop();
294
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/openssh_publickey %1 %2").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()).arg(ui->lineEditUserName->text()) << QApplication::applicationDirPath());
295
m_ubuntuProcess.start(QString::fromLatin1("Setting up public key authentication.."));
298
void UbuntuDevicesWidget::on_pushButtonUpgradeToDailyImage_clicked() {
299
beginAction(QString::fromLatin1("Upgrade device to daily.."));
300
m_ubuntuProcess.stop();
301
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_flashdaily %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
302
m_ubuntuProcess.start(QString::fromLatin1("Upgrade device to daily.."));
305
void UbuntuDevicesWidget::on_pushButtonUpgradeToDailyImageWithBootstrap_clicked() {
306
beginAction(QString::fromLatin1("Upgrade device to daily with a full bootstrap.."));
307
m_ubuntuProcess.stop();
308
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_flashdaily_bootstrap %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
309
m_ubuntuProcess.start(QString::fromLatin1("Upgrade device to daily with a full bootstrap.."));
312
void UbuntuDevicesWidget::detectHasNetworkConnection() {
313
beginAction(QString::fromLatin1("Check if the device is connected to a network.."));
314
m_ubuntuProcess.stop();
315
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_hasnetwork %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
316
m_ubuntuProcess.start(QString::fromLatin1("Check if the device is connected to a network"));
319
QString UbuntuDevicesWidget::serialNumber() {
320
return ui->comboBoxSerialNumber->currentText();
323
void UbuntuDevicesWidget::detectDeviceVersion() {
324
beginAction(QString::fromLatin1("Check device image version.."));
325
m_ubuntuProcess.stop();
326
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_version %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
327
m_ubuntuProcess.start(QString::fromLatin1("Check device image version.."));
330
UbuntuDevicesWidget::~UbuntuDevicesWidget()
332
m_aboutToClose = true;
333
m_ubuntuProcess.stop();
337
void UbuntuDevicesWidget::on_pushButtonSshInstall_clicked() {
338
beginAction(QString::fromLatin1("Installing openssh-server.."));
339
m_ubuntuProcess.stop();
340
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/openssh_install %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
341
m_ubuntuProcess.start(QString::fromLatin1("Installing openssh-server.."));
344
void UbuntuDevicesWidget::on_pushButtonCloneTimeConfig_clicked() {
345
beginAction(QString::fromLatin1("Cloning time configuration from host to device.."));
346
m_ubuntuProcess.stop();
347
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/device_time_clone %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
348
m_ubuntuProcess.start(QString::fromLatin1("Cloning time configuration from host to device.."));
351
void UbuntuDevicesWidget::on_pushButtonSshRemove_clicked() {
352
beginAction(QString::fromLatin1("Removing openssh-server.."));
353
m_ubuntuProcess.stop();
354
m_ubuntuProcess.append(QStringList() << QString::fromLatin1("%0/openssh_remove %1").arg(Ubuntu::Constants::UBUNTU_SCRIPTPATH).arg(serialNumber()) << QApplication::applicationDirPath());
355
m_ubuntuProcess.start(QString::fromLatin1("Removing openssh-server.."));