diff --git a/core/Command/Maintenance/Install.php b/core/Command/Maintenance/Install.php
index dffbbd0338217..fc219e79bcdd4 100644
--- a/core/Command/Maintenance/Install.php
+++ b/core/Command/Maintenance/Install.php
@@ -43,6 +43,8 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\Question;
+use Throwable;
+use function get_class;
class Install extends Command {
@@ -201,11 +203,26 @@ protected function validateInput(InputInterface $input, OutputInterface $output,
protected function printErrors(OutputInterface $output, $errors) {
foreach ($errors as $error) {
if (is_array($error)) {
- $output->writeln('' . (string)$error['error'] . '');
- $output->writeln(' -> ' . (string)$error['hint'] . '');
+ $output->writeln('' . $error['error'] . '');
+ if (isset($error['hint']) && !empty($error['hint'])) {
+ $output->writeln(' -> ' . $error['hint'] . '');
+ }
+ if (isset($error['exception']) && $error['exception'] instanceof Throwable) {
+ $this->printThrowable($output, $error['exception']);
+ }
} else {
- $output->writeln('' . (string)$error . '');
+ $output->writeln('' . $error . '');
}
}
}
+
+ private function printThrowable(OutputInterface $output, Throwable $t): void {
+ $output->write('Trace: ' . $t->getTraceAsString() . '');
+ $output->writeln('');
+ if ($t->getPrevious() !== null) {
+ $output->writeln('');
+ $output->writeln('Previous: ' . get_class($t->getPrevious()) . ': ' . $t->getPrevious()->getMessage() . '');
+ $this->printThrowable($output, $t->getPrevious());
+ }
+ }
}
diff --git a/lib/private/Setup.php b/lib/private/Setup.php
index 873e82e55de7f..98cf11e3a87c3 100644
--- a/lib/private/Setup.php
+++ b/lib/private/Setup.php
@@ -236,6 +236,7 @@ public function getSystemInfo($allowAllDatabases = false) {
} catch (\OC\HintException $e) {
$errors[] = [
'error' => $e->getMessage(),
+ 'exception' => $e,
'hint' => $e->getHint(),
];
$htAccessWorking = false;
@@ -360,12 +361,14 @@ public function install($options) {
} catch (\OC\DatabaseSetupException $e) {
$error[] = [
'error' => $e->getMessage(),
+ 'exception' => $e,
'hint' => $e->getHint(),
];
return $error;
} catch (Exception $e) {
$error[] = [
'error' => 'Error while trying to create admin user: ' . $e->getMessage(),
+ 'exception' => $e,
'hint' => '',
];
return $error;
@@ -376,6 +379,7 @@ public function install($options) {
} catch (Exception $e) {
$error[] = [
'error' => 'Error while trying to initialise the database: ' . $e->getMessage(),
+ 'exception' => $e,
'hint' => '',
];
return $error;
diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php
index 54542de72bffd..966c97edf5538 100644
--- a/lib/private/Setup/MySQL.php
+++ b/lib/private/Setup/MySQL.php
@@ -66,7 +66,7 @@ public function setupDatabase($username) {
} catch (\Exception $e) {
$this->logger->logException($e);
throw new \OC\DatabaseSetupException($this->trans->t('MySQL username and/or password not valid'),
- $this->trans->t('You need to enter details of an existing account.'));
+ $this->trans->t('You need to enter details of an existing account.'), 0, $e);
}
}
diff --git a/lib/private/Setup/OCI.php b/lib/private/Setup/OCI.php
index 1d7fe27e8b8df..ed05e0bf14c9e 100644
--- a/lib/private/Setup/OCI.php
+++ b/lib/private/Setup/OCI.php
@@ -74,14 +74,14 @@ public function setupDatabase($username) {
. ' ORACLE_SID=' . getenv('ORACLE_SID')
. ' LD_LIBRARY_PATH=' . getenv('LD_LIBRARY_PATH')
. ' NLS_LANG=' . getenv('NLS_LANG')
- . ' tnsnames.ora is ' . (is_readable(getenv('ORACLE_HOME') . '/network/admin/tnsnames.ora') ? '' : 'not ') . 'readable');
+ . ' tnsnames.ora is ' . (is_readable(getenv('ORACLE_HOME') . '/network/admin/tnsnames.ora') ? '' : 'not ') . 'readable', 0, $e);
}
throw new \OC\DatabaseSetupException($this->trans->t('Oracle username and/or password not valid'),
'Check environment: ORACLE_HOME=' . getenv('ORACLE_HOME')
. ' ORACLE_SID=' . getenv('ORACLE_SID')
. ' LD_LIBRARY_PATH=' . getenv('LD_LIBRARY_PATH')
. ' NLS_LANG=' . getenv('NLS_LANG')
- . ' tnsnames.ora is ' . (is_readable(getenv('ORACLE_HOME') . '/network/admin/tnsnames.ora') ? '' : 'not ') . 'readable');
+ . ' tnsnames.ora is ' . (is_readable(getenv('ORACLE_HOME') . '/network/admin/tnsnames.ora') ? '' : 'not ') . 'readable', 0, $e);
}
$this->config->setValues([
diff --git a/lib/private/Setup/PostgreSQL.php b/lib/private/Setup/PostgreSQL.php
index 3d7a0b2a4b13d..1f0b7b8f8948d 100644
--- a/lib/private/Setup/PostgreSQL.php
+++ b/lib/private/Setup/PostgreSQL.php
@@ -99,7 +99,7 @@ public function setupDatabase($username) {
} catch (\Exception $e) {
$this->logger->logException($e);
throw new \OC\DatabaseSetupException($this->trans->t('PostgreSQL username and/or password not valid'),
- $this->trans->t('You need to enter details of an existing account.'));
+ $this->trans->t('You need to enter details of an existing account.'), 0, $e);
}
}