Skip to content

Commit

Permalink
Add database creation page
Browse files Browse the repository at this point in the history
refs #7163
  • Loading branch information
Johannes Meyer committed Oct 1, 2014
1 parent c78b016 commit 08d259e
Show file tree
Hide file tree
Showing 3 changed files with 295 additions and 5 deletions.
144 changes: 144 additions & 0 deletions application/forms/Setup/DatabaseCreationPage.php
@@ -0,0 +1,144 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}

namespace Icinga\Form\Setup;

use PDOException;
use Icinga\Web\Form;
use Icinga\Web\Form\Element\Note;
use Icinga\Web\Setup\DbTool;

/**
* Wizard page to define a database user that is able to create databases and tables
*/
class DatabaseCreationPage extends Form
{
/**
* The resource configuration to use
*
* @var array
*/
protected $config;

/**
* The required database privileges
*
* @var array
*/
protected $databasePrivileges;

/**
* Initialize this page
*/
public function init()
{
$this->setName('setup_database_creation');
}

/**
* Set the resource configuration to use
*
* @param array $config
*
* @return self
*/
public function setResourceConfig(array $config)
{
$this->config = $config;
return $this;
}

/**
* Set the required database privileges
*
* @param array $privileges The required privileges
*
* @return self
*/
public function setDatabasePrivileges(array $privileges)
{
$this->databasePrivileges = $privileges;
return $this;
}

/**
* @see Form::createElements()
*/
public function createElements(array $formData)
{
$this->addElement(
new Note(
'description',
array(
'value' => t(
'It seems that either the database you defined earlier does not yet exist and cannot be created'
. ' using the provided access credentials or the database does not have the required schema to '
. 'be operated by Icinga Web 2. Please provide appropriate access credentials to solve this.'
)
)
)
);
$this->addElement(
'text',
'username',
array(
'required' => true,
'label' => t('Username'),
'description' => t('A user which is able to create databases and/or touch the database schema')
)
);
$this->addElement(
'password',
'password',
array(
'required' => true,
'label' => t('Password'),
'description' => t('The password for the database user defined above')
)
);
}

/**
* Validate the given form data and check whether the defined user has sufficient access rights
*
* @param array $data The data to validate
*
* @return bool
*/
public function isValid($data)
{
if (false === parent::isValid($data)) {
return false;
}

$this->config['username'] = $this->getValue('username');
$this->config['password'] = $this->getValue('password');
$db = new DbTool($this->config);

try {
$db->connectToDb();
if (false === $db->checkPrivileges($this->databasePrivileges)) {
$this->addError(
t('The provided credentials do not have the required access rights to create the database schema.')
);
return false;
}
} catch (PDOException $e) {
try {
$db->connectToHost();
if (false === $db->checkPrivileges($this->databasePrivileges)) {
$this->addError(
t('The provided credentials cannot be used to create the database and/or the user.')
);
return false;
}
} catch (PDOException $e) {
$this->addError($e->getMessage());
return false;
}
}

return true;
}
}
53 changes: 52 additions & 1 deletion library/Icinga/Application/WebSetup.php
Expand Up @@ -4,6 +4,7 @@

namespace Icinga\Application;

use PDOException;
use Icinga\Form\Setup\WelcomePage;
use Icinga\Form\Setup\DbResourcePage;
use Icinga\Form\Setup\PreferencesPage;
Expand All @@ -13,9 +14,11 @@
use Icinga\Form\Setup\RequirementsPage;
use Icinga\Form\Setup\GeneralConfigPage;
use Icinga\Form\Setup\AuthenticationPage;
use Icinga\Form\Setup\DatabaseCreationPage;
use Icinga\Web\Form;
use Icinga\Web\Wizard;
use Icinga\Web\Request;
use Icinga\Web\Setup\DbTool;
use Icinga\Web\Setup\SetupWizard;
use Icinga\Web\Setup\Requirements;
use Icinga\Application\Platform;
Expand All @@ -25,6 +28,31 @@
*/
class WebSetup extends Wizard implements SetupWizard
{
/**
* The database tables required by Icinga Web 2
*
* @var array
*/
protected $databaseTables = array('account', 'preference');

/**
* The privileges required by Icinga Web 2 to setup the database
*
* @var array
*/
protected $databaseSetupPrivileges = array(
'USAGE',
'CREATE',
'ALTER',
'INSERT',
'UPDATE',
'DELETE',
'TRUNCATE',
'REFERENCES',
'CREATE USER',
'GRANT OPTION'
);

/**
* @see Wizard::init()
*/
Expand All @@ -37,8 +65,9 @@ protected function init()
$this->addPage(new DbResourcePage());
$this->addPage(new LdapResourcePage());
$this->addPage(new AuthBackendPage());
$this->addPage(new GeneralConfigPage());
$this->addPage(new AdminAccountPage());
$this->addPage(new GeneralConfigPage());
$this->addPage(new DatabaseCreationPage());
}

/**
Expand Down Expand Up @@ -68,6 +97,9 @@ public function setupPage(Form $page, Request $request)
} elseif ($authData['type'] === 'ldap') {
$page->setResourceConfig($this->getPageData('setup_ldap_resource'));
}
} elseif ($page->getName() === 'setup_database_creation') {
$page->setDatabasePrivileges($this->databaseSetupPrivileges);
$page->setResourceConfig($this->getPageData('setup_db_resource'));
}
}

Expand All @@ -85,6 +117,25 @@ protected function getNewPage($requestedPage, Form $originPage)
} elseif ($newPage->getName() === 'setup_ldap_resource') {
$authData = $this->getPageData('setup_authentication_type');
$skip = $authData['type'] !== 'ldap';
} elseif ($newPage->getName() === 'setup_database_creation') {
if ($this->hasPageData('setup_db_resource')) {
$db = new DbTool($this->getPageData('setup_db_resource'));

try {
$db->connectToDb();
$diff = array_diff($this->databaseTables, $db->listTables());
if (false === empty($diff)) {
$skip = $db->checkPrivileges($this->databaseSetupPrivileges);
} else {
$skip = true;
}
} catch (PDOException $e) {
$db->connectToHost();
$skip = $db->checkPrivileges($this->databaseSetupPrivileges);
}
} else {
$skip = true;
}
}

if ($skip) {
Expand Down

0 comments on commit 08d259e

Please sign in to comment.