diff --git a/console.php b/console.php index 9b2475aa03..43f0563dc7 100644 --- a/console.php +++ b/console.php @@ -22,18 +22,14 @@ */ use Symfony\Component\Console\Application; +define('OC_CONSOLE', 1); + try { require_once 'lib/base.php'; // set to run indefinitely if needed set_time_limit(0); - // Don't do anything if ownCloud has not been installed yet - if (!\OC::$server->getConfig()->getSystemValue('installed', false)) { - echo "Console can only be used once ownCloud has been installed" . PHP_EOL; - exit(0); - } - if (!OC::$CLI) { echo "This script can be run from the command line only" . PHP_EOL; exit(0); @@ -54,23 +50,23 @@ try { } } - // only load apps if no update is due, - // else only core commands will be available - if (!\OCP\Util::needUpgrade()) { - // load all apps to get all api routes properly setup - OC_App::loadApps(); - } - $defaults = new OC_Defaults; $application = new Application($defaults->getName(), \OC_Util::getVersionString()); require_once 'core/register_command.php'; - if (!\OCP\Util::needUpgrade()) { - foreach(OC_App::getAllApps() as $app) { - $file = OC_App::getAppPath($app).'/appinfo/register_command.php'; - if(file_exists($file)) { - require $file; + if (\OC::$server->getConfig()->getSystemValue('installed', false)) { + if (!\OCP\Util::needUpgrade()) { + OC_App::loadApps(); + foreach (OC_App::getAllApps() as $app) { + $file = OC_App::getAppPath($app) . '/appinfo/register_command.php'; + if (file_exists($file)) { + require $file; + } } + } else { + echo "ownCloud or one of the apps require upgrade - only a limited number of commands are available" . PHP_EOL; } + } else { + echo "ownCloud is not installed - only a limited number of commands are available" . PHP_EOL; } $application->run(); } catch (Exception $ex) { diff --git a/core/command/maintenance/install.php b/core/command/maintenance/install.php new file mode 100644 index 0000000000..38074adf11 --- /dev/null +++ b/core/command/maintenance/install.php @@ -0,0 +1,124 @@ +config = $config; + } + + protected function configure() { + $this + ->setName('maintenance:install') + ->setDescription('install ownCloud') + ->addOption('database', null, InputOption::VALUE_REQUIRED, 'Supported database type', 'sqlite') + ->addOption('database-name', null, InputOption::VALUE_REQUIRED, 'Name of the database') + ->addOption('database-host', null, InputOption::VALUE_REQUIRED, 'Hostname of the database', 'localhost') + ->addOption('database-user', null, InputOption::VALUE_REQUIRED, 'User name to connect to the database') + ->addOption('database-pass', null, InputOption::VALUE_REQUIRED, 'Password of the database user') + ->addOption('database-table-prefix', null, InputOption::VALUE_REQUIRED, 'Prefix for all tables', 'oc_') + ->addOption('admin-user', null, InputOption::VALUE_REQUIRED, 'User name of the admin account', 'admin') + ->addOption('admin-pass', null, InputOption::VALUE_REQUIRED, 'Password of the admin account') + ->addOption('data-dir', null, InputOption::VALUE_REQUIRED, 'Path to data directory', \OC::$SERVERROOT."/data"); + } + + 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) { + $output->writeln((string)$error); + } + + return 1; + } + + /** + * @param InputInterface $input + * @param OutputInterface $output + * @return array + */ + protected function validateInput(InputInterface $input, OutputInterface $output) { + $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."); + } + + $dbUser = $input->getOption('database-user'); + $dbPass = $input->getOption('database-pass'); + $dbName = $input->getOption('database-name'); + $dbHost = $input->getOption('database-host'); + $dbTablePrefix = $input->getOption('database-table-prefix'); + $adminLogin = $input->getOption('admin-user'); + $adminPassword = $input->getOption('admin-pass'); + $dataDir = $input->getOption('data-dir'); + + if ($db !== 'sqlite') { + if (is_null($dbUser)) { + throw new InvalidArgumentException("Database user not provided."); + } + if (is_null($dbName)) { + throw new InvalidArgumentException("Database name not provided."); + } + if (is_null($dbPass)) { + /** @var $dialog \Symfony\Component\Console\Helper\DialogHelper */ + $dialog = $this->getHelperSet()->get('dialog'); + $dbPass = $dialog->askHiddenResponse( + $output, + "What is the password to access the database with user <$dbUser>?", + false + ); + } + } + + if (is_null($adminPassword)) { + /** @var $dialog \Symfony\Component\Console\Helper\DialogHelper */ + $dialog = $this->getHelperSet()->get('dialog'); + $adminPassword = $dialog->askHiddenResponse( + $output, + "What is the password you like to use for the admin account <$adminLogin>?", + false + ); + } + + $options = [ + 'dbtype' => $db, + 'dbuser' => $dbUser, + 'dbpass' => $dbPass, + 'dbname' => $dbName, + 'dbhost' => $dbHost, + 'dbtableprefix' => $dbTablePrefix, + 'adminlogin' => $adminLogin, + 'adminpass' => $adminPassword, + 'directory' => $dataDir + ]; + return $options; + } +} diff --git a/core/register_command.php b/core/register_command.php index 4af423054d..c62282c084 100644 --- a/core/register_command.php +++ b/core/register_command.php @@ -24,23 +24,28 @@ * along with this program. If not, see * */ -$repair = new \OC\Repair(\OC\Repair::getRepairSteps()); /** @var $application Symfony\Component\Console\Application */ $application->add(new OC\Core\Command\Status); -$application->add(new OC\Core\Command\Db\GenerateChangeScript()); -$application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory())); -$application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig())); -$application->add(new OC\Core\Command\Maintenance\SingleUser()); -$application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig())); -$application->add(new OC\Core\Command\App\CheckCode()); -$application->add(new OC\Core\Command\App\Disable()); -$application->add(new OC\Core\Command\App\Enable()); -$application->add(new OC\Core\Command\App\ListApps()); -$application->add(new OC\Core\Command\Maintenance\Repair($repair, \OC::$server->getConfig())); -$application->add(new OC\Core\Command\User\Report()); -$application->add(new OC\Core\Command\User\ResetPassword(\OC::$server->getUserManager())); -$application->add(new OC\Core\Command\User\LastSeen()); -$application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager())); -$application->add(new OC\Core\Command\L10n\CreateJs()); +if (\OC::$server->getConfig()->getSystemValue('installed', false)) { + $repair = new \OC\Repair(\OC\Repair::getRepairSteps()); + + $application->add(new OC\Core\Command\Db\GenerateChangeScript()); + $application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory())); + $application->add(new OC\Core\Command\Upgrade(\OC::$server->getConfig())); + $application->add(new OC\Core\Command\Maintenance\SingleUser()); + $application->add(new OC\Core\Command\Maintenance\Mode(\OC::$server->getConfig())); + $application->add(new OC\Core\Command\App\CheckCode()); + $application->add(new OC\Core\Command\App\Disable()); + $application->add(new OC\Core\Command\App\Enable()); + $application->add(new OC\Core\Command\App\ListApps()); + $application->add(new OC\Core\Command\Maintenance\Repair($repair, \OC::$server->getConfig())); + $application->add(new OC\Core\Command\User\Report()); + $application->add(new OC\Core\Command\User\ResetPassword(\OC::$server->getUserManager())); + $application->add(new OC\Core\Command\User\LastSeen()); + $application->add(new OC\Core\Command\User\Delete(\OC::$server->getUserManager())); + $application->add(new OC\Core\Command\L10n\CreateJs()); +} else { + $application->add(new OC\Core\Command\Maintenance\Install(\OC::$server->getConfig())); +} diff --git a/lib/base.php b/lib/base.php index 3cf0fef2ed..6048df33f4 100644 --- a/lib/base.php +++ b/lib/base.php @@ -257,6 +257,9 @@ class OC { } public static function checkInstalled() { + if (defined('OC_CONSOLE')) { + return; + } // Redirect to installer if not installed if (!\OC::$server->getSystemConfig()->getValue('installed', false) && OC::$SUBURI != '/index.php') { if (OC::$CLI) {