2011-09-30 19:42:28 +04:00
|
|
|
/*
|
|
|
|
* Copyright (C) by Klaas Freitag <freitag@kde.org>
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful, but
|
|
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
|
|
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
|
|
* for more details.
|
|
|
|
*/
|
|
|
|
|
2011-09-28 20:14:48 +04:00
|
|
|
#include <QtCore>
|
|
|
|
#include <QProcess>
|
2011-09-29 19:17:50 +04:00
|
|
|
#include <QMessageBox>
|
2011-09-29 21:05:49 +04:00
|
|
|
#include <QDesktopServices>
|
2011-09-28 20:14:48 +04:00
|
|
|
|
|
|
|
#include "owncloudsetup.h"
|
2011-09-30 16:19:26 +04:00
|
|
|
#include "mirall/sitecopyconfig.h"
|
2011-10-05 14:11:10 +04:00
|
|
|
#include "mirall/sitecopyfolder.h"
|
2011-09-28 20:14:48 +04:00
|
|
|
|
|
|
|
namespace Mirall {
|
|
|
|
|
|
|
|
OwncloudSetup::OwncloudSetup( QObject *parent ) :
|
|
|
|
QObject( parent )
|
|
|
|
{
|
|
|
|
_process = new QProcess( this );
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(readyReadStandardOutput()),
|
|
|
|
SLOT(slotReadyReadStandardOutput()));
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(readyReadStandardError()),
|
|
|
|
SLOT(slotReadyReadStandardError()));
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(stateChanged(QProcess::ProcessState)),
|
|
|
|
SLOT(slotStateChanged(QProcess::ProcessState)));
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(error(QProcess::ProcessError)),
|
|
|
|
SLOT(slotError(QProcess::ProcessError)));
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(started()),
|
|
|
|
SLOT(slotStarted()));
|
|
|
|
|
|
|
|
QObject::connect(_process, SIGNAL(finished(int, QProcess::ExitStatus)),
|
|
|
|
SLOT(slotFinished(int, QProcess::ExitStatus)));
|
|
|
|
|
|
|
|
|
|
|
|
_ocWizard = new OwncloudWizard();
|
2011-09-29 21:05:49 +04:00
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
connect( _ocWizard, SIGNAL(connectToOCUrl( const QString& ) ),
|
|
|
|
this, SLOT(slotConnectToOCUrl( const QString& )));
|
2011-09-28 20:14:48 +04:00
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
connect( _ocWizard, SIGNAL(installOCServer()),
|
|
|
|
this, SLOT(slotInstallOCServer()));
|
|
|
|
|
|
|
|
connect( _ocWizard, SIGNAL(installOCLocalhost()),
|
|
|
|
this, SLOT(slotCreateOCLocalhost()));
|
2011-09-28 20:14:48 +04:00
|
|
|
|
2011-10-14 18:39:53 +04:00
|
|
|
// in case of cancel, terminate the owncloud-admin script.
|
|
|
|
connect( _ocWizard, SIGNAL(rejected()), _process, SLOT(terminate()));
|
|
|
|
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotConnectToOCUrl( const QString& url )
|
|
|
|
{
|
|
|
|
qDebug() << "Connect to url: " << url;
|
2011-09-29 21:05:49 +04:00
|
|
|
_ocWizard->setField("OCUrl", url );
|
|
|
|
_ocWizard->appendToResultWidget(tr("Connecting to ownCloud at %1").arg(url ));
|
|
|
|
slotFinished( 0, QProcess::NormalExit );
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
bool OwncloudSetup::isBusy()
|
2011-09-28 20:14:48 +04:00
|
|
|
{
|
2011-09-29 18:36:27 +04:00
|
|
|
return _process->state() > 0;
|
|
|
|
}
|
|
|
|
|
2011-10-14 18:39:53 +04:00
|
|
|
OwncloudWizard *OwncloudSetup::wizard()
|
|
|
|
{
|
|
|
|
return _ocWizard;
|
|
|
|
}
|
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
void OwncloudSetup::slotCreateOCLocalhost()
|
|
|
|
{
|
|
|
|
if( isBusy() ) {
|
|
|
|
qDebug() << "Can not install now, busy. Come back later.";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
qDebug() << "Install OC on localhost";
|
|
|
|
|
|
|
|
QStringList args;
|
|
|
|
|
|
|
|
args << "install";
|
|
|
|
args << "--server-type" << "local";
|
|
|
|
args << "--root_helper" << "kdesu -c";
|
2011-09-29 19:17:50 +04:00
|
|
|
runOwncloudAdmin( args );
|
2011-09-29 21:05:49 +04:00
|
|
|
|
|
|
|
// define
|
|
|
|
_ocWizard->setField( "OCUrl", QString( "http://localhost/owncloud/") );
|
2011-09-29 18:36:27 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotInstallOCServer()
|
|
|
|
{
|
|
|
|
if( isBusy() ) {
|
|
|
|
qDebug() << "Can not install now, busy. Come back later.";
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2011-09-28 20:14:48 +04:00
|
|
|
const QString server = _ocWizard->field("ftpUrl").toString();
|
|
|
|
const QString user = _ocWizard->field("ftpUser").toString();
|
|
|
|
const QString passwd = _ocWizard->field("ftpPasswd").toString();
|
2011-09-29 18:36:27 +04:00
|
|
|
const QString dir; // = _ocWizard->field("ftpDir").toString();
|
2011-09-28 20:14:48 +04:00
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
qDebug() << "Install OC on " << server << " as user " << user;
|
2011-09-28 20:14:48 +04:00
|
|
|
|
|
|
|
QStringList args;
|
|
|
|
args << "install";
|
|
|
|
args << "--server-type" << "ftp";
|
2011-09-29 18:36:27 +04:00
|
|
|
args << "--server" << server;
|
|
|
|
args << "--user" << user;
|
2011-09-29 19:17:50 +04:00
|
|
|
if( ! passwd.isEmpty() ) {
|
|
|
|
args << "--password" << passwd;
|
|
|
|
}
|
2011-09-29 18:36:27 +04:00
|
|
|
if( !dir.isEmpty() ) {
|
|
|
|
args << "--ftpdir" << dir;
|
|
|
|
}
|
2011-09-29 19:17:50 +04:00
|
|
|
runOwncloudAdmin( args );
|
2011-09-29 21:05:49 +04:00
|
|
|
_ocWizard->setField( "OCUrl", QString( "%1/owncloud/").arg(_ocWizard->field("myOCDomain").toString() ));
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 19:17:50 +04:00
|
|
|
void OwncloudSetup::runOwncloudAdmin( const QStringList& args )
|
|
|
|
{
|
|
|
|
const QString bin("/usr/bin/owncloud-admin");
|
2011-10-14 18:39:53 +04:00
|
|
|
qDebug() << "starting " << bin << " with args. " << args;
|
|
|
|
if( _process->state() != QProcess::NotRunning ) {
|
|
|
|
qDebug() << "Owncloud admin is still running, skip!";
|
|
|
|
return;
|
|
|
|
}
|
2011-09-29 19:17:50 +04:00
|
|
|
if( checkOwncloudAdmin( bin )) {
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->appendToResultWidget( tr("Starting script owncloud-admin...") );
|
2011-09-29 19:17:50 +04:00
|
|
|
_process->start( bin, args );
|
|
|
|
} else {
|
|
|
|
slotFinished( 1, QProcess::NormalExit );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
void OwncloudSetup::slotReadyReadStandardOutput()
|
2011-09-28 20:14:48 +04:00
|
|
|
{
|
2011-09-29 18:36:27 +04:00
|
|
|
QByteArray arr = _process->readAllStandardOutput();
|
|
|
|
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
|
|
|
|
// render the output to status line
|
|
|
|
QString string = codec->toUnicode( arr );
|
|
|
|
_ocWizard->appendToResultWidget( string );
|
2011-09-28 20:14:48 +04:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
void OwncloudSetup::slotReadyReadStandardError()
|
2011-09-28 20:14:48 +04:00
|
|
|
{
|
2011-09-29 18:36:27 +04:00
|
|
|
qDebug() << _process->readAllStandardError();
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotStateChanged( QProcess::ProcessState )
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotError( QProcess::ProcessError )
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotStarted()
|
|
|
|
{
|
2011-09-29 18:36:27 +04:00
|
|
|
_ocWizard->button( QWizard::FinishButton )->setEnabled( false );
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->button( QWizard::BackButton )->setEnabled( false );
|
|
|
|
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
void OwncloudSetup::slotFinished( int res, QProcess::ExitStatus )
|
2011-09-28 20:14:48 +04:00
|
|
|
{
|
2011-09-29 18:36:27 +04:00
|
|
|
_ocWizard->button( QWizard::FinishButton )->setEnabled( true );
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->button( QWizard::BackButton)->setEnabled( true );
|
|
|
|
QApplication::restoreOverrideCursor();
|
2011-09-28 20:14:48 +04:00
|
|
|
|
2011-09-29 18:36:27 +04:00
|
|
|
if( res ) {
|
2011-09-29 19:17:50 +04:00
|
|
|
_ocWizard->appendToResultWidget( tr("<font color=\"red\">Installation of ownCloud failed!</font>") );
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->showOCUrlLabel( false );
|
|
|
|
emit ownCloudSetupFinished( false );
|
2011-09-29 18:36:27 +04:00
|
|
|
} else {
|
2011-09-29 21:05:49 +04:00
|
|
|
// Successful installation. Write the config.
|
2011-09-29 19:17:50 +04:00
|
|
|
_ocWizard->appendToResultWidget( tr("<font color=\"green\">Installation of ownCloud succeeded!</font>") );
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->showOCUrlLabel( true );
|
2011-09-29 21:05:49 +04:00
|
|
|
writeOwncloudConfig();
|
2011-09-30 16:19:26 +04:00
|
|
|
|
|
|
|
emit ownCloudSetupFinished( true );
|
|
|
|
setupLocalSyncFolder();
|
2011-09-29 18:36:27 +04:00
|
|
|
}
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 21:05:49 +04:00
|
|
|
void OwncloudSetup::startWizard()
|
2011-09-28 20:14:48 +04:00
|
|
|
{
|
2011-09-30 12:24:01 +04:00
|
|
|
_ocWizard->setOCUrl( ownCloudUrl() );
|
2011-10-14 18:39:53 +04:00
|
|
|
_ocWizard->show();
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 21:05:49 +04:00
|
|
|
QString OwncloudSetup::mirallConfigFile() const
|
|
|
|
{
|
|
|
|
const QString dir = QDesktopServices::storageLocation(QDesktopServices::DataLocation) + "/mirall.cfg";
|
|
|
|
return dir;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void OwncloudSetup::writeOwncloudConfig()
|
|
|
|
{
|
|
|
|
qDebug() << "*** writing mirall config to " << mirallConfigFile();
|
|
|
|
QSettings settings( mirallConfigFile(), QSettings::IniFormat);
|
2011-09-30 17:35:19 +04:00
|
|
|
QString url = _ocWizard->field("OCUrl").toString();
|
|
|
|
if( !url.startsWith("http")) {
|
|
|
|
url.prepend( "http://" );
|
|
|
|
}
|
|
|
|
settings.setValue("ownCloud/url", url );
|
2011-09-30 14:51:56 +04:00
|
|
|
settings.setValue("ownCloud/user", _ocWizard->field("OCUser").toString() );
|
|
|
|
settings.setValue("ownCloud/password", _ocWizard->field("OCPasswd").toString() );
|
|
|
|
|
2011-09-29 21:05:49 +04:00
|
|
|
settings.sync();
|
|
|
|
}
|
|
|
|
|
2011-09-30 12:24:01 +04:00
|
|
|
/*
|
|
|
|
* returns the configured owncloud url if its already configured, otherwise an empty
|
|
|
|
* string.
|
|
|
|
*/
|
|
|
|
QString OwncloudSetup::ownCloudUrl() const
|
|
|
|
{
|
|
|
|
QSettings settings( mirallConfigFile(), QSettings::IniFormat );
|
|
|
|
QString url = settings.value( "ownCloud/url" ).toString();
|
|
|
|
qDebug() << "Returning configured owncloud url: " << url;
|
|
|
|
|
|
|
|
return url;
|
|
|
|
}
|
|
|
|
|
2011-09-30 16:19:26 +04:00
|
|
|
QString OwncloudSetup::ownCloudUser() const
|
|
|
|
{
|
|
|
|
QSettings settings( mirallConfigFile(), QSettings::IniFormat );
|
|
|
|
QString user = settings.value( "ownCloud/user" ).toString();
|
|
|
|
qDebug() << "Returning configured owncloud user: " << user;
|
|
|
|
|
|
|
|
return user;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString OwncloudSetup::ownCloudPasswd() const
|
|
|
|
{
|
|
|
|
QSettings settings( mirallConfigFile(), QSettings::IniFormat );
|
|
|
|
QString pwd = settings.value( "ownCloud/password" ).toString();
|
|
|
|
|
|
|
|
return pwd;
|
|
|
|
}
|
|
|
|
|
2011-09-29 21:05:49 +04:00
|
|
|
/*
|
|
|
|
* method to check the if the owncloud admin script is existing
|
|
|
|
*/
|
2011-09-29 19:17:50 +04:00
|
|
|
bool OwncloudSetup::checkOwncloudAdmin( const QString& bin )
|
|
|
|
{
|
|
|
|
QFileInfo fi( bin );
|
|
|
|
qDebug() << "checking owncloud-admin " << bin;
|
|
|
|
if( ! (fi.exists() && fi.isExecutable() ) ) {
|
|
|
|
_ocWizard->appendToResultWidget( tr("The owncloud admin script can not be found.\n"
|
|
|
|
"Setup can not be done.") );
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
2011-09-28 20:14:48 +04:00
|
|
|
}
|
2011-09-29 18:36:27 +04:00
|
|
|
|
2011-09-30 16:19:26 +04:00
|
|
|
void OwncloudSetup::setupLocalSyncFolder()
|
|
|
|
{
|
2011-10-05 14:11:10 +04:00
|
|
|
const QString syncFolder( QDir::homePath() + "/ownCloud" );
|
2011-09-30 16:19:26 +04:00
|
|
|
qDebug() << "Setup local sync folder " << syncFolder;
|
|
|
|
QDir fi( syncFolder );
|
|
|
|
_ocWizard->appendToResultWidget( tr("creating local sync folder %1").arg(syncFolder) );
|
|
|
|
|
|
|
|
if( fi.exists() ) {
|
|
|
|
// there is an existing local folder. If its non empty, it can only be synced if the
|
|
|
|
// ownCloud is newly created.
|
|
|
|
_ocWizard->appendToResultWidget( tr("Local sync folder %1 already exists, can "
|
|
|
|
"not automatically create.").arg(syncFolder));
|
|
|
|
} else {
|
|
|
|
|
|
|
|
if( fi.mkpath( syncFolder ) ) {
|
2011-10-14 20:13:34 +04:00
|
|
|
QString targetPath = "mirall"; // Do NOT sync to root dir on ownCloud!
|
2011-09-30 16:19:26 +04:00
|
|
|
qDebug() << "Successfully created " << fi.path();
|
|
|
|
|
|
|
|
// Create a sitecopy config file
|
|
|
|
SitecopyConfig scConfig;
|
|
|
|
|
|
|
|
scConfig.writeSiteConfig( syncFolder, /* local path */
|
|
|
|
"ownCloud", /* _folderWizard->field("OCSiteAlias").toString(), site alias */
|
|
|
|
ownCloudUrl(),
|
|
|
|
ownCloudUser(),
|
|
|
|
ownCloudPasswd(),
|
|
|
|
targetPath );
|
|
|
|
|
2011-10-05 14:11:10 +04:00
|
|
|
// now there is the sitecopy config. A fetch in to the newly created folder mirrors
|
|
|
|
// the files from the ownCloud to local
|
|
|
|
startFetchFromOC( syncFolder );
|
|
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
qDebug() << "Failed to create " << fi.path();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::startFetchFromOC( const QString& syncFolder )
|
|
|
|
{
|
|
|
|
_scf = new SiteCopyFolder( "ownCloud",
|
|
|
|
syncFolder,
|
|
|
|
QString(),
|
|
|
|
this);
|
|
|
|
connect( _scf, SIGNAL( syncFinished( const SyncResult& )),
|
|
|
|
SLOT( slotFetchFinished( const SyncResult& )));
|
|
|
|
_ocWizard->appendToResultWidget( tr("Starting initial fetch of ownCloud data..."));
|
|
|
|
_scf->fetchFromOC();
|
|
|
|
}
|
|
|
|
|
|
|
|
void OwncloudSetup::slotFetchFinished( const SyncResult& res )
|
|
|
|
{
|
|
|
|
qDebug() << "Initial fetch finished!";
|
|
|
|
if( res.result() == SyncResult::Error ) {
|
|
|
|
_ocWizard->appendToResultWidget( tr("Initial fetch of data failed: ") + res.errorString() );
|
|
|
|
} else {
|
|
|
|
// fetch of data from ownCloud succeeded.
|
|
|
|
_ocWizard->appendToResultWidget( tr("Initial fetch of data succeeded.") );
|
|
|
|
_ocWizard->appendToResultWidget( tr("Writing mirall folder setting now.") );
|
|
|
|
// create a mirall folder entry.
|
2011-09-30 16:19:26 +04:00
|
|
|
// FIXME: folderConfigPath is a method of application object, copied to here.
|
|
|
|
const QString folderConfigPath = QDesktopServices::storageLocation(QDesktopServices::DataLocation) + "/folders";
|
|
|
|
|
2011-10-05 14:11:10 +04:00
|
|
|
const QString syncFolder( QDir::homePath() + "/ownCloud" );
|
|
|
|
const QString targetPath("/");
|
|
|
|
|
2011-09-30 16:19:26 +04:00
|
|
|
QSettings settings(folderConfigPath + "/ownCloud", QSettings::IniFormat);
|
|
|
|
settings.setValue("folder/backend", "sitecopy");
|
|
|
|
settings.setValue("folder/path", syncFolder );
|
|
|
|
settings.setValue("backend:sitecopy/targetPath", targetPath );
|
|
|
|
settings.setValue("backend:sitecopy/alias", "ownCloud" );
|
|
|
|
settings.sync();
|
|
|
|
}
|
2011-10-05 14:11:10 +04:00
|
|
|
_scf->deleteLater();
|
2011-09-30 16:19:26 +04:00
|
|
|
}
|
|
|
|
|
2011-09-29 19:17:50 +04:00
|
|
|
}
|
2011-09-29 18:36:27 +04:00
|
|
|
#include "owncloudsetup.moc"
|