Commit 3df1d933 authored by Thomas Müller's avatar Thomas Müller
Browse files

Merge pull request #14778 from owncloud/use-occ-setup-in-autotest-master

Use occ to install ownCloud in autotest.sh
parents cfaee935 6c1a1234
......@@ -4,7 +4,7 @@
#
# @author Thomas Müller
# @author Morris Jobke
# @copyright 2012, 2013 Thomas Müller thomas.mueller@tmit.eu
# @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu
# @copyright 2014 Morris Jobke hey@morrisjobke.de
#
......@@ -90,67 +90,6 @@ fi
echo "Using database $DATABASENAME"
# create autoconfig for sqlite, mysql and postgresql
cat > ./tests/autoconfig-sqlite.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'sqlite',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
);
DELIM
cat > ./tests/autoconfig-mysql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'mysql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-pgsql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'pgsql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-oci.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'oci',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASENAME',
'dbname' => 'XE',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
function execute_tests {
echo "Setup environment for $1 testing ..."
# back to root folder
......@@ -197,15 +136,16 @@ EOF
to $DATABASENAME;
exit;
EOF
DATABASEUSER=$DATABASENAME
DATABASENAME='XE'
fi
# copy autoconfig
cp "$BASEDIR/tests/autoconfig-$1.php" "$BASEDIR/config/autoconfig.php"
# trigger installation
echo "INDEX"
php -f index.php | grep -i -C9999 error && echo "Error during setup" && exit 101
echo "END INDEX"
echo "Installing ...."
./occ maintenance:install --database=$1 --database-name=$DATABASENAME --database-host=localhost --database-user=$DATABASEUSER --database-pass=owncloud --database-table-prefix=oc_ --admin-user=$ADMINLOGIN --admin-pass=admin --data-dir=$DATADIR
#test execution
echo "Testing with $1 ..."
......
......@@ -2,8 +2,14 @@
#
# ownCloud
#
# @author Vincent Petry
# @author Morris Jobke
# @author Robin McCorkell
# @author Thomas Müller
# @copyright 2012, 2013 Thomas Müller thomas.mueller@tmit.eu
# @author Andreas Fischer
# @author Joas Schilling
# @author Lukas Reschke
# @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu
#
set -e
......@@ -95,67 +101,6 @@ fi
echo "Using database $DATABASENAME"
# create autoconfig for sqlite, mysql and postgresql
cat > ./tests/autoconfig-sqlite.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'sqlite',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
);
DELIM
cat > ./tests/autoconfig-mysql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'mysql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-pgsql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'pgsql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-oci.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'oci',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASENAME',
'dbname' => 'XE',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
function execute_tests {
echo "Setup environment for $1 testing ..."
# back to root folder
......@@ -202,15 +147,16 @@ EOF
to $DATABASENAME;
exit;
EOF
DATABASEUSER=$DATABASENAME
DATABASENAME='XE'
fi
# copy autoconfig
cp "$BASEDIR/tests/autoconfig-$1.php" "$BASEDIR/config/autoconfig.php"
# trigger installation
echo "INDEX"
hhvm -f index.php | grep -i -C9999 error && echo "Error during setup" && exit 101
echo "END INDEX"
echo "Installing ...."
hhvm ./occ maintenance:install --database=$1 --database-name=$DATABASENAME --database-host=localhost --database-user=$DATABASEUSER --database-pass=owncloud --database-table-prefix=oc_ --admin-user=$ADMINLOGIN --admin-pass=admin --data-dir=$DATADIR
#test execution
echo "Testing with $1 ..."
......
......@@ -2,8 +2,14 @@
#
# ownCloud
#
# @author Vincent Petry
# @author Morris Jobke
# @author Robin McCorkell
# @author Thomas Müller
# @copyright 2012, 2013 Thomas Müller thomas.mueller@tmit.eu
# @author Andreas Fischer
# @author Joas Schilling
# @author Lukas Reschke
# @copyright 2012-2015 Thomas Müller thomas.mueller@tmit.eu
#
set -e
......@@ -89,67 +95,6 @@ fi
echo "Using database $DATABASENAME"
# create autoconfig for sqlite, mysql and postgresql
cat > ./tests/autoconfig-sqlite.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'sqlite',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
);
DELIM
cat > ./tests/autoconfig-mysql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'mysql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-pgsql.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'pgsql',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASEUSER',
'dbname' => '$DATABASENAME',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
cat > ./tests/autoconfig-oci.php <<DELIM
<?php
\$AUTOCONFIG = array (
'installed' => false,
'dbtype' => 'oci',
'dbtableprefix' => 'oc_',
'adminlogin' => '$ADMINLOGIN',
'adminpass' => 'admin',
'directory' => '$DATADIR',
'dbuser' => '$DATABASENAME',
'dbname' => 'XE',
'dbhost' => 'localhost',
'dbpass' => 'owncloud',
);
DELIM
function execute_tests {
echo "Setup environment for $1 testing ..."
# back to root folder
......@@ -162,8 +107,6 @@ function execute_tests {
rm -rf "$DATADIR"
mkdir "$DATADIR"
# remove the old config file
#rm -rf config/config.php
cp tests/preseed-config.php config/config.php
# drop database
......@@ -196,15 +139,13 @@ EOF
to $DATABASENAME;
exit;
EOF
DATABASEUSER=$DATABASENAME
DATABASENAME='XE'
fi
# copy autoconfig
cp "$BASEDIR/tests/autoconfig-$1.php" "$BASEDIR/config/autoconfig.php"
# trigger installation
echo "INDEX"
php -f index.php | grep -i -C9999 error && echo "Error during setup" && exit 101
echo "END INDEX"
echo "Installing ...."
./occ maintenance:install --database=$1 --database-name=$DATABASENAME --database-host=localhost --database-user=$DATABASEUSER --database-pass=owncloud --database-table-prefix=oc_ --admin-user=$ADMINLOGIN --admin-pass=admin --data-dir=$DATADIR
#test execution
echo "Testing with $1 ..."
......
......@@ -3,6 +3,7 @@
namespace OC\Core\Command\Maintenance;
use InvalidArgumentException;
use OC\Setup;
use OCP\IConfig;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
......@@ -38,39 +39,36 @@ class Install extends Command {
protected function execute(InputInterface $input, OutputInterface $output) {
$options = $this->validateInput($input, $output);
$errors = \OC\Setup::install($options);
if (count($errors) === 0) {
$output->writeln("ownCloud was successfully installed");
return 0;
}
foreach($errors as $error) {
if (is_array($error)) {
$output->writeln('<error>' . (string)$error['error'] . '</error>');
$output->writeln('<info> -> ' . (string)$error['hint'] . '</info>');
} else {
$output->writeln('<error>' . (string)$error . '</error>');
}
// validate the environment
$setupHelper = new Setup($this->config, \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
$sysInfo = $setupHelper->getSystemInfo();
$errors = $sysInfo['errors'];
if (count($errors) > 0) {
$this->printErrors($output, $errors);
return 1;
}
return 1;
// validate user input
$options = $this->validateInput($input, $output, array_keys($sysInfo['databases']));
// perform installation
$errors = $setupHelper->install($options);
if (count($errors) > 0) {
$this->printErrors($output, $errors);
return 1;
}
$output->writeln("ownCloud was successfully installed");
return 0;
}
/**
* @param InputInterface $input
* @param OutputInterface $output
* @param string[] $supportedDatabases
* @return array
*/
protected function validateInput(InputInterface $input, OutputInterface $output) {
protected function validateInput(InputInterface $input, OutputInterface $output, $supportedDatabases) {
$db = strtolower($input->getOption('database'));
$supportedDatabases = $this->config->getSystemValue('supportedDatabases', [
'sqlite',
'mysql',
'pgsql',
'oci',
'mssql'
]);
if (!in_array($db, $supportedDatabases)) {
throw new InvalidArgumentException("Database <$db> is not supported.");
......@@ -126,4 +124,19 @@ class Install extends Command {
];
return $options;
}
/**
* @param OutputInterface $output
* @param $errors
*/
protected function printErrors(OutputInterface $output, $errors) {
foreach ($errors as $error) {
if (is_array($error)) {
$output->writeln('<error>' . (string)$error['error'] . '</error>');
$output->writeln('<info> -> ' . (string)$error['hint'] . '</info>');
} else {
$output->writeln('<error>' . (string)$error . '</error>');
}
}
}
}
......@@ -9,42 +9,20 @@
namespace OC\Core\Setup;
use bantu\IniGetWrapper\IniGetWrapper;
use OCP\IConfig;
use OCP\IL10N;
use OC\Setup;
class Controller {
/**
* @var \OCP\IConfig
*/
protected $config;
/** @var IniGetWrapper */
protected $iniWrapper;
/** @var IL10N */
protected $l10n;
/** @var \OC_Defaults */
protected $defaults;
/**
* @var string
*/
/** @var Setup */
protected $setupHelper;
/** @var string */
private $autoConfigFile;
/**
* @param IConfig $config
* @param IniGetWrapper $iniWrapper
* @param IL10N $l10n
* @param \OC_Defaults $defaults
* @param Setup $setupHelper
*/
function __construct(IConfig $config,
IniGetWrapper $iniWrapper,
IL10N $l10n,
\OC_Defaults $defaults) {
function __construct(Setup $setupHelper) {
$this->autoConfigFile = \OC::$SERVERROOT.'/config/autoconfig.php';
$this->config = $config;
$this->iniWrapper = $iniWrapper;
$this->l10n = $l10n;
$this->defaults = $defaults;
$this->setupHelper = $setupHelper;
}
/**
......@@ -53,7 +31,7 @@ class Controller {
public function run($post) {
// Check for autosetup:
$post = $this->loadAutoConfig($post);
$opts = $this->getSystemInfo();
$opts = $this->setupHelper->getSystemInfo();
// convert 'abcpassword' to 'abcpass'
if (isset($post['adminpassword'])) {
......@@ -65,7 +43,7 @@ class Controller {
if(isset($post['install']) AND $post['install']=='true') {
// We have to launch the installation process :
$e = \OC\Setup::install($post);
$e = $this->setupHelper->install($post);
$errors = array('errors' => $e);
if(count($e) > 0) {
......@@ -126,85 +104,4 @@ class Controller {
return $post;
}
/**
* Gathers system information like database type and does
* a few system checks.
*
* @return array of system info, including an "errors" value
* in case of errors/warnings
*/
public function getSystemInfo() {
$setup = new \OC\Setup($this->config);
$databases = $setup->getSupportedDatabases();
$dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT.'/data');
$errors = array();
// Create data directory to test whether the .htaccess works
// Notice that this is not necessarily the same data directory as the one
// that will effectively be used.
@mkdir($dataDir);
$htAccessWorking = true;
if (is_dir($dataDir) && is_writable($dataDir)) {
// Protect data directory here, so we can test if the protection is working
\OC\Setup::protectDataDirectory();
try {
$htAccessWorking = \OC_Util::isHtaccessWorking();
} catch (\OC\HintException $e) {
$errors[] = array(
'error' => $e->getMessage(),
'hint' => $e->getHint()
);
$htAccessWorking = false;
}
}
if (\OC_Util::runningOnMac()) {
$errors[] = array(
'error' => $this->l10n->t(
'Mac OS X is not supported and %s will not work properly on this platform. ' .
'Use it at your own risk! ',
$this->defaults->getName()
),
'hint' => $this->l10n->t('For the best results, please consider using a GNU/Linux server instead.')
);
}
if($this->iniWrapper->getString('open_basedir') !== '' && PHP_INT_SIZE === 4) {
$errors[] = array(
'error' => $this->l10n->t(
'It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. ' .
'This will lead to problems with files over 4 GB and is highly discouraged.',
$this->defaults->getName()
),
'hint' => $this->l10n->t('Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP.')
);
}
if(!function_exists('curl_init') && PHP_INT_SIZE === 4) {
$errors[] = array(
'error' => $this->l10n->t(
'It seems that this %s instance is running on a 32-bit PHP environment and cURL is not installed. ' .
'This will lead to problems with files over 4 GB and is highly discouraged.',
$this->defaults->getName()
),
'hint' => $this->l10n->t('Please install the cURL extension and restart your webserver.')
);
}
return array(
'hasSQLite' => isset($databases['sqlite']),
'hasMySQL' => isset($databases['mysql']),
'hasPostgreSQL' => isset($databases['pgsql']),
'hasOracle' => isset($databases['oci']),
'hasMSSQL' => isset($databases['mssql']),
'databases' => $databases,
'directory' => $dataDir,
'htaccessWorking' => $htAccessWorking,
'errors' => $errors,
);
}
}
......@@ -566,7 +566,7 @@ class OC {
} catch(\Exception $e) {
echo('Writing to database failed');
}
exit();
exit(1);
} else {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
OC_Template::printGuestPage('', 'error', array('errors' => $errors));
......@@ -747,7 +747,8 @@ class OC {
// Check if ownCloud is installed or in maintenance (update) mode
if (!$systemConfig->getValue('installed', false)) {
\OC::$server->getSession()->clear();
$controller = new OC\Core\Setup\Controller(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('core'), new \OC_Defaults());
$setupHelper = new OC\Setup(\OC::$server->getConfig(), \OC::$server->getIniWrapper(), \OC::$server->getL10N('lib'), new \OC_Defaults());
$controller = new OC\Core\Setup\Controller($setupHelper);
$controller->run($_POST);
exit();
}
......
......@@ -8,19 +8,34 @@
namespace OC;
use bantu\IniGetWrapper\IniGetWrapper;
use Exception;
use OC_L10N;
use OCP\IConfig;
use OCP\IL10N;
class Setup {
/** @var IConfig */
/** @var \OCP\IConfig */
protected $config;
/** @var IniGetWrapper */
protected $iniWrapper;
/** @var IL10N */
protected $l10n;
/** @var \OC_Defaults */
protected $defaults;
/**
* @param IConfig $config
* @param IniGetWrapper $iniWrapper
* @param \OC_Defaults $defaults
*/
function __construct(IConfig $config) {
function __construct(IConfig $config,
IniGetWrapper $iniWrapper,
IL10N $l10n,
\OC_Defaults $defaults) {
$this->config = $config;
$this->iniWrapper = $iniWrapper;
$this->l10n = $l10n;
$this->defaults = $defaults;
}
static $dbSetupClasses = array(
......@@ -32,13 +47,6 @@ class Setup {
'sqlite3' => '\OC\Setup\Sqlite',
);
/**
* @return OC_L10N
*/
public static function getTrans(){
return \OC::$server->getL10N('lib');
}
/**
* Wrapper around the "class_exists" PHP function to be able to mock it
* @param string $name
......@@ -116,12 +124,91 @@ class Setup {
return $supportedDatabases;
}
/**
* Gathers system information like database type and does
* a few system checks.
*
* @return array of system info, including an "errors" value
* in case of errors/warnings
*/
public function getSystemInfo() {
$databases = $this->getSupportedDatabases();
$dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT.'/data');