commit
86a9c7f8c6
|
@ -4,7 +4,10 @@
|
|||
|
||||
namespace Icinga\Module\Setup\Clicommands;
|
||||
|
||||
use Icinga\Application\Logger;
|
||||
use Icinga\Cli\Command;
|
||||
use Icinga\Exception\ProgrammingError;
|
||||
use Icinga\Module\Setup\Webserver;
|
||||
|
||||
class ConfigCommand extends Command
|
||||
{
|
||||
|
@ -60,4 +63,79 @@ class ConfigCommand extends Command
|
|||
|
||||
printf($this->translate("Successfully created configuration directory at: %s\n"), $path);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create webserver configuration
|
||||
*
|
||||
* USAGE:
|
||||
*
|
||||
* icingacli setup config webserver <apache|nginx> [options]
|
||||
*
|
||||
* OPTIONS:
|
||||
*
|
||||
* --path=<urlpath> The URL path to Icinga Web 2 [/icingaweb]
|
||||
*
|
||||
* --root/--document-root=<directory> The directory from which the webserver will serve files [./public]
|
||||
*
|
||||
* --config=<directory> Path to Icinga Web 2's configuration files [/etc/icingaweb]
|
||||
*
|
||||
* --file=<filename> Write configuration to file [stdout]
|
||||
*
|
||||
*
|
||||
* EXAMPLES:
|
||||
*
|
||||
* icingacli setup config webserver apache
|
||||
*
|
||||
* icingacli setup config webserver apache --path /icingaweb --document-root /usr/share/icingaweb/public --config=/etc/icingaweb
|
||||
*
|
||||
* icingacli setup config webserver apache --file /etc/apache2/conf.d/icingaweb.conf
|
||||
*
|
||||
* icingacli setup config webserver nginx
|
||||
*/
|
||||
public function webserverAction()
|
||||
{
|
||||
if (($type = $this->params->getStandalone()) === null) {
|
||||
$this->fail($this->translate('Argument type is mandatory.'));
|
||||
}
|
||||
try {
|
||||
$webserver = Webserver::createInstance($type);
|
||||
} catch (ProgrammingError $e) {
|
||||
$this->fail($this->translate('Unknown type') . ': ' . $type);
|
||||
}
|
||||
$urlPath = $this->params->get('path', $webserver->getUrlPath());
|
||||
if (! is_string($urlPath) || strlen(trim($urlPath)) === 0) {
|
||||
$this->fail($this->translate('The argument --path expects a URL path'));
|
||||
}
|
||||
$documentRoot = $this->params->get('root', $this->params->get('document-root', $webserver->getDocumentRoot()));
|
||||
if (! is_string($documentRoot) || strlen(trim($documentRoot)) === 0) {
|
||||
$this->fail($this->translate(
|
||||
'The argument --root/--document-root expects a directory from which the webserver will serve files'
|
||||
));
|
||||
}
|
||||
$configDir = $this->params->get('config', $webserver->getConfigDir());
|
||||
if (! is_string($documentRoot) || strlen(trim($documentRoot)) === 0) {
|
||||
$this->fail($this->translate(
|
||||
'The argument --config expects a path to Icinga Web 2\'s configuration files'
|
||||
));
|
||||
}
|
||||
$webserver
|
||||
->setDocumentRoot($documentRoot)
|
||||
->setConfigDir($configDir)
|
||||
->setUrlPath($urlPath);
|
||||
$config = $webserver->generate() . "\n";
|
||||
if (($file = $this->params->get('file')) !== null) {
|
||||
if (file_exists($file) === true) {
|
||||
$this->fail(sprintf($this->translate('File %s already exists. Please delete it first.'), $file));
|
||||
}
|
||||
Logger::info($this->translate('Write %s configuration to file: %s'), $type, $file);
|
||||
$re = file_put_contents($file, $config);
|
||||
if ($re === false) {
|
||||
$this->fail($this->translate('Could not write to file') . ': ' . $file);
|
||||
}
|
||||
Logger::info($this->translate('Successfully written %d bytes to file'), $re);
|
||||
return true;
|
||||
}
|
||||
echo $config;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,168 @@
|
|||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
namespace Icinga\Module\Setup;
|
||||
|
||||
use Icinga\Application\Icinga;
|
||||
use Icinga\Exception\ProgrammingError;
|
||||
|
||||
/**
|
||||
* Base class for generating webserver configuration
|
||||
*/
|
||||
abstract class Webserver
|
||||
{
|
||||
/**
|
||||
* Document root
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $documentRoot;
|
||||
|
||||
/**
|
||||
* URL path of Icinga Web 2
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $urlPath = '/icingaweb';
|
||||
|
||||
/**
|
||||
* Path to Icinga Web 2's configuration files
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $configDir;
|
||||
|
||||
/**
|
||||
* Create instance by type name
|
||||
*
|
||||
* @param string $type
|
||||
*
|
||||
* @return WebServer
|
||||
*
|
||||
* @throws ProgrammingError
|
||||
*/
|
||||
public static function createInstance($type)
|
||||
{
|
||||
$class = __NAMESPACE__ . '\\Webserver\\' . ucfirst($type);
|
||||
if (class_exists($class)) {
|
||||
return new $class();
|
||||
}
|
||||
throw new ProgrammingError('Class "%s" does not exist', $class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate configuration
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function generate()
|
||||
{
|
||||
$template = $this->getTemplate();
|
||||
|
||||
$searchTokens = array(
|
||||
'{urlPath}',
|
||||
'{documentRoot}',
|
||||
'{configDir}',
|
||||
);
|
||||
$replaceTokens = array(
|
||||
$this->getUrlPath(),
|
||||
$this->getDocumentRoot(),
|
||||
$this->getConfigDir()
|
||||
);
|
||||
$template = str_replace($searchTokens, $replaceTokens, $template);
|
||||
return $template;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specific template
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
abstract protected function getTemplate();
|
||||
|
||||
/**
|
||||
* Set the URL path of Icinga Web 2
|
||||
*
|
||||
* @param string $urlPath
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setUrlPath($urlPath)
|
||||
{
|
||||
$this->urlPath = '/' . ltrim(trim((string) $urlPath), '/');
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the URL path of Icinga Web 2
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getUrlPath()
|
||||
{
|
||||
return $this->urlPath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the document root
|
||||
*
|
||||
* @param string $documentRoot
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setDocumentRoot($documentRoot)
|
||||
{
|
||||
$this->documentRoot = trim((string) $documentRoot);
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detect the document root
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function detectDocumentRoot()
|
||||
{
|
||||
return Icinga::app()->getBaseDir('public');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the document root
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getDocumentRoot()
|
||||
{
|
||||
if ($this->documentRoot === null) {
|
||||
$this->documentRoot = $this->detectDocumentRoot();
|
||||
}
|
||||
return $this->documentRoot;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the configuration directory
|
||||
*
|
||||
* @param string $configDir
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setConfigDir($configDir)
|
||||
{
|
||||
$this->configDir = (string) $configDir;
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the configuration directory
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getConfigDir()
|
||||
{
|
||||
if ($this->configDir === null) {
|
||||
return Icinga::app()->getConfigDir();
|
||||
}
|
||||
return $this->configDir;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,61 @@
|
|||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
namespace Icinga\Module\Setup\Webserver;
|
||||
|
||||
use Icinga\Module\Setup\Webserver;
|
||||
|
||||
/**
|
||||
* Generate Apache 2.x configuration
|
||||
*/
|
||||
class Apache extends Webserver
|
||||
{
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
protected function getTemplate()
|
||||
{
|
||||
return <<<'EOD'
|
||||
Alias {urlPath} "{documentRoot}"
|
||||
|
||||
<Directory "{documentRoot}">
|
||||
Options SymLinksIfOwnerMatch
|
||||
AllowOverride None
|
||||
|
||||
<IfModule mod_authz_core.c>
|
||||
# Apache 2.4
|
||||
<RequireAll>
|
||||
Require all granted
|
||||
</RequireAll>
|
||||
</IfModule>
|
||||
|
||||
<IfModule !mod_authz_core.c>
|
||||
# Apache 2.2
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</IfModule>
|
||||
|
||||
SetEnv ICINGAWEB_CONFIGDIR "{configDir}"
|
||||
|
||||
EnableSendfile Off
|
||||
|
||||
<IfModule mod_rewrite.c>
|
||||
RewriteEngine on
|
||||
RewriteBase {urlPath}/
|
||||
RewriteCond %{REQUEST_FILENAME} -s [OR]
|
||||
RewriteCond %{REQUEST_FILENAME} -l [OR]
|
||||
RewriteCond %{REQUEST_FILENAME} -d
|
||||
RewriteRule ^.*$ - [NC,L]
|
||||
RewriteRule ^.*$ index.php [NC,L]
|
||||
</IfModule>
|
||||
|
||||
<IfModule !mod_rewrite.c>
|
||||
DirectoryIndex error_norewrite.html
|
||||
ErrorDocument 404 /error_norewrite.html
|
||||
</IfModule>
|
||||
</Directory>
|
||||
EOD;
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,38 @@
|
|||
<?php
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
// {{{ICINGA_LICENSE_HEADER}}}
|
||||
|
||||
namespace Icinga\Module\Setup\Webserver;
|
||||
|
||||
use Icinga\Module\Setup\Webserver;
|
||||
|
||||
/**
|
||||
* Generate nginx configuration
|
||||
*/
|
||||
class Nginx extends Webserver
|
||||
{
|
||||
/**
|
||||
* Specific template
|
||||
*
|
||||
* @return array|string
|
||||
*/
|
||||
protected function getTemplate()
|
||||
{
|
||||
return <<<'EOD'
|
||||
location ~ ^{urlPath}/index\.php(.*)$ {
|
||||
# fastcgi_pass 127.0.0.1:9000;
|
||||
fastcgi_pass unix:/var/run/php5-fpm.sock;
|
||||
fastcgi_index index.php;
|
||||
include fastcgi_params;
|
||||
fastcgi_param SCRIPT_FILENAME {documentRoot}/index.php;
|
||||
fastcgi_param ICINGAWEB_CONFIGDIR {configDir};
|
||||
}
|
||||
|
||||
location ~ ^{urlPath}(.+)? {
|
||||
alias {documentRoot};
|
||||
index index.php;
|
||||
try_files $1 $uri $uri/ {urlPath}/index.php$is_args$args;
|
||||
}
|
||||
EOD;
|
||||
}
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
<h1>The rewrite module is not enabled</h1>
|
Loading…
Reference in New Issue