diff --git a/.gitattributes b/.gitattributes index e4504cf21..35002d0cb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,5 @@ +# Exclude files related to git when generating an archive .git* export-ignore + +# Normalize puppet manifests' line endings to LF on checkin and prevent conversion to CRLF when the files are checked out +.vagrant-puppet/* eol=lf diff --git a/.gitignore b/.gitignore index 55580cae9..d7a87ccdd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,46 +1,12 @@ # Exclude all hidden files .* -# But not .gitignore, .gitattributes, .vagrant-puppet, .htaccess and .gitkeep -!.gitignore -!.gitattributes -!.vagrant-puppet -!public/.htaccess -!packages/rhel/usr/share/icingaweb/public/.htaccess -!public/.htaccess.in -!.gitkeep -build/ +# Except those related to git and vagrant +!.git* +!.vagrant-puppet/* -development/ +# Exclude application log files +var/log/* -# ./configure output -config.log -autom4te.cache -autoscan* -config.status -Makefile - -# cmd tester -modules/test/bin/extcmd_test - -# misc test output -test/php/library/Icinga/Protocol/Statusdat/.cache - -# Generated API documentation -doc/api - -# Enabled modules -config/enabledModules/ - -# User preferences -config/preferences/*.ini - -# Application logfiles -var/log/*.log - -# Packaging +# Exclude symlink you need for packaging /debian -*.tar.gz -*.komodoproject - - diff --git a/.vagrant-puppet/.gitattributes b/.vagrant-puppet/.gitattributes deleted file mode 100644 index af67531d8..000000000 --- a/.vagrant-puppet/.gitattributes +++ /dev/null @@ -1 +0,0 @@ -* -crlf diff --git a/.vagrant-puppet/manifests/default.pp b/.vagrant-puppet/manifests/default.pp index 39b0d967c..117ad0836 100644 --- a/.vagrant-puppet/manifests/default.pp +++ b/.vagrant-puppet/manifests/default.pp @@ -601,27 +601,15 @@ exec { 'create-pgsql-icingaweb-db': require => Service['postgresql'] } -exec { 'populate-icingaweb-mysql-db-accounts': +exec { 'populate-icingaweb-mysql-db-tables': unless => 'mysql -uicingaweb -picingaweb icingaweb -e "SELECT * FROM account;" &> /dev/null', - command => 'mysql -uicingaweb -picingaweb icingaweb < /vagrant/etc/schema/accounts.mysql.sql', + command => 'mysql -uicingaweb -picingaweb icingaweb < /vagrant/etc/schema/mysql.sql', require => [ Exec['create-mysql-icingaweb-db'] ] } -exec { 'populate-icingweba-pgsql-db-accounts': +exec { 'populate-icingweba-pgsql-db-tables': unless => 'psql -U icingaweb -d icingaweb -c "SELECT * FROM account;" &> /dev/null', - command => 'sudo -u postgres psql -U icingaweb -d icingaweb -f /vagrant/etc/schema/accounts.pgsql.sql', - require => [ Exec['create-pgsql-icingaweb-db'] ] -} - -exec { 'populate-icingaweb-mysql-db-preferences': - unless => 'mysql -uicingaweb -picingaweb icingaweb -e "SELECT * FROM preference;" &> /dev/null', - command => 'mysql -uicingaweb -picingaweb icingaweb < /vagrant/etc/schema/preferences.mysql.sql', - require => [ Exec['create-mysql-icingaweb-db'] ] -} - -exec { 'populate-icingweba-pgsql-db-preferences': - unless => 'psql -U icingaweb -d icingaweb -c "SELECT * FROM preference;" &> /dev/null', - command => 'sudo -u postgres psql -U icingaweb -d icingaweb -f /vagrant/etc/schema/preferences.pgsql.sql', + command => 'sudo -u postgres psql -U icingaweb -d icingaweb -f /vagrant/etc/schema/pgsql.sql', require => [ Exec['create-pgsql-icingaweb-db'] ] } diff --git a/Makefile.in b/Makefile.in deleted file mode 100644 index d97040cc3..000000000 --- a/Makefile.in +++ /dev/null @@ -1,158 +0,0 @@ -SHELL=/bin/sh - -PACKAGE_TARNAME=@PACKAGE_TARNAME@ -PACKAGE_NAME=@PACKAGE_NAME@ -PACKAGE_VERSION=@PACKAGE_VERSION@ - -prefix=@prefix@ -exec_prefix=@exec_prefix@ -bindir=@bindir@ - -HTTPD_CONFIG_PATH=@httpd_config_path@ -ICINGAWEB_CONFIG_PATH=@icingaweb_config_path@ -ICINGAWEB_LOG_PATH=@icingaweb_log_path@ - -INSTALL=@INSTALL@ -INSTALL_OPTS=@INSTALL_OPTS@ -INSTALL_OPTS_WEB=@INSTALL_OPTS_WEB@ - -default: - @echo "IcingaWeb make targets: " - @printf "%b" " -install:\t\t\tInstall the application and overwrite configs\n" - @printf "%b" " -update:\t\t\tInstall the application without touching the configs\n" - @printf "%b" " -install-apache-config:\tInstall the apache configuration\n" - -# -# Installs the whole application w\o httpd configurations -# -install: install-config install-basic ensure-writable-folders install-cli - -# -# Install icingacli bin -# - -install-cli: - $(INSTALL) -m 755 -d $(INSTALL_OPTS) $(bindir) - $(INSTALL) -m 755 $(INSTALL_OPTS) "./bin/icingacli" $(bindir)/icingacli; - -# -# Installs the whole application w\o configuration -# -install-basic: install-static-files install-runtime-dirs ensure-writable-folders - -# -# Updates only the application -# -update: install-application - -# -# Removes files created by ./configure -# -clean: - if [ -f ./Makefile ];then \ - rm ./Makefile; \ - fi; \ - if [ -f ./etc/apache/icingaweb.conf ];then \ - rm ./etc/apache/icingaweb.conf; \ - fi; - -# -# Installs/copies all static files (executables, scripts, html, etc) -# -install-static-files: install-application copy-web-files-public copy-web-files-modules - -# -# Installs all configuration files -# -install-config: - $(INSTALL) -m 755 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(ICINGAWEB_CONFIG_PATH) - - @dirs=`cd ./config ; find . -mindepth 1 -type d `;\ - for dir in $$dirs; do \ - $(INSTALL) -m 755 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(ICINGAWEB_CONFIG_PATH)/"$$dir"; \ - done; - - @files=`cd ./config ; find . -mindepth 1 -type f \ - -and ! -name ".*" -and ! -name "*.in"`; \ - for file in $$files; do \ - $(INSTALL) -m 644 $(INSTALL_OPTS_WEB) "./config/$$file" $(DESTDIR)$(ICINGAWEB_CONFIG_PATH)/"$$file"; \ - done - - -# -# Installs runtime directories like the application cache -# -install-runtime-dirs: - $(INSTALL) -m 755 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(prefix)/application/cache - -# -# Copies the tests into the installation directory -# -install-tests: copy-folder-tests - -# -# Install configurations for apache2 -# -install-apache-config: - $(INSTALL) -m 755 -d $(INSTALL_OPTS) $(DESTDIR)$(HTTPD_CONFIG_PATH) - $(INSTALL) -m 644 $(INSTALL_OPTS) "./etc/apache/icingaweb.conf" $(DESTDIR)$(HTTPD_CONFIG_PATH)/icingaweb.conf; - -# -# Installs the php files to the prefix -# -install-application: copy-web-files-application copy-web-files-library install-cli - -# -# Rule for copying folders and containing files (arbitary types), hidden files are excluded -# -copy-folder-%: - $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(prefix)/$* - - @dirs=`find ./$* -mindepth 1 -type d `;\ - for dir in $$dirs; do \ - $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(prefix)/"$$dir"; \ - done; - - @files=`find ./$* -mindepth 1 -type f \ - -and ! -name ".*"`; \ - for file in $$files; do \ - $(INSTALL) -m 644 $(INSTALL_OPTS) "$$file" $(DESTDIR)$(prefix)/"$$file"; \ - done - - -ensure-writable-folders: - $(INSTALL) -m 775 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(prefix)/var/ - $(INSTALL) -m 775 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(ICINGAWEB_LOG_PATH) - chmod -R 775 $(DESTDIR)$(ICINGAWEB_CONFIG_PATH) - - -# -# Rule for copying only php, *html, js and ini files. Hidden files are ignored -# -copy-web-files-%: - $(INSTALL) -m 755 $(INSTALL_OPTS) -d $(DESTDIR)$(prefix)/$* - - @dirs=`find ./$* -mindepth 1 -type d `;\ - for dir in $$dirs; do \ - $(INSTALL) -m 755 $(INSTALL_OPTS_WEB) -d $(DESTDIR)$(prefix)/"$$dir"; \ - done; - - @files=`find ./$* -mindepth 1 -type f \ - -name "*.php" -or -name "*.ini" -or -name "*.*html" \ - -or -name "*.js" -or -name "*.css" -or -name "*.less" \ - -or -name "*.otf" -or -name "*.ttf" -or -name "*.otf" \ - -or -name "*.svg" -or -name "*.woff" -or -name "*.png" \ - -and ! -name ".*"`; \ - for file in $$files; do \ - $(INSTALL) -m 644 $(INSTALL_OPTS_WEB) "$$file" $(DESTDIR)$(prefix)/"$$file"; \ - done - -# -# Create release or snapshot tarball -# -# TODO: Use git-archive -# create-tarball: -# @./bin/make-tarball --prefix $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)/ -# -# create-tarball-nightly: -# ./bin/make-tarball --prefix $(PACKAGE_TARNAME)-$(PACKAGE_VERSION)-`date +%Y%m%d`-`git rev-parse --short HEAD`/ diff --git a/aclocal.m4 b/aclocal.m4 deleted file mode 100644 index ed4703fd0..000000000 --- a/aclocal.m4 +++ /dev/null @@ -1,84 +0,0 @@ -AC_DEFUN([AC_USER_GUESS],[ - $2=$3 - for x in $1; do - AC_MSG_CHECKING([if user $x exists]) - AS_IF([ $GREP -q "^$x:" /etc/passwd ], - [ AC_MSG_RESULT([found]); $2=$x ; break], - [ AC_MSG_RESULT([not found]) ]) - done - ]) - -AC_DEFUN([AC_CHECK_PHP_MODULE],[ - for x in $1;do - AC_MSG_CHECKING([if php has $x module]) - AS_IF([ php -m | $GREP -iq "^$x$" ], - [ AC_MSG_RESULT([found]) ], - [ AC_MSG_ERROR([not found])]) - done -]) - -AC_DEFUN([AC_CHECK_PHP_VERSION],[ - AC_MSG_CHECKING([if php has at least version $1.$2.$3]) - AS_IF([ test $1 -le `php -r 'echo PHP_MAJOR_VERSION;'` && \ - test $2 -le `php -r 'echo PHP_MINOR_VERSION;'` && \ - test $3 -le `php -r 'echo PHP_RELEASE_VERSION;'`], - [ AC_MSG_RESULT([PHP version is correct])], - [ AC_MSG_ERROR([You need at least PHP version $1.$2.$3])]) -]) - -AC_DEFUN([AC_CHECK_PHP_INCLUDE],[ - AC_MSG_CHECKING([if PHP runtime dependency '$2' is available]) - AS_IF([ php -r 'require "$1";' ], - [ AC_MSG_RESULT([PHP runtime dependency fulfilled])], - [ AC_MSG_ERROR([PHP runtime dependency '$2' is missing])]) -]) - -AC_DEFUN([AC_GROUP_GUESS],[ - $2=$3 - for x in $1; do - AC_MSG_CHECKING([if group $x exists]) - AS_IF([ $GREP -q "^$x:" /etc/group ], - [ AC_MSG_RESULT([found]); $2=$x ; break], - [ AC_MSG_RESULT([not found]) ]) - done -]) - -AC_DEFUN([AC_CHECK_BIN], [ - AC_PATH_PROG([$1],[$2],[not found]) - - AS_IF([ test "XX${$1}" == "XXnot found" ], - [ AC_MSG_WARN([binary $2 not found in PATH]) ]) - - test "XX${$1}" == "XXnot found" && $1="" -]) - -AC_DEFUN([AC_PATH_GUESS], [ - $2=$3 - for x in $1; do - AC_MSG_CHECKING([if path $x exists]) - AS_IF([test -d $x], - [AC_MSG_RESULT([found]); $2=$x; break], - [AC_MSG_RESULT([not found])] - ) - done -]) - -# ICINGA_CHECK_DBTYPE(DBTYPE, ARGUMENT_NAME) -# ------------------------------------------ -AC_DEFUN([ICINGA_CHECK_DBTYPE], [ - AC_MSG_CHECKING([Testing database type for $2]) - AS_IF(echo "$1" | $GREP -q "^\(my\|pg\)sql$", - AC_MSG_RESULT([OK ($1)]), - AC_MSG_ERROR([$1]) - ) -]) - -# ICINGA_CHECK_BACKENDTYPE(BACKENDTYPE, ARGUMENT_NAME) -# ------------------------------------------ -AC_DEFUN([ICINGA_CHECK_BACKENDTYPE], [ - AC_MSG_CHECKING([Testing backend type for $2]) - AS_IF(echo "$1" | $GREP -q "^\(ido\|statusdat\|livestatus\)$", - AC_MSG_RESULT([OK ($1)]), - AC_MSG_ERROR([$1]) - ) -]) diff --git a/application/clicommands/WebCommand.php b/application/clicommands/WebCommand.php index 11e7f002a..12ed9e1a4 100644 --- a/application/clicommands/WebCommand.php +++ b/application/clicommands/WebCommand.php @@ -4,6 +4,7 @@ namespace Icinga\Clicommands; +use Icinga\Application\Icinga; use Icinga\Cli\Command; use Icinga\Exception\IcingaException; @@ -30,7 +31,7 @@ class WebCommand extends Command // throw new IcingaException('Socket is required'); } if ($basedir === null) { - $basedir = dirname(ICINGAWEB_APPDIR) . '/public'; + $basedir = Icinga::app()->getBaseDir('public'); if (! file_exists($basedir) || ! is_dir($basedir)) { throw new IcingaException('Basedir is required'); } @@ -46,7 +47,7 @@ class WebCommand extends Command readlink('/proc/self/exe'), $socket, $basedir, - ICINGA_LIBDIR . '/Icinga/Application/webrouter.php' + Icinga::app()->getLibraryDir('/Icinga/Application/webrouter.php') ); // TODO: Store webserver log, switch uid, log index.php includes, pid file diff --git a/application/controllers/AuthenticationController.php b/application/controllers/AuthenticationController.php index 1d47a7d41..b0d93ddf0 100644 --- a/application/controllers/AuthenticationController.php +++ b/application/controllers/AuthenticationController.php @@ -6,7 +6,7 @@ use Icinga\Authentication\Backend\AutoLoginBackend; use Icinga\Web\Controller\ActionController; -use Icinga\Form\Authentication\LoginForm; +use Icinga\Forms\Authentication\LoginForm; use Icinga\Authentication\AuthChain; use Icinga\Application\Config; use Icinga\Application\Logger; @@ -33,6 +33,17 @@ class AuthenticationController extends ActionController */ public function loginAction() { + if (@file_exists(Config::$configDir . '/setup.token')) { + try { + $config = Config::app()->toArray(); + if (empty($config)) { + $this->redirectNow(Url::fromPath('setup')); + } + } catch (NotReadableError $e) { + // Gets thrown in case of insufficient permission only + } + } + $auth = $this->Auth(); $this->view->form = $form = new LoginForm(); $this->view->title = $this->translate('Icingaweb Login'); @@ -53,7 +64,7 @@ class AuthenticationController extends ActionController $config = Config::app('authentication'); } catch (NotReadableError $e) { throw new ConfigurationError( - $this->translate('Could not read your authentiction.ini, no authentication methods are available.'), + $this->translate('Could not read your authentication.ini, no authentication methods are available.'), 0, $e ); @@ -93,30 +104,30 @@ class AuthenticationController extends ActionController } } if ($backendsTried === 0) { - throw new ConfigurationError( + $this->view->form->addError( $this->translate( 'No authentication methods available. Did you create' - . ' authentication.ini when installing Icinga Web 2?' + . ' authentication.ini when setting up Icinga Web 2?' ) ); - } - if ($backendsTried === $backendsWithError) { - throw new ConfigurationError( + } else if ($backendsTried === $backendsWithError) { + $this->view->form->addError( $this->translate( 'All configured authentication methods failed.' . ' Please check the system log or Icinga Web 2 log for more information.' ) ); - } - if ($backendsWithError) { - $this->view->form->getElement('username')->addError( + } elseif ($backendsWithError) { + $this->view->form->addError( $this->translate( 'Please note that not all authentication methods were available.' . ' Check the system log or Icinga Web 2 log for more information.' ) ); } - $this->view->form->getElement('password')->addError($this->translate('Incorrect username or password')); + if ($backendsTried > 0 && $backendsTried !== $backendsWithError) { + $this->view->form->getElement('password')->addError($this->translate('Incorrect username or password')); + } } elseif ($request->isGet()) { $user = new User(''); foreach ($chain as $backend) { @@ -134,6 +145,8 @@ class AuthenticationController extends ActionController } catch (Exception $e) { $this->view->errorInfo = $e->getMessage(); } + + $this->view->configMissing = is_dir(Config::$configDir) === false; } /** diff --git a/application/controllers/ConfigController.php b/application/controllers/ConfigController.php index b39f57734..11d011bc0 100644 --- a/application/controllers/ConfigController.php +++ b/application/controllers/ConfigController.php @@ -8,11 +8,11 @@ use Icinga\Application\Modules\Module; use Icinga\Web\Widget; use Icinga\Application\Icinga; use Icinga\Application\Config; -use Icinga\Form\Config\GeneralConfigForm; -use Icinga\Form\Config\AuthenticationBackendReorderForm; -use Icinga\Form\Config\AuthenticationBackendConfigForm; -use Icinga\Form\Config\ResourceConfigForm; -use Icinga\Form\ConfirmRemovalForm; +use Icinga\Forms\Config\GeneralConfigForm; +use Icinga\Forms\Config\AuthenticationBackendReorderForm; +use Icinga\Forms\Config\AuthenticationBackendConfigForm; +use Icinga\Forms\Config\ResourceConfigForm; +use Icinga\Forms\ConfirmRemovalForm; use Icinga\Data\ResourceFactory; @@ -99,7 +99,7 @@ class ConfigController extends ActionController Notification::success(sprintf($this->translate('Module "%s" enabled'), $module)); $this->rerenderLayout()->reloadCss()->redirectNow('config/modules'); } catch (Exception $e) { - $this->view->exceptionMesssage = $e->getMessage(); + $this->view->exceptionMessage = $e->getMessage(); $this->view->moduleName = $module; $this->view->action = 'enable'; $this->render('module-configuration-error'); diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php index 51435d727..d357231ca 100644 --- a/application/controllers/DashboardController.php +++ b/application/controllers/DashboardController.php @@ -8,7 +8,7 @@ use Icinga\Exception\ConfigurationError; use Icinga\Exception\IcingaException; use Icinga\Exception\NotReadableError; use Icinga\File\Ini\IniWriter; -use Icinga\Form\Dashboard\AddUrlForm; +use Icinga\Forms\Dashboard\AddUrlForm; use Icinga\Web\Controller\ActionController; use Icinga\Web\Url; use Icinga\Web\Widget\Dashboard; diff --git a/application/controllers/PreferenceController.php b/application/controllers/PreferenceController.php index bd76b2466..378a5aa34 100644 --- a/application/controllers/PreferenceController.php +++ b/application/controllers/PreferenceController.php @@ -6,7 +6,7 @@ use Icinga\Web\Controller\BasePreferenceController; use Icinga\Web\Url; use Icinga\Web\Widget\Tab; use Icinga\Application\Config; -use Icinga\Form\PreferenceForm; +use Icinga\Forms\PreferenceForm; use Icinga\Exception\ConfigurationError; use Icinga\User\Preferences\PreferencesStore; @@ -25,9 +25,9 @@ class PreferenceController extends BasePreferenceController public static function createProvidedTabs() { return array( - 'general' => new Tab( + 'preferences' => new Tab( array( - 'title' => 'General settings', + 'title' => t('Preferences'), 'url' => Url::fromPath('/preference') ) ) @@ -51,6 +51,6 @@ class PreferenceController extends BasePreferenceController $form->handleRequest(); $this->view->form = $form; - $this->getTabs()->activate('general'); + $this->getTabs()->activate('preferences'); } } diff --git a/application/fonts/fontanello-ifont/LICENSE.txt b/application/fonts/fontanello-ifont/LICENSE.txt new file mode 100644 index 000000000..29b99c574 --- /dev/null +++ b/application/fonts/fontanello-ifont/LICENSE.txt @@ -0,0 +1,39 @@ +Font license info + + +## Font Awesome + + Copyright (C) 2012 by Dave Gandy + + Author: Dave Gandy + License: SIL () + Homepage: http://fortawesome.github.com/Font-Awesome/ + + +## Iconic + + Copyright (C) 2012 by P.J. Onori + + Author: P.J. Onori + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://somerandomdude.com/work/iconic/ + + +## MFG Labs + + Copyright (C) 2012 by Daniel Bruce + + Author: MFG Labs + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.mfglabs.com/ + + +## Entypo + + Copyright (C) 2012 by Daniel Bruce + + Author: Daniel Bruce + License: SIL (http://scripts.sil.org/OFL) + Homepage: http://www.entypo.com + + diff --git a/application/fonts/fontanello-ifont/README.txt b/application/fonts/fontanello-ifont/README.txt new file mode 100644 index 000000000..43e23f283 --- /dev/null +++ b/application/fonts/fontanello-ifont/README.txt @@ -0,0 +1,75 @@ +This webfont is generated by http://fontello.com open source project. + + +================================================================================ +Please, note, that you should obey original font licences, used to make this +webfont pack. Details available in LICENSE.txt file. + +- Usually, it's enough to publish content of LICENSE.txt file somewhere on your + site in "About" section. + +- If your project is open-source, usually, it will be ok to make LICENSE.txt + file publically available in your repository. + +- Fonts, used in Fontello, don't require to make clickable links on your site. + But any kind of additional authors crediting is welcome. +================================================================================ + + +Comments on archive content +--------------------------- + +- /font/* - fonts in different formats + +- /css/* - different kinds of css, for all situations. Should be ok with + twitter bootstrap. Also, you can skip style and assign icon classes + directly to text elements, if you don't mind about IE7. + +- demo.html - demo file, to show your webfont content + +- LICENSE.txt - license info about source fonts, used to build your one. + +- config.json - keeps your settings. You can import it back to fontello anytime, + to continue your work + + +Why so many CSS files ? +----------------------- + +Because we like to fit all your needs :) + +- basic file, .css - is usually enougth, in contains @font-face + and character codes definition + +- *-ie7.css - if you need IE7 support, but still don't wish to put char codes + directly into html + +- *-codes.css and *-ie7-codes.css - if you like to use your own @font-face + rules, but still wish to benefit of css generation. That can be very + convenient for automated assets build systems. When you need to update font - + no needs to manually edit files, just override old version with archive + content. See fontello source codes for example. + +- *-embedded.css - basic css file, but with embedded WOFF font, to avoid + CORS issues in Firefox and IE9+, when fonts are hosted on the separate domain. + We strongly recommend to resolve this issue by `Access-Control-Allow-Origin` + server headers. But if you ok with dirty hack - this file is for you. Note, + that data url moved to separate @font-face to avoid problems with + + + + + + + + +
+

+ ifont + font demo +

+ +
+
+
+
icon-dashboard0xe800
+
icon-user0xe801
+
icon-users0xe802
+
icon-ok0xe803
+
+
+
icon-cancel0xe804
+
icon-plus0xe805
+
icon-minus0xe806
+
icon-folder-empty0xe807
+
+
+
icon-download0xe808
+
icon-upload0xe809
+
icon-git0xe80a
+
icon-cubes0xe80b
+
+
+
icon-database0xe80c
+
icon-gauge0xe80d
+
icon-sitemap0xe80e
+
icon-sort-name-up0xe80f
+
+
+
icon-sort-name-down0xe810
+
icon-megaphone0xe811
+
icon-bug0xe812
+
icon-tasks0xe813
+
+
+
icon-filter0xe814
+
icon-off0xe815
+
icon-book0xe816
+
icon-paste0xe817
+
+
+
icon-scissors0xe818
+
icon-globe0xe819
+
icon-cloud0xe81a
+
icon-flash0xe81b
+
+
+
icon-service0xe81c
+
icon-down-dir0xe81d
+
icon-up-dir0xe81e
+
icon-left-dir0xe81f
+
+
+
icon-right-dir0xe820
+
icon-down-open0xe821
+
icon-right-open0xe822
+
icon-up-open0xe823
+
+
+
icon-left-open0xe824
+
icon-up-big0xe825
+
icon-right-big0xe826
+
icon-left-big0xe827
+
+
+
icon-down-big0xe828
+
icon-resize-full-alt0xe829
+
icon-resize-full0xe82a
+
icon-resize-small0xe82b
+
+
+
icon-move0xe82c
+
icon-resize-horizontal0xe82d
+
icon-resize-vertical0xe82e
+
icon-zoom-in0xe82f
+
+
+
icon-block0xe830
+
icon-zoom-out0xe831
+
icon-lightbulb0xe832
+
icon-clock0xe833
+
+
+
icon-volume-up0xe834
+
icon-volume-down0xe835
+
icon-volume-off0xe836
+
icon-mute0xe837
+
+
+
icon-mic0xe838
+
icon-endtime0xe839
+
icon-starttime0xe83a
+
icon-calendar-empty0xe83b
+
+
+
icon-calendar0xe83c
+
icon-wrench0xe83d
+
icon-sliders0xe83e
+
icon-conf-alt0xe83f
+
+
+
icon-conf0xe840
+
icon-phone0xe841
+
icon-file-pdf0xe842
+
icon-file-word0xe843
+
+
+
icon-file-excel0xe844
+
icon-doc-text0xe845
+
icon-trash0xe846
+
icon-comment-empty0xe847
+
+
+
icon-comment0xe848
+
icon-chat0xe849
+
icon-chat-empty0xe84a
+
icon-bell0xe84b
+
+
+
icon-bell-alt0xe84c
+
icon-attention-alt0xe84d
+
icon-print0xe84e
+
icon-edit0xe84f
+
+
+
icon-forward0xe850
+
icon-reply0xe851
+
icon-reply-all0xe852
+
icon-eye0xe853
+
+
+
icon-tag0xe854
+
icon-tags0xe855
+
icon-lock-open-alt0xe856
+
icon-lock-open0xe857
+
+
+
icon-lock0xe858
+
icon-home0xe859
+
icon-info0xe85a
+
icon-help0xe85b
+
+
+
icon-search0xe85c
+
icon-flapping0xe85d
+
icon-rewind0xe85e
+
icon-chart-line0xe85f
+
+
+
icon-bell-off0xe860
+
icon-bell-off-empty0xe861
+
icon-plug0xe862
+
icon-eye-off0xe863
+
+
+
icon-reschedule0xe864
+
icon-cw0xe865
+
icon-host0xe866
+
icon-thumbs-up0xe867
+
+
+
icon-thumbs-down0xe868
+
+
+ + + \ No newline at end of file diff --git a/application/fonts/fontanello-ifont/font/ifont.eot b/application/fonts/fontanello-ifont/font/ifont.eot new file mode 100644 index 000000000..b8cec1252 Binary files /dev/null and b/application/fonts/fontanello-ifont/font/ifont.eot differ diff --git a/application/fonts/fontanello-ifont/font/ifont.svg b/application/fonts/fontanello-ifont/font/ifont.svg new file mode 100644 index 000000000..6e385b6f0 --- /dev/null +++ b/application/fonts/fontanello-ifont/font/ifont.svg @@ -0,0 +1,116 @@ + + + +Copyright (C) 2014 by original authors @ fontello.com + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/application/fonts/fontanello-ifont/font/ifont.ttf b/application/fonts/fontanello-ifont/font/ifont.ttf new file mode 100644 index 000000000..470c1997a Binary files /dev/null and b/application/fonts/fontanello-ifont/font/ifont.ttf differ diff --git a/application/fonts/fontanello-ifont/font/ifont.woff b/application/fonts/fontanello-ifont/font/ifont.woff new file mode 100644 index 000000000..6f08975f5 Binary files /dev/null and b/application/fonts/fontanello-ifont/font/ifont.woff differ diff --git a/application/forms/Authentication/LoginForm.php b/application/forms/Authentication/LoginForm.php index 0afc56749..41107be18 100644 --- a/application/forms/Authentication/LoginForm.php +++ b/application/forms/Authentication/LoginForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Authentication; +namespace Icinga\Forms\Authentication; use Icinga\Web\Form; use Icinga\Web\Url; @@ -32,7 +32,7 @@ class LoginForm extends Form array( 'required' => true, 'label' => t('Username'), - 'placeholder' => t('Please enter your username...'), + 'placeholder' => t(''), 'class' => false === isset($formData['username']) ? 'autofocus' : '' ) ); @@ -42,7 +42,7 @@ class LoginForm extends Form array( 'required' => true, 'label' => t('Password'), - 'placeholder' => t('...and your password'), + 'placeholder' => t(''), 'class' => isset($formData['username']) ? 'autofocus' : '' ) ); diff --git a/application/forms/Config/Authentication/AutologinBackendForm.php b/application/forms/Config/Authentication/AutologinBackendForm.php index 4f4df73e3..1725ea3c9 100644 --- a/application/forms/Config/Authentication/AutologinBackendForm.php +++ b/application/forms/Config/Authentication/AutologinBackendForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Authentication; +namespace Icinga\Forms\Config\Authentication; use Zend_Validate_Callback; use Icinga\Web\Form; @@ -31,7 +31,9 @@ class AutologinBackendForm extends Form array( 'required' => true, 'label' => t('Backend Name'), - 'description' => t('The name of this authentication backend'), + 'description' => t( + 'The name of this authentication provider that is used to differentiate it from others' + ), 'validators' => array( array( 'Regex', @@ -50,9 +52,8 @@ class AutologinBackendForm extends Form 'text', 'strip_username_regexp', array( - 'required' => true, - 'label' => t('Backend Domain Pattern'), - 'description' => t('The domain pattern of this authentication backend'), + 'label' => t('Filter Pattern'), + 'description' => t('The regular expression to use to strip specific parts off from usernames. Leave empty if you do not want to strip off anything'), 'value' => '/\@[^$]+$/', 'validators' => array( new Zend_Validate_Callback(function ($value) { @@ -82,7 +83,7 @@ class AutologinBackendForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidAuthenticationBackend(Form $form) + public static function isValidAuthenticationBackend(Form $form) { return true; } diff --git a/application/forms/Config/Authentication/DbBackendForm.php b/application/forms/Config/Authentication/DbBackendForm.php index 23335f8fa..4cf015db8 100644 --- a/application/forms/Config/Authentication/DbBackendForm.php +++ b/application/forms/Config/Authentication/DbBackendForm.php @@ -2,11 +2,11 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Authentication; +namespace Icinga\Forms\Config\Authentication; use Exception; +use Icinga\Application\Config; use Icinga\Web\Form; -use Icinga\Web\Request; use Icinga\Data\ResourceFactory; use Icinga\Authentication\Backend\DbUserBackend; @@ -54,7 +54,9 @@ class DbBackendForm extends Form array( 'required' => true, 'label' => t('Backend Name'), - 'description' => t('The name of this authentication provider'), + 'description' => t( + 'The name of this authentication provider that is used to differentiate it from others' + ), ) ); $this->addElement( @@ -86,9 +88,9 @@ class DbBackendForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - if (false === $this->isValidAuthenticationBackend($this)) { + if (false === static::isValidAuthenticationBackend($this)) { return false; } } @@ -100,21 +102,29 @@ class DbBackendForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidAuthenticationBackend(Form $form) + public static function isValidAuthenticationBackend(Form $form) { - $element = $form->getElement('resource'); - try { - $dbUserBackend = new DbUserBackend(ResourceFactory::create($element->getValue())); + $dbUserBackend = new DbUserBackend(ResourceFactory::createResource($form->getResourceConfig())); if ($dbUserBackend->count() < 1) { - $element->addError(t('No users found under the specified database backend')); + $form->addError(t('No users found under the specified database backend')); return false; } } catch (Exception $e) { - $element->addError(sprintf(t('Using the specified backend failed: %s'), $e->getMessage())); + $form->addError(sprintf(t('Using the specified backend failed: %s'), $e->getMessage())); return false; } return true; } + + /** + * Return the configuration for the chosen resource + * + * @return Config + */ + public function getResourceConfig() + { + return ResourceFactory::getResourceConfig($this->getValue('resource')); + } } diff --git a/application/forms/Config/Authentication/LdapBackendForm.php b/application/forms/Config/Authentication/LdapBackendForm.php index 6056b0911..3e5c2b305 100644 --- a/application/forms/Config/Authentication/LdapBackendForm.php +++ b/application/forms/Config/Authentication/LdapBackendForm.php @@ -2,12 +2,13 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Authentication; +namespace Icinga\Forms\Config\Authentication; use Exception; +use Icinga\Application\Config; use Icinga\Web\Form; -use Icinga\Web\Request; use Icinga\Data\ResourceFactory; +use Icinga\Exception\AuthenticationException; use Icinga\Authentication\Backend\LdapUserBackend; /** @@ -54,7 +55,9 @@ class LdapBackendForm extends Form array( 'required' => true, 'label' => t('Backend Name'), - 'description' => t('The name of this authentication backend') + 'description' => t( + 'The name of this authentication provider that is used to differentiate it from others' + ) ) ); $this->addElement( @@ -97,7 +100,16 @@ class LdapBackendForm extends Form 'value' => 'ldap' ) ); - + $this->addElement( + 'text', + 'base_dn', + array( + 'required' => false, + 'label' => t('Base DN'), + 'description' => t('The path where users can be found on the ldap server. ' . + ' Leave empty to select all users available on the specified resource.') + ) + ); return $this; } @@ -106,9 +118,9 @@ class LdapBackendForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - if (false === $this->isValidAuthenticationBackend($this)) { + if (false === static::isValidAuthenticationBackend($this)) { return false; } } @@ -120,22 +132,34 @@ class LdapBackendForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidAuthenticationBackend(Form $form) + public static function isValidAuthenticationBackend(Form $form) { - $element = $form->getElement('resource'); - try { $ldapUserBackend = new LdapUserBackend( - ResourceFactory::create($element->getValue()), + ResourceFactory::createResource($form->getResourceConfig()), $form->getElement('user_class')->getValue(), - $form->getElement('user_name_attribute')->getValue() + $form->getElement('user_name_attribute')->getValue(), + $form->getElement('base_dn')->getValue() ); $ldapUserBackend->assertAuthenticationPossible(); + } catch (AuthenticationException $e) { + $form->addError($e->getMessage()); + return false; } catch (Exception $e) { - $element->addError(sprintf(t('Connection validation failed: %s'), $e->getMessage())); + $form->addError(sprintf(t('Unable to validate authentication: %s'), $e->getMessage())); return false; } return true; } + + /** + * Return the configuration for the chosen resource + * + * @return Config + */ + public function getResourceConfig() + { + return ResourceFactory::getResourceConfig($this->getValue('resource')); + } } diff --git a/application/forms/Config/AuthenticationBackendConfigForm.php b/application/forms/Config/AuthenticationBackendConfigForm.php index e81382cd4..c21ccf8f2 100644 --- a/application/forms/Config/AuthenticationBackendConfigForm.php +++ b/application/forms/Config/AuthenticationBackendConfigForm.php @@ -2,18 +2,18 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config; +namespace Icinga\Forms\Config; use InvalidArgumentException; -use Icinga\Web\Request; -use Icinga\Form\ConfigForm; +use Icinga\Forms\ConfigForm; use Icinga\Web\Notification; use Icinga\Application\Config; use Icinga\Application\Platform; +use Icinga\Data\ResourceFactory; use Icinga\Exception\ConfigurationError; -use Icinga\Form\Config\Authentication\DbBackendForm; -use Icinga\Form\Config\Authentication\LdapBackendForm; -use Icinga\Form\Config\Authentication\AutologinBackendForm; +use Icinga\Forms\Config\Authentication\DbBackendForm; +use Icinga\Forms\Config\Authentication\LdapBackendForm; +use Icinga\Forms\Config\Authentication\AutologinBackendForm; class AuthenticationBackendConfigForm extends ConfigForm { @@ -39,8 +39,6 @@ class AuthenticationBackendConfigForm extends ConfigForm * @param Config $resources The resource configuration * * @return self - * - * @throws ConfigurationError In case no resources are available for authentication */ public function setResourceConfig(Config $resourceConfig) { @@ -49,10 +47,6 @@ class AuthenticationBackendConfigForm extends ConfigForm $resources[strtolower($resource->type)][] = $name; } - if (empty($resources)) { - throw new ConfigurationError(t('Could not find any resources for authentication')); - } - $this->resources = $resources; return $this; } @@ -197,17 +191,17 @@ class AuthenticationBackendConfigForm extends ConfigForm * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) { $backendForm = $this->getBackendForm($this->getElement('type')->getValue()); - if (false === $backendForm->isValidAuthenticationBackend($this)) { + if (false === $backendForm::isValidAuthenticationBackend($this)) { $this->addElement($this->getForceCreationCheckbox()); return false; } } - $authBackend = $request->getQuery('auth_backend'); + $authBackend = $this->request->getQuery('auth_backend'); try { if ($authBackend === null) { // create new backend $this->add($this->getValues()); @@ -235,9 +229,9 @@ class AuthenticationBackendConfigForm extends ConfigForm * * @throws ConfigurationError In case the backend name is missing in the request or is invalid */ - public function onRequest(Request $request) + public function onRequest() { - $authBackend = $request->getQuery('auth_backend'); + $authBackend = $this->request->getQuery('auth_backend'); if ($authBackend !== null) { if ($authBackend === '') { throw new ConfigurationError(t('Authentication backend name missing')); @@ -251,6 +245,17 @@ class AuthenticationBackendConfigForm extends ConfigForm $configValues['type'] = $configValues['backend']; $configValues['name'] = $authBackend; $this->populate($configValues); + } elseif (empty($this->resources)) { + $autologinBackends = array_filter( + $this->config->toArray(), + function ($authBackendCfg) { + return isset($authBackendCfg['backend']) && $authBackendCfg['backend'] === 'autologin'; + } + ); + + if (false === empty($autologinBackends)) { + throw new ConfigurationError(t('Could not find any resources for authentication')); + } } } @@ -280,7 +285,7 @@ class AuthenticationBackendConfigForm extends ConfigForm public function createElements(array $formData) { $backendTypes = array(); - $backendType = isset($formData['type']) ? $formData['type'] : 'db'; + $backendType = isset($formData['type']) ? $formData['type'] : null; if (isset($this->resources['db'])) { $backendTypes['db'] = t('Database'); @@ -299,6 +304,10 @@ class AuthenticationBackendConfigForm extends ConfigForm $backendTypes['autologin'] = t('Autologin'); } + if ($backendType === null) { + $backendType = key($backendTypes); + } + $this->addElement( 'select', 'type', @@ -307,7 +316,7 @@ class AuthenticationBackendConfigForm extends ConfigForm 'required' => true, 'autosubmit' => true, 'label' => t('Backend Type'), - 'description' => t('The type of the resource to use for this authenticaton backend'), + 'description' => t('The type of the resource to use for this authenticaton provider'), 'multiOptions' => $backendTypes ) ); @@ -319,4 +328,14 @@ class AuthenticationBackendConfigForm extends ConfigForm $this->addElements($this->getBackendForm($backendType)->createElements($formData)->getElements()); } + + /** + * Return the configuration for the chosen resource + * + * @return Config + */ + public function getResourceConfig() + { + return ResourceFactory::getResourceConfig($this->getValue('resource')); + } } diff --git a/application/forms/Config/AuthenticationBackendReorderForm.php b/application/forms/Config/AuthenticationBackendReorderForm.php index 3b5e70866..07200827a 100644 --- a/application/forms/Config/AuthenticationBackendReorderForm.php +++ b/application/forms/Config/AuthenticationBackendReorderForm.php @@ -2,12 +2,11 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config; +namespace Icinga\Forms\Config; use InvalidArgumentException; -use Icinga\Web\Request; use Icinga\Web\Notification; -use Icinga\Form\ConfigForm; +use Icinga\Forms\ConfigForm; class AuthenticationBackendReorderForm extends ConfigForm { @@ -30,17 +29,26 @@ class AuthenticationBackendReorderForm extends ConfigForm return $this->config->keys(); } + /** + * @see Form::createElements() + */ + public function createElements(array $formData) + { + // This adds just a dummy element to be able to utilize Form::getValue as part of onSuccess() + $this->addElement('hidden', 'backend_newpos'); + } + /** * Update the authentication backend order and save the configuration * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - $formData = $this->getRequestData($request); - if (isset($formData['backend_newpos'])) { + $newPosData = $this->getValue('backend_newpos'); + if ($newPosData) { $configForm = $this->getConfigForm(); - list($backendName, $position) = explode('|', $formData['backend_newpos'], 2); + list($backendName, $position) = explode('|', $newPosData, 2); try { if ($configForm->move($backendName, $position)->save()) { diff --git a/application/forms/Config/General/ApplicationConfigForm.php b/application/forms/Config/General/ApplicationConfigForm.php index fda695886..df8531250 100644 --- a/application/forms/Config/General/ApplicationConfigForm.php +++ b/application/forms/Config/General/ApplicationConfigForm.php @@ -2,12 +2,14 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\General; +namespace Icinga\Forms\Config\General; use DateTimeZone; -use Icinga\Web\Form; -use Icinga\Util\Translator; +use Icinga\Application\Icinga; use Icinga\Data\ResourceFactory; +use Icinga\Util\Translator; +use Icinga\Web\Form; + /** * Form class to modify the general application configuration @@ -27,56 +29,18 @@ class ApplicationConfigForm extends Form */ public function createElements(array $formData) { - $languages = array(); - foreach (Translator::getAvailableLocaleCodes() as $language) { - $languages[$language] = $language; - } - - $this->addElement( - 'select', - 'global_language', - array( - 'label' => t('Default Language'), - 'required' => true, - 'multiOptions' => $languages, - 'description' => t( - 'Select the language to use by default. Can be overwritten by a user in his preferences.' - ) - ) - ); - - $tzList = array(); - foreach (DateTimeZone::listIdentifiers() as $tz) { - $tzList[$tz] = $tz; - } - - $this->addElement( - 'select', - 'global_timezone', - array( - 'label' => t('Default Application Timezone'), - 'required' => true, - 'multiOptions' => $tzList, - 'description' => t( - 'Select the timezone to be used as the default. User\'s can set their own timezone if' - . ' they like to, but this is the timezone to be used as the default setting .' - ), - 'value' => date_default_timezone_get() - ) - ); - $this->addElement( 'text', 'global_modulePath', array( 'label' => t('Module Path'), 'required' => true, + 'value' => implode(':', Icinga::app()->getModuleManager()->getModuleDirs()), 'description' => t( 'Contains the directories that will be searched for available modules, separated by ' . 'colons. Modules that don\'t exist in these directories can still be symlinked in ' . 'the module folder, but won\'t show up in the list of disabled modules.' - ), - 'value' => realpath(ICINGAWEB_APPDIR . '/../modules') + ) ) ); diff --git a/application/forms/Config/General/LoggingConfigForm.php b/application/forms/Config/General/LoggingConfigForm.php index 50b61d246..deed06011 100644 --- a/application/forms/Config/General/LoggingConfigForm.php +++ b/application/forms/Config/General/LoggingConfigForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\General; +namespace Icinga\Forms\Config\General; use Icinga\Application\Icinga; use Icinga\Application\Logger; @@ -30,13 +30,13 @@ class LoggingConfigForm extends Form 'logging_log', array( 'required' => true, - 'class' => 'autosubmit', + 'autosubmit' => true, 'label' => t('Logging Type'), 'description' => t('The type of logging to utilize.'), 'multiOptions' => array( 'syslog' => 'Syslog', - 'file' => t('File'), - 'none' => t('None') + 'file' => t('File', 'app.config.logging.type'), + 'none' => t('None', 'app.config.logging.type') ) ) ); @@ -50,16 +50,16 @@ class LoggingConfigForm extends Form 'label' => t('Logging Level'), 'description' => t('The maximum logging level to emit.'), 'multiOptions' => array( - Logger::$levels[Logger::ERROR] => t('Error'), - Logger::$levels[Logger::WARNING] => t('Warning'), - Logger::$levels[Logger::INFO] => t('Information'), - Logger::$levels[Logger::DEBUG] => t('Debug') + Logger::$levels[Logger::ERROR] => t('Error', 'app.config.logging.level'), + Logger::$levels[Logger::WARNING] => t('Warning', 'app.config.logging.level'), + Logger::$levels[Logger::INFO] => t('Information', 'app.config.logging.level'), + Logger::$levels[Logger::DEBUG] => t('Debug', 'app.config.logging.level') ) ) ); } - if (isset($formData['logging_log']) && $formData['logging_log'] === 'syslog') { + if (false === isset($formData['logging_log']) || $formData['logging_log'] === 'syslog') { $this->addElement( 'text', 'logging_application', diff --git a/application/forms/Config/GeneralConfigForm.php b/application/forms/Config/GeneralConfigForm.php index 0b55704c2..2cb72e3a1 100644 --- a/application/forms/Config/GeneralConfigForm.php +++ b/application/forms/Config/GeneralConfigForm.php @@ -2,13 +2,12 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config; +namespace Icinga\Forms\Config; -use Icinga\Web\Request; use Icinga\Web\Notification; -use Icinga\Form\ConfigForm; -use Icinga\Form\Config\General\LoggingConfigForm; -use Icinga\Form\Config\General\ApplicationConfigForm; +use Icinga\Forms\ConfigForm; +use Icinga\Forms\Config\General\LoggingConfigForm; +use Icinga\Forms\Config\General\ApplicationConfigForm; /** * Form class for application-wide and logging specific settings @@ -38,7 +37,7 @@ class GeneralConfigForm extends ConfigForm /** * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { $sections = array(); foreach ($this->getValues() as $sectionAndPropertyName => $value) { @@ -62,7 +61,7 @@ class GeneralConfigForm extends ConfigForm /** * @see Form::onRequest() */ - public function onRequest(Request $request) + public function onRequest() { $values = array(); foreach ($this->config as $section => $properties) { diff --git a/application/forms/Config/Resource/DbResourceForm.php b/application/forms/Config/Resource/DbResourceForm.php index f3d81e648..b1d54c704 100644 --- a/application/forms/Config/Resource/DbResourceForm.php +++ b/application/forms/Config/Resource/DbResourceForm.php @@ -2,14 +2,13 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Resource; +namespace Icinga\Forms\Config\Resource; use Exception; use Icinga\Application\Config; use Icinga\Web\Form; -use Icinga\Web\Request; -use Icinga\Web\Form\Element\Number; use Icinga\Data\ResourceFactory; +use Icinga\Application\Platform; /** * Form class for adding/modifying database resources @@ -29,6 +28,23 @@ class DbResourceForm extends Form */ public function createElements(array $formData) { + $dbChoices = array(); + if (Platform::zendClassExists('Zend_Db_Adapter_Pdo_Mysql')) { + $dbChoices['mysql'] = 'MySQL'; + } + if (Platform::zendClassExists('Zend_Db_Adapter_Pdo_Pgsql')) { + $dbChoices['pgsql'] = 'PostgreSQL'; + } + + $this->addElement( + 'text', + 'name', + array( + 'required' => true, + 'label' => t('Resource Name'), + 'description' => t('The unique name of this resource') + ) + ); $this->addElement( 'select', 'db', @@ -36,11 +52,7 @@ class DbResourceForm extends Form 'required' => true, 'label' => t('Database Type'), 'description' => t('The type of SQL database'), - 'multiOptions' => array( - 'mysql' => 'MySQL', - 'pgsql' => 'PostgreSQL' - //'oracle' => 'Oracle' - ) + 'multiOptions' => $dbChoices ) ); $this->addElement( @@ -54,14 +66,13 @@ class DbResourceForm extends Form ) ); $this->addElement( - new Number( - array( - 'required' => true, - 'name' => 'port', - 'label' => t('Port'), - 'description' => t('The port to use'), - 'value' => 3306 - ) + 'number', + 'port', + array( + 'required' => true, + 'label' => t('Port'), + 'description' => t('The port to use'), + 'value' => 3306 ) ); $this->addElement( @@ -101,9 +112,9 @@ class DbResourceForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - if (false === $this->isValidResource($this)) { + if (false === static::isValidResource($this)) { return false; } } @@ -115,7 +126,7 @@ class DbResourceForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidResource(Form $form) + public static function isValidResource(Form $form) { try { $resource = ResourceFactory::createResource(new Config($form->getValues())); diff --git a/application/forms/Config/Resource/FileResourceForm.php b/application/forms/Config/Resource/FileResourceForm.php index d1d33a749..8e2920313 100644 --- a/application/forms/Config/Resource/FileResourceForm.php +++ b/application/forms/Config/Resource/FileResourceForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Resource; +namespace Icinga\Forms\Config\Resource; use Icinga\Web\Form; use Icinga\Web\Form\Validator\ReadablePathValidator; @@ -25,6 +25,15 @@ class FileResourceForm extends Form */ public function createElements(array $formData) { + $this->addElement( + 'text', + 'name', + array( + 'required' => true, + 'label' => t('Resource Name'), + 'description' => t('The unique name of this resource') + ) + ); $this->addElement( 'text', 'filename', diff --git a/application/forms/Config/Resource/LdapResourceForm.php b/application/forms/Config/Resource/LdapResourceForm.php index ee647d507..6c29a09d6 100644 --- a/application/forms/Config/Resource/LdapResourceForm.php +++ b/application/forms/Config/Resource/LdapResourceForm.php @@ -2,13 +2,11 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Resource; +namespace Icinga\Forms\Config\Resource; use Exception; use Icinga\Application\Config; use Icinga\Web\Form; -use Icinga\Web\Request; -use Icinga\Web\Form\Element\Number; use Icinga\Data\ResourceFactory; /** @@ -29,6 +27,15 @@ class LdapResourceForm extends Form */ public function createElements(array $formData) { + $this->addElement( + 'text', + 'name', + array( + 'required' => true, + 'label' => t('Resource Name'), + 'description' => t('The unique name of this resource') + ) + ); $this->addElement( 'text', 'hostname', @@ -40,14 +47,13 @@ class LdapResourceForm extends Form ) ); $this->addElement( - new Number( - array( - 'required' => true, - 'name' => 'port', - 'label' => t('Port'), - 'description' => t('The port of the LDAP server to use for authentication'), - 'value' => 389 - ) + 'number', + 'port', + array( + 'required' => true, + 'label' => t('Port'), + 'description' => t('The port of the LDAP server to use for authentication'), + 'value' => 389 ) ); $this->addElement( @@ -56,7 +62,7 @@ class LdapResourceForm extends Form array( 'required' => true, 'label' => t('Root DN'), - 'description' => t('The path where users can be found on the ldap server') + 'description' => t('Only the root and its child nodes will be accessible on this resource.') ) ); $this->addElement( @@ -87,9 +93,9 @@ class LdapResourceForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - if (false === $this->isValidResource($this)) { + if (false === static::isValidResource($this)) { return false; } } @@ -101,11 +107,17 @@ class LdapResourceForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidResource(Form $form) + public static function isValidResource(Form $form) { try { $resource = ResourceFactory::createResource(new Config($form->getValues())); - $resource->connect(); + if (false === $resource->testCredentials( + $form->getElement('bind_dn')->getValue(), + $form->getElement('bind_pw')->getValue() + ) + ) { + throw new Exception(); + } } catch (Exception $e) { $form->addError(t('Connectivity validation failed, connection to the given resource not possible.')); return false; diff --git a/application/forms/Config/Resource/LivestatusResourceForm.php b/application/forms/Config/Resource/LivestatusResourceForm.php index 676904966..e4dae844b 100644 --- a/application/forms/Config/Resource/LivestatusResourceForm.php +++ b/application/forms/Config/Resource/LivestatusResourceForm.php @@ -2,12 +2,11 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config\Resource; +namespace Icinga\Forms\Config\Resource; use Exception; use Icinga\Application\Config; use Icinga\Web\Form; -use Icinga\Web\Request; use Icinga\Application\Icinga; use Icinga\Data\ResourceFactory; @@ -29,6 +28,15 @@ class LivestatusResourceForm extends Form */ public function createElements(array $formData) { + $this->addElement( + 'text', + 'name', + array( + 'required' => true, + 'label' => t('Resource Name'), + 'description' => t('The unique name of this resource') + ) + ); $this->addElement( 'text', 'socket', @@ -48,9 +56,9 @@ class LivestatusResourceForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { - if (false === $this->isValidResource($this)) { + if (false === static::isValidResource($this)) { return false; } } @@ -62,7 +70,7 @@ class LivestatusResourceForm extends Form * * @return bool Whether validation succeeded or not */ - public function isValidResource(Form $form) + public static function isValidResource(Form $form) { try { $resource = ResourceFactory::createResource(new Config($form->getValues())); diff --git a/application/forms/Config/ResourceConfigForm.php b/application/forms/Config/ResourceConfigForm.php index 1aa7edc96..d5faca1cd 100644 --- a/application/forms/Config/ResourceConfigForm.php +++ b/application/forms/Config/ResourceConfigForm.php @@ -2,16 +2,15 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Config; +namespace Icinga\Forms\Config; use InvalidArgumentException; -use Icinga\Web\Request; use Icinga\Web\Notification; -use Icinga\Form\ConfigForm; -use Icinga\Form\Config\Resource\DbResourceForm; -use Icinga\Form\Config\Resource\FileResourceForm; -use Icinga\Form\Config\Resource\LdapResourceForm; -use Icinga\Form\Config\Resource\LivestatusResourceForm; +use Icinga\Forms\ConfigForm; +use Icinga\Forms\Config\Resource\DbResourceForm; +use Icinga\Forms\Config\Resource\FileResourceForm; +use Icinga\Forms\Config\Resource\LdapResourceForm; +use Icinga\Forms\Config\Resource\LivestatusResourceForm; use Icinga\Application\Platform; use Icinga\Exception\ConfigurationError; @@ -128,17 +127,17 @@ class ResourceConfigForm extends ConfigForm * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) { $resourceForm = $this->getResourceForm($this->getElement('type')->getValue()); - if (method_exists($resourceForm, 'isValidResource') && false === $resourceForm->isValidResource($this)) { + if (method_exists($resourceForm, 'isValidResource') && false === $resourceForm::isValidResource($this)) { $this->addElement($this->getForceCreationCheckbox()); return false; } } - $resource = $request->getQuery('resource'); + $resource = $this->request->getQuery('resource'); try { if ($resource === null) { // create new resource $this->add($this->getValues()); @@ -166,9 +165,9 @@ class ResourceConfigForm extends ConfigForm * * @throws ConfigurationError In case the backend name is missing in the request or is invalid */ - public function onRequest(Request $request) + public function onRequest() { - $resource = $request->getQuery('resource'); + $resource = $this->request->getQuery('resource'); if ($resource !== null) { if ($resource === '') { throw new ConfigurationError(t('Resource name missing')); @@ -220,15 +219,6 @@ class ResourceConfigForm extends ConfigForm $resourceTypes['db'] = t('SQL Database'); } - $this->addElement( - 'text', - 'name', - array( - 'required' => true, - 'label' => t('Resource Name'), - 'description' => t('The unique name of this resource') - ) - ); $this->addElement( 'select', 'type', diff --git a/application/forms/ConfigForm.php b/application/forms/ConfigForm.php index d1f2ed1dd..fcf674cad 100644 --- a/application/forms/ConfigForm.php +++ b/application/forms/ConfigForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form; +namespace Icinga\Forms; use Exception; use Icinga\Web\Form; diff --git a/application/forms/ConfirmRemovalForm.php b/application/forms/ConfirmRemovalForm.php index 86a2eb02a..02d7263df 100644 --- a/application/forms/ConfirmRemovalForm.php +++ b/application/forms/ConfirmRemovalForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form; +namespace Icinga\Forms; use Icinga\Web\Form; diff --git a/application/forms/Dashboard/AddUrlForm.php b/application/forms/Dashboard/AddUrlForm.php index 564ff3d7a..7f5a217d1 100644 --- a/application/forms/Dashboard/AddUrlForm.php +++ b/application/forms/Dashboard/AddUrlForm.php @@ -2,7 +2,7 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form\Dashboard; +namespace Icinga\Forms\Dashboard; use Icinga\Application\Config; use Icinga\Web\Widget\Dashboard; diff --git a/application/forms/LdapDiscoveryForm.php b/application/forms/LdapDiscoveryForm.php new file mode 100644 index 000000000..9e5af79ac --- /dev/null +++ b/application/forms/LdapDiscoveryForm.php @@ -0,0 +1,211 @@ +setName('form_ldap_discovery'); + } + + /** + * @see Form::createElements() + */ + public function createElements(array $formData) + { + $this->addElement( + 'text', + 'domain', + array( + 'required' => true, + 'label' => t('Search Domain'), + 'description' => t('Search this domain for records of available servers.'), + ) + ); + + if (false) { + $this->addElement( + 'note', + 'additional_description', + array( + 'value' => t('No Ldap servers found on this domain.' + . ' You can try to specify host and port and try again, or just skip this step and ' + . 'configure the server manually.' + ) + ) + ); + $this->addElement( + 'text', + 'hostname', + array( + 'required' => false, + 'label' => t('Host'), + 'description' => t('IP or host name to search.'), + ) + ); + + $this->addElement( + 'text', + 'port', + array( + 'required' => false, + 'label' => t('Port'), + 'description' => t('Port', 389), + ) + ); + } + return $this; + } + + public function isValid($data) + { + if (false === parent::isValid($data)) { + return false; + } + if ($this->discover($this->getValue('domain'))) { + return true; + } + return true; + } + + + private function discover($domain) + { + // Attempt 1: Connect to the domain directly + if ($this->discoverCapabilities(array( + 'hostname' => $domain, + 'port' => 389) + )) { + return true; + } + + // Attempt 2: Discover all available ldap dns records and connect to the first one + $cap = false; + $records = array_merge(Dns::getSrvRecords($domain, 'ldap'), Dns::getSrvRecords($domain, 'ldaps')); + if (isset($records[0])) { + $record = $records[0]; + if (isset($record['port'])) { + $cap = $this->discoverCapabilities(array( + 'hostname' => $record['target'], + 'port' => $record['port'] + )); + } else { + $cap = $this->discoverCapabilities(array( + 'hostname' => $record['target'], + 'port' => 389 + )); + } + } + return $cap; + } + + private function discoverCapabilities($config) + { + $conn = new Connection(new Config($config)); + try { + $conn->connect(); + $this->capabilities = $conn->getCapabilities(); + $this->namingContext = $conn->getDefaultNamingContext(); + $this->port = $config['port']; + $this->domain = $config['hostname']; + return true; + } catch (LdapException $e) { + Logger::info( + 'Ldap discovery for ' . $config['hostname'] . ':' . $config['port'] . ' failed: ' . $e->getMessage() + ); + return false; + } + } + + public function suggestResourceSettings() + { + if (! isset($this->capabilities)) { + return array(); + } + if ($this->capabilities->msCapabilities->ActiveDirectoryOid) { + return array( + 'hostname' => $this->domain, + 'port' => $this->port, + 'root_dn' => $this->namingContext + ); + } else { + return array( + 'hostname' => $this->domain, + 'port' => $this->port, + 'root_dn' => $this->namingContext + ); + } + } + + public function hasSuggestion() + { + return isset($this->capabilities); + } + + public function suggestBackendSettings() + { + if (! isset($this->capabilities)) { + return array(); + } + if ($this->capabilities->msCapabilities->ActiveDirectoryOid) { + return array( + 'base_dn' => $this->namingContext, + 'user_class' => 'user', + 'user_name_attribute' => 'sAMAccountName' + ); + } else { + return array( + 'base_dn' => $this->namingContext, + 'user_class' => 'inetOrgPerson', + 'user_name_attribute' => 'uid' + ); + } + } + + public function isAd() + { + return $this->capabilities->msCapabilities->ActiveDirectoryOid; + } +} \ No newline at end of file diff --git a/application/forms/PreferenceForm.php b/application/forms/PreferenceForm.php index 633e2183a..e3cfdf319 100644 --- a/application/forms/PreferenceForm.php +++ b/application/forms/PreferenceForm.php @@ -2,18 +2,18 @@ // {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}} -namespace Icinga\Form; +namespace Icinga\Forms; use Exception; use DateTimeZone; use Icinga\Application\Logger; +use Icinga\Authentication\Manager; use Icinga\User\Preferences; use Icinga\User\Preferences\PreferencesStore; use Icinga\Util\TimezoneDetect; use Icinga\Util\Translator; use Icinga\Web\Form; use Icinga\Web\Notification; -use Icinga\Web\Request; use Icinga\Web\Session; /** @@ -41,7 +41,6 @@ class PreferenceForm extends Form public function init() { $this->setName('form_config_preferences'); - $this->setSubmitLabel(t('Save Changes')); } /** @@ -76,7 +75,6 @@ class PreferenceForm extends Form */ public function save() { - $this->store->load(); // Necessary for patching existing preferences $this->store->save($this->preferences); return $this; } @@ -86,11 +84,13 @@ class PreferenceForm extends Form * * @see Form::onSuccess() */ - public function onSuccess(Request $request) + public function onSuccess() { + $this->preferences = new Preferences($this->store->load()); + $webPreferences = $this->preferences->get('icingaweb', array()); foreach ($this->getValues() as $key => $value) { - if ($value === null) { + if ($value === null || $value === 'autodetect') { if (isset($webPreferences[$key])) { unset($webPreferences[$key]); } @@ -100,14 +100,15 @@ class PreferenceForm extends Form } $this->preferences->icingaweb = $webPreferences; - // TODO: Is this even necessary in case the session is written on response? - $session = Session::getSession(); - $session->user->setPreferences($this->preferences); - $session->write(); + Session::getSession()->user->setPreferences($this->preferences); try { - $this->save(); - Notification::success(t('Preferences successfully saved')); + if ($this->getElement('btn_submit_preferences')->isChecked()) { + $this->save(); + Notification::success(t('Preferences successfully saved')); + } else { + Notification::success(t('Preferences successfully saved for the current session')); + } } catch (Exception $e) { Logger::error($e); Notification::error($e->getMessage()); @@ -119,11 +120,19 @@ class PreferenceForm extends Form * * @see Form::onRequest() */ - public function onRequest(Request $request) + public function onRequest() { - $values = $this->preferences->get('icingaweb', array()); - $values['browser_language'] = false === isset($values['language']); - $values['local_timezone'] = false === isset($values['timezone']); + $auth = Manager::getInstance(); + $values = $auth->getUser()->getPreferences()->get('icingaweb'); + + if (! isset($values['language'])) { + $values['language'] = 'autodetect'; + } + + if (! isset($values['timezone'])) { + $values['timezone'] = 'autodetect'; + } + $this->populate($values); } @@ -133,72 +142,40 @@ class PreferenceForm extends Form public function createElements(array $formData) { $languages = array(); + $languages['autodetect'] = sprintf(t('Browser (%s)', 'preferences.form'), $this->getLocale()); foreach (Translator::getAvailableLocaleCodes() as $language) { $languages[$language] = $language; } $tzList = array(); + $tzList['autodetect'] = sprintf(t('Browser (%s)', 'preferences.form'), $this->getDefaultTimezone()); foreach (DateTimeZone::listIdentifiers() as $tz) { $tzList[$tz] = $tz; } $this->addElement( - 'checkbox', - 'browser_language', - array( - 'ignore' => true, - 'required' => true, - 'autosubmit' => true, - 'value' => true, - 'label' => t('Use your browser\'s language suggestions') - ) - ); - - $useBrowserLanguage = isset($formData['browser_language']) ? $formData['browser_language'] == 1 : true; - $languageSelection = $this->createElement( 'select', 'language', array( - 'required' => false === $useBrowserLanguage, + 'required' => true, 'label' => t('Your Current Language'), 'description' => t('Use the following language to display texts and messages'), 'multiOptions' => $languages, 'value' => substr(setlocale(LC_ALL, 0), 0, 5) ) ); - if ($useBrowserLanguage) { - $languageSelection->setAttrib('disabled', 'disabled'); - } - $this->addElement($languageSelection); $this->addElement( - 'checkbox', - 'local_timezone', - array( - 'ignore' => true, - 'required' => true, - 'autosubmit' => true, - 'value' => true, - 'label' => t('Use your local timezone') - ) - ); - - $useLocalTimezone = isset($formData['local_timezone']) ? $formData['local_timezone'] == 1 : true; - $timezoneSelection = $this->createElement( 'select', 'timezone', array( - 'required' => false === $useLocalTimezone, + 'required' => true, 'label' => t('Your Current Timezone'), 'description' => t('Use the following timezone for dates and times'), 'multiOptions' => $tzList, 'value' => $this->getDefaultTimezone() ) ); - if ($useLocalTimezone) { - $timezoneSelection->setAttrib('disabled', 'disabled'); - } - $this->addElement($timezoneSelection); $this->addElement( 'checkbox', @@ -208,6 +185,43 @@ class PreferenceForm extends Form 'label' => t('Use benchmark') ) ); + + $this->addElement( + 'submit', + 'btn_submit_preferences', + array( + 'ignore' => true, + 'label' => t('Save to the Preferences'), + 'decorators' => array( + 'ViewHelper', + array('HtmlTag', array('tag' => 'div')) + ) + ) + ); + + $this->addElement( + 'submit', + 'btn_submit_session', + array( + 'ignore' => true, + 'label' => t('Save for the current Session'), + 'decorators' => array( + 'ViewHelper', + array('HtmlTag', array('tag' => 'div')) + ) + ) + ); + + $this->addDisplayGroup( + array('btn_submit_preferences', 'btn_submit_session'), + 'submit_buttons', + array( + 'decorators' => array( + 'FormElements', + array('HtmlTag', array('tag' => 'div', 'class' => 'control-group')) + ) + ) + ); } /** @@ -221,7 +235,18 @@ class PreferenceForm extends Form if ($detect->success()) { return $detect->getTimezoneName(); } else { - return date_default_timezone_get(); + return @date_default_timezone_get(); } } + + /** + * Return the preferred locale based on the given HTTP header and the available translations + * + * @return string + */ + protected function getLocale() + { + $locale = Translator::getPreferredLocaleCode($_SERVER['HTTP_ACCEPT_LANGUAGE']); + return $locale; + } } diff --git a/application/views/scripts/authentication/login.phtml b/application/views/scripts/authentication/login.phtml index fe3ab5e3b..e931d0448 100644 --- a/application/views/scripts/authentication/login.phtml +++ b/application/views/scripts/authentication/login.phtml @@ -1,11 +1,10 @@
-

translate('Icingaweb Login') ?>

errorInfo)): ?> @@ -14,6 +13,18 @@
form ?> - + + +
', // TODO: Documentation link + '', + '' + ); ?>
+
diff --git a/application/views/scripts/config/authentication/reorder.phtml b/application/views/scripts/config/authentication/reorder.phtml index 0ae7850eb..688d99f88 100644 --- a/application/views/scripts/config/authentication/reorder.phtml +++ b/application/views/scripts/config/authentication/reorder.phtml @@ -4,8 +4,8 @@ \ No newline at end of file + diff --git a/application/views/scripts/config/module.phtml b/application/views/scripts/config/module.phtml index c74cac80d..b7f6bf346 100644 --- a/application/views/scripts/config/module.phtml +++ b/application/views/scripts/config/module.phtml @@ -1,5 +1,6 @@
tabs ?> +

escape($module->getTitle()) ?>

@@ -12,7 +13,6 @@ $permissions = $module->getProvidedPermissions(); $state = $moduleData->enabled ? ($moduleData->loaded ? 'enabled' : 'failed') : 'disabled' ?> -

escape($module->getTitle()) ?>

diff --git a/application/views/scripts/config/modules.phtml b/application/views/scripts/config/modules.phtml index c0951d415..95c9fa731 100644 --- a/application/views/scripts/config/modules.phtml +++ b/application/views/scripts/config/modules.phtml @@ -11,9 +11,9 @@ @@ -37,4 +37,4 @@
escape('Name') ?>
enabled): ?> - icon('success.png', $this->translate('Module is enabled')) ?> + icon('thumbs-up', $this->translate('Module is enabled')) ?> - icon('remove.png', $this->translate('Module is disabled')) ?> + icon('thumbs-down', $this->translate('Module is disabled')) ?>

- icon('create.png'); ?> translate('Create A New Resource'); ?> + icon('plus'); ?> translate('Create A New Resource'); ?>

@@ -17,16 +17,16 @@
- icon('edit.png'); ?> escape($name); ?> + icon('edit'); ?> escape($name); ?> - icon('remove.png'); ?> + icon('minus'); ?>
- \ No newline at end of file + diff --git a/application/views/scripts/form/reorder-authbackend.phtml b/application/views/scripts/form/reorder-authbackend.phtml index 8153e17d2..e23df8b7a 100644 --- a/application/views/scripts/form/reorder-authbackend.phtml +++ b/application/views/scripts/form/reorder-authbackend.phtml @@ -11,23 +11,23 @@
- icon('edit.png'); ?> escape($backendNames[$i]); ?> + icon('edit'); ?> escape($backendNames[$i]); ?> - icon('remove.png', $this->translate('Remove')); ?> + icon('minus', $this->translate('Remove')); ?> 0): ?>
getElement($form->getTokenElementName()); ?> getElement($form->getUidElementName()); ?> - \ No newline at end of file + diff --git a/application/views/scripts/joystickPagination.phtml b/application/views/scripts/joystickPagination.phtml new file mode 100644 index 000000000..27cafa309 --- /dev/null +++ b/application/views/scripts/joystickPagination.phtml @@ -0,0 +1,99 @@ +count() <= 1 && $yAxisPaginator->count() <= 1) { + return; // Display this pagination only if there are multiple pages +} + +$fromTo = t('%s: %d to %d of %d'); +$xAxisPages = $xAxisPaginator->getPages('all'); +$yAxisPages = $yAxisPaginator->getPages('all'); + +$totalYAxisPages = $yAxisPaginator->count(); +$currentYAxisPage = $yAxisPaginator->getCurrentPageNumber(); +$prevYAxisPage = $currentYAxisPage > 1 ? $currentYAxisPage - 1 : null; +$nextYAxisPage = $currentYAxisPage < $totalYAxisPages ? $currentYAxisPage + 1 : null; + +$totalXAxisPages = $xAxisPaginator->count(); +$currentXAxisPage = $xAxisPaginator->getCurrentPageNumber(); +$prevXAxisPage = $currentXAxisPage > 1 ? $currentXAxisPage - 1 : null; +$nextXAxisPage = $currentXAxisPage < $totalXAxisPages ? $currentXAxisPage + 1 : null; + +?> + + + + + + + + + + + + + + + + + + + +
  + + icon('up-open'); ?> + + icon('up-open'); ?> + +  
+ + icon('left-open'); ?> + + icon('left-open'); ?> + +   + + icon('right-open'); ?> + + icon('right-open'); ?> + +
  + + icon('down-open'); ?> + + icon('down-open'); ?> + +  
diff --git a/bin/icingacli b/bin/icingacli index 1a0781222..cb0d68397 100755 --- a/bin/icingacli +++ b/bin/icingacli @@ -1,6 +1,9 @@ #!/usr/bin/php -dispatch(); + +Icinga\Application\Cli::start()->dispatch(); diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 0a2f13d0d..000000000 --- a/config/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -authentication.ini -config.ini -modules/monitoring/backends.ini -modules/monitoring/instances.ini -resources.ini - diff --git a/config/authentication.ini.in b/config/authentication.ini.in deleted file mode 100644 index 2a2d2a969..000000000 --- a/config/authentication.ini.in +++ /dev/null @@ -1,29 +0,0 @@ -; authentication.ini -; -; Each section listed in this configuration represents a backend used to authenticate users. The backend configurations -; must define a resource referring to a configured database or LDAP connection in the INI file resources.ini. -; -; The backends will be processed from top to bottom using the first backend for authentication which reports that -; the user trying to log in is available. - -[autologin] -backend = autologin -; -; If you want to strip the domain -; strip_username_regexp = /\@[^$]+$/ - -[internal_ldap_authentication] -@ldap_auth_disabled@ -backend = ldap -resource = internal_ldap -user_class = @ldap_user_objectclass@ -user_name_attribute = @ldap_attribute_username@ -group_base_dn = @ldap_group_base_dn@ -group_attribute = @ldap_group_attribute@ -group_member_attribute = @ldap_group_member_attribute@ -group_class = @ldap_group_class@ - -[internal_db_authentication] -@internal_auth_disabled@ -backend = db -resource = internal_db diff --git a/config/config.ini.in b/config/config.ini.in deleted file mode 100644 index 560acf527..000000000 --- a/config/config.ini.in +++ /dev/null @@ -1,41 +0,0 @@ -[global] -timezone = "Europe/Berlin" - -; Contains the directories that will be searched for available modules. Modules that -; don't exist in these directories can still be symlinked in the module folder, but -; won't show up in the list of disabled modules -; modulePath = "/vagrant/modules:/usr/share/icingaweb/modules" - -[logging] -enable = true -; Writing to a Stream -type = "file" -; Write data to the following file -target = "@icingaweb_log_path@/icingaweb.log" -; Write data to a PHP stream -;target = "php://output" - -; Writing to the System Log -;type = "syslog" -; Prefix all syslog messages generated with the string "icingaweb" -;application = "icingaweb" -;facility = "LOG_USER" - -level = 1 -; The default level is WARNING, which means that only events of this level and -; above will be tracked. Level numbers descend in order of importance where -; ERROR (0) is the most important level and DEBUG (3) is the least important -; level: -; -; ERROR = 0 - Error: error conditions -; WARNING = 1 - Warning: warning conditions -; INFO = 2 - Informational: informational messages -; DEBUG = 3 - Debug: debug messages - -[preferences] -; Use INI file storage to save preferences to a local disk -type = "ini" - -; Use database storage to save preferences in either a MySQL or PostgreSQL database -;type = db -;resource = icingaweb-mysql diff --git a/config/enabledModules/README b/config/enabledModules/README deleted file mode 100644 index 7a55ea091..000000000 --- a/config/enabledModules/README +++ /dev/null @@ -1 +0,0 @@ -Enabled modules shall be symlinked here. diff --git a/config/ldap/ldap_ca.conf.in b/config/ldap/ldap_ca.conf.in deleted file mode 100644 index 2682820b8..000000000 --- a/config/ldap/ldap_ca.conf.in +++ /dev/null @@ -1,4 +0,0 @@ -# Use given CA file -TLS_REQCERT demand -TLS_CACERT @prefix@/config/ssl/cacerts/trusted.crt - diff --git a/config/ldap/ldap_nocert.conf b/config/ldap/ldap_nocert.conf deleted file mode 100644 index 768691479..000000000 --- a/config/ldap/ldap_nocert.conf +++ /dev/null @@ -1,4 +0,0 @@ -# This config file will allow TLS-based LDAP connections ignoring -# unknown certificates -TLS_REQCERT never - diff --git a/config/memberships.ini b/config/memberships.ini deleted file mode 100644 index c92fae47c..000000000 --- a/config/memberships.ini +++ /dev/null @@ -1,9 +0,0 @@ -[membership-set1] -backend = groupX -users = icingaadmin,tgelf -groups = admin,users - -[membership-set2] -backend = groupY -users = icingaadmin -groups = support1,support2 diff --git a/config/modules/monitoring/backends.ini.in b/config/modules/monitoring/backends.ini.in deleted file mode 100644 index 910f17f81..000000000 --- a/config/modules/monitoring/backends.ini.in +++ /dev/null @@ -1,19 +0,0 @@ -[localdb] -@ido_enabled@ -type = ido -resource = "ido" - -[locallive] -@livestatus_enabled@ -type = livestatus -resource = livestatus - -[localfile] -@statusdat_enabled@ -type = statusdat -resource = statusdat - -;[localfailsafe] -;enabled=false -;type = combo -;backends = localdb, locallive, localfile diff --git a/config/modules/monitoring/config.ini b/config/modules/monitoring/config.ini deleted file mode 100644 index 9b69fe86f..000000000 --- a/config/modules/monitoring/config.ini +++ /dev/null @@ -1,2 +0,0 @@ -[security] -protected_customvars = "*pw*,*pass*,community" diff --git a/config/modules/monitoring/instances.ini.in b/config/modules/monitoring/instances.ini.in deleted file mode 100644 index f129553d0..000000000 --- a/config/modules/monitoring/instances.ini.in +++ /dev/null @@ -1,2 +0,0 @@ -[icinga] -path = "@icinga_commandpipe@" diff --git a/config/permissions.ini b/config/permissions.ini deleted file mode 100644 index 3fec92f1c..000000000 --- a/config/permissions.ini +++ /dev/null @@ -1,11 +0,0 @@ -[test1] -users = icingaadmin,root,tgelf -groups = support2,support2 -permission_1 = monitoring, monitoring/log -permission_2 = monitoring/command/all - -[test2] -users = root -groups = admin -permission_2 = test/permission/1, test/permission/2 -permission_3 = test/permission/15, test/permission/7 \ No newline at end of file diff --git a/config/preferences/.gitkeep b/config/preferences/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/config/resources.ini.in b/config/resources.ini.in deleted file mode 100644 index d4c617c51..000000000 --- a/config/resources.ini.in +++ /dev/null @@ -1,55 +0,0 @@ -; resources.ini -; -; The configuration file *resources.ini* contains data sources that -; can be referenced in other configurations. This allows you to manage -; all connections to SQL databases in one single place, avoiding the need -; to edit several different configuration files, when the connection -; information of a resource change. -; -; Each section represents a resource, with the section name being the -; identifier used to reference this certain section. Depending on the -; resource type, each section contains different properties. The property -; *type* defines the resource type and thus how the properties are going to -; be interpreted. Currently only the resource type *db* is available. - - -[internal_db] -type = db -db = @internal_db_type@ -host = @internal_db_host@ -port = @internal_db_port@ -password = @internal_db_password@ -username = @internal_db_user@ -dbname = @internal_db_name@ - -[ido] -type = db -db = @ido_db_type@ -host = @ido_host@ -port = @ido_port@ -password = @ido_password@ -username = @ido_user@ -dbname = @ido_db_name@ - -[statusdat] -type = statusdat -status_file = @statusdat_file@ -object_file = @objects_cache_file@ - -[livestatus] -type = livestatus -socket = @livestatus_socket@ - -[internal_ldap] -type = ldap -hostname = @ldap_host@ -port = @ldap_port@ -root_dn = "@ldap_rootdn@" -bind_dn = "@ldap_binddn@" -bind_pw = @ldap_bindpass@ - -[logfile] -type = file -filename = "@icingaweb_log_path@/icingaweb.log" -fields = "/^(?[0-9]{4}(-[0-9]{2}){2}T[0-9]{2}(:[0-9]{2}){2}(\\+[0-9]{2}:[0-9]{2})?) - (?[A-Za-z]+) - (?.*)$/" -; format: PCRE diff --git a/config/restrictions.ini b/config/restrictions.ini deleted file mode 100644 index d14a8a60f..000000000 --- a/config/restrictions.ini +++ /dev/null @@ -1,16 +0,0 @@ -[test1] -users = "user1" -groups = "no-such-group" -name = "monitoring/filter" -restriction = "hostgroup=lalala&service_description=*ping*" - -[test2] -users = "user2" -name = "monitoring/filter" -restriction = "hostgroup=kunden*&service_description=*ping*" - -[test3] -users = "user3" -name = "monitoring/filter" -restriction = "hostgroup=kunden*&service_description=*ping-ping*" - diff --git a/config/ssl/cacerts/trusted.crt.in b/config/ssl/cacerts/trusted.crt.in deleted file mode 100644 index e69de29bb..000000000 diff --git a/configure b/configure deleted file mode 100755 index a48f71506..000000000 --- a/configure +++ /dev/null @@ -1,4125 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for IcingaWeb2 1.0.0. -# -# Report bugs to . -# -# -# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. -# -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Use a proper internal environment variable to ensure we don't fall - # into an infinite loop, continuously re-executing ourselves. - if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then - _as_can_reexec=no; export _as_can_reexec; - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -as_fn_exit 255 - fi - # We don't want this to propagate to other subprocesses. - { _as_can_reexec=; unset _as_can_reexec;} -if test "x$CONFIG_SHELL" = x; then - as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which - # is contrary to our usage. Disable this feature. - alias -g '\${1+\"\$@\"}'='\"\$@\"' - setopt NO_GLOB_SUBST -else - case \`(set -o) 2>/dev/null\` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi -" - as_required="as_fn_return () { (exit \$1); } -as_fn_success () { as_fn_return 0; } -as_fn_failure () { as_fn_return 1; } -as_fn_ret_success () { return 0; } -as_fn_ret_failure () { return 1; } - -exitcode=0 -as_fn_success || { exitcode=1; echo as_fn_success failed.; } -as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } -as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } -as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } -if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : - -else - exitcode=1; echo positional parameters were not saved. -fi -test x\$exitcode = x0 || exit 1 -test -x / || exit 1" - as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO - as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO - eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && - test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 -test \$(( 1 + 1 )) = 2 || exit 1" - if (eval "$as_required") 2>/dev/null; then : - as_have_required=yes -else - as_have_required=no -fi - if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : - -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -as_found=false -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - as_found=: - case $as_dir in #( - /*) - for as_base in sh bash ksh sh5; do - # Try only shells that exist, to save several forks. - as_shell=$as_dir/$as_base - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : - CONFIG_SHELL=$as_shell as_have_required=yes - if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : - break 2 -fi -fi - done;; - esac - as_found=false -done -$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && - { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : - CONFIG_SHELL=$SHELL as_have_required=yes -fi; } -IFS=$as_save_IFS - - - if test "x$CONFIG_SHELL" != x; then : - export CONFIG_SHELL - # We cannot yet assume a decent shell, so we have to provide a -# neutralization value for shells without unset; and this also -# works around shells that cannot unset nonexistent variables. -# Preserve -v and -x to the replacement shell. -BASH_ENV=/dev/null -ENV=/dev/null -(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV -case $- in # (((( - *v*x* | *x*v* ) as_opts=-vx ;; - *v* ) as_opts=-v ;; - *x* ) as_opts=-x ;; - * ) as_opts= ;; -esac -exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} -# Admittedly, this is quite paranoid, since all the known shells bail -# out after a failed `exec'. -$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 -exit 255 -fi - - if test x$as_have_required = xno; then : - $as_echo "$0: This script requires a shell more modern than all" - $as_echo "$0: the shells that I found on your system." - if test x${ZSH_VERSION+set} = xset ; then - $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" - $as_echo "$0: be upgraded to zsh 4.3.4 or later." - else - $as_echo "$0: Please tell bug-autoconf@gnu.org and info@icinga.org -$0: about your system, including any error possibly output -$0: before this message. Then install a modern shell, or -$0: manually run the script under such a shell if you do -$0: have one." - fi - exit 1 -fi -fi -fi -SHELL=${CONFIG_SHELL-/bin/sh} -export SHELL -# Unset more variables known to interfere with behavior of common tools. -CLICOLOR_FORCE= GREP_OPTIONS= -unset CLICOLOR_FORCE GREP_OPTIONS - -## --------------------- ## -## M4sh Shell Functions. ## -## --------------------- ## -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - - - as_lineno_1=$LINENO as_lineno_1a=$LINENO - as_lineno_2=$LINENO as_lineno_2a=$LINENO - eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && - test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { - # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } - - # If we had to re-execute with $CONFIG_SHELL, we're ensured to have - # already done that, so ensure we don't try to do so again and fall - # in an infinite loop. This has already happened in practice. - _as_can_reexec=no; export _as_can_reexec - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -test -n "$DJDIR" || exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= - -# Identity of this package. -PACKAGE_NAME='IcingaWeb2' -PACKAGE_TARNAME='icingaweb2' -PACKAGE_VERSION='1.0.0' -PACKAGE_STRING='IcingaWeb2 1.0.0' -PACKAGE_BUGREPORT='info@icinga.org' -PACKAGE_URL='' - -ac_default_prefix=/usr/local/icingaweb -ac_subst_vars='LTLIBOBJS -LIBOBJS -INSTALL_OPTS_WEB -INSTALL_OPTS -internal_auth_disabled -ldap_auth_disabled -icinga_commandpipe -livestatus_enabled -livestatus_socket -objects_cache_file -statusdat_file -statusdat_enabled -ido_password -ido_user -ido_db_name -ido_port -ido_host -ido_db_type -ido_enabled -icinga_backend -ldap_attribute_username -ldap_attribute_basedn -ldap_user_objectclass -ldap_bindpass -ldap_binddn -ldap_rootdn -ldap_port -ldap_host -internal_db_password -internal_db_user -internal_db_port -internal_db_host -internal_db_name -internal_db_type -icingaweb_log_path -icingaweb_config_path -bin_group -bin_user -httpd_config_path -web_path -web_group -web_user -app_name -PHP -SED -GREP -INSTALL_DATA -INSTALL_SCRIPT -INSTALL_PROGRAM -target_alias -host_alias -build_alias -LIBS -ECHO_T -ECHO_N -ECHO_C -DEFS -mandir -localedir -libdir -psdir -pdfdir -dvidir -htmldir -infodir -docdir -oldincludedir -includedir -localstatedir -sharedstatedir -sysconfdir -datadir -datarootdir -libexecdir -sbindir -bindir -program_transform_name -prefix -exec_prefix -PACKAGE_URL -PACKAGE_BUGREPORT -PACKAGE_STRING -PACKAGE_VERSION -PACKAGE_TARNAME -PACKAGE_NAME -PATH_SEPARATOR -SHELL' -ac_subst_files='' -ac_user_opts=' -enable_option_checking -with_icingaweb_config_path -with_icingaweb_log_path -with_web_user -with_web_group -with_web_path -with_httpd_config_path -with_bin_user -with_bin_group -with_internal_db_type -with_internal_db_name -with_internal_db_host -with_internal_db_port -with_internal_db_password -with_internal_db_user -with_internal_authentication -with_ldap_authentication -with_ldap_host -with_ldap_port -with_ldap_binddn -with_ldap_bindpass -with_ldap_rootdn -with_ldap_user_objectclass -with_ldap_attribute_username -with_icinga_backend -with_ido_db_type -with_ido_host -with_ido_port -with_ido_db_name -with_ido_user -with_ido_password -with_statusdat_file -with_objects_cache_file -with_livestatus_socket -with_icinga_commandpipe -' - ac_precious_vars='build_alias -host_alias -target_alias -PHP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -ac_unrecognized_opts= -ac_unrecognized_sep= -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *=) ac_optarg= ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid feature name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"enable_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval enable_$ac_useropt=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=\$ac_optarg ;; - - -without-* | --without-*) - ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && - as_fn_error $? "invalid package name: $ac_useropt" - ac_useropt_orig=$ac_useropt - ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` - case $ac_user_opts in - *" -"with_$ac_useropt" -"*) ;; - *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" - ac_unrecognized_sep=', ';; - esac - eval with_$ac_useropt=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) as_fn_error $? "unrecognized option: \`$ac_option' -Try \`$0 --help' for more information" - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - case $ac_envvar in #( - '' | [0-9]* | *[!_$as_cr_alnum]* ) - as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; - esac - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - as_fn_error $? "missing argument to $ac_option" -fi - -if test -n "$ac_unrecognized_opts"; then - case $enable_option_checking in - no) ;; - fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; - *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; - esac -fi - -# Check all directory arguments for consistency. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - # Remove trailing slashes. - case $ac_val in - */ ) - ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` - eval $ac_var=\$ac_val;; - esac - # Be sure to have absolute directory names. - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - as_fn_error $? "working directory cannot be determined" -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - as_fn_error $? "pwd does not report name of working directory" - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$as_myself" || -$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_myself" : 'X\(//\)[^/]' \| \ - X"$as_myself" : 'X\(//\)$' \| \ - X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_myself" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures IcingaWeb2 1.0.0 to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking ...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/icingaweb2] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF -_ACEOF -fi - -if test -n "$ac_init_help"; then - case $ac_init_help in - short | recursive ) echo "Configuration of IcingaWeb2 1.0.0:";; - esac - cat <<\_ACEOF - -Optional Packages: - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-icingaweb-config-path=PATH - Configuration path for icinga web (default - $prefix/config) - --with-icingaweb-log-path=PATH - Log path for icinga web (default $prefix/var/log) - --with-web-user=USER username for web writable files (default www-data) - --with-web-group=GROUP group for web writable files (default www-data) - --with-web-path=PATH web sub path (default /icingaweb) - --with-httpd-config-path=PATH - Include folder apache2 (default /etc/apache2/conf.d) - --with-bin-user=USER user for all other files (default root) - --with-bin-group=GROUP group for all other files (default bin) - --with-internal-db-type=TYPE - database type to use for internal database (default - mysql, supported: pgsql, mysql) - --with-internal-db-name=NAME - database name to use for internal database (default - icingaweb) - --with-internal-db-host=HOST - database host to use for internal database (default - localhost) - --with-internal-db-port=PORT - database port to use for internal database (default: - 3306 for mysql, 5432 for pgsql) - --with-internal-db-password=PASS - database pass to use for internal database (default - icingaweb) - --with-internal-db-user=USER - database user to use for internal database (default - icingaweb) - --with-internal-authentication - use the internal database for authentication - (default: yes) - --with-ldap-authentication - use a ldap server for authentication (default: no) - --with-ldap-host=HOST host to use for authentication via ldap (default - localhost) - --with-ldap-port=PORT port to use for authentication via ldap (default - 389) - --with-ldap-binddn=DN dn to use for retrieving user information via ldap - (default cn=admin, cn=config) - --with-ldap-bindpass=PASS - password to use for retrieving user information via - ldap (default admin) - --with-ldap-rootdn=LDAP_ATTRIBUTE - root dn to use for user lookup (default ou=people, - dc=icinga, dc=org) - --with-ldap-user-objectclass=LDAP_OBJECT_CLASS - ldap object class to use for user authentication - (default: inetOrgPerson) - --with-ldap-attribute-username=LDAP_ATTRIBUTE - user attribute to use for the username (default: - uid) - --with-icinga-backend=(ido, statusdat, livestatus) - backend to use for rb (default: statusdat) - --with-ido-db-type=(mysql, pgsql) - database engine to use for retrieving data from the - ido db (default: mysql) - --with-ido-host=HOST host to use for retrieving data from the ido db - (default: localhost) - --with-ido-port=PORT backend to use for retrieving data from the ido db - (default: 3306 for mysql. 5432 for pgsql) - --with-ido-db-name=DATABASE - database name to use for retrieving data from the - ido db (default: icinga) - --with-ido-user=USER user to use for retrieving data from the ido db - (default: icinga) - --with-ido-password=PASSWORD - password to use for retrieving data from the ido db - (default: icinga) - --with-statusdat-file=FILE - location of the status.dat file when retrieving data - from status.dat (default: - /usr/local/icinga/var/status.dat) - --with-objects-cache-file=FILE - location of the objects.cache file when retrieving - data from status.dat (default: - /usr/local/icinga/var/objects.cache) - --with-livestatus-socket=FILE - location of the livestatus socket (default: - /usr/local/icinga/var/rw/live) - --with-icinga-commandpipe=FILE - location of the command pipe used for sending - commands (default: - /usr/local/icinga/var/rw/icinga.cmd) - --with-objects-file=FILE - location of the objects.cache file when retrieving - data from status.dat (default: - /usr/local/icinga/var/objects.cache) - -Some influential environment variables: - PHP php cli binary - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -Report bugs to . -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || - { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || - continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -IcingaWeb2 configure 1.0.0 -generated by GNU Autoconf 2.69 - -Copyright (C) 2012 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi - -## ------------------------ ## -## Autoconf initialization. ## -## ------------------------ ## -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by IcingaWeb2 $as_me 1.0.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - $as_echo "PATH: $as_dir" - done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; - 2) - as_fn_append ac_configure_args1 " '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - as_fn_append ac_configure_args " '$ac_arg'" - ;; - esac - done -done -{ ac_configure_args0=; unset ac_configure_args0;} -{ ac_configure_args1=; unset ac_configure_args1;} - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - $as_echo "## ---------------- ## -## Cache variables. ## -## ---------------- ##" - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - $as_echo "## ----------------- ## -## Output variables. ## -## ----------------- ##" - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - $as_echo "## ------------------- ## -## File substitutions. ## -## ------------------- ##" - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - $as_echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - $as_echo "## ----------- ## -## confdefs.h. ## -## ----------- ##" - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - $as_echo "$as_me: caught signal $ac_signal" - $as_echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -$as_echo "/* confdefs.h */" > confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_URL "$PACKAGE_URL" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer an explicitly selected file to automatically selected ones. -ac_site_file1=NONE -ac_site_file2=NONE -if test -n "$CONFIG_SITE"; then - # We do not want a PATH search for config.site. - case $CONFIG_SITE in #(( - -*) ac_site_file1=./$CONFIG_SITE;; - */*) ac_site_file1=$CONFIG_SITE;; - *) ac_site_file1=./$CONFIG_SITE;; - esac -elif test "x$prefix" != xNONE; then - ac_site_file1=$prefix/share/config.site - ac_site_file2=$prefix/etc/config.site -else - ac_site_file1=$ac_default_prefix/share/config.site - ac_site_file2=$ac_default_prefix/etc/config.site -fi -for ac_site_file in "$ac_site_file1" "$ac_site_file2" -do - test "x$ac_site_file" = xNONE && continue - if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 -$as_echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" \ - || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error $? "failed to load site script $ac_site_file -See \`config.log' for more details" "$LINENO" 5; } - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special files - # actually), so we avoid doing that. DJGPP emulates it as a regular file. - if test /dev/null != "$cache_file" && test -f "$cache_file"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 -$as_echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 -$as_echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 -$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - # differences in whitespace do not lead to failure. - ac_old_val_w=`echo x $ac_old_val` - ac_new_val_w=`echo x $ac_new_val` - if test "$ac_old_val_w" != "$ac_new_val_w"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 -$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - ac_cache_corrupted=: - else - { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 -$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} - eval $ac_var=\$ac_old_val - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 -$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 -$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) as_fn_append ac_configure_args " '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 -$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} - as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 -fi -## -------------------- ## -## Main body of script. ## -## -------------------- ## - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - - -if test "x$prefix" = "xNONE" ; then - installDir="/usr/local/icingaweb" - prefix=$installDir -else - installDir=$prefix -fi - -# Checks for programs. -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : - $as_echo_n "(cached) " >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - - done -IFS=$as_save_IFS - -rm -rf conftest.one conftest.two conftest.dir - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 -$as_echo_n "checking for grep that handles long lines and -e... " >&6; } -if ${ac_cv_path_GREP+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -z "$GREP"; then - ac_path_GREP_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_GREP" || continue -# Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_GREP_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_GREP"; then - as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 - fi -else - ac_cv_path_GREP=$GREP -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 -$as_echo "$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5 -$as_echo_n "checking for a sed that does not truncate output... " >&6; } -if ${ac_cv_path_SED+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for ac_i in 1 2 3 4 5 6 7; do - ac_script="$ac_script$as_nl$ac_script" - done - echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed - { ac_script=; unset ac_script;} - if test -z "$SED"; then - ac_path_SED_found=false - # Loop through the user's path and test for each of PROGNAME-LIST - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in sed gsed; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_SED="$as_dir/$ac_prog$ac_exec_ext" - as_fn_executable_p "$ac_path_SED" || continue -# Check for GNU ac_path_SED and select it if it is found. - # Check for GNU $ac_path_SED -case `"$ac_path_SED" --version 2>&1` in -*GNU*) - ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;; -*) - ac_count=0 - $as_echo_n 0123456789 >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - $as_echo '' >> "conftest.nl" - "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - as_fn_arith $ac_count + 1 && ac_count=$as_val - if test $ac_count -gt ${ac_path_SED_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_SED="$ac_path_SED" - ac_path_SED_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - $ac_path_SED_found && break 3 - done - done - done -IFS=$as_save_IFS - if test -z "$ac_cv_path_SED"; then - as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5 - fi -else - ac_cv_path_SED=$SED -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5 -$as_echo "$ac_cv_path_SED" >&6; } - SED="$ac_cv_path_SED" - rm -f conftest.sed - - -# Check for php - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PHP runtime dependency 'Zend Framework' is available" >&5 -$as_echo_n "checking if PHP runtime dependency 'Zend Framework' is available... " >&6; } - if php -r 'require "Zend/Application.php";' ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP runtime dependency fulfilled" >&5 -$as_echo "PHP runtime dependency fulfilled" >&6; } -else - as_fn_error $? "PHP runtime dependency 'Zend Framework' is missing" "$LINENO" 5 -fi - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has at least version 5.3.0" >&5 -$as_echo_n "checking if php has at least version 5.3.0... " >&6; } - if test 5 -le `php -r 'echo PHP_MAJOR_VERSION;'` && \ - test 3 -le `php -r 'echo PHP_MINOR_VERSION;'` && \ - test 0 -le `php -r 'echo PHP_RELEASE_VERSION;'`; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP version is correct" >&5 -$as_echo "PHP version is correct" >&6; } -else - as_fn_error $? "You need at least PHP version 5.3.0" "$LINENO" 5 -fi - - - # Extract the first word of "php", so it can be a program name with args. -set dummy php; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_path_PHP+:} false; then : - $as_echo_n "(cached) " >&6 -else - case $PHP in - [\\/]* | ?:[\\/]*) - ac_cv_path_PHP="$PHP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_path_PHP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - test -z "$ac_cv_path_PHP" && ac_cv_path_PHP="not found" - ;; -esac -fi -PHP=$ac_cv_path_PHP -if test -n "$PHP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PHP" >&5 -$as_echo "$PHP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - - if test "XX${PHP}" == "XXnot found" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: binary php not found in PATH" >&5 -$as_echo "$as_me: WARNING: binary php not found in PATH" >&2;} -fi - - test "XX${PHP}" == "XXnot found" && PHP="" - - -# Checks for libraries. - - for x in sockets json;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - -# -# Configuration files -# - -# Check whether --with-icingaweb_config_path was given. -if test "${with_icingaweb_config_path+set}" = set; then : - withval=$with_icingaweb_config_path; icingaweb_config_path=$withval -else - icingaweb_config_path=$prefix/config - -fi - - -# -# Log files -# - -# Check whether --with-icingaweb_log_path was given. -if test "${with_icingaweb_log_path+set}" = set; then : - withval=$with_icingaweb_log_path; icingaweb_log_path=$withval -else - icingaweb_log_path=$prefix/var/log - -fi - - -# -# Users for webfiles -# - - -# Check whether --with-web_user was given. -if test "${with_web_user+set}" = set; then : - withval=$with_web_user; web_user=$withval -else - - web_user=www-data - for x in www wwwrun www-data apache httpd nobody; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if user $x exists" >&5 -$as_echo_n "checking if user $x exists... " >&6; } - if $GREP -q "^$x:" /etc/passwd ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; }; web_user=$x ; break -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } -fi - done - - -fi - - - -# Check whether --with-web_group was given. -if test "${with_web_group+set}" = set; then : - withval=$with_web_group; web_group=$withval -else - - web_group=www-data - for x in www www-data apache httpd nogroup nobody; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if group $x exists" >&5 -$as_echo_n "checking if group $x exists... " >&6; } - if $GREP -q "^$x:" /etc/group ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; }; web_group=$x ; break -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } -fi - done - - -fi - - - -# Check whether --with-web_path was given. -if test "${with_web_path+set}" = set; then : - withval=$with_web_path; web_path=$withval -else - web_path=/icingaweb - -fi - - - -# Check whether --with-httpd_config_path was given. -if test "${with_httpd_config_path+set}" = set; then : - withval=$with_httpd_config_path; httpd_config_path=$withval -else - httpd_config_path= - httpd_config_path=/etc/apache2/conf.d - for x in /etc/httpd/conf.d /etc/apache2/conf-available /etc/apache2/conf.d /etc/apache/conf.d; do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if path $x exists" >&5 -$as_echo_n "checking if path $x exists... " >&6; } - if test -d $x; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; }; httpd_config_path=$x; break -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 -$as_echo "not found" >&6; } - -fi - done - - -fi - - -# -# Users and groups for installation -# - - -# Check whether --with-bin_user was given. -if test "${with_bin_user+set}" = set; then : - withval=$with_bin_user; bin_user=$withval -else - bin_user=root - -fi - - - -# Check whether --with-bin_group was given. -if test "${with_bin_group+set}" = set; then : - withval=$with_bin_group; bin_group=$withval -else - bin_group=bin - -fi - - -# -# Internal database setup -# - - -# Check whether --with-internal_db_type was given. -if test "${with_internal_db_type+set}" = set; then : - withval=$with_internal_db_type; internal_db_type=$withval -else - internal_db_type=mysql - -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Testing database type for --with-internal-db-type" >&5 -$as_echo_n "checking Testing database type for --with-internal-db-type... " >&6; } - if echo "$internal_db_type" | $GREP -q "^\(my\|pg\)sql$"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK ($internal_db_type)" >&5 -$as_echo "OK ($internal_db_type)" >&6; } -else - as_fn_error $? "$internal_db_type" "$LINENO" 5 - -fi - - - -# Check whether --with-internal_db_name was given. -if test "${with_internal_db_name+set}" = set; then : - withval=$with_internal_db_name; internal_db_name=$withval -else - internal_db_name=icingaweb - -fi - - - -# Check whether --with-internal_db_host was given. -if test "${with_internal_db_host+set}" = set; then : - withval=$with_internal_db_host; internal_db_host=$withval -else - internal_db_host=localhost - -fi - - - -# Check whether --with-internal_db_port was given. -if test "${with_internal_db_port+set}" = set; then : - withval=$with_internal_db_port; internal_db_port=$withval -else - internal_db_port=db_default_port - -fi - - - -# Check whether --with-internal_db_password was given. -if test "${with_internal_db_password+set}" = set; then : - withval=$with_internal_db_password; internal_db_password=$withval -else - internal_db_password=icingaweb - -fi - - - -# Check whether --with-internal_db_user was given. -if test "${with_internal_db_user+set}" = set; then : - withval=$with_internal_db_user; internal_db_user=$withval -else - internal_db_user=icingaweb - -fi - - -# -# Authorization method -# - - -# Check whether --with-internal_authentication was given. -if test "${with_internal_authentication+set}" = set; then : - withval=$with_internal_authentication; internal_authentication=$withval -else - internal_authentication=yes - -fi - - - -# Check whether --with-ldap_authentication was given. -if test "${with_ldap_authentication+set}" = set; then : - withval=$with_ldap_authentication; ldap_authentication=$withval -else - ldap_authentication=no - -fi - - -# -# LDAP Authorization -# - - -# Check whether --with-ldap_host was given. -if test "${with_ldap_host+set}" = set; then : - withval=$with_ldap_host; ldap_host=$withval -else - ldap_host=localhost - -fi - - - -# Check whether --with-ldap_port was given. -if test "${with_ldap_port+set}" = set; then : - withval=$with_ldap_port; ldap_port=$withval -else - ldap_port=389 - -fi - - - -# Check whether --with-ldap_binddn was given. -if test "${with_ldap_binddn+set}" = set; then : - withval=$with_ldap_binddn; ldap_binddn=$withval -else - ldap_binddn="cn=admin,cn=config" - -fi - - - -# Check whether --with-ldap_bindpass was given. -if test "${with_ldap_bindpass+set}" = set; then : - withval=$with_ldap_bindpass; ldap_bindpass=$withval -else - ldap_bindpass="admin" - -fi - - - -# Check whether --with-ldap_rootdn was given. -if test "${with_ldap_rootdn+set}" = set; then : - withval=$with_ldap_rootdn; ldap_rootdn=$withval -else - ldap_rootdn="ou=people, dc=icinga, dc=org" - -fi - - - -# Check whether --with-ldap_user_objectclass was given. -if test "${with_ldap_user_objectclass+set}" = set; then : - withval=$with_ldap_user_objectclass; ldap_user_objectclass=$withval -else - ldap_user_objectclass="inetOrgPerson" - -fi - - - -# Check whether --with-ldap_attribute_username was given. -if test "${with_ldap_attribute_username+set}" = set; then : - withval=$with_ldap_attribute_username; ldap_attribute_username=$withval -else - ldap_attribute_username="uid" - -fi - - -# -# Icinga backend selection -# - - -# Check whether --with-icinga_backend was given. -if test "${with_icinga_backend+set}" = set; then : - withval=$with_icinga_backend; icinga_backend=$withval -else - icinga_backend="statusdat" - -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Testing backend type for --with-icinga-backend" >&5 -$as_echo_n "checking Testing backend type for --with-icinga-backend... " >&6; } - if echo "$icinga_backend" | $GREP -q "^\(ido\|statusdat\|livestatus\)$"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK ($icinga_backend)" >&5 -$as_echo "OK ($icinga_backend)" >&6; } -else - as_fn_error $? "$icinga_backend" "$LINENO" 5 - -fi - - -# -# Ido settings -# - - -# Check whether --with-ido_db_type was given. -if test "${with_ido_db_type+set}" = set; then : - withval=$with_ido_db_type; ido_db_type=$withval -else - ido_db_type="mysql" - -fi - - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking Testing database type for --with-ido-db-type" >&5 -$as_echo_n "checking Testing database type for --with-ido-db-type... " >&6; } - if echo "$ido_db_type" | $GREP -q "^\(my\|pg\)sql$"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: OK ($ido_db_type)" >&5 -$as_echo "OK ($ido_db_type)" >&6; } -else - as_fn_error $? "$ido_db_type" "$LINENO" 5 - -fi - - - -# Check whether --with-ido_host was given. -if test "${with_ido_host+set}" = set; then : - withval=$with_ido_host; ido_host=$withval -else - ido_host="localhost" - -fi - - - -# Check whether --with-ido_port was given. -if test "${with_ido_port+set}" = set; then : - withval=$with_ido_port; ido_port=$withval -else - ido_port=db_default_port - -fi - - - -# Check whether --with-ido_db_name was given. -if test "${with_ido_db_name+set}" = set; then : - withval=$with_ido_db_name; ido_db_name=$withval -else - ido_db_name="icinga" - -fi - - - -# Check whether --with-ido_user was given. -if test "${with_ido_user+set}" = set; then : - withval=$with_ido_user; ido_user=$withval -else - ido_user="icinga" - -fi - - - -# Check whether --with-ido_password was given. -if test "${with_ido_password+set}" = set; then : - withval=$with_ido_password; ido_password=$withval -else - ido_password="icinga" - -fi - - -# -# Statusdat file location -# - - -# Check whether --with-statusdat_file was given. -if test "${with_statusdat_file+set}" = set; then : - withval=$with_statusdat_file; statusdat_file=$withval -else - statusdat_file="/usr/local/icinga/var/status.dat" - -fi - - - -# Check whether --with-objects_cache_file was given. -if test "${with_objects_cache_file+set}" = set; then : - withval=$with_objects_cache_file; objects_cache_file=$withval -else - objects_cache_file="/usr/local/icinga/var/objects.cache" - -fi - - -# -# Livestatus connection -# - - -# Check whether --with-livestatus_socket was given. -if test "${with_livestatus_socket+set}" = set; then : - withval=$with_livestatus_socket; livestatus_socket=$withval -else - livestatus_socket="/usr/local/icinga/var/rw/live" - -fi - - -# -# Icinga commandpipe -# - - -# Check whether --with-icinga_commandpipe was given. -if test "${with_icinga_commandpipe+set}" = set; then : - withval=$with_icinga_commandpipe; icinga_commandpipe=$withval -else - icinga_commandpipe="/usr/local/icinga/var/rw/icinga.cmd" - -fi - - - -# Check whether --with-objects_cache_file was given. -if test "${with_objects_cache_file+set}" = set; then : - withval=$with_objects_cache_file; objects_cache_file=$withval -else - objects_cache_file="/usr/local/icinga/var/objects.cache" - -fi - - -# -# Livestatus connection -# - - -# Check whether --with-livestatus_socket was given. -if test "${with_livestatus_socket+set}" = set; then : - withval=$with_livestatus_socket; livestatus_socket=$withval -else - livestatus_socket="/usr/local/icinga/var/rw/live" - -fi - - -# -# Icinga commandpipe -# - - -# Check whether --with-icinga_commandpipe was given. -if test "${with_icinga_commandpipe+set}" = set; then : - withval=$with_icinga_commandpipe; icinga_commandpipe=$withval -else - icinga_commandpipe="/usr/local/icinga/var/rw/icinga.cmd" - -fi - - -# Installation options -INSTALL_OPTS="-o $bin_user -g $bin_group" -INSTALL_OPTS_WEB="-o $web_user -g $web_group" - -if test "x$internal_db_type" = xmysql; then : - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is available" >&5 -$as_echo_n "checking if PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is available... " >&6; } - if php -r 'require "Zend/Db/Adapter/Pdo/Mysql.php";' ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP runtime dependency fulfilled" >&5 -$as_echo "PHP runtime dependency fulfilled" >&6; } -else - as_fn_error $? "PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is missing" "$LINENO" 5 -fi - - - for x in mysql;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - if test "x$internal_db_port" == xdb_default_port; then : - internal_db_port=3306 -fi - -fi - -if test "x$ido_db_type" = xmysql; then : - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is available" >&5 -$as_echo_n "checking if PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is available... " >&6; } - if php -r 'require "Zend/Db/Adapter/Pdo/Mysql.php";' ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP runtime dependency fulfilled" >&5 -$as_echo "PHP runtime dependency fulfilled" >&6; } -else - as_fn_error $? "PHP runtime dependency 'Zend Framework - MySQL PDO Adapter' is missing" "$LINENO" 5 -fi - - - for x in mysql;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - if test "x$ido_port" = xdb_default_port; then : - ido_port=3306 -fi - -fi - -if test "x$internal_db_type" = xpgsql; then : - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is available" >&5 -$as_echo_n "checking if PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is available... " >&6; } - if php -r 'require "Zend/Db/Adapter/Pdo/Pgsql.php";' ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP runtime dependency fulfilled" >&5 -$as_echo "PHP runtime dependency fulfilled" >&6; } -else - as_fn_error $? "PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is missing" "$LINENO" 5 -fi - - - for x in pgsql;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - if test "x$internal_db_port" = xdb_default_port; then : - internal_db_port=5432 -fi - -fi - -if test "x$ido_db_type" = xpgsql; then : - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is available" >&5 -$as_echo_n "checking if PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is available... " >&6; } - if php -r 'require "Zend/Db/Adapter/Pdo/Pgsql.php";' ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: PHP runtime dependency fulfilled" >&5 -$as_echo "PHP runtime dependency fulfilled" >&6; } -else - as_fn_error $? "PHP runtime dependency 'Zend Framework - PostgreSQL PDO Adapter' is missing" "$LINENO" 5 -fi - - - for x in pgsql;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - if test "x$ido_port" = xdb_default_port; then : - ido_port=5432 -fi - -fi - -# -# Disable authentication backends -# - -ido_enabled="disabled = \"1\"" -statusdat_enabled="disabled = \"1\"" -livestatus_enabled="disabled = \"1\"" - -case $icinga_backend in #( - "ido") : - ido_enabled="" ;; #( - "statusdat") : - statusdat_enabled="" ;; #( - "livestatus") : - livestatus_enabled="" ;; #( - *) : - statusdat_enabled="" ;; -esac - -ldap_auth_disabled="disabled = \"1\"" -if test "x$ldap_authentication" != xno; then : - - for x in ldap;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - ldap_auth_disabled="" - -fi - -internal_auth_disabled="disabled = \"1\"" -if test "x$internal_authentication" != xno; then : - - for x in ldap;do - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if php has $x module" >&5 -$as_echo_n "checking if php has $x module... " >&6; } - if php -m | $GREP -iq "^$x$" ; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found" >&5 -$as_echo "found" >&6; } -else - as_fn_error $? "not found" "$LINENO" 5 -fi - done - - internal_auth_disabled="" - -fi - -# -# Substitution variables -# - -# Installation directives - - - - - - - - - - -# Internal db setup - - - - - - - -# ldap setup - - - - - - - - - -# backend setup - - -# ido backend variables - - - - - - - - -# status.dat backend - - - - -# livestatus backend - - - -# command pipe - - -# Comment placeholders for toggling backends - - - - -# Application and installation - - - - -# -# Create config files -# -ac_config_files="$ac_config_files Makefile config/authentication.ini config/config.ini config/resources.ini config/modules/monitoring/backends.ini config/modules/monitoring/instances.ini etc/apache/icingaweb.conf" - - -# -# Commit and write -# -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 -$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( - *) { eval $ac_var=; unset $ac_var;} ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes: double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \. - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - if test "x$cache_file" != "x/dev/null"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 -$as_echo "$as_me: updating cache $cache_file" >&6;} - if test ! -f "$cache_file" || test -h "$cache_file"; then - cat confcache >"$cache_file" - else - case $cache_file in #( - */* | ?:*) - mv -f confcache "$cache_file"$$ && - mv -f "$cache_file"$$ "$cache_file" ;; #( - *) - mv -f confcache "$cache_file" ;; - esac - fi - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 -$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -:mline -/\\$/{ - N - s,\\\n,, - b mline -} -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -U= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`$as_echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" - as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - - -: "${CONFIG_STATUS=./config.status}" -ac_write_fail=0 -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 -$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} -as_write_fail=0 -cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false - -SHELL=\${CONFIG_SHELL-$SHELL} -export SHELL -_ASEOF -cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 -## -------------------- ## -## M4sh Initialization. ## -## -------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : - emulate sh - NULLCMD=: - # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in #( - *posix*) : - set -o posix ;; #( - *) : - ;; -esac -fi - - -as_nl=' -' -export as_nl -# Printing a long string crashes Solaris 7 /usr/bin/printf. -as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo -as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo -# Prefer a ksh shell builtin over an external printf program on Solaris, -# but without wasting forks for bash or zsh. -if test -z "$BASH_VERSION$ZSH_VERSION" \ - && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='print -r --' - as_echo_n='print -rn --' -elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then - as_echo='printf %s\n' - as_echo_n='printf %s' -else - if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then - as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' - as_echo_n='/usr/ucb/echo -n' - else - as_echo_body='eval expr "X$1" : "X\\(.*\\)"' - as_echo_n_body='eval - arg=$1; - case $arg in #( - *"$as_nl"*) - expr "X$arg" : "X\\(.*\\)$as_nl"; - arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; - esac; - expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" - ' - export as_echo_n_body - as_echo_n='sh -c $as_echo_n_body as_echo' - fi - export as_echo_body - as_echo='sh -c $as_echo_body as_echo' -fi - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - PATH_SEPARATOR=: - (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { - (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || - PATH_SEPARATOR=';' - } -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -as_myself= -case $0 in #(( - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break - done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - exit 1 -fi - -# Unset variables that we do not need and which cause bugs (e.g. in -# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" -# suppresses any "Segmentation fault" message there. '((' could -# trigger a bug in pdksh 5.2.14. -for as_var in BASH_ENV ENV MAIL MAILPATH -do eval test x\${$as_var+set} = xset \ - && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -LC_ALL=C -export LC_ALL -LANGUAGE=C -export LANGUAGE - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - - -# as_fn_error STATUS ERROR [LINENO LOG_FD] -# ---------------------------------------- -# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are -# provided, also output the error to LOG_FD, referencing LINENO. Then exit the -# script with STATUS, using 1 if that was 0. -as_fn_error () -{ - as_status=$1; test $as_status -eq 0 && as_status=1 - if test "$4"; then - as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 - fi - $as_echo "$as_me: error: $2" >&2 - as_fn_exit $as_status -} # as_fn_error - - -# as_fn_set_status STATUS -# ----------------------- -# Set $? to STATUS, without forking. -as_fn_set_status () -{ - return $1 -} # as_fn_set_status - -# as_fn_exit STATUS -# ----------------- -# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. -as_fn_exit () -{ - set +e - as_fn_set_status $1 - exit $1 -} # as_fn_exit - -# as_fn_unset VAR -# --------------- -# Portably unset VAR. -as_fn_unset () -{ - { eval $1=; unset $1;} -} -as_unset=as_fn_unset -# as_fn_append VAR VALUE -# ---------------------- -# Append the text in VALUE to the end of the definition contained in VAR. Take -# advantage of any shell optimizations that allow amortized linear growth over -# repeated appends, instead of the typical quadratic growth present in naive -# implementations. -if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : - eval 'as_fn_append () - { - eval $1+=\$2 - }' -else - as_fn_append () - { - eval $1=\$$1\$2 - } -fi # as_fn_append - -# as_fn_arith ARG... -# ------------------ -# Perform arithmetic evaluation on the ARGs, and store the result in the -# global $as_val. Take advantage of shells that can avoid forks. The arguments -# must be portable across $(()) and expr. -if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : - eval 'as_fn_arith () - { - as_val=$(( $* )) - }' -else - as_fn_arith () - { - as_val=`expr "$@" || test $? -eq 1` - } -fi # as_fn_arith - - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in #((((( --n*) - case `echo 'xy\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - xy) ECHO_C='\c';; - *) echo `echo ksh88 bug on AIX 6.1` > /dev/null - ECHO_T=' ';; - esac;; -*) - ECHO_N='-n';; -esac - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir 2>/dev/null -fi -if (echo >conf$$.file) 2>/dev/null; then - if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - - -# as_fn_mkdir_p -# ------------- -# Create "$as_dir" as a directory, including parents if necessary. -as_fn_mkdir_p () -{ - - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || eval $as_mkdir_p || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" - - -} # as_fn_mkdir_p -if mkdir -p . 2>/dev/null; then - as_mkdir_p='mkdir -p "$as_dir"' -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 -## ----------------------------------- ## -## Main body of $CONFIG_STATUS script. ## -## ----------------------------------- ## -_ASEOF -test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# Save the log message, to keep $0 and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by IcingaWeb2 $as_me 1.0.0, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -case $ac_config_files in *" -"*) set x $ac_config_files; shift; ac_config_files=$*;; -esac - - - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -# Files that config.status was made for. -config_files="$ac_config_files" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -ac_cs_usage="\ -\`$as_me' instantiates files and other configuration actions -from templates according to the current configuration. Unless the files -and actions are specified as TAGs, all are instantiated by default. - -Usage: $0 [OPTION]... [TAG]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - --config print configuration, then exit - -q, --quiet, --silent - do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" -ac_cs_version="\\ -IcingaWeb2 config.status 1.0.0 -configured by $0, generated by GNU Autoconf 2.69, - with options \\"\$ac_cs_config\\" - -Copyright (C) 2012 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -test -n "\$AWK" || AWK=awk -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# The default lists apply if the user does not specify any file. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=?*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - --*=) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg= - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - $as_echo "$ac_cs_version"; exit ;; - --config | --confi | --conf | --con | --co | --c ) - $as_echo "$ac_cs_config"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - case $ac_optarg in - *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; - '') as_fn_error $? "missing file argument" ;; - esac - as_fn_append CONFIG_FILES " '$ac_optarg'" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - $as_echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) as_fn_error $? "unrecognized option: \`$1' -Try \`$0 --help' for more information." ;; - - *) as_fn_append ac_config_targets " $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -if \$ac_cs_recheck; then - set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion - shift - \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 - CONFIG_SHELL='$SHELL' - export CONFIG_SHELL - exec "\$@" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - $as_echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "config/authentication.ini") CONFIG_FILES="$CONFIG_FILES config/authentication.ini" ;; - "config/config.ini") CONFIG_FILES="$CONFIG_FILES config/config.ini" ;; - "config/resources.ini") CONFIG_FILES="$CONFIG_FILES config/resources.ini" ;; - "config/modules/monitoring/backends.ini") CONFIG_FILES="$CONFIG_FILES config/modules/monitoring/backends.ini" ;; - "config/modules/monitoring/instances.ini") CONFIG_FILES="$CONFIG_FILES config/modules/monitoring/instances.ini" ;; - "etc/apache/icingaweb.conf") CONFIG_FILES="$CONFIG_FILES etc/apache/icingaweb.conf" ;; - - *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= ac_tmp= - trap 'exit_status=$? - : "${ac_tmp:=$tmp}" - { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status -' 0 - trap 'as_fn_exit 1' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 -ac_tmp=$tmp - -# Set up the scripts for CONFIG_FILES section. -# No need to generate them if there are no CONFIG_FILES. -# This happens for instance with `./config.status config.h'. -if test -n "$CONFIG_FILES"; then - - -ac_cr=`echo X | tr X '\015'` -# On cygwin, bash can eat \r inside `` if the user requested igncr. -# But we know of no other shell where ac_cr would be empty at this -# point, so we can use a bashism as a fallback. -if test "x$ac_cr" = x; then - eval ac_cr=\$\'\\r\' -fi -ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` -if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then - ac_cs_awk_cr='\\r' -else - ac_cs_awk_cr=$ac_cr -fi - -echo 'BEGIN {' >"$ac_tmp/subs1.awk" && -_ACEOF - - -{ - echo "cat >conf$$subs.awk <<_ACEOF" && - echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && - echo "_ACEOF" -} >conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 -ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - . ./conf$$subs.sh || - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - - ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` - if test $ac_delim_n = $ac_delim_num; then - break - elif $ac_last_try; then - as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done -rm -f conf$$subs.sh - -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && -_ACEOF -sed -n ' -h -s/^/S["/; s/!.*/"]=/ -p -g -s/^[^!]*!// -:repl -t repl -s/'"$ac_delim"'$// -t delim -:nl -h -s/\(.\{148\}\)..*/\1/ -t more1 -s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ -p -n -b repl -:more1 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t nl -:delim -h -s/\(.\{148\}\)..*/\1/ -t more2 -s/["\\]/\\&/g; s/^/"/; s/$/"/ -p -b -:more2 -s/["\\]/\\&/g; s/^/"/; s/$/"\\/ -p -g -s/.\{148\}// -t delim -' >$CONFIG_STATUS || ac_write_fail=1 -rm -f conf$$subs.awk -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -_ACAWK -cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && - for (key in S) S_is_set[key] = 1 - FS = "" - -} -{ - line = $ 0 - nfields = split(line, field, "@") - substed = 0 - len = length(field[1]) - for (i = 2; i < nfields; i++) { - key = field[i] - keylen = length(key) - if (S_is_set[key]) { - value = S[key] - line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) - len += length(value) + length(field[++i]) - substed = 1 - } else - len += 1 + keylen - } - - print line -} - -_ACAWK -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then - sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" -else - cat -fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ - || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 -_ACEOF - -# VPATH may cause trouble with some makes, so we remove sole $(srcdir), -# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ -h -s/// -s/^/:/ -s/[ ]*$/:/ -s/:\$(srcdir):/:/g -s/:\${srcdir}:/:/g -s/:@srcdir@:/:/g -s/^:*// -s/:*$// -x -s/\(=[ ]*\).*/\1/ -G -s/\n// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -fi # test -n "$CONFIG_FILES" - - -eval set X " :F $CONFIG_FILES " -shift -for ac_tag -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$ac_tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; - esac - case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac - as_fn_append ac_file_inputs " '$ac_f'" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input='Generated from '` - $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' - `' by configure.' - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 -$as_echo "$as_me: creating $ac_file" >&6;} - fi - # Neutralize special characters interpreted by sed in replacement strings. - case $configure_input in #( - *\&* | *\|* | *\\* ) - ac_sed_conf_input=`$as_echo "$configure_input" | - sed 's/[\\\\&|]/\\\\&/g'`;; #( - *) ac_sed_conf_input=$configure_input;; - esac - - case $ac_tag in - *:-:* | *:-) cat >"$ac_tmp/stdin" \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -$as_echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - as_dir="$ac_dir"; as_fn_mkdir_p - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= -ac_sed_dataroot=' -/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p' -case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 -ac_sed_extra="$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s|@configure_input@|$ac_sed_conf_input|;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@top_build_prefix@&$ac_top_build_prefix&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" -eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ - >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ - "$ac_tmp/out"`; test -z "$ac_out"; } && - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&5 -$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined" >&2;} - - rm -f "$ac_tmp/stdin" - case $ac_file in - -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; - *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; - esac \ - || as_fn_error $? "could not create $ac_file" "$LINENO" 5 - ;; - - - - esac - -done # for ac_tag - - -as_fn_exit 0 -_ACEOF -ac_clean_files=$ac_clean_files_save - -test $ac_write_fail = 0 || - as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || as_fn_exit 1 -fi -if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 -$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} -fi - diff --git a/configure.ac b/configure.ac deleted file mode 100644 index 065c81a8f..000000000 --- a/configure.ac +++ /dev/null @@ -1,448 +0,0 @@ -# -*- Autoconf -*- -# Process this file with autoconf to produce a configure script. - -AC_PREREQ([2.61]) -AC_INIT([IcingaWeb2], [1.0.0], [info@icinga.org]) -AC_PREFIX_DEFAULT(/usr/local/icingaweb) - -if test "x$prefix" = "xNONE" ; then - installDir="/usr/local/icingaweb" - prefix=$installDir -else - installDir=$prefix -fi - -# Checks for programs. -AC_PROG_INSTALL -AC_PROG_GREP -AC_PROG_SED - -# Check for php -AC_ARG_VAR([PHP],[php cli binary]) -AC_CHECK_PHP_INCLUDE([Zend/Application.php],[Zend Framework]) -AC_CHECK_PHP_VERSION([5],[3],[0]) -AC_CHECK_BIN([PHP], [php]) - -# Checks for libraries. -AC_CHECK_PHP_MODULE([sockets json]) - -# -# Configuration files -# -AC_ARG_WITH([icingaweb_config_path], - AS_HELP_STRING([--with-icingaweb-config-path=PATH], [Configuration path for icinga web (default $prefix/config)]), - icingaweb_config_path=$withval, - icingaweb_config_path=$prefix/config -) - -# -# Log files -# -AC_ARG_WITH([icingaweb_log_path], - AS_HELP_STRING([--with-icingaweb-log-path=PATH], [Log path for icinga web (default $prefix/var/log)]), - icingaweb_log_path=$withval, - icingaweb_log_path=$prefix/var/log -) - -# -# Users for webfiles -# - -AC_ARG_WITH([web_user], - AS_HELP_STRING([--with-web-user=USER], [username for web writable files (default www-data)]), - web_user=$withval, - AC_USER_GUESS([www wwwrun www-data apache httpd nobody],[web_user],[www-data]) -) - -AC_ARG_WITH([web_group], - AS_HELP_STRING([--with-web-group=GROUP], [group for web writable files (default www-data)]), - web_group=$withval, - AC_GROUP_GUESS([www www-data apache httpd nogroup nobody],[web_group], [www-data]) -) - -AC_ARG_WITH([web_path], - AS_HELP_STRING([--with-web-path=PATH], [web sub path (default /icingaweb)]), - web_path=$withval, - web_path=/icingaweb -) - -AC_ARG_WITH([httpd_config_path], - AS_HELP_STRING([--with-httpd-config-path=PATH], [Include folder apache2 (default /etc/apache2/conf.d)]), - httpd_config_path=$withval, - httpd_config_path=AC_PATH_GUESS([/etc/httpd/conf.d /etc/apache2/conf-available /etc/apache2/conf.d /etc/apache/conf.d], [httpd_config_path], [/etc/apache2/conf.d]) -) - -# -# Users and groups for installation -# - -AC_ARG_WITH([bin_user], - AS_HELP_STRING([--with-bin-user=USER], [user for all other files (default root)]), - bin_user=$withval, - bin_user=root -) - -AC_ARG_WITH([bin_group], - AS_HELP_STRING([--with-bin-group=GROUP], [group for all other files (default bin)]), - bin_group=$withval, - bin_group=bin -) - -# -# Internal database setup -# - -AC_ARG_WITH([internal_db_type], - AS_HELP_STRING([--with-internal-db-type=TYPE], [database type to use for internal database (default mysql, supported: pgsql, mysql)]), - internal_db_type=$withval, - internal_db_type=mysql -) - -ICINGA_CHECK_DBTYPE($internal_db_type, [--with-internal-db-type]) - -AC_ARG_WITH([internal_db_name], - AS_HELP_STRING([--with-internal-db-name=NAME], [database name to use for internal database (default icingaweb)]), - internal_db_name=$withval, - internal_db_name=icingaweb -) - -AC_ARG_WITH([internal_db_host], - AS_HELP_STRING([--with-internal-db-host=HOST], [database host to use for internal database (default localhost)]), - internal_db_host=$withval, - internal_db_host=localhost -) - -AC_ARG_WITH([internal_db_port], - AS_HELP_STRING([--with-internal-db-port=PORT], [database port to use for internal database (default: 3306 for mysql, 5432 for pgsql)]), - internal_db_port=$withval, - internal_db_port=db_default_port -) - -AC_ARG_WITH([internal_db_password], - AS_HELP_STRING([--with-internal-db-password=PASS], [database pass to use for internal database (default icingaweb)]), - internal_db_password=$withval, - internal_db_password=icingaweb -) - -AC_ARG_WITH([internal_db_user], - AS_HELP_STRING([--with-internal-db-user=USER], [database user to use for internal database (default icingaweb)]), - internal_db_user=$withval, - internal_db_user=icingaweb -) - -# -# Authorization method -# - -AC_ARG_WITH([internal_authentication], - AC_HELP_STRING([--with-internal-authentication], [use the internal database for authentication (default: yes)]), - internal_authentication=$withval, - internal_authentication=yes -) - -AC_ARG_WITH([ldap_authentication], - AC_HELP_STRING([--with-ldap-authentication], [use a ldap server for authentication (default: no)]), - ldap_authentication=$withval, - ldap_authentication=no -) - -# -# LDAP Authorization -# - -AC_ARG_WITH([ldap_host], - AS_HELP_STRING([--with-ldap-host=HOST], [host to use for authentication via ldap (default localhost)]), - ldap_host=$withval, - ldap_host=localhost -) - -AC_ARG_WITH([ldap_port], - AS_HELP_STRING([--with-ldap-port=PORT], [port to use for authentication via ldap (default 389)]), - ldap_port=$withval, - ldap_port=389 -) - -AC_ARG_WITH([ldap_binddn], - AS_HELP_STRING([--with-ldap-binddn=DN], [dn to use for retrieving user information via ldap (default cn=admin, cn=config)]), - ldap_binddn=$withval, - ldap_binddn=["cn=admin,cn=config"] -) - -AC_ARG_WITH([ldap_bindpass], - AS_HELP_STRING([--with-ldap-bindpass=PASS], [password to use for retrieving user information via ldap (default admin)]), - ldap_bindpass=$withval, - ldap_bindpass=["admin"] -) - -AC_ARG_WITH([ldap_rootdn], - AS_HELP_STRING([--with-ldap-rootdn=LDAP_ATTRIBUTE], [root dn to use for user lookup (default ou=people, dc=icinga, dc=org)]), - ldap_rootdn=$withval, - ldap_rootdn=["ou=people, dc=icinga, dc=org"] -) - -AC_ARG_WITH([ldap_user_objectclass], - AS_HELP_STRING([--with-ldap-user-objectclass=LDAP_OBJECT_CLASS], [ldap object class to use for user authentication (default: inetOrgPerson)]), - ldap_user_objectclass=$withval, - ldap_user_objectclass="inetOrgPerson" -) - -AC_ARG_WITH([ldap_attribute_username], - AS_HELP_STRING([--with-ldap-attribute-username=LDAP_ATTRIBUTE], [user attribute to use for the username (default: uid)]), - ldap_attribute_username=$withval, - ldap_attribute_username="uid" -) - -# -# Icinga backend selection -# - -AC_ARG_WITH([icinga_backend], - AS_HELP_STRING([--with-icinga-backend=(ido, statusdat, livestatus)], [backend to use for rb (default: statusdat)]), - icinga_backend=$withval, - icinga_backend="statusdat" -) - -ICINGA_CHECK_BACKENDTYPE($icinga_backend, [--with-icinga-backend]) - -# -# Ido settings -# - -AC_ARG_WITH([ido_db_type], - AS_HELP_STRING([--with-ido-db-type=(mysql, pgsql)], [database engine to use for retrieving data from the ido db (default: mysql)]), - ido_db_type=$withval, - ido_db_type="mysql" -) - -ICINGA_CHECK_DBTYPE($ido_db_type, [--with-ido-db-type]) - -AC_ARG_WITH([ido_host], - AS_HELP_STRING([--with-ido-host=HOST], [host to use for retrieving data from the ido db (default: localhost)]), - ido_host=$withval, - ido_host="localhost" -) - -AC_ARG_WITH([ido_port], - AS_HELP_STRING([--with-ido-port=PORT], [backend to use for retrieving data from the ido db (default: 3306 for mysql. 5432 for pgsql)]), - ido_port=$withval, - ido_port=db_default_port -) - -AC_ARG_WITH([ido_db_name], - AS_HELP_STRING([--with-ido-db-name=DATABASE], [database name to use for retrieving data from the ido db (default: icinga)]), - ido_db_name=$withval, - ido_db_name="icinga" -) - -AC_ARG_WITH([ido_user], - AS_HELP_STRING([--with-ido-user=USER], [user to use for retrieving data from the ido db (default: icinga)]), - ido_user=$withval, - ido_user="icinga" -) - -AC_ARG_WITH([ido_password], - AS_HELP_STRING([--with-ido-password=PASSWORD], [password to use for retrieving data from the ido db (default: icinga)]), - ido_password=$withval, - ido_password="icinga" -) - -# -# Statusdat file location -# - -AC_ARG_WITH([statusdat_file], - AS_HELP_STRING([--with-statusdat-file=FILE], [location of the status.dat file when retrieving data from status.dat (default: /usr/local/icinga/var/status.dat)]), - statusdat_file=$withval, - statusdat_file="/usr/local/icinga/var/status.dat" -) - -AC_ARG_WITH([objects_cache_file], - AS_HELP_STRING([--with-objects-cache-file=FILE], [location of the objects.cache file when retrieving data from status.dat (default: /usr/local/icinga/var/objects.cache)]), - objects_cache_file=$withval, - objects_cache_file="/usr/local/icinga/var/objects.cache" -) - -# -# Livestatus connection -# - -AC_ARG_WITH([livestatus_socket], - AS_HELP_STRING([--with-livestatus-socket=FILE], [location of the livestatus socket (default: /usr/local/icinga/var/rw/live)]), - livestatus_socket=$withval, - livestatus_socket="/usr/local/icinga/var/rw/live" -) - -# -# Icinga commandpipe -# - -AC_ARG_WITH([icinga_commandpipe], - AS_HELP_STRING([--with-icinga-commandpipe=FILE], [location of the command pipe used for sending commands (default: /usr/local/icinga/var/rw/icinga.cmd)]), - icinga_commandpipe=$withval, - icinga_commandpipe="/usr/local/icinga/var/rw/icinga.cmd" -) - -AC_ARG_WITH([objects_cache_file], - AS_HELP_STRING([--with-objects-file=FILE], [location of the objects.cache file when retrieving data from status.dat (default: /usr/local/icinga/var/objects.cache)]), - objects_cache_file=$withval, - objects_cache_file="/usr/local/icinga/var/objects.cache" -) - -# -# Livestatus connection -# - -AC_ARG_WITH([livestatus_socket], - AS_HELP_STRING([--with-livestatus-socket=FILE], [location of the livestatus socket (default: /usr/local/icinga/var/rw/live)]), - livestatus_socket=$withval, - livestatus_socket="/usr/local/icinga/var/rw/live" -) - -# -# Icinga commandpipe -# - -AC_ARG_WITH([icinga_commandpipe], - AS_HELP_STRING([--with-icinga-commandpipe=FILE], [location of the command pipe used for sending commands (default: /usr/local/icinga/var/rw/icinga.cmd)]), - icinga_commandpipe=$withval, - icinga_commandpipe="/usr/local/icinga/var/rw/icinga.cmd" -) - -# Installation options -INSTALL_OPTS="-o $bin_user -g $bin_group" -INSTALL_OPTS_WEB="-o $web_user -g $web_group" - -AS_IF([test "x$internal_db_type" = xmysql], [ - AC_CHECK_PHP_INCLUDE([Zend/Db/Adapter/Pdo/Mysql.php],[Zend Framework - MySQL PDO Adapter]) - AC_CHECK_PHP_MODULE([mysql]) - AS_IF([test "x$internal_db_port" == xdb_default_port], [internal_db_port=3306]) -]) - -AS_IF([test "x$ido_db_type" = xmysql], [ - AC_CHECK_PHP_INCLUDE([Zend/Db/Adapter/Pdo/Mysql.php],[Zend Framework - MySQL PDO Adapter]) - AC_CHECK_PHP_MODULE([mysql]) - AS_IF([test "x$ido_port" = xdb_default_port], [ido_port=3306]) -]) - -AS_IF([test "x$internal_db_type" = xpgsql], [ - AC_CHECK_PHP_INCLUDE([Zend/Db/Adapter/Pdo/Pgsql.php],[Zend Framework - PostgreSQL PDO Adapter]) - AC_CHECK_PHP_MODULE([pgsql]) - AS_IF([test "x$internal_db_port" = xdb_default_port], [internal_db_port=5432]) -]) - -AS_IF([test "x$ido_db_type" = xpgsql], [ - AC_CHECK_PHP_INCLUDE([Zend/Db/Adapter/Pdo/Pgsql.php],[Zend Framework - PostgreSQL PDO Adapter]) - AC_CHECK_PHP_MODULE([pgsql]) - AS_IF([test "x$ido_port" = xdb_default_port], [ido_port=5432]) -]) - -# -# Disable authentication backends -# - -ido_enabled="disabled = \"1\"" -statusdat_enabled="disabled = \"1\"" -livestatus_enabled="disabled = \"1\"" - -AS_CASE([$icinga_backend], - ["ido"], [ido_enabled=""], - ["statusdat"], [statusdat_enabled=""], - ["livestatus"], [livestatus_enabled=""], - [statusdat_enabled=""]) - -ldap_auth_disabled="disabled = \"1\"" -AS_IF([test "x$ldap_authentication" != xno], - AC_CHECK_PHP_MODULE([ldap]) - ldap_auth_disabled="" -) - -internal_auth_disabled="disabled = \"1\"" -AS_IF([test "x$internal_authentication" != xno], - AC_CHECK_PHP_MODULE([ldap]) - internal_auth_disabled="" -) - -# -# Substitution variables -# - -# Installation directives -AC_SUBST(app_name) -AC_SUBST(web_user) -AC_SUBST(web_group) -AC_SUBST(web_path) -AC_SUBST(httpd_config_path) -AC_SUBST(bin_user) -AC_SUBST(bin_group) -AC_SUBST(icingaweb_config_path) -AC_SUBST(icingaweb_log_path) - -# Internal db setup -AC_SUBST(internal_db_type) -AC_SUBST(internal_db_name) -AC_SUBST(internal_db_host) -AC_SUBST(internal_db_port) -AC_SUBST(internal_db_user) -AC_SUBST(internal_db_password) - -# ldap setup -AC_SUBST(ldap_host) -AC_SUBST(ldap_port) -AC_SUBST(ldap_rootdn) -AC_SUBST(ldap_binddn) -AC_SUBST(ldap_bindpass) -AC_SUBST(ldap_user_objectclass) -AC_SUBST(ldap_attribute_basedn) -AC_SUBST(ldap_attribute_username) - -# backend setup -AC_SUBST(icinga_backend) - -# ido backend variables -AC_SUBST(ido_enabled) -AC_SUBST(ido_db_type) -AC_SUBST(ido_host) -AC_SUBST(ido_port) -AC_SUBST(ido_db_name) -AC_SUBST(ido_user) -AC_SUBST(ido_password) - -# status.dat backend -AC_SUBST(statusdat_enabled) -AC_SUBST(statusdat_file) -AC_SUBST(objects_cache_file) - -# livestatus backend -AC_SUBST(livestatus_socket) -AC_SUBST(livestatus_enabled) - -# command pipe -AC_SUBST(icinga_commandpipe) - -# Comment placeholders for toggling backends - -AC_SUBST(ldap_auth_disabled) -AC_SUBST(internal_auth_disabled) - -# Application and installation -AC_SUBST(PHP) -AC_SUBST(INSTALL_OPTS) -AC_SUBST(INSTALL_OPTS_WEB) - -# -# Create config files -# -AC_CONFIG_FILES([ - Makefile - config/authentication.ini - config/config.ini - config/resources.ini - config/modules/monitoring/backends.ini - config/modules/monitoring/instances.ini - etc/apache/icingaweb.conf -]) - -# -# Commit and write -# -AC_OUTPUT diff --git a/doc/api/.gitkeep b/doc/api/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/doc/apidoc_creation.md b/doc/apidoc_creation.md deleted file mode 100644 index 89eb99feb..000000000 --- a/doc/apidoc_creation.md +++ /dev/null @@ -1,27 +0,0 @@ -# Create API documentation - -## Prerequisites - -You need phpDocumentor 2 installed on your system to create the api -documentation. Please visit [phpdoc's website](http://phpdoc.org/) for more -information. Additionally, the graphviz package is required to be installed. - -## Configuration - -phpDocumentator is configured with xml configuration reside in doc/phpdoc.xml. -In there you'll find the target path where the documentation is created as -html. Default location is doc/api/. Just point to index.html in this directory -with a browser. - -If you generated the documentation already, you can follow [this link](apidoc/idnex.html). - -## Generation - -Change to Icinga Web 2 root directory (source tree) and run: - - bin/createapidoc.sh - -## Options for createapidoc.sh - - --build Optional, silent build mode - --help Displays help message diff --git a/doc/container_component.md b/doc/container_component.md deleted file mode 100644 index ed505f81b..000000000 --- a/doc/container_component.md +++ /dev/null @@ -1,198 +0,0 @@ -# The Container Component (app/container) - -The container component is the most basic building block for icingaweb. Even when displaying an empty controller, -you always have at least two containers in your viewport which are implicitly created: The main and the detail container. - -Container handle the following tasks: - -* Updating the url part responsible for the container -* Handling Url changes like they occur when the browser history is used by synchronizing their content with the - associated Url part -* Informing subcomponents about changes in the container - - -## The Container Api - -You can find the sourcecode for containers along with jsdoc comments at *./public/js/icinga/components/container.js*. -Here we will discuss the most important calls and their synopsis: - -### Accessing Containers: - -The container component returns a 'Container' object which allows you to access responsible containers for dom nodes via -the following methods: - -* using `new Container($myDomNodes)` which returns a stateless container object wrapping the container responsible for - the first node in $myDomNodes -* using `Container.getMainContainer()` or `Container.getDetailContainer()` which remove the main or detail container - (this one is stateful with a few notes, read on) - -**Note:** `new Container($('#icingamain')) != Container.getMainContainer()`, but -`(new Container($('#icingamain'))).containerDom == Container.getMainContainer().containerDom` - -** Example #1 getting the container responsible for a dom node ** - -**HTML** - -
-
- Some kind of node -
-
-
- Some other kind of node -

- Insert your lorem ipsum here -

-
-
-
- -**JS**: - - require(['jquery', 'app/container'], function($, Container) { - var firstContainer = new Container($('.myNode')); // firstContainer wraps '#icingamain' - var mainContainer = Container.getMainContainer(); // also wraps '#icingamain' - var secondContainer = new Container($('.myNode p')); // #somecontainer is wrapped by secondContainer - - firstContainer.someProperty = 'What a nice property!'; - mainContainer.someState = 'I have some state'; - console.log(firstContainer.someProperty); // return 'What a nice property' - console.log(main.someProperty); // return 'undefined' - console.log(Container.getMainContainer().someState) // return 'I have some state' when page hasn't been refreshed - }); - -## Containers And The Browser Url - -As noted before (and indicated by the `getMainContainer()` and `getDetailContainer()` function), the main and detail -container have a special role. Considering the following Url: - - http://my.monitoringhost.org/icingaweb/monitoring/list/host?page=4&detail=%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dlocalhost - -This URL displays the 4th page of your host list in the main container (monitoring/list/host?page=4) and the host information -for localhost in the detail container (monitoring/show/host?host=localhost). When you split this Url up in logical pieces -it looks like this: - - http://my.monitoringhost.org/icingaweb/monitoring/list/host?page=4&detail=%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dlocalhost - \___________ _______________________/\_________ ______________/ \_ ____/\________________ _______________________/ - \/ \/ \/ \/ - 1. Base URL 2.Main container URL and Query 3.Detail param 4. Encoded detail URL and params - -1. **Base URL** : I don't think this needs much explanation. -2. **Main container URL and query** : This is the *normal* part of your Url and denotes the controller route that is - being displayed in your main container -3. **Detail parameter**: This parameter will be ignored by the main container and used for rendering the detail container, - if omitted there's simple no detail view to be displayed -4 **Encoded detail URL**: The value of the "detail" parameter is the Url (without the base Url) that returns the content - of the detail area - - -### Updating A Container's Url - -If you want your container to display content from a different Url, you can use the *replaceDomFromUrl()* on your -Container object: - -**Example #2 Updating A Containers URL** - -**HTML:** - -
-
-
-
-
-
- -**JS:** - - // this loads the page with the new main container - require(['jquery', 'app/container'], function($, Container) { - new Container('#mainSub').replaceDomFormUrl('/another/url'); - } - - // this loads the page with the new detail container - require(['jquery', 'app/container'], function($, Container) { - new Container('#detailSub').replaceDomFormUrl('/another/url'); - } - - // this does NOT work: - require(['jquery', 'app/container'], function($, Container) { - Container.getMainContainer().replaceDomFormUrl('/another/url'); - // will never be reached due to a reload - Container.getMainContainer().replaceDomFormUrl('/another/url2'); - } - - // this loads the page with both main and detail changed (this is rarely needed and should be avoided) - require(['icinga', 'jquery', 'app/container'], function('Icinga', $, Container) { - // it's better to use this: - var mainContainer = Container.getMainContainer(); - var detailContainer = Container.getDetailContainer(); - - mainContainer.updateContainerHref('/another/url'); // first update the main container href - detailContainer.updateContainerHref('/another/url2'); // update the detail href - - var url = mainContainer.getContainerHref(detailContainer.getContainerHref()); // fetch the new url - Icinga.replaceBodyFromUrl(url); // and update manual - } - -This results in the URL changing to './another/url?detail=%2Fanother%2Fdetail%2Furl. -The advantage of using a Container instance with the subelements (i.e. '\#mainSub') over calling getMain/DetailContainer -directly is that you don't need to know in what container your view is displayed - when you move 'mainSub' into the -detail container, the detail container would be updated afterwards. - -**NOTE**: You should read the '...' section in order to understand why you shouldn't do it like in this example - -### How container refresh states are handled - -If you refresh containers content (load url or replace dom), the container displaya a loading -mask as default behaviour. To disable this mask and handle it yourself, you can register own events: - -**Example #3 Load indicator events** - - require(['icinga', 'jquery', 'app/container'], function('Icinga', $, Container) { - var mainContainer = Container.getMainContainer(); - - // Detach the default behaviour from container - mainContainer.removeDefaultLoadIndicator(); - - var showFunction = function() { - console.log('container is loading'); - }; - - var hideFunction = function() { - console.log('container content refreshed'); - }; - - // Install new handlers - mainContainer.registerOnShowLoadIndicator(showFunction); - mainContainer.registerOnHideLoadIndicator(hideFunction); - }; - -**Example #4 Use this for your components** - -Please have a look into [components documentation](components.md) for detailed information about components. - - define(['components/app/container', 'jquery', 'logging', 'URIjs/URI', 'URIjs/URITemplate'], - function(Container, $, logger, URI) { - "use strict"; - - /** - * Master/Detail grid component handling history, link behaviour, selection (@TODO 3788) and updates of - * grids - * - * @param {HTMLElement} The outer element to apply the behaviour on - */ - return function(gridDomNode) { - /** - * Constructor method for this component - */ - this.construct = function(target) { - // Container object for the component - this.container = new Container(target); - - // Detach default handlers - this.container.removeDefaultLoadIndicator(); - }; - - this.construct(gridDomNode); - }; - }; \ No newline at end of file diff --git a/doc/installation.md b/doc/installation.md index 9de3f7d5c..60a5a3ce5 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -74,8 +74,7 @@ create all database tables. You will find the installation guides for the differ > > RPM packages install the schema into /usr/share/doc/icingaweb-<version>/schema - bash$ mysql -u root -p icingaweb < etc/schema/accounts.mysql.sql - bash$ mysql -u root -p icingaweb < etc/schema/preferences.mysql.sql + bash$ mysql -u root -p icingaweb < etc/schema/mysql.sql #### PostgreSQL @@ -108,8 +107,7 @@ And restart your database ('service postgresql restart' or '/etc/init.d/postgres > > RPM packages install the schema into /usr/share/doc/icingaweb-<version>/schema - bash$ psql -U icingaweb -a -f etc/schema/accounts.pgsql.sql - bash$ psql -U icingaweb -a -f etc/schema/preferences.pgsql.sql + bash$ psql -U icingaweb -a -f etc/schema/pgsql.sql diff --git a/etc/apache/.gitignore b/etc/apache/.gitignore deleted file mode 100644 index 839e1f407..000000000 --- a/etc/apache/.gitignore +++ /dev/null @@ -1 +0,0 @@ -icingaweb.conf diff --git a/etc/apache/icingaweb.conf.in b/etc/apache/icingaweb.conf.in deleted file mode 100644 index 3884aea5a..000000000 --- a/etc/apache/icingaweb.conf.in +++ /dev/null @@ -1,32 +0,0 @@ -Alias @web_path@ "@prefix@/public" - - - Options SymLinksIfOwnerMatch - AllowOverride None - - - # Apache 2.4 - - Require all granted - - - - - # Apache 2.2 - Order allow,deny - Allow from all - - - SetEnv ICINGAWEB_CONFIGDIR @icingaweb_config_path@ - - EnableSendfile Off - - RewriteEngine on - RewriteBase @web_path@/ - RewriteCond %{REQUEST_FILENAME} -s [OR] - RewriteCond %{REQUEST_FILENAME} -l [OR] - RewriteCond %{REQUEST_FILENAME} -d - RewriteRule ^.*$ - [NC,L] - RewriteRule ^.*$ index.php [NC,L] - - diff --git a/etc/schema/accounts.mysql.sql b/etc/schema/accounts.mysql.sql deleted file mode 100644 index 72eeee4fc..000000000 --- a/etc/schema/accounts.mysql.sql +++ /dev/null @@ -1,24 +0,0 @@ -create table account ( - `username` varchar(255) COLLATE latin1_general_ci NOT NULL, - `salt` varchar(255) NOT NULL, - `password` varchar(255) NOT NULL, - `active` tinyint(1) DEFAULT NULL, - PRIMARY KEY (`username`) -) ENGINE=InnoDB DEFAULT CHARSET=latin1; - -/* - * user: icingaadmin - * password: icinga - */ -INSERT INTO account ( - `username`, - `salt`, - `password`, - `active` - ) - VALUES ( - 'icingaadmin', - '57cfd5746224be4f60c25d4e8514bec35ad2d01810723a138756b285898e71b2', - '43f8e0588eb39f1a41383b48def0b1fdc45e79b8f67194cccee4453eb3f4ea13', - 1 - ); diff --git a/etc/schema/accounts.pgsql.sql b/etc/schema/accounts.pgsql.sql deleted file mode 100644 index 84ecb54e8..000000000 --- a/etc/schema/accounts.pgsql.sql +++ /dev/null @@ -1,28 +0,0 @@ -create table "account" ( - "username" character varying(255) NOT NULL, - "salt" character varying(255), - "password" character varying(255) NOT NULL, - "active" boolean -); - -ALTER TABLE ONLY "account" - ADD CONSTRAINT account_pkey PRIMARY KEY ("username"); - -CREATE UNIQUE INDEX username_lower_unique_idx ON "account" USING btree (lower((username)::text)); - -/* - * user: icingaadmin - * password: icinga - */ -INSERT INTO "account" ( - "username", - "salt", - "password", - "active" - ) - VALUES ( - 'icingaadmin', - '57cfd5746224be4f60c25d4e8514bec35ad2d01810723a138756b285898e71b2', - '43f8e0588eb39f1a41383b48def0b1fdc45e79b8f67194cccee4453eb3f4ea13', - true - ); diff --git a/etc/schema/mysql.schema.sql b/etc/schema/mysql.schema.sql index 7867796b4..74d2665d4 100644 --- a/etc/schema/mysql.schema.sql +++ b/etc/schema/mysql.schema.sql @@ -27,9 +27,10 @@ CREATE TABLE `icingaweb_user`( CREATE TABLE `icingaweb_user_preference`( `username` varchar(64) COLLATE utf8_unicode_ci NOT NULL, + `section` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `name` varchar(64) COLLATE utf8_unicode_ci NOT NULL, `value` varchar(255) NOT NULL, `ctime` timestamp NULL DEFAULT NULL, `mtime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`username`,`name`) + PRIMARY KEY (`username`,`section`,`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/etc/schema/pgsql.schema.sql b/etc/schema/pgsql.schema.sql new file mode 100644 index 000000000..b699eccf8 --- /dev/null +++ b/etc/schema/pgsql.schema.sql @@ -0,0 +1,96 @@ +/** + * Table "icingaweb_group" + */ +CREATE TABLE "icingaweb_group" ( + "name" character varying(64) NOT NULL, + "parent" character varying(64) NULL DEFAULT NULL, + "ctime" timestamp NULL DEFAULT NULL, + "mtime" timestamp NULL DEFAULT NULL +); + +ALTER TABLE ONLY "icingaweb_group" + ADD CONSTRAINT pk_icingaweb_group + PRIMARY KEY ( + "name" +); + +CREATE UNIQUE INDEX idx_icingaweb_group + ON "icingaweb_group" + USING btree ( + lower((name)::text) +); + + +/** + * Table "icingaweb_group_membership" + */ +CREATE TABLE "icingaweb_group_membership" ( + "group_name" character varying(64) NOT NULL, + "username" character varying(64) NOT NULL, + "ctime" timestamp NULL DEFAULT NULL, + "mtime" timestamp NULL DEFAULT NULL +); + +ALTER TABLE ONLY "icingaweb_group_membership" + ADD CONSTRAINT pk_icingaweb_group_membership + PRIMARY KEY ( + "group_name", + "username" +); + +CREATE UNIQUE INDEX idx_icingaweb_group_membership + ON "icingaweb_group_membership" + USING btree ( + lower((group_name)::text), + lower((username)::text) +); + + +/** + * Table "icingaweb_user" + */ +CREATE TABLE "icingaweb_user" ( + "name" character varying(64) NOT NULL, + "active" smallint NOT NULL, + "password_hash" bytea NOT NULL, + "ctime" timestamp NULL DEFAULT NULL, + "mtime" timestamp NULL DEFAULT NULL +); + +ALTER TABLE ONLY "icingaweb_user" + ADD CONSTRAINT pk_icingaweb_user + PRIMARY KEY ( + "name" +); + +CREATE UNIQUE INDEX idx_icingaweb_user + ON "icingaweb_user" + USING btree ( + lower((name)::text) +); + + +/** + * Table "icingaweb_user_preference" + */ +CREATE TABLE "icingaweb_user_preference" ( + "username" character varying(64) NOT NULL, + "name" character varying(64) NOT NULL, + "value" character varying(255) NOT NULL, + "ctime" timestamp NULL DEFAULT NULL, + "mtime" timestamp NULL DEFAULT NULL +); + +ALTER TABLE ONLY "icingaweb_user_preference" + ADD CONSTRAINT pk_icingaweb_user_preference + PRIMARY KEY ( + "username", + "name" +); + +CREATE UNIQUE INDEX idx_icingaweb_user_preference + ON "icingaweb_user_preference" + USING btree ( + lower((username)::text), + lower((name)::text) +); \ No newline at end of file diff --git a/etc/schema/preferences.mysql.sql b/etc/schema/preferences.mysql.sql deleted file mode 100644 index 5549daa3f..000000000 --- a/etc/schema/preferences.mysql.sql +++ /dev/null @@ -1,6 +0,0 @@ -create table `preference`( - `username` VARCHAR(255) COLLATE latin1_general_ci NOT NULL, - `key` VARCHAR(100) COLLATE latin1_general_ci NOT NULL, - `value` VARCHAR(255) NOT NULL, - PRIMARY KEY (`username`, `key`) -) ENGINE=InnoDB; \ No newline at end of file diff --git a/etc/schema/preferences.pgsql.sql b/etc/schema/preferences.pgsql.sql deleted file mode 100644 index 8b694f0a0..000000000 --- a/etc/schema/preferences.pgsql.sql +++ /dev/null @@ -1,10 +0,0 @@ -create table "preference"( - "username" VARCHAR(255) NOT NULL, - "key" VARCHAR(100) NOT NULL, - "value" VARCHAR(255) NOT NULL -); - -ALTER TABLE ONLY "preference" - ADD CONSTRAINT preference_pkey PRIMARY KEY ("username", "key"); - -CREATE UNIQUE INDEX username_and_key_lower_unique_idx ON "preference" USING btree (lower((username)::text), lower((key)::text)); \ No newline at end of file diff --git a/icingaweb2.spec b/icingaweb2.spec index db0929f7b..9d9e11345 100644 --- a/icingaweb2.spec +++ b/icingaweb2.spec @@ -31,7 +31,7 @@ %define prefixdir %{_datadir}/%{name} %define usermodparam -a -G %define logdir %{_localstatedir}/log/%{name} -%define docdir %{sharedir}/log +%define docdir %{sharedir}/doc %if "%{_vendor}" == "suse" %define phpname php5 @@ -179,7 +179,8 @@ install -D -m0644 packages/rpm/etc/httpd/conf.d/icingaweb.conf %{buildroot}/%{ap %{__mkdir} -p %{buildroot}/%{_sysconfdir}/%{name}/modules/monitoring %{__mkdir} -p %{buildroot}/%{_sysconfdir}/%{name}/enabledModules -%{__cp} -r application doc library modules public %{buildroot}/%{sharedir}/ +# make sure to install local icingacli for setup wizard token generation & webserver config +%{__cp} -r application doc library modules public bin %{buildroot}/%{sharedir}/ ## config # authentication is db only @@ -194,8 +195,8 @@ install -D -m0644 packages/rpm/etc/%{name}/modules/monitoring/instances.ini %{bu ln -s %{sharedir}/modules/monitoring %{buildroot}/%{_sysconfdir}/%{name}/enabledModules/monitoring ## config -# install icingacli -install -D -m0755 packages/rpm/usr/bin/icingacli %{buildroot}/usr/bin/icingacli +# symlink icingacli +ln -sf %{buildroot}/%{sharedir}/bin/icingacli %{buildroot}/usr/bin/icingacli %pre # Add apacheuser in the icingacmd group diff --git a/install-sh b/install-sh deleted file mode 100755 index 6781b987b..000000000 --- a/install-sh +++ /dev/null @@ -1,520 +0,0 @@ -#!/bin/sh -# install - install a program, script, or datafile - -scriptversion=2009-04-28.21; # UTC - -# This originates from X11R5 (mit/util/scripts/install.sh), which was -# later released in X11R6 (xc/config/util/install.sh) with the -# following copyright and license. -# -# Copyright (C) 1994 X Consortium -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN -# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- -# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# -# Except as contained in this notice, the name of the X Consortium shall not -# be used in advertising or otherwise to promote the sale, use or other deal- -# ings in this Software without prior written authorization from the X Consor- -# tium. -# -# -# FSF changes to this file are in the public domain. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. - -nl=' -' -IFS=" "" $nl" - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit=${DOITPROG-} -if test -z "$doit"; then - doit_exec=exec -else - doit_exec=$doit -fi - -# Put in absolute file names if you don't have them in your path; -# or use environment vars. - -chgrpprog=${CHGRPPROG-chgrp} -chmodprog=${CHMODPROG-chmod} -chownprog=${CHOWNPROG-chown} -cmpprog=${CMPPROG-cmp} -cpprog=${CPPROG-cp} -mkdirprog=${MKDIRPROG-mkdir} -mvprog=${MVPROG-mv} -rmprog=${RMPROG-rm} -stripprog=${STRIPPROG-strip} - -posix_glob='?' -initialize_posix_glob=' - test "$posix_glob" != "?" || { - if (set -f) 2>/dev/null; then - posix_glob= - else - posix_glob=: - fi - } -' - -posix_mkdir= - -# Desired mode of installed file. -mode=0755 - -chgrpcmd= -chmodcmd=$chmodprog -chowncmd= -mvcmd=$mvprog -rmcmd="$rmprog -f" -stripcmd= - -src= -dst= -dir_arg= -dst_arg= - -copy_on_change=false -no_target_directory= - -usage="\ -Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE - or: $0 [OPTION]... SRCFILES... DIRECTORY - or: $0 [OPTION]... -t DIRECTORY SRCFILES... - or: $0 [OPTION]... -d DIRECTORIES... - -In the 1st form, copy SRCFILE to DSTFILE. -In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. -In the 4th, create DIRECTORIES. - -Options: - --help display this help and exit. - --version display version info and exit. - - -c (ignored) - -C install only if different (preserve the last data modification time) - -d create directories instead of installing files. - -g GROUP $chgrpprog installed files to GROUP. - -m MODE $chmodprog installed files to MODE. - -o USER $chownprog installed files to USER. - -s $stripprog installed files. - -t DIRECTORY install into DIRECTORY. - -T report an error if DSTFILE is a directory. - -Environment variables override the default commands: - CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG - RMPROG STRIPPROG -" - -while test $# -ne 0; do - case $1 in - -c) ;; - - -C) copy_on_change=true;; - - -d) dir_arg=true;; - - -g) chgrpcmd="$chgrpprog $2" - shift;; - - --help) echo "$usage"; exit $?;; - - -m) mode=$2 - case $mode in - *' '* | *' '* | *' -'* | *'*'* | *'?'* | *'['*) - echo "$0: invalid mode: $mode" >&2 - exit 1;; - esac - shift;; - - -o) chowncmd="$chownprog $2" - shift;; - - -s) stripcmd=$stripprog;; - - -t) dst_arg=$2 - shift;; - - -T) no_target_directory=true;; - - --version) echo "$0 $scriptversion"; exit $?;; - - --) shift - break;; - - -*) echo "$0: invalid option: $1" >&2 - exit 1;; - - *) break;; - esac - shift -done - -if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then - # When -d is used, all remaining arguments are directories to create. - # When -t is used, the destination is already specified. - # Otherwise, the last argument is the destination. Remove it from $@. - for arg - do - if test -n "$dst_arg"; then - # $@ is not empty: it contains at least $arg. - set fnord "$@" "$dst_arg" - shift # fnord - fi - shift # arg - dst_arg=$arg - done -fi - -if test $# -eq 0; then - if test -z "$dir_arg"; then - echo "$0: no input file specified." >&2 - exit 1 - fi - # It's OK to call `install-sh -d' without argument. - # This can happen when creating conditional directories. - exit 0 -fi - -if test -z "$dir_arg"; then - trap '(exit $?); exit' 1 2 13 15 - - # Set umask so as not to create temps with too-generous modes. - # However, 'strip' requires both read and write access to temps. - case $mode in - # Optimize common cases. - *644) cp_umask=133;; - *755) cp_umask=22;; - - *[0-7]) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw='% 200' - fi - cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; - *) - if test -z "$stripcmd"; then - u_plus_rw= - else - u_plus_rw=,u+rw - fi - cp_umask=$mode$u_plus_rw;; - esac -fi - -for src -do - # Protect names starting with `-'. - case $src in - -*) src=./$src;; - esac - - if test -n "$dir_arg"; then - dst=$src - dstdir=$dst - test -d "$dstdir" - dstdir_status=$? - else - - # Waiting for this to be detected by the "$cpprog $src $dsttmp" command - # might cause directories to be created, which would be especially bad - # if $src (and thus $dsttmp) contains '*'. - if test ! -f "$src" && test ! -d "$src"; then - echo "$0: $src does not exist." >&2 - exit 1 - fi - - if test -z "$dst_arg"; then - echo "$0: no destination specified." >&2 - exit 1 - fi - - dst=$dst_arg - # Protect names starting with `-'. - case $dst in - -*) dst=./$dst;; - esac - - # If destination is a directory, append the input filename; won't work - # if double slashes aren't ignored. - if test -d "$dst"; then - if test -n "$no_target_directory"; then - echo "$0: $dst_arg: Is a directory" >&2 - exit 1 - fi - dstdir=$dst - dst=$dstdir/`basename "$src"` - dstdir_status=0 - else - # Prefer dirname, but fall back on a substitute if dirname fails. - dstdir=` - (dirname "$dst") 2>/dev/null || - expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$dst" : 'X\(//\)[^/]' \| \ - X"$dst" : 'X\(//\)$' \| \ - X"$dst" : 'X\(/\)' \| . 2>/dev/null || - echo X"$dst" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q' - ` - - test -d "$dstdir" - dstdir_status=$? - fi - fi - - obsolete_mkdir_used=false - - if test $dstdir_status != 0; then - case $posix_mkdir in - '') - # Create intermediate dirs using mode 755 as modified by the umask. - # This is like FreeBSD 'install' as of 1997-10-28. - umask=`umask` - case $stripcmd.$umask in - # Optimize common cases. - *[2367][2367]) mkdir_umask=$umask;; - .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; - - *[0-7]) - mkdir_umask=`expr $umask + 22 \ - - $umask % 100 % 40 + $umask % 20 \ - - $umask % 10 % 4 + $umask % 2 - `;; - *) mkdir_umask=$umask,go-w;; - esac - - # With -d, create the new directory with the user-specified mode. - # Otherwise, rely on $mkdir_umask. - if test -n "$dir_arg"; then - mkdir_mode=-m$mode - else - mkdir_mode= - fi - - posix_mkdir=false - case $umask in - *[123567][0-7][0-7]) - # POSIX mkdir -p sets u+wx bits regardless of umask, which - # is incompatible with FreeBSD 'install' when (umask & 300) != 0. - ;; - *) - tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ - trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 - - if (umask $mkdir_umask && - exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 - then - if test -z "$dir_arg" || { - # Check for POSIX incompatibilities with -m. - # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or - # other-writeable bit of parent directory when it shouldn't. - # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. - ls_ld_tmpdir=`ls -ld "$tmpdir"` - case $ls_ld_tmpdir in - d????-?r-*) different_mode=700;; - d????-?--*) different_mode=755;; - *) false;; - esac && - $mkdirprog -m$different_mode -p -- "$tmpdir" && { - ls_ld_tmpdir_1=`ls -ld "$tmpdir"` - test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" - } - } - then posix_mkdir=: - fi - rmdir "$tmpdir/d" "$tmpdir" - else - # Remove any dirs left behind by ancient mkdir implementations. - rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null - fi - trap '' 0;; - esac;; - esac - - if - $posix_mkdir && ( - umask $mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" - ) - then : - else - - # The umask is ridiculous, or mkdir does not conform to POSIX, - # or it failed possibly due to a race condition. Create the - # directory the slow way, step by step, checking for races as we go. - - case $dstdir in - /*) prefix='/';; - -*) prefix='./';; - *) prefix='';; - esac - - eval "$initialize_posix_glob" - - oIFS=$IFS - IFS=/ - $posix_glob set -f - set fnord $dstdir - shift - $posix_glob set +f - IFS=$oIFS - - prefixes= - - for d - do - test -z "$d" && continue - - prefix=$prefix$d - if test -d "$prefix"; then - prefixes= - else - if $posix_mkdir; then - (umask=$mkdir_umask && - $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break - # Don't fail if two instances are running concurrently. - test -d "$prefix" || exit 1 - else - case $prefix in - *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; - *) qprefix=$prefix;; - esac - prefixes="$prefixes '$qprefix'" - fi - fi - prefix=$prefix/ - done - - if test -n "$prefixes"; then - # Don't fail if two instances are running concurrently. - (umask $mkdir_umask && - eval "\$doit_exec \$mkdirprog $prefixes") || - test -d "$dstdir" || exit 1 - obsolete_mkdir_used=true - fi - fi - fi - - if test -n "$dir_arg"; then - { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && - { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || - test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 - else - - # Make a couple of temp file names in the proper directory. - dsttmp=$dstdir/_inst.$$_ - rmtmp=$dstdir/_rm.$$_ - - # Trap to clean up those temp files at exit. - trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 - - # Copy the file name to the temp name. - (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && - - # and set any options; do chmod last to preserve setuid bits. - # - # If any of these fail, we abort the whole thing. If we want to - # ignore errors from any of these, just make sure not to ignore - # errors from the above "$doit $cpprog $src $dsttmp" command. - # - { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && - { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && - { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && - { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && - - # If -C, don't bother to copy if it wouldn't change the file. - if $copy_on_change && - old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && - new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && - - eval "$initialize_posix_glob" && - $posix_glob set -f && - set X $old && old=:$2:$4:$5:$6 && - set X $new && new=:$2:$4:$5:$6 && - $posix_glob set +f && - - test "$old" = "$new" && - $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 - then - rm -f "$dsttmp" - else - # Rename the file to the real destination. - $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || - - # The rename failed, perhaps because mv can't rename something else - # to itself, or perhaps because mv is so ancient that it does not - # support -f. - { - # Now remove or move aside any old file at destination location. - # We try this two ways since rm can't unlink itself on some - # systems and the destination file might be busy for other - # reasons. In this case, the final cleanup might fail but the new - # file should still install successfully. - { - test ! -f "$dst" || - $doit $rmcmd -f "$dst" 2>/dev/null || - { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && - { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } - } || - { echo "$0: cannot unlink or rename $dst" >&2 - (exit 1); exit 1 - } - } && - - # Now rename the file to the real destination. - $doit $mvcmd "$dsttmp" "$dst" - } - fi || exit 1 - - trap '' 0 - fi -done - -# Local variables: -# eval: (add-hook 'write-file-hooks 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC" -# time-stamp-end: "; # UTC" -# End: diff --git a/library/Icinga/Application/ApplicationBootstrap.php b/library/Icinga/Application/ApplicationBootstrap.php index 00c600609..4710994b4 100644 --- a/library/Icinga/Application/ApplicationBootstrap.php +++ b/library/Icinga/Application/ApplicationBootstrap.php @@ -6,6 +6,7 @@ namespace Icinga\Application; use ErrorException; use Exception; +use LogicException; use Icinga\Application\Modules\Manager as ModuleManager; use Icinga\Data\ResourceFactory; use Icinga\Exception\ConfigurationError; @@ -39,6 +40,43 @@ use Icinga\Exception\IcingaException; */ abstract class ApplicationBootstrap { + /** + * Base directory + * + * Parent folder for at least application, bin, modules, library/vendor and public + * + * @var string + */ + protected $baseDir; + + /** + * Application directory + * + * @var string + */ + protected $appDir; + + /** + * Vendor library directory + * + * @var string + */ + protected $vendorDir; + + /** + * Library directory + * + * @var string + */ + protected $libDir; + + /** + * Configuration directory + * + * @var string + */ + protected $configDir; + /** * Icinga auto loader * @@ -46,13 +84,6 @@ abstract class ApplicationBootstrap */ private $loader; - /** - * Library directory - * - * @var string - */ - private $libDir; - /** * Config object * @@ -60,20 +91,6 @@ abstract class ApplicationBootstrap */ protected $config; - /** - * Configuration directory - * - * @var string - */ - private $configDir; - - /** - * Application directory - * - * @var string - */ - private $appDir; - /** * Module manager * @@ -97,27 +114,20 @@ abstract class ApplicationBootstrap /** * Constructor + * + * @param string $baseDir Icinga Web 2 base directory + * @param string $configDir Path to Icinga Web 2's configuration files */ - protected function __construct($configDir = null) + protected function __construct($baseDir = null, $configDir = null) { + if ($baseDir === null) { + $baseDir = dirname($this->getBootstrapDirectory()); + } + $this->baseDir = $baseDir; + $this->appDir = $baseDir . '/application'; + $this->vendorDir = $baseDir . '/library/vendor'; $this->libDir = realpath(__DIR__ . '/../..'); - if (!defined('ICINGA_LIBDIR')) { - define('ICINGA_LIBDIR', $this->libDir); - } - - if (defined('ICINGAWEB_APPDIR')) { - $this->appDir = ICINGAWEB_APPDIR; - } elseif (array_key_exists('ICINGAWEB_APPDIR', $_SERVER)) { - $this->appDir = $_SERVER['ICINGAWEB_APPDIR']; - } else { - $this->appDir = realpath($this->libDir. '/../application'); - } - - if (!defined('ICINGAWEB_APPDIR')) { - define('ICINGAWEB_APPDIR', $this->appDir); - } - if ($configDir === null) { if (array_key_exists('ICINGAWEB_CONFIGDIR', $_SERVER)) { $configDir = $_SERVER['ICINGAWEB_CONFIGDIR']; @@ -129,7 +139,13 @@ abstract class ApplicationBootstrap $this->configDir = $canonical ? $canonical : $configDir; $this->setupAutoloader(); - $this->setupZendAutoloader(); + + set_include_path( + implode( + PATH_SEPARATOR, + array($this->vendorDir, get_include_path()) + ) + ); Benchmark::measure('Bootstrap, autoloader registered'); @@ -195,44 +211,6 @@ abstract class ApplicationBootstrap return $this->isWeb; } - /** - * Getter for application dir - * - * Optional append sub directory - * - * @param string $subdir optional subdir - * - * @return string - */ - public function getApplicationDir($subdir = null) - { - return $this->getDirWithSubDir($this->appDir, $subdir); - } - - /** - * Getter for config dir - * - * @param string $subdir - * - * @return string - */ - public function getConfigDir($subdir = null) - { - return $this->getDirWithSubDir($this->configDir, $subdir); - } - - /** - * Get the path to the bootstrapping directory. - * - * This is usually /public for Web and EmbeddedWeb - * - * @return string - */ - public function getBootstrapDirecory() - { - return dirname($_SERVER['SCRIPT_FILENAME']); - } - /** * Helper to glue directories together * @@ -251,15 +229,102 @@ abstract class ApplicationBootstrap } /** - * Starting concrete bootstrap classes + * Get the base directory * - * @param string $configDir + * @param string $subDir Optional sub directory to get * - * @return ApplicationBootstrap + * @return string */ - public static function start($configDir = null) + public function getBaseDir($subDir = null) { - $application = new static($configDir); + return $this->getDirWithSubDir($this->baseDir, $subDir); + } + + /** + * Get the application directory + * + * @param string $subDir Optional sub directory to get + * + * @return string + */ + public function getApplicationDir($subDir = null) + { + return $this->getDirWithSubDir($this->appDir, $subDir); + } + + /** + * Get the vendor library directory + * + * @param string $subDir Optional sub directory to get + * + * @return string + */ + public function getVendorDir($subDir = null) + { + return $this->getDirWithSubDir($this->vendorDir, $subDir); + } + + /** + * Get the configuration directory + * + * @param string $subDir Optional sub directory to get + * + * @return string + */ + public function getConfigDir($subDir = null) + { + return $this->getDirWithSubDir($this->configDir, $subDir); + } + + /** + * Get the Icinga library directory + * + * @param string $subDir Optional sub directory to get + * + * @return string + */ + public function getLibraryDir($subDir = null) + { + return $this->getDirWithSubDir($this->libDir, $subDir); + } + + /** + * Get the path to the bootstrapping directory + * + * This is usually /public for Web and EmbeddedWeb and /bin for the CLI + * + * @return string + * + * @throws LogicException If the base directory can not be detected + */ + public function getBootstrapDirectory() + { + $script = $_SERVER['SCRIPT_FILENAME']; + $canonical = realpath($script); + if ($canonical !== false) { + $dir = dirname($canonical); + } elseif (substr($script, -14) === '/webrouter.php') { + // If Icinga Web 2 is served using PHP's built-in webserver with our webrouter.php script, the $_SERVER + // variable SCRIPT_FILENAME is set to DOCUMENT_ROOT/webrouter.php which is not a valid path to + // realpath but DOCUMENT_ROOT here still is the bootstrapping directory + $dir = dirname($script); + } else { + throw new LogicException('Can\'t detected base directory'); + } + return $dir; + } + + /** + * Start the bootstrap + * + * @param string $baseDir Icinga Web 2 base directory + * @param string $configDir Path to Icinga Web 2's configuration files + * + * @return static + */ + public static function start($baseDir = null, $configDir = null) + { + $application = new static($baseDir, $configDir); $application->bootstrap(); return $application; } @@ -283,7 +348,7 @@ abstract class ApplicationBootstrap /** * Register the Zend Autoloader * - * @return self + * @return $this */ protected function setupZendAutoloader() { @@ -291,17 +356,12 @@ abstract class ApplicationBootstrap \Zend_Loader_Autoloader::getInstance(); - // Unfortunately this is needed to get the Zend Plugin loader working: - set_include_path( - implode( - PATH_SEPARATOR, - array($this->libDir, get_include_path()) - ) + \Zend_Paginator::addScrollingStylePrefixPath( + 'Icinga_Web_Paginator_ScrollingStyle_', $this->libDir . '/Icinga/Web/Paginator/ScrollingStyle' ); return $this; } - /** * Setup module manager * @@ -312,11 +372,26 @@ abstract class ApplicationBootstrap $this->moduleManager = new ModuleManager( $this, $this->configDir . '/enabledModules', - explode(':', $this->config->fromSection('global', 'modulePath', ICINGAWEB_APPDIR . '/../modules')) + explode(':', $this->config->fromSection('global', 'modulePath', $this->baseDir . '/modules')) ); return $this; } + /** + * Load all core modules + * + * @return self + */ + protected function loadCoreModules() + { + try { + $this->moduleManager->loadCoreModules(); + } catch (NotReadableError $e) { + Logger::error(new IcingaException('Cannot load core modules. An exception was thrown:', $e)); + } + return $this; + } + /** * Load all enabled modules * @@ -357,12 +432,14 @@ abstract class ApplicationBootstrap protected function loadConfig() { Config::$configDir = $this->configDir; + try { $this->config = Config::app(); } catch (NotReadableError $e) { Logger::error(new IcingaException('Cannot load application configuration. An exception was thrown:', $e)); $this->config = new Config(); } + return $this; } @@ -382,6 +459,7 @@ abstract class ApplicationBootstrap return false; // Continue with the normal error handler } switch($errno) { + case E_NOTICE: case E_WARNING: case E_STRICT: throw new ErrorException($errstr, 0, $errno, $errfile, $errline); @@ -398,7 +476,7 @@ abstract class ApplicationBootstrap */ protected function setupLogger() { - if (($loggingConfig = $this->config->get('logging')) !== null) { + if (($loggingConfig = $this->config->logging) !== null) { try { Logger::create($loggingConfig); } catch (ConfigurationError $e) { @@ -428,42 +506,62 @@ abstract class ApplicationBootstrap } /** - * Setup default timezone + * Detect the timezone * - * @return self - * @throws ConfigurationError if the timezone in config.ini isn't valid + * @return null|string */ - protected function setupTimezone() + protected function detectTimezone() { - $default = @date_default_timezone_get(); - if (! $default) { - $default = 'UTC'; + return null; + } + + /** + * Set up the timezone + * + * @return $this + */ + protected final function setupTimezone() + { + $timezone = $this->detectTimeZone(); + if ($timezone === null || @date_default_timezone_set($timezone) === false) { + $timezone = @date_default_timezone_get(); + if ($timezone === false) { + $timezone = 'UTC'; + date_default_timezone_set($timezone); + } } - $timeZoneString = $this->config->fromSection('global', 'timezone', $default); - date_default_timezone_set($timeZoneString); - DateTimeFactory::setConfig(array('timezone' => $timeZoneString)); + DateTimeFactory::setConfig(array('timezone' => $timezone)); return $this; } /** - * Setup internationalization using gettext + * Detect the locale * - * Uses the preferred language sent by the browser or the default one - * - * @return self + * @return null|string */ - protected function setupInternationalization() + protected function detectLocale() + { + return null; + } + + /** + * Set up internationalization using gettext + * + * @return $this + */ + protected final function setupInternationalization() { if ($this->hasLocales()) { Translator::registerDomain(Translator::DEFAULT_DOMAIN, $this->getLocaleDir()); } + $locale = $this->detectLocale(); + if ($locale === null) { + $locale = Translator::DEFAULT_LOCALE; + } + try { - Translator::setupLocale( - isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) - ? Translator::getPreferredLocaleCode($_SERVER['HTTP_ACCEPT_LANGUAGE']) - : Translator::DEFAULT_LOCALE - ); + Translator::setupLocale($locale); } catch (Exception $error) { Logger::error($error); } diff --git a/library/Icinga/Application/Cli.php b/library/Icinga/Application/Cli.php index 740623d9d..9f14b6c20 100644 --- a/library/Icinga/Application/Cli.php +++ b/library/Icinga/Application/Cli.php @@ -43,7 +43,8 @@ class Cli extends ApplicationBootstrap ->parseBasicParams() ->setupLogger() ->setupResourceFactory() - ->setupModuleManager(); + ->setupModuleManager() + ->loadCoreModules(); } protected function setupLogging() @@ -52,8 +53,7 @@ class Cli extends ApplicationBootstrap new Config( array( 'level' => Logger::INFO, - 'log' => 'file', - 'file' => 'php://stderr' + 'log' => 'stdout', ) ) ); diff --git a/library/Icinga/Application/EmbeddedWeb.php b/library/Icinga/Application/EmbeddedWeb.php index 6a160017c..23cb365f0 100644 --- a/library/Icinga/Application/EmbeddedWeb.php +++ b/library/Icinga/Application/EmbeddedWeb.php @@ -27,7 +27,9 @@ class EmbeddedWeb extends ApplicationBootstrap */ protected function bootstrap() { - return $this->loadConfig() + return $this + ->setupZendAutoloader() + ->loadConfig() ->setupErrorHandling() ->setupTimezone() ->setupModuleManager() diff --git a/library/Icinga/Application/Logger/LogWriter.php b/library/Icinga/Application/Logger/LogWriter.php index c18e51257..831c96fe8 100644 --- a/library/Icinga/Application/Logger/LogWriter.php +++ b/library/Icinga/Application/Logger/LogWriter.php @@ -11,10 +11,18 @@ use Icinga\Application\Config; */ abstract class LogWriter { + /** + * @var Zend_Config + */ + protected $config; + /** * Create a new log writer initialized with the given configuration */ - abstract public function __construct(Config $config); + public function __construct(Config $config) + { + $this->config = $config; + } /** * Log a message with the given severity diff --git a/library/Icinga/Application/Logger/Writer/StdoutWriter.php b/library/Icinga/Application/Logger/Writer/StdoutWriter.php new file mode 100644 index 000000000..1fe929d92 --- /dev/null +++ b/library/Icinga/Application/Logger/Writer/StdoutWriter.php @@ -0,0 +1,50 @@ +screen === null) { + $this->screen = Screen::instance(); + } + return $this->screen; + } + + /** + * Log a message with the given severity + * + * @param int $severity The severity to use + * @param string $message The message to log + */ + public function log($severity, $message) + { + $color = 'black'; + switch ($severity) { + case Logger::$ERROR: + $color = 'red'; + break; + case Logger::$WARNING: + $color = 'orange'; + break; + case Logger::$INFO: + $color = 'green'; + break; + case Logger::$DEBUG: + $color = 'blue'; + break; + } + file_put_contents('php://stderr', $this->screen()->colorize($message, $color) . "\n"); + } +} diff --git a/library/Icinga/Application/Modules/Manager.php b/library/Icinga/Application/Modules/Manager.php index db6f0e527..8857bf2d2 100644 --- a/library/Icinga/Application/Modules/Manager.php +++ b/library/Icinga/Application/Modules/Manager.php @@ -67,6 +67,18 @@ class Manager */ private $modulePaths = array(); + /** + * The core modules + * + * Core modules do not need to be enabled to load and cannot be disabled + * by the user. This must not be writable programmatically! + * + * @var array + */ + private $coreModules = array( + 'setup' + ); + /** * Create a new instance of the module manager * @@ -157,7 +169,21 @@ class Manager } /** - * Try to set all enabled modules in loaded sate + * Try to set all core modules in loaded state + * + * @return self + * @see Manager::loadModule() + */ + public function loadCoreModules() + { + foreach ($this->coreModules as $name) { + $this->loadModule($name); + } + return $this; + } + + /** + * Try to set all enabled modules in loaded state * * @return self * @see Manager::loadModule() @@ -211,6 +237,8 @@ class Manager 'Cannot enable module "%s". Module is not installed.', $name ); + } elseif (in_array($name, $this->coreModules)) { + return $this; } clearstatcache(true); @@ -427,7 +455,7 @@ class Manager } $installed = $this->listInstalledModules(); - foreach ($installed as $name) { + foreach (array_diff($installed, $this->coreModules) as $name) { $info[$name] = (object) array( 'name' => $name, 'path' => $this->installedBaseDirs[$name], @@ -487,11 +515,14 @@ class Manager /** * Detect installed modules from every path provided in modulePaths * + * @param array $availableDirs Installed modules location + * * @return self */ - public function detectInstalledModules() + public function detectInstalledModules(array $availableDirs = null) { - foreach ($this->modulePaths as $basedir) { + $modulePaths = $availableDirs !== null ? $availableDirs : $this->modulePaths; + foreach ($modulePaths as $basedir) { $canonical = realpath($basedir); if ($canonical === false) { Logger::warning('Module path "%s" does not exist', $basedir); @@ -528,4 +559,14 @@ class Manager ksort($this->installedBaseDirs); return $this; } + + /** + * Get the directories where to look for installed modules + * + * @return array + */ + public function getModuleDirs() + { + return $this->modulePaths; + } } diff --git a/library/Icinga/Application/Modules/Module.php b/library/Icinga/Application/Modules/Module.php index 7793ef689..443a39e32 100644 --- a/library/Icinga/Application/Modules/Module.php +++ b/library/Icinga/Application/Modules/Module.php @@ -17,6 +17,7 @@ use Icinga\Web\Hook; use Icinga\Web\Menu; use Icinga\Web\Widget; use Icinga\Web\Widget\Dashboard\Pane; +use Icinga\Module\Setup\SetupWizard; use Icinga\Util\File; use Icinga\Exception\ProgrammingError; use Icinga\Exception\IcingaException; @@ -133,6 +134,13 @@ class Module */ private $configTabs = array(); + /** + * Provided setup wizard + * + * @var string + */ + private $setupWizard; + /** * Icinga application * @@ -641,6 +649,31 @@ class Module return $tabs; } + /** + * Whether this module provides a setup wizard + * + * @return bool + */ + public function providesSetupWizard() + { + $this->launchConfigScript(); + if (class_exists($this->setupWizard)) { + $wizard = new $this->setupWizard; + return $wizard instanceof SetupWizard; + } + + return false; + } + + /** + * Return this module's setup wizard + * + * @return SetupWizard + */ + public function getSetupWizard() + { + return new $this->setupWizard; + } /** * Provide a named permission @@ -704,6 +737,19 @@ class Module return $this; } + /** + * Provide a setup wizard + * + * @param string $className The name of the class + * + * @return self + */ + protected function provideSetupWizard($className) + { + $this->setupWizard = $className; + return $this; + } + /** * Register new namespaces on the autoloader * @@ -717,7 +763,7 @@ class Module $this->app->getLoader()->registerNamespace('Icinga\\Module\\' . $moduleName, $moduleLibraryDir); if (is_dir($this->getFormDir())) { $this->app->getLoader()->registerNamespace( - 'Icinga\\Module\\' . $moduleName. '\\Form', + 'Icinga\\Module\\' . $moduleName. '\\Forms', $this->getFormDir() ); } diff --git a/library/Icinga/Application/Platform.php b/library/Icinga/Application/Platform.php index 1ca738741..259219435 100644 --- a/library/Icinga/Application/Platform.php +++ b/library/Icinga/Application/Platform.php @@ -30,6 +30,16 @@ class Platform */ protected static $fqdn; + /** + * Return the operating system's name + * + * @return string + */ + public static function getOperatingSystemName() + { + return php_uname('s'); + } + /** * Test of windows * @@ -37,7 +47,7 @@ class Platform */ public static function isWindows() { - return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + return strtoupper(substr(self::getOperatingSystemName(), 0, 3)) === 'WIN'; } /** @@ -47,7 +57,7 @@ class Platform */ public static function isLinux() { - return strtoupper(substr(PHP_OS, 0, 5)) === 'LINUX'; + return strtoupper(substr(self::getOperatingSystemName(), 0, 5)) === 'LINUX'; } /** @@ -116,7 +126,35 @@ class Platform if (substr(self::$fqdn, 0, strlen(self::$hostname)) === self::$hostname) { self::$domain = substr(self::$fqdn, strlen(self::$hostname) + 1); } else { - self::$domain = array_shift(preg_split('~\.~', self::$hostname, 2)); + $parts = preg_split('~\.~', self::$hostname, 2); + self::$domain = array_shift($parts); + } + } + + /** + * Return the version of PHP + * + * @return string + */ + public static function getPhpVersion() + { + return phpversion(); + } + + /** + * Return the username PHP is running as + * + * @return string + */ + public static function getPhpUser() + { + if (static::isWindows()) { + return get_current_user(); // http://php.net/manual/en/function.get-current-user.php#75059 + } + + if (function_exists('posix_geteuid')) { + $userInfo = posix_getpwuid(posix_geteuid()); + return $userInfo['name']; } } @@ -131,4 +169,32 @@ class Platform { return extension_loaded($extensionName); } + + /** + * Return the value for the given PHP configuration option + * + * @param string $option The option name for which to return the value + * + * @return string|false + */ + public static function getPhpConfig($option) + { + return ini_get($option); + } + + /** + * Return whether the given Zend framework class exists + * + * @param string $name The name of the class to check + * + * @return bool + */ + public static function zendClassExists($name) + { + if (class_exists($name)) { + return true; + } + + return (@include str_replace('_', '/', $name) . '.php') !== false; + } } diff --git a/library/Icinga/Application/Web.php b/library/Icinga/Application/Web.php index d43b1d34d..f227df247 100644 --- a/library/Icinga/Application/Web.php +++ b/library/Icinga/Application/Web.php @@ -7,6 +7,7 @@ namespace Icinga\Application; require_once __DIR__ . '/ApplicationBootstrap.php'; use Icinga\Authentication\Manager as AuthenticationManager; +use Icinga\Authentication\Manager; use Icinga\Exception\ConfigurationError; use Icinga\Exception\NotReadableError; use Icinga\Application\Logger; @@ -14,6 +15,8 @@ use Icinga\Util\TimezoneDetect; use Icinga\Web\Request; use Icinga\Web\Response; use Icinga\Web\View; +use Icinga\Web\Session\Session as BaseSession; +use Icinga\Web\Session; use Icinga\User; use Icinga\Util\Translator; use Icinga\Util\DateTimeFactory; @@ -58,6 +61,13 @@ class Web extends ApplicationBootstrap */ private $request; + /** + * Session object + * + * @var BaseSession + */ + private $session; + /** * User object * @@ -80,10 +90,12 @@ class Web extends ApplicationBootstrap protected function bootstrap() { return $this + ->setupZendAutoloader() ->setupLogging() ->setupErrorHandling() ->loadConfig() ->setupResourceFactory() + ->setupSession() ->setupUser() ->setupTimezone() ->setupLogger() @@ -92,6 +104,7 @@ class Web extends ApplicationBootstrap ->setupZendMvc() ->setupFormNamespace() ->setupModuleManager() + ->loadCoreModules() ->loadEnabledModules() ->setupRoute() ->setupPagination(); @@ -163,6 +176,7 @@ class Web extends ApplicationBootstrap $this->setupFrontController(); $this->setupViewRenderer(); + return $this; } @@ -182,6 +196,17 @@ class Web extends ApplicationBootstrap return $this; } + /** + * Initialize a session provider + * + * @return self + */ + private function setupSession() + { + $this->session = Session::create(); + return $this; + } + /** * Inject dependencies into request * @@ -267,29 +292,19 @@ class Web extends ApplicationBootstrap } /** - * Setup user timezone if set and valid, otherwise global default timezone - * - * @return self - * @see ApplicationBootstrap::setupTimezone + * (non-PHPDoc) + * @see ApplicationBootstrap::detectTimezone() For the method documentation. */ - protected function setupTimezone() + protected function detectTimezone() { - $userTimezone = null; - - if ($this->user !== null && $this->user->getPreferences() !== null) { + $auth = Manager::getInstance(); + if (! $auth->isAuthenticated() + || ($timezone = $auth->getUser()->getPreferences()->getValue('icingaweb', 'timezone')) === null + ) { $detect = new TimezoneDetect(); - $userTimezone = $this->user->getPreferences() - ->getValue('icingaweb', 'timezone', $detect->getTimezoneName()); + $timezone = $detect->getTimezoneName(); } - - try { - DateTimeFactory::setConfig(array('timezone' => $userTimezone)); - date_default_timezone_set($userTimezone); - } catch (ConfigurationError $e) { - return parent::setupTimezone(); - } - - return $this; + return $timezone; } /** @@ -299,35 +314,30 @@ class Web extends ApplicationBootstrap * * @return self */ - protected function setupInternationalization() + protected function detectLocale() { - parent::setupInternationalization(); - if ($this->user !== null && $this->user->getPreferences() !== null - && (($locale = $this->user->getPreferences()->getValue('icingaweb', 'language')) !== null) + $auth = Manager::getInstance(); + if (! $auth->isAuthenticated() + || ($locale = $auth->getUser()->getPreferences()->getValue('icingaweb', 'language')) === null + && isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ) { - try { - Translator::setupLocale($locale); - } catch (Exception $error) { - Logger::warning( - 'Cannot set locale "' . $locale . '" configured in ' . - 'preferences of user "' . $this->user->getUsername() . '"' - ); - } + $locale = Translator::getPreferredLocaleCode($_SERVER['HTTP_ACCEPT_LANGUAGE']); } - return $this; + return $locale; } /** - * Setup an autoloader namespace for Icinga\Form + * Setup an autoloader namespace for Icinga\Forms * * @return self */ private function setupFormNamespace() { $this->getLoader()->registerNamespace( - 'Icinga\\Form', + 'Icinga\\Forms', $this->getApplicationDir('forms') ); return $this; } } +// @codeCoverageIgnoreEnd diff --git a/library/Icinga/Authentication/Backend/AutoLoginBackend.php b/library/Icinga/Authentication/Backend/AutoLoginBackend.php index 8d38d9c15..990797088 100644 --- a/library/Icinga/Authentication/Backend/AutoLoginBackend.php +++ b/library/Icinga/Authentication/Backend/AutoLoginBackend.php @@ -54,7 +54,7 @@ class AutoLoginBackend extends UserBackend if (isset($_SERVER['REMOTE_USER'])) { $username = $_SERVER['REMOTE_USER']; $user->setRemoteUserInformation($username, 'REMOTE_USER'); - if ($this->stripUsernameRegexp !== null) { + if ($this->stripUsernameRegexp) { $stripped = preg_replace($this->stripUsernameRegexp, '', $username); if ($stripped !== false) { // TODO(el): PHP issues a warning when PHP cannot compile the regular expression. Should we log an diff --git a/library/Icinga/Authentication/Backend/DbUserBackend.php b/library/Icinga/Authentication/Backend/DbUserBackend.php index a89a07c81..d2d0147e5 100644 --- a/library/Icinga/Authentication/Backend/DbUserBackend.php +++ b/library/Icinga/Authentication/Backend/DbUserBackend.php @@ -4,6 +4,7 @@ namespace Icinga\Authentication\Backend; +use PDO; use Icinga\Authentication\UserBackend; use Icinga\Data\Db\DbConnection; use Icinga\User; @@ -11,16 +12,29 @@ use Icinga\Exception\AuthenticationException; use Exception; use Zend_Db_Expr; use Zend_Db_Select; -use Icinga\Exception\IcingaException; class DbUserBackend extends UserBackend { + /** + * The algorithm to use when hashing passwords + * + * @var string + */ + const HASH_ALGORITHM = '$1$'; // MD5 + + /** + * The length of the salt to use when hashing a password + * + * @var int + */ + const SALT_LENGTH = 12; // 12 is required by MD5 + /** * Connection to the database * * @var DbConnection */ - private $conn; + protected $conn; public function __construct(DbConnection $conn) { @@ -36,45 +50,69 @@ class DbUserBackend extends UserBackend */ public function hasUser(User $user) { - $select = new Zend_Db_Select($this->conn->getConnection()); - $row = $select->from('account', array(new Zend_Db_Expr(1))) - ->where('username = ?', $user->getUsername()) + $select = new Zend_Db_Select($this->conn->getDbAdapter()); + $row = $select->from('icingaweb_user', array(new Zend_Db_Expr(1))) + ->where('name = ?', $user->getUsername()) ->query()->fetchObject(); return ($row !== false) ? true : false; } /** - * Authenticate the given user and return true on success, false on failure and null on error + * Add a new user + * + * @param string $username The name of the new user + * @param string $password The new user's password + * @param bool $active Whether the user is active + */ + public function addUser($username, $password, $active = true) + { + $passwordHash = $this->hashPassword($password); + + $stmt = $this->conn->getDbAdapter()->prepare( + 'INSERT INTO icingaweb_user VALUES (:name, :active, :password_hash, now(), DEFAULT);' + ); + $stmt->bindParam(':name', $username, PDO::PARAM_STR); + $stmt->bindParam(':active', $active, PDO::PARAM_INT); + $stmt->bindParam(':password_hash', $passwordHash, PDO::PARAM_LOB); + $stmt->execute(); + } + + /** + * Fetch the hashed password for the given user + * + * @param string $username The name of the user + * + * @return string + */ + protected function getPasswordHash($username) + { + $stmt = $this->conn->getDbAdapter()->prepare( + 'SELECT password_hash FROM icingaweb_user WHERE name = :name AND active = 1' + ); + $stmt->execute(array(':name' => $username)); + $stmt->bindColumn(1, $lob, PDO::PARAM_LOB); + $stmt->fetch(PDO::FETCH_BOUND); + return is_resource($lob) ? stream_get_contents($lob) : $lob; + } + + /** + * Authenticate the given user and return true on success, false on failure and throw an exception on error * * @param User $user * @param string $password * - * @return bool|null + * @return bool + * * @throws AuthenticationException */ public function authenticate(User $user, $password) { try { - $salt = $this->getSalt($user->getUsername()); - if ($salt === null) { - return false; - } - if ($salt === '') { - throw new IcingaException( - 'Cannot find salt for user %s', - $user->getUsername() - ); - } - - $select = new Zend_Db_Select($this->conn->getConnection()); - $row = $select->from('account', array(new Zend_Db_Expr(1))) - ->where('username = ?', $user->getUsername()) - ->where('active = ?', true) - ->where('password = ?', $this->hashPassword($password, $salt)) - ->query()->fetchObject(); - - return ($row !== false) ? true : false; + $passwordHash = $this->getPasswordHash($user->getUsername()); + $passwordSalt = $this->getSalt($passwordHash); + $hashToCompare = $this->hashPassword($password, $passwordSalt); + return $hashToCompare === $passwordHash; } catch (Exception $e) { throw new AuthenticationException( 'Failed to authenticate user "%s" against backend "%s". An exception was thrown:', @@ -86,29 +124,40 @@ class DbUserBackend extends UserBackend } /** - * Get salt by username + * Extract salt from the given password hash * - * @param string $username + * @param string $hash The hashed password * - * @return string|null + * @return string */ - private function getSalt($username) + protected function getSalt($hash) { - $select = new Zend_Db_Select($this->conn->getConnection()); - $row = $select->from('account', array('salt'))->where('username = ?', $username)->query()->fetchObject(); - return ($row !== false) ? $row->salt : null; + return substr($hash, strlen(self::HASH_ALGORITHM), self::SALT_LENGTH); + } + + /** + * Return a random salt + * + * The returned salt is safe to be used for hashing a user's password + * + * @return string + */ + protected function generateSalt() + { + return openssl_random_pseudo_bytes(self::SALT_LENGTH); } /** * Hash a password * - * @param string $password - * @param string $salt + * @param string $password + * @param string $salt * * @return string */ - private function hashPassword($password, $salt) { - return hash_hmac('sha256', $password, $salt); + protected function hashPassword($password, $salt = null) + { + return crypt($password, self::HASH_ALGORITHM . ($salt !== null ? $salt : $this->generateSalt())); } /** @@ -118,12 +167,29 @@ class DbUserBackend extends UserBackend */ public function count() { - $select = new Zend_Db_Select($this->conn->getConnection()); + $select = new Zend_Db_Select($this->conn->getDbAdapter()); $row = $select->from( - 'account', + 'icingaweb_user', array('count' => 'COUNT(*)') )->query()->fetchObject(); return ($row !== false) ? $row->count : 0; } + + /** + * Return the names of all available users + * + * @return array + */ + public function listUsers() + { + $query = $this->conn->select()->from('icingaweb_user', array('name')); + + $users = array(); + foreach ($query->fetchAll() as $row) { + $users[] = $row->name; + } + + return $users; + } } diff --git a/library/Icinga/Authentication/Backend/LdapUserBackend.php b/library/Icinga/Authentication/Backend/LdapUserBackend.php index 97ca24aa0..519dd3c48 100644 --- a/library/Icinga/Authentication/Backend/LdapUserBackend.php +++ b/library/Icinga/Authentication/Backend/LdapUserBackend.php @@ -4,7 +4,6 @@ namespace Icinga\Authentication\Backend; -use Icinga\Application\Logger; use Icinga\User; use Icinga\Authentication\UserBackend; use Icinga\Protocol\Ldap\Connection; @@ -20,20 +19,36 @@ class LdapUserBackend extends UserBackend **/ protected $conn; + protected $baseDn; + protected $userClass; protected $userNameAttribute; protected $groupOptions; - public function __construct(Connection $conn, $userClass, $userNameAttribute, $groupOptions = null) + public function __construct(Connection $conn, $userClass, $userNameAttribute, $baseDn, $groupOptions = null) { $this->conn = $conn; + $this->baseDn = trim($baseDn) !== '' ? $baseDn : $conn->getDN(); $this->userClass = $userClass; $this->userNameAttribute = $userNameAttribute; $this->groupOptions = $groupOptions; } + /** + * @return \Icinga\Protocol\Ldap\Query + */ + protected function selectUsers() + { + return $this->conn->select()->setBase($this->baseDn)->from( + $this->userClass, + array( + $this->userNameAttribute + ) + ); + } + /** * Create query * @@ -41,14 +56,9 @@ class LdapUserBackend extends UserBackend * * @return \Icinga\Protocol\Ldap\Query **/ - protected function createQuery($username) + protected function selectUser($username) { - return $this->conn->select() - ->from( - $this->userClass, - array($this->userNameAttribute) - ) - ->where( + return $this->selectUsers()->where( $this->userNameAttribute, str_replace('*', '', $username) ); @@ -69,7 +79,7 @@ class LdapUserBackend extends UserBackend public function assertAuthenticationPossible() { try { - $q = $this->conn->select()->from($this->userClass); + $q = $this->conn->select()->setBase($this->baseDn)->from($this->userClass); $result = $q->fetchRow(); } catch (LdapException $e) { throw new AuthenticationException('Connection not possible.', $e); @@ -79,7 +89,7 @@ class LdapUserBackend extends UserBackend throw new AuthenticationException( 'No objects with objectClass="%s" in DN="%s" found.', $this->userClass, - $this->conn->getDN() + $this->baseDn ); } @@ -99,12 +109,12 @@ class LdapUserBackend extends UserBackend * * @param string $dn * - * @return array|null + * @return array */ public function getGroups($dn) { if (empty($this->groupOptions) || ! isset($this->groupOptions['group_base_dn'])) { - return null; + return array(); } $q = $this->conn->select() @@ -140,7 +150,7 @@ class LdapUserBackend extends UserBackend public function hasUser(User $user) { $username = $user->getUsername(); - return $this->conn->fetchOne($this->createQuery($username)) === $username; + return $this->conn->fetchOne($this->selectUser($username)) === $username; } /** @@ -173,7 +183,7 @@ class LdapUserBackend extends UserBackend return false; } try { - $userDn = $this->conn->fetchDN($this->createQuery($user->getUsername())); + $userDn = $this->conn->fetchDN($this->selectUser($user->getUsername())); $authenticated = $this->conn->testCredentials( $userDn, $password @@ -203,14 +213,20 @@ class LdapUserBackend extends UserBackend */ public function count() { + return $this->conn->count($this->selectUsers()); + } - return $this->conn->count( - $this->conn->select()->from( - $this->userClass, - array( - $this->userNameAttribute - ) - ) - ); + /** + * Return the names of all available users + * + * @return array + */ + public function listUsers() + { + $users = array(); + foreach ($this->selectUsers()->fetchAll() as $row) { + $users[] = $row->{$this->userNameAttribute}; + } + return $users; } } diff --git a/library/Icinga/Authentication/Manager.php b/library/Icinga/Authentication/Manager.php index ac83529ed..64d5f5336 100644 --- a/library/Icinga/Authentication/Manager.php +++ b/library/Icinga/Authentication/Manager.php @@ -119,10 +119,7 @@ class Manager */ public function persistCurrentUser() { - $session = Session::getSession(); - $session->set('user', $this->user); - $session->write(); - $session->refreshId(); + Session::getSession()->set('user', $this->user)->refreshId(); } /** diff --git a/library/Icinga/Authentication/UserBackend.php b/library/Icinga/Authentication/UserBackend.php index ee3d1d5b6..494ada4aa 100644 --- a/library/Icinga/Authentication/UserBackend.php +++ b/library/Icinga/Authentication/UserBackend.php @@ -103,6 +103,7 @@ abstract class UserBackend implements Countable $resource, $backendConfig->get('user_class', 'user'), $backendConfig->get('user_name_attribute', 'sAMAccountName'), + $backendConfig->get('base_dn', $resource->getDN()), $groupOptions ); break; @@ -129,6 +130,7 @@ abstract class UserBackend implements Countable $resource, $backendConfig->user_class, $backendConfig->user_name_attribute, + $backendConfig->get('base_dn', $resource->getDN()), $groupOptions ); break; diff --git a/library/Icinga/Cli/Loader.php b/library/Icinga/Cli/Loader.php index 11ca2b70b..655ef7c18 100644 --- a/library/Icinga/Cli/Loader.php +++ b/library/Icinga/Cli/Loader.php @@ -66,7 +66,7 @@ class Loader public function __construct(App $app) { $this->app = $app; - $this->coreAppDir = ICINGAWEB_APPDIR . '/clicommands'; + $this->coreAppDir = $app->getApplicationDir('clicommands'); } /** diff --git a/library/Icinga/Data/Db/DbConnection.php b/library/Icinga/Data/Db/DbConnection.php index 5fb08730e..82686893d 100644 --- a/library/Icinga/Data/Db/DbConnection.php +++ b/library/Icinga/Data/Db/DbConnection.php @@ -216,7 +216,10 @@ class DbConnection implements Selectable */ public function fetchRow(DbQuery $query) { - return $this->dbAdapter->fetchRow($query->getSelectQuery()); + Benchmark::measure('DB is fetching row'); + $result = $this->dbAdapter->fetchRow($query->getSelectQuery()); + Benchmark::measure('DB row done'); + return $result; } /** diff --git a/library/Icinga/Data/Db/DbQuery.php b/library/Icinga/Data/Db/DbQuery.php index 94765d98f..5062c8caf 100644 --- a/library/Icinga/Data/Db/DbQuery.php +++ b/library/Icinga/Data/Db/DbQuery.php @@ -72,6 +72,12 @@ class DbQuery extends SimpleQuery parent::init(); } + public function setUseSubqueryCount($useSubqueryCount = true) + { + $this->useSubqueryCount = $useSubqueryCount; + return $this; + } + public function where($condition, $value = null) { // $this->count = $this->select = null; @@ -259,11 +265,13 @@ class DbQuery extends SimpleQuery */ public function getCountQuery() { - // TODO: there may be situations where we should clone the "select" + // TODO: there may be situations where we should clone the "select" $count = $this->dbSelect(); - + if ($this->group) { + $count->group($this->group); + } $this->applyFilterSql($count); - if ($this->useSubqueryCount) { + if ($this->useSubqueryCount || $this->group) { $count->columns($this->columns); $columns = array('cnt' => 'COUNT(*)'); return $this->db->select()->from($count, $columns); diff --git a/library/Icinga/Data/Filter/Filter.php b/library/Icinga/Data/Filter/Filter.php index e979d1b23..5793a4749 100644 --- a/library/Icinga/Data/Filter/Filter.php +++ b/library/Icinga/Data/Filter/Filter.php @@ -22,7 +22,17 @@ abstract class Filter return $this; } - abstract function toQueryString(); + abstract public function isExpression(); + + abstract public function isChain(); + + abstract public function isEmpty(); + + abstract public function toQueryString(); + + abstract public function andFilter(Filter $filter); + + abstract public function orFilter(Filter $filter); public function getUrlParams() { @@ -81,7 +91,7 @@ abstract class Filter } } - krsort($operators, SORT_NATURAL); + krsort($operators, version_compare(PHP_VERSION, '5.4.0') >= 0 ? SORT_NATURAL : SORT_REGULAR); foreach ($operators as $id => $operator) { $f = $filter->getById($id); if ($f->getOperatorName() !== $operator) { @@ -98,7 +108,7 @@ abstract class Filter public function getParentId() { - if ($self->isRootNode()) { + if ($this->isRootNode()) { throw new ProgrammingError('Filter root nodes have no parent'); } return substr($this->id, 0, strrpos($this->id, '-')); diff --git a/library/Icinga/Data/Filter/FilterAnd.php b/library/Icinga/Data/Filter/FilterAnd.php index 899f488ce..8fd2f2411 100644 --- a/library/Icinga/Data/Filter/FilterAnd.php +++ b/library/Icinga/Data/Filter/FilterAnd.php @@ -30,4 +30,14 @@ class FilterAnd extends FilterChain } return true; } + + public function andFilter(Filter $filter) + { + return $this->addFilter($filter); + } + + public function orFilter(Filter $filter) + { + return Filter::matchAny($this, $filter); + } } diff --git a/library/Icinga/Data/Filter/FilterChain.php b/library/Icinga/Data/Filter/FilterChain.php index 980341fad..cdb3a1123 100644 --- a/library/Icinga/Data/Filter/FilterChain.php +++ b/library/Icinga/Data/Filter/FilterChain.php @@ -180,6 +180,16 @@ abstract class FilterChain extends Filter } } + public function isExpression() + { + return false; + } + + public function isChain() + { + return true; + } + public function isEmpty() { return empty($this->filters); @@ -188,7 +198,8 @@ abstract class FilterChain extends Filter public function addFilter(Filter $filter) { $this->filters[] = $filter; - $filter->setId($this->getId() . '-' . (count($this->filters))); + $filter->setId($this->getId() . '-' . $this->count()); + return $this; } public function &filters() @@ -196,6 +207,11 @@ abstract class FilterChain extends Filter return $this->filters; } + public function count() + { + return count($this->filters); + } + public function __clone() { foreach ($this->filters as & $filter) { diff --git a/library/Icinga/Data/Filter/FilterExpression.php b/library/Icinga/Data/Filter/FilterExpression.php index 1b88551eb..0782bcd89 100644 --- a/library/Icinga/Data/Filter/FilterExpression.php +++ b/library/Icinga/Data/Filter/FilterExpression.php @@ -19,6 +19,16 @@ class FilterExpression extends Filter $this->expression = $expression; } + public function isExpression() + { + return true; + } + + public function isChain() + { + return false; + } + public function isEmpty() { return false; @@ -102,4 +112,14 @@ class FilterExpression extends Filter return (bool) preg_match($pattern, $row->{$this->column}); } } + + public function andFilter(Filter $filter) + { + return Filter::matchAll($this, $filter); + } + + public function orFilter(Filter $filter) + { + return Filter::matchAny($this, $filter); + } } diff --git a/library/Icinga/Data/Filter/FilterNot.php b/library/Icinga/Data/Filter/FilterNot.php index a49a7ab3d..5e63691f1 100644 --- a/library/Icinga/Data/Filter/FilterNot.php +++ b/library/Icinga/Data/Filter/FilterNot.php @@ -22,6 +22,16 @@ class FilterNot extends FilterChain return true; } + public function andFilter(Filter $filter) + { + return Filter::matchAll($this, $filter); + } + + public function orFilter(Filter $filter) + { + return Filter::matchAny($filter); + } + public function toQueryString() { $parts = array(); diff --git a/library/Icinga/Data/Filter/FilterOr.php b/library/Icinga/Data/Filter/FilterOr.php index 427c17fd2..8291d32dc 100644 --- a/library/Icinga/Data/Filter/FilterOr.php +++ b/library/Icinga/Data/Filter/FilterOr.php @@ -19,4 +19,22 @@ class FilterOr extends FilterChain } return false; } + + public function setOperatorName($name) + { + if ($this->count() > 1 && $name === 'NOT') { + return Filter::not(clone $this); + } + return parent::setOperatorName($name); + } + + public function andFilter(Filter $filter) + { + return Filter::matchAll($this, $filter); + } + + public function orFilter(Filter $filter) + { + return $this->addFilter($filter); + } } diff --git a/library/Icinga/Data/PivotTable.php b/library/Icinga/Data/PivotTable.php index ab6fab13d..0a1f009fe 100644 --- a/library/Icinga/Data/PivotTable.php +++ b/library/Icinga/Data/PivotTable.php @@ -69,11 +69,13 @@ class PivotTable protected function prepareQueries() { $this->xAxisQuery = clone $this->baseQuery; - $this->xAxisQuery->distinct(); + $this->xAxisQuery->group($this->xAxisColumn); $this->xAxisQuery->columns(array($this->xAxisColumn)); + $this->xAxisQuery->setUseSubqueryCount(); $this->yAxisQuery = clone $this->baseQuery; - $this->yAxisQuery->distinct(); + $this->yAxisQuery->group($this->yAxisColumn); $this->yAxisQuery->columns(array($this->yAxisColumn)); + $this->yAxisQuery->setUseSubqueryCount(); return $this; } @@ -85,24 +87,14 @@ class PivotTable */ protected function adjustSorting() { - $currentOrderColumns = $this->baseQuery->getOrder(); - $xAxisOrderColumns = array(array($this->baseQuery->getMappedField($this->xAxisColumn), SimpleQuery::SORT_ASC)); - $yAxisOrderColumns = array(array($this->baseQuery->getMappedField($this->yAxisColumn), SimpleQuery::SORT_ASC)); - - foreach ($currentOrderColumns as $orderInfo) { - if ($orderInfo[0] === $xAxisOrderColumns[0][0]) { - $xAxisOrderColumns[0] = $orderInfo; - } elseif ($orderInfo[0] === $yAxisOrderColumns[0][0]) { - $yAxisOrderColumns[0] = $orderInfo; - } else { - $xAxisOrderColumns[] = $orderInfo; - $yAxisOrderColumns[] = $orderInfo; - } + if (false === $this->xAxisQuery->hasOrder($this->xAxisColumn)) { + $this->xAxisQuery->order($this->xAxisColumn, 'ASC'); } -//TODO: simplify this whole function. No need to care about mapping -// foreach ($xAxisOrderColumns as -// $this->xAxisQuery->setOrder($xAxisOrderColumns); -// $this->yAxisQuery->setOrder($yAxisOrderColumns); + + if (false === $this->yAxisQuery->hasOrder($this->yAxisColumn)) { + $this->yAxisQuery->order($this->yAxisColumn, 'ASC'); + } + return $this; } diff --git a/library/Icinga/File/Ini/IniWriter.php b/library/Icinga/File/Ini/IniWriter.php index c9b4b3c20..cf9355b56 100644 --- a/library/Icinga/File/Ini/IniWriter.php +++ b/library/Icinga/File/Ini/IniWriter.php @@ -6,6 +6,7 @@ namespace Icinga\File\Ini; use Zend_Config; use Zend_Config_Ini; +use Zend_Config_Exception; use Zend_Config_Writer_FileAbstract; use Icinga\Application\Config; @@ -21,11 +22,18 @@ class IniWriter extends Zend_Config_Writer_FileAbstract */ protected $options; + /** + * The mode to set on new files + * + * @var int + */ + public static $fileMode = 0664; + /** * Create a new INI writer * - * @param array $options Supports all options of Zend_Config_Writer and additional - * options for the internal IniEditor: + * @param array $options Supports all options of Zend_Config_Writer and additional options: + * * filemode: The mode to set on new files * * valueIndentation: The indentation level of the values * * commentIndentation: The indentation level of the comments * * sectionSeparators: The amount of newlines between sections @@ -58,12 +66,36 @@ class IniWriter extends Zend_Config_Writer_FileAbstract } $newconfig = $this->_config; - $editor = new IniEditor(file_get_contents($this->_filename), $this->options); + $editor = new IniEditor(@file_get_contents($this->_filename), $this->options); $this->diffConfigs($oldconfig, $newconfig, $editor); $this->updateSectionOrder($newconfig, $editor); return $editor->getText(); } + /** + * Write configuration to file and set file mode in case it does not exist yet + * + * @param string $filename + * @param Zend_Config $config + * @param bool $exclusiveLock + */ + public function write($filename = null, Zend_Config $config = null, $exclusiveLock = null) + { + $filePath = $filename !== null ? $filename : $this->_filename; + $setMode = false === file_exists($filePath); + + parent::write($filename, $config, $exclusiveLock); + + if ($setMode) { + $mode = isset($this->options['filemode']) ? $this->options['filemode'] : static::$fileMode; + $old = umask(0); // Make sure that the mode we're going to set doesn't get mangled + if (is_int($mode) && false === @chmod($filePath, $mode)) { + throw new Zend_Config_Exception(sprintf('Failed to set file mode "%o" on file "%s"', $mode, $filePath)); + } + umask($old); + } + } + /** * Create a property diff and apply the changes to the editor * diff --git a/library/Icinga/File/Pdf.php b/library/Icinga/File/Pdf.php index 2e8a97887..44d1a107a 100644 --- a/library/Icinga/File/Pdf.php +++ b/library/Icinga/File/Pdf.php @@ -13,9 +13,8 @@ use Icinga\Web\StyleSheet; use Icinga\Web\Url; use Icinga\Exception\ProgrammingError; -require_once 'IcingaVendor/dompdf/dompdf_config.inc.php'; - -spl_autoload_register('DOMPDF_autoload'); +require_once 'dompdf/dompdf_config.inc.php'; +require_once 'dompdf/include/autoload.inc.php'; class Pdf extends DOMPDF { @@ -49,7 +48,7 @@ class Pdf extends DOMPDF $layout->content = $controller->getResponse(); $html = $layout->render(); $imgDir = Url::fromPath('img'); - $html = preg_replace('~src="' . $imgDir . '/~', 'src="' . Icinga::app()->getBootstrapDirecory() . '/img/', $html); + $html = preg_replace('~src="' . $imgDir . '/~', 'src="' . Icinga::app()->getBootstrapDirectory() . '/img/', $html); $html = preg_replace('~src="/svg/chart.php(.*)"~', 'class="icon" src="http://master1.com/png/chart.php$1"', $html); $this->load_html($html); $this->render(); diff --git a/library/Icinga/Protocol/Dns.php b/library/Icinga/Protocol/Dns.php index 92e8b2a4d..950c22f44 100644 --- a/library/Icinga/Protocol/Dns.php +++ b/library/Icinga/Protocol/Dns.php @@ -9,7 +9,6 @@ namespace Icinga\Protocol; */ class Dns { - /** * Discover all service records on a given domain * @@ -17,21 +16,12 @@ class Dns * @param string $service The type of the service, like for example 'ldaps' or 'ldap' * @param string $protocol The transport protocol used by the service, defaults to 'tcp' * - * @return array|null An array of all service domains + * @return array An array of all found service records */ public static function getSrvRecords($domain, $service, $protocol = 'tcp') { $records = dns_get_record('_' . $service . '._' . $protocol . '.' . $domain, DNS_SRV); - if ($records === false) { - return null; - } - $targets = array(); - foreach ($records as $record) { - if (array_key_exists('target', $record)) { - $targets[] = $record['target']; - } - } - return $targets; + return $records === false ? array() : $records; } /** diff --git a/library/Icinga/User/Preferences/Store/DbStore.php b/library/Icinga/User/Preferences/Store/DbStore.php index 5ef4a5b6e..4d7b10584 100644 --- a/library/Icinga/User/Preferences/Store/DbStore.php +++ b/library/Icinga/User/Preferences/Store/DbStore.php @@ -9,6 +9,7 @@ use Icinga\Exception\NotReadableError; use Icinga\Exception\NotWritableError; use Icinga\User\Preferences; use Icinga\User\Preferences\PreferencesStore; +use Zend_Db_Expr; /** * Load and save user preferences by using a database @@ -20,22 +21,37 @@ class DbStore extends PreferencesStore */ const COLUMN_USERNAME = 'username'; + /** + * Column name for section + */ + const COLUMN_SECTION = 'section'; + /** * Column name for preference */ - const COLUMN_PREFERENCE = 'key'; + const COLUMN_PREFERENCE = 'name'; /** * Column name for value */ const COLUMN_VALUE = 'value'; + /** + * Column name for created time + */ + const COLUMN_CREATED_TIME = 'ctime'; + + /** + * Column name for modified time + */ + const COLUMN_MODIFIED_TIME = 'mtime'; + /** * Table name * * @var string */ - protected $table = 'preference'; + protected $table = 'icingaweb_user_preference'; /** * Stored preferences @@ -74,7 +90,7 @@ class DbStore extends PreferencesStore try { $select = $this->getStoreConfig()->connection->getDbAdapter()->select(); $result = $select - ->from($this->table, array(self::COLUMN_PREFERENCE, self::COLUMN_VALUE)) + ->from($this->table, array(self::COLUMN_SECTION, self::COLUMN_PREFERENCE, self::COLUMN_VALUE)) ->where(self::COLUMN_USERNAME . ' = ?', $this->getUser()->getUsername()) ->query() ->fetchAll(); @@ -89,7 +105,7 @@ class DbStore extends PreferencesStore if ($result !== false) { $values = array(); foreach ($result as $row) { - $values[$row->{self::COLUMN_PREFERENCE}] = $row->{self::COLUMN_VALUE}; + $values[$row->{self::COLUMN_SECTION}][$row->{self::COLUMN_PREFERENCE}] = $row->{self::COLUMN_VALUE}; } $this->preferences = $values; } @@ -106,22 +122,32 @@ class DbStore extends PreferencesStore { $preferences = $preferences->toArray(); - $toBeInserted = array_diff_key($preferences, $this->preferences); - if (!empty($toBeInserted)) { - $this->insert($toBeInserted); - } + $sections = array_keys($preferences); - $toBeUpdated = array_intersect_key( - array_diff_assoc($preferences, $this->preferences), - array_diff_assoc($this->preferences, $preferences) - ); - if (!empty($toBeUpdated)) { - $this->update($toBeUpdated); - } + foreach ($sections as $section) { + if (! array_key_exists($section, $this->preferences)) { + $this->preferences[$section] = array(); + } + if (! array_key_exists($section, $preferences)) { + $preferences[$section] = array(); + } + $toBeInserted = array_diff_key($preferences[$section], $this->preferences[$section]); + if (!empty($toBeInserted)) { + $this->insert($toBeInserted, $section); + } - $toBeDeleted = array_keys(array_diff_key($this->preferences, $preferences)); - if (!empty($toBeDeleted)) { - $this->delete($toBeDeleted); + $toBeUpdated = array_intersect_key( + array_diff_assoc($preferences[$section], $this->preferences[$section]), + array_diff_assoc($this->preferences[$section], $preferences[$section]) + ); + if (!empty($toBeUpdated)) { + $this->update($toBeUpdated, $section); + } + + $toBeDeleted = array_keys(array_diff_key($this->preferences[$section], $preferences[$section])); + if (!empty($toBeDeleted)) { + $this->delete($toBeDeleted, $section); + } } } @@ -129,11 +155,13 @@ class DbStore extends PreferencesStore * Insert the given preferences into the database * * @param array $preferences The preferences to insert + * @param string $section The preferences in section to update * * @throws NotWritableError In case the database operation failed */ - protected function insert(array $preferences) + protected function insert(array $preferences, $section) { + /** @var \Zend_Db_Adapter_Abstract $db */ $db = $this->getStoreConfig()->connection->getDbAdapter(); try { @@ -142,8 +170,11 @@ class DbStore extends PreferencesStore $this->table, array( self::COLUMN_USERNAME => $this->getUser()->getUsername(), + $db->quoteIdentifier(self::COLUMN_SECTION) => $section, $db->quoteIdentifier(self::COLUMN_PREFERENCE) => $key, - self::COLUMN_VALUE => $value + self::COLUMN_VALUE => $value, + self::COLUMN_CREATED_TIME => new Zend_Db_Expr('NOW()'), + self::COLUMN_MODIFIED_TIME => new Zend_Db_Expr('NOW()') ) ); } @@ -160,11 +191,13 @@ class DbStore extends PreferencesStore * Update the given preferences in the database * * @param array $preferences The preferences to update + * @param string $section The preferences in section to update * * @throws NotWritableError In case the database operation failed */ - protected function update(array $preferences) + protected function update(array $preferences, $section) { + /** @var \Zend_Db_Adapter_Abstract $db */ $db = $this->getStoreConfig()->connection->getDbAdapter(); try { @@ -174,7 +207,9 @@ class DbStore extends PreferencesStore array(self::COLUMN_VALUE => $value), array( self::COLUMN_USERNAME . '=?' => $this->getUser()->getUsername(), - $db->quoteIdentifier(self::COLUMN_PREFERENCE) . '=?' => $key + $db->quoteIdentifier(self::COLUMN_SECTION) . '=?' => $section, + $db->quoteIdentifier(self::COLUMN_PREFERENCE) . '=?' => $key, + self::COLUMN_MODIFIED_TIME => new Zend_Db_Expr('NOW()') ) ); } @@ -191,11 +226,13 @@ class DbStore extends PreferencesStore * Delete the given preference names from the database * * @param array $preferenceKeys The preference names to delete + * @param string $section The preferences in section to update * * @throws NotWritableError In case the database operation failed */ - protected function delete(array $preferenceKeys) + protected function delete(array $preferenceKeys, $section) { + /** @var \Zend_Db_Adapter_Abstract $db */ $db = $this->getStoreConfig()->connection->getDbAdapter(); try { @@ -203,6 +240,7 @@ class DbStore extends PreferencesStore $this->table, array( self::COLUMN_USERNAME . '=?' => $this->getUser()->getUsername(), + $db->quoteIdentifier(self::COLUMN_SECTION) . '=?' => $section, $db->quoteIdentifier(self::COLUMN_PREFERENCE) . ' IN (?)' => $preferenceKeys ) ); diff --git a/library/Icinga/User/Preferences/Store/IniStore.php b/library/Icinga/User/Preferences/Store/IniStore.php index c668b0bc0..b765efe52 100644 --- a/library/Icinga/User/Preferences/Store/IniStore.php +++ b/library/Icinga/User/Preferences/Store/IniStore.php @@ -67,7 +67,7 @@ class IniStore extends PreferencesStore $this->getUser()->getUsername() ); } else { - $this->preferences = parse_ini_file($this->preferencesFile); + $this->preferences = parse_ini_file($this->preferencesFile, true); } } @@ -81,9 +81,13 @@ class IniStore extends PreferencesStore */ public function save(Preferences $preferences) { - $preferences = $preferences->toArray(); - $this->update(array_diff_assoc($preferences, $this->preferences)); - $this->delete(array_keys(array_diff_key($this->preferences, $preferences))); + $this->preferences = $preferences->toArray(); + + // TODO: Elaborate whether we need to patch the contents + // $preferences = $preferences->toArray(); + // $this->update(array_diff_assoc($preferences, $this->preferences)); + // $this->delete(array_keys(array_diff_key($this->preferences, $preferences))); + $this->write(); } diff --git a/library/Icinga/Util/Translator.php b/library/Icinga/Util/Translator.php index 755203474..52a84bd62 100644 --- a/library/Icinga/Util/Translator.php +++ b/library/Icinga/Util/Translator.php @@ -224,6 +224,7 @@ class Translator } } } + sort($codes); return $codes; } diff --git a/library/Icinga/Web/Controller.php b/library/Icinga/Web/Controller.php new file mode 100644 index 000000000..111ee244c --- /dev/null +++ b/library/Icinga/Web/Controller.php @@ -0,0 +1,14 @@ +getResponse()->setHeader('X-Icinga-Reload-Css', 'now'); } + $this->shutdownSession(); + $this->getResponse() ->setHeader('X-Icinga-Redirect', rawurlencode($url->getAbsoluteUrl())) ->sendHeaders(); - // TODO: Session shutdown? exit; } + protected function redirectHttp($url) + { + if (! $url instanceof Url) { + $url = Url::fromPath($url); + } + $this->shutdownSession(); + $this->_helper->Redirector->gotoUrlAndExit($url->getRelativeUrl()); + } + /** * Redirect to a specific url, updating the browsers URL field * @@ -343,10 +351,7 @@ class ActionController extends Zend_Controller_Action if ($this->isXhr()) { $this->redirectXhr($url); } else { - if (! $url instanceof Url) { - $url = Url::fromPath($url); - } - $this->_helper->Redirector->gotoUrlAndExit($url->getRelativeUrl()); + $this->redirectHttp($url); } } @@ -374,6 +379,7 @@ class ActionController extends Zend_Controller_Action if ($req->getParam('format') === 'pdf') { $layout->setLayout('pdf'); + $this->shutdownSession(); $this->sendAsPdf(); exit; } @@ -381,6 +387,8 @@ class ActionController extends Zend_Controller_Action if ($this->isXhr()) { $this->postDispatchXhr(); } + + $this->shutdownSession(); } protected function postDispatchXhr() @@ -420,7 +428,7 @@ class ActionController extends Zend_Controller_Action } if ($this->autorefreshInterval !== null) { - $resp->setHeader('X-Icinga-Refresh', $this->autorefreshInterval); + // $resp->setHeader('X-Icinga-Refresh', $this->autorefreshInterval); } } @@ -430,6 +438,14 @@ class ActionController extends Zend_Controller_Action $pdf->renderControllerAction($this); } + protected function shutdownSession() + { + $session = Session::getSession(); + if ($session->hasChanged()) { + $session->write(); + } + } + /** * Render the benchmark * diff --git a/library/Icinga/Web/Form.php b/library/Icinga/Web/Form.php index 631b2eb07..20484c33e 100644 --- a/library/Icinga/Web/Form.php +++ b/library/Icinga/Web/Form.php @@ -11,6 +11,7 @@ use Zend_View_Interface; use Icinga\Application\Icinga; use Icinga\Web\Form\Decorator\NoScriptApply; use Icinga\Web\Form\Element\CsrfCounterMeasure; +use Icinga\Web\Form\FormElement; /** * Base class for forms providing CSRF protection, confirmation logic and auto submission @@ -36,6 +37,13 @@ class Form extends Zend_Form */ protected $created = false; + /** + * The request associated with this form + * + * @var Request + */ + protected $request; + /** * The callback to call instead of Form::onSuccess() * @@ -100,18 +108,18 @@ class Form extends Zend_Form * @var array */ public static $defaultElementDecorators = array( - 'ViewHelper', - 'Errors', - array('Description', array('tag' => 'span', 'class' => 'description')), - 'Label', - array('HtmlTag', array('tag' => 'div')) + array('ViewHelper', array('separator' => '')), + array('Errors', array('separator' => '')), + array('Description', array('tag' => 'span', 'class' => 'description', 'separator' => '')), + array('Label', array('separator' => '')), + array('HtmlTag', array('tag' => 'div', 'class' => 'element')) ); /** * Create a new form * * Accepts an additional option `onSuccess' which is a callback that is called instead of this - * form's method. It is called using the following signature: (Request $request, Form $form). + * form's method. It is called using the following signature: (Form $form). * * @see Zend_Form::__construct() * @@ -355,11 +363,9 @@ class Form extends Zend_Form * * Intended to be implemented by concrete form classes. The base implementation returns always FALSE. * - * @param Request $request The valid request used to process this form - * * @return null|bool Return FALSE in case no redirect should take place */ - public function onSuccess(Request $request) + public function onSuccess() { return false; } @@ -368,10 +374,8 @@ class Form extends Zend_Form * Perform actions when no form dependent data was sent * * Intended to be implemented by concrete form classes. - * - * @param Request $request The current request */ - public function onRequest(Request $request) + public function onRequest() { } @@ -437,8 +441,8 @@ class Form extends Zend_Form * `disableLoadDefaultDecorators' option to any other value than `true'. For loading custom element decorators use * the 'decorators' option. * - * @param string $type String element type - * @param string $name The name of the element to add + * @param string $type The type of the element + * @param string $name The name of the element * @param mixed $options The options for the element * * @return Zend_Form_Element @@ -460,10 +464,20 @@ class Form extends Zend_Form $options = array('decorators' => static::$defaultElementDecorators); } - $el = parent::createElement($type, $name, $options); + if (($el = $this->createIcingaFormElement($type, $name, $options)) === null) { + $el = parent::createElement($type, $name, $options); + } if ($el && $el->getAttrib('autosubmit')) { - $el->addDecorator(new NoScriptApply()); // Non-JS environments + $noScript = new NoScriptApply(); // Non-JS environments + $decorators = $el->getDecorators(); + $pos = array_search('Zend_Form_Decorator_ViewHelper', array_keys($decorators)) + 1; + $el->setDecorators( + array_slice($decorators, 0, $pos, true) + + array(get_class($noScript) => $noScript) + + array_slice($decorators, $pos, count($decorators) - $pos, true) + ); + $class = $el->getAttrib('class'); if (is_array($class)) { $class[] = 'autosubmit'; @@ -473,6 +487,7 @@ class Form extends Zend_Form $class .= ' autosubmit'; } $el->setAttrib('class', $class); // JS environments + unset($el->autosubmit); } @@ -540,15 +555,17 @@ class Form extends Zend_Form { if ($request === null) { $request = $this->getRequest(); + } else { + $this->request = $request; } - $formData = $this->getRequestData($request); + $formData = $this->getRequestData(); if ($this->getUidDisabled() || $this->wasSent($formData)) { $this->populate($formData); // Necessary to get isSubmitted() to work if (! $this->getSubmitLabel() || $this->isSubmitted()) { if ($this->isValid($formData) - && (($this->onSuccess !== null && false !== call_user_func($this->onSuccess, $request, $this)) - || ($this->onSuccess === null && false !== $this->onSuccess($request)))) { + && (($this->onSuccess !== null && false !== call_user_func($this->onSuccess, $this)) + || ($this->onSuccess === null && false !== $this->onSuccess()))) { $this->getResponse()->redirectAndExit($this->getRedirectUrl()); } } else { @@ -556,7 +573,7 @@ class Form extends Zend_Form $this->isValidPartial($formData); } } else { - $this->onRequest($request); + $this->onRequest(); } return $request; @@ -682,29 +699,19 @@ class Form extends Zend_Form } /** - * Return the request data based on this form's request method + * Return the request associated with this form * - * @param Request $request The request to fetch the data from - * - * @return array - */ - public function getRequestData(Request $request) - { - if (strtolower($request->getMethod()) === $this->getMethod()) { - return $request->{'get' . ($request->isPost() ? 'Post' : 'Query')}(); - } - - return array(); - } - - /** - * Return the current request + * Returns the global request if none has been set for this form yet. * * @return Request */ public function getRequest() { - return Icinga::app()->getFrontController()->getRequest(); + if ($this->request === null) { + $this->request = Icinga::app()->getFrontController()->getRequest(); + } + + return $this->request; } /** @@ -717,6 +724,39 @@ class Form extends Zend_Form return Icinga::app()->getFrontController()->getResponse(); } + /** + * Return the request data based on this form's request method + * + * @return array + */ + protected function getRequestData() + { + if (strtolower($this->request->getMethod()) === $this->getMethod()) { + return $this->request->{'get' . ($this->request->isPost() ? 'Post' : 'Query')}(); + } + + return array(); + } + + /** + * Create a new element located in the Icinga Web 2 library + * + * @param string $type The type of the element + * @param string $name The name of the element + * @param mixed $options The options for the element + * + * @return NULL|FormElement NULL in case the element is not found in the Icinga Web 2 library + * + * @see Form::$defaultElementDecorators For Icinga Web 2's default element decorators. + */ + protected function createIcingaFormElement($type, $name, $options = null) + { + $className = 'Icinga\\Web\\Form\\Element\\' . ucfirst($type); + if (class_exists($className)) { + return new $className($name, $options); + } + } + /** * Render this form * diff --git a/library/Icinga/Web/Form/Decorator/ElementDoubler.php b/library/Icinga/Web/Form/Decorator/ElementDoubler.php new file mode 100644 index 000000000..8bedf9492 --- /dev/null +++ b/library/Icinga/Web/Form/Decorator/ElementDoubler.php @@ -0,0 +1,64 @@ +getElement(); + if ($group->getElement($this->getOption('condition')) !== null) { + if ($this->getPlacement() === static::APPEND) { + return $content . $this->applyAttributes($group->getElement($this->getOption('double')))->render(); + } else { // $this->getPlacement() === static::PREPEND + return $this->applyAttributes($group->getElement($this->getOption('double')))->render() . $content; + } + } + + return $content; + } + + /** + * Apply all element attributes + * + * @param Zend_Form_Element $element The element to apply the attributes to + * + * @return Zend_Form_Element + */ + protected function applyAttributes(Zend_Form_Element $element) + { + $attributes = $this->getOption('attributes'); + if ($attributes !== null) { + foreach ($attributes as $name => $value) { + $element->setAttrib($name, $value); + } + } + + return $element; + } +} diff --git a/library/Icinga/Web/Form/Element/Button.php b/library/Icinga/Web/Form/Element/Button.php new file mode 100644 index 000000000..1c5499373 --- /dev/null +++ b/library/Icinga/Web/Form/Element/Button.php @@ -0,0 +1,81 @@ + $options); + } + + if (!isset($options['ignore'])) { + $options['ignore'] = true; + } + + parent::__construct($spec, $options); + + if ($label = $this->getLabel()) { + // Necessary to get the label shown on the generated HTML + $this->content = $label; + } + } + + /** + * Validate element value (pseudo) + * + * There is no need to reset the value + * + * @param mixed $value Is always ignored + * @param mixed $context Is always ignored + * + * @return bool Returns always TRUE + */ + public function isValid($value, $context = null) + { + return true; + } + + /** + * Has this button been selected? + * + * @return bool + */ + public function isChecked() + { + return $this->getRequest()->getParam($this->getName()) === $this->getValue(); + } + + /** + * Return the current request + * + * @return Request + */ + protected function getRequest() + { + return Icinga::app()->getFrontController()->getRequest(); + } +} diff --git a/library/Icinga/Web/Form/Element/Note.php b/library/Icinga/Web/Form/Element/Note.php index 78881ab44..37bc127e9 100644 --- a/library/Icinga/Web/Form/Element/Note.php +++ b/library/Icinga/Web/Form/Element/Note.php @@ -4,13 +4,12 @@ namespace Icinga\Web\Form\Element; -use Zend_Form_Element; -use Icinga\Web\Form; +use Icinga\Web\Form\FormElement; /** * A note */ -class Note extends Zend_Form_Element +class Note extends FormElement { /** * Form view helper to use for rendering @@ -32,7 +31,15 @@ class Note extends Zend_Form_Element */ public function init() { - $this->setDecorators(Form::$defaultElementDecorators); + if (count($this->getDecorators()) === 0) { + $this->setDecorators(array( + 'ViewHelper', + array( + 'HtmlTag', + array('tag' => 'p') + ) + )); + } } /** diff --git a/library/Icinga/Web/JavaScript.php b/library/Icinga/Web/JavaScript.php index 6224b5b82..9fa687042 100644 --- a/library/Icinga/Web/JavaScript.php +++ b/library/Icinga/Web/JavaScript.php @@ -67,7 +67,7 @@ class JavaScript public static function send($minified = false) { header('Content-Type: application/javascript'); - $basedir = Icinga::app()->getBootstrapDirecory(); + $basedir = Icinga::app()->getBootstrapDirectory(); $js = $out = ''; $min = $minified ? '.min' : ''; @@ -118,7 +118,7 @@ class JavaScript } if ($minified) { - require_once 'IcingaVendor/JShrink/Minifier.php'; + require_once 'JShrink/Minifier.php'; $out .= Minifier::minify($js, array('flaggedComments' => false)); } else { $out .= $js; diff --git a/library/Icinga/Web/LessCompiler.php b/library/Icinga/Web/LessCompiler.php index 16514cf6d..791fdbab0 100644 --- a/library/Icinga/Web/LessCompiler.php +++ b/library/Icinga/Web/LessCompiler.php @@ -41,7 +41,7 @@ class LessCompiler */ public function __construct() { - require_once 'IcingaVendor/lessphp/lessc.inc.php'; + require_once 'lessphp/lessc.inc.php'; $this->lessc = new lessc(); $this->lessc->setVariables( diff --git a/library/Icinga/Web/Menu.php b/library/Icinga/Web/Menu.php index 4cd660116..4eae7525b 100644 --- a/library/Icinga/Web/Menu.php +++ b/library/Icinga/Web/Menu.php @@ -4,6 +4,7 @@ namespace Icinga\Web; +use Icinga\Authentication\Manager; use Icinga\Web\Menu\MenuItemRenderer; use RecursiveIterator; use Icinga\Application\Config; @@ -200,41 +201,50 @@ class Menu implements RecursiveIterator */ protected function addMainMenuItems() { - $this->add(t('Dashboard'), array( - 'url' => 'dashboard', - 'icon' => 'img/icons/dashboard.png', - 'priority' => 10 - )); + $auth = Manager::getInstance(); - $section = $this->add(t('System'), array( - 'icon' => 'img/icons/configuration.png', - 'priority' => 200 - )); - $section->add(t('Preferences'), array( - 'url' => 'preference', - 'priority' => 200 - )); - $section->add(t('Configuration'), array( - 'url' => 'config', - 'priority' => 300 - )); - $section->add(t('Modules'), array( - 'url' => 'config/modules', - 'priority' => 400 - )); + if ($auth->isAuthenticated()) { - if (Logger::writesToFile()) { - $section->add(t('Application Log'), array( - 'url' => 'list/applicationlog', - 'priority' => 500 + $this->add(t('Dashboard'), array( + 'url' => 'dashboard', + 'icon' => 'dashboard', + 'priority' => 10 + )); + + $section = $this->add(t('System'), array( + 'icon' => 'conf-alt', + 'priority' => 200 + )); + $section->add(t('Configuration'), array( + 'url' => 'config', + 'priority' => 300 + )); + $section->add(t('Modules'), array( + 'url' => 'config/modules', + 'priority' => 400 + )); + + if (Logger::writesToFile()) { + $section->add(t('Application Log'), array( + 'url' => 'list/applicationlog', + 'priority' => 500 + )); + } + + $section = $this->add($auth->getUser()->getUsername(), array( + 'icon' => 'user', + 'priority' => 600 + )); + $section->add(t('Preferences'), array( + 'url' => 'preference', + 'priority' => 601 + )); + + $section->add(t('Logout'), array( + 'url' => 'authentication/logout', + 'priority' => 700 )); } - - $this->add(t('Logout'), array( - 'url' => 'authentication/logout', - 'icon' => 'img/icons/logout.png', - 'priority' => 300 - )); } /** diff --git a/library/Icinga/Web/Menu/MonitoringMenuItemRenderer.php b/library/Icinga/Web/Menu/MonitoringMenuItemRenderer.php new file mode 100644 index 000000000..6493497af --- /dev/null +++ b/library/Icinga/Web/Menu/MonitoringMenuItemRenderer.php @@ -0,0 +1,100 @@ +select()->from( + 'statusSummary', + array( + 'hosts_down_unhandled', + 'services_critical_unhandled' + ) + )->getQuery()->fetchRow(); + } + + if ($column === null) { + return self::$summary; + } elseif (isset(self::$summary->$column)) { + return self::$summary->$column; + } else { + return null; + } + } + + protected function getBadgeTitle() + { + $translations = array( + 'hosts_down_unhandled' => mt('monitoring', '%d unhandled hosts down'), + 'services_critical_unhandled' => mt('monitoring', '%d unhandled services critical') + ); + + $titles = array(); + $sum = $this->summary(); + + foreach ($this->columns as $col) { + if (isset($sum->$col) && $sum->$col > 0) { + $titles[] = sprintf($translations[$col], $sum->$col); + } + } + + return implode(', ', $titles); + } + + protected function countItems() + { + $sum = self::summary(); + $count = 0; + + foreach ($this->columns as $col) { + if (isset($sum->$col)) { + $count += $sum->$col; + } + } + + return $count; + } + + public function render(Menu $menu) + { + $count = $this->countItems(); + $badge = ''; + if ($count) { + $badge = sprintf( + '
%s
', + $this->getBadgeTitle(), + $count + ); + } + if ($menu->getIcon() && strpos($menu->getIcon(), '.') === false) { + return sprintf( + '%s%s', + $menu->getUrl() ?: '#', + $menu->getIcon(), + htmlspecialchars($menu->getTitle()), + $badge + ); + } + + return sprintf( + '%s%s%s', + $menu->getUrl() ?: '#', + $menu->getIcon() ? ' ' : '', + htmlspecialchars($menu->getTitle()), + $badge + ); + } +} diff --git a/library/Icinga/Web/Menu/ProblemMenuItemRenderer.php b/library/Icinga/Web/Menu/ProblemMenuItemRenderer.php index 1254033ae..58689547f 100644 --- a/library/Icinga/Web/Menu/ProblemMenuItemRenderer.php +++ b/library/Icinga/Web/Menu/ProblemMenuItemRenderer.php @@ -1,39 +1,11 @@ select()->from( - 'statusSummary', - array( - 'hosts_down_unhandled', - 'services_critical_unhandled' - ) - )->getQuery()->fetchRow(); - $unhandled = $statusSummary->hosts_down_unhandled + $statusSummary->services_critical_unhandled; - $badge = ''; - if ($unhandled) { - $badge = sprintf( - '
%s
', - $unhandled - ); - } - return sprintf( - '%s%s %s', - $menu->getUrl() ?: '#', - $menu->getIcon() ? ' ' : '', - htmlspecialchars($menu->getTitle()), - $badge - ); - } +class ProblemMenuItemRenderer extends MonitoringMenuItemRenderer +{ + protected $columns = array( + 'hosts_down_unhandled', + 'services_critical_unhandled' + ); } diff --git a/library/Icinga/Web/Menu/UnhandledHostMenuItemRenderer.php b/library/Icinga/Web/Menu/UnhandledHostMenuItemRenderer.php index c7e6036fb..10a75c00f 100644 --- a/library/Icinga/Web/Menu/UnhandledHostMenuItemRenderer.php +++ b/library/Icinga/Web/Menu/UnhandledHostMenuItemRenderer.php @@ -1,38 +1,12 @@ select()->from( - 'statusSummary', - array( - 'hosts_down_unhandled' - ) - )->getQuery()->fetchRow(); - $badge = ''; - if ($statusSummary->hosts_down_unhandled) { - $badge = sprintf( - '
%s
', - t(sprintf('%d unhandled host problems', $statusSummary->hosts_down_unhandled)), - $statusSummary->hosts_down_unhandled - ); - } - return sprintf( - '%s%s %s', - $menu->getUrl() ?: '#', - $menu->getIcon() ? ' ' : '', - htmlspecialchars($menu->getTitle()), - $badge - ); - } +class UnhandledHostMenuItemRenderer extends MonitoringMenuItemRenderer +{ + protected $columns = array( + 'hosts_down_unhandled', + ); } diff --git a/library/Icinga/Web/Menu/UnhandledServiceMenuItemRenderer.php b/library/Icinga/Web/Menu/UnhandledServiceMenuItemRenderer.php index b677a4935..8a59e9baa 100644 --- a/library/Icinga/Web/Menu/UnhandledServiceMenuItemRenderer.php +++ b/library/Icinga/Web/Menu/UnhandledServiceMenuItemRenderer.php @@ -1,38 +1,12 @@ select()->from( - 'statusSummary', - array( - 'services_critical_unhandled' - ) - )->getQuery()->fetchRow(); - $badge = ''; - if ($statusSummary->services_critical_unhandled) { - $badge = sprintf( - '
%s
', - t(sprintf('%d unhandled service problems', $statusSummary->services_critical_unhandled)), - $statusSummary->services_critical_unhandled - ); - } - return sprintf( - '%s%s %s', - $menu->getUrl() ?: '#', - $menu->getIcon() ? ' ' : '', - htmlspecialchars($menu->getTitle()), - $badge - ); - } +class UnhandledServiceMenuItemRenderer extends MonitoringMenuItemRenderer +{ + protected $columns = array( + 'services_critical_unhandled' + ); } diff --git a/library/Icinga/Web/MenuRenderer.php b/library/Icinga/Web/MenuRenderer.php index bbd5c208d..8502e5215 100644 --- a/library/Icinga/Web/MenuRenderer.php +++ b/library/Icinga/Web/MenuRenderer.php @@ -114,6 +114,14 @@ class MenuRenderer extends RecursiveIteratorIterator Logger::error('Could not invoke custom renderer. Exception: '. $e->getMessage()); } } + if ($child->getIcon() && strpos($child->getIcon(), '.') === false) { + return sprintf( + '%s', + $child->getUrl() ?: '#', + $child->getIcon(), + htmlspecialchars($child->getTitle()) + ); + } return sprintf( '%s%s', $child->getUrl() ?: '#', diff --git a/library/Icinga/Web/Notification.php b/library/Icinga/Web/Notification.php index c85dbcc13..b046476b3 100644 --- a/library/Icinga/Web/Notification.php +++ b/library/Icinga/Web/Notification.php @@ -75,35 +75,28 @@ class Notification return; } - $mo = (object) array( + $messages = & Session::getSession()->getByRef('messages'); + $messages[] = (object) array( 'type' => $type, 'message' => $message, ); - - // Get, change, set - just to be on the safe side: - $session = Session::getSession(); - $msgs = $session->messages; - $msgs[] = $mo; - $session->messages = $msgs; - $session->write(); } public function hasMessages() { $session = Session::getSession(); - return !empty($session->messages); + return false === empty($session->messages); } public function getMessages() { $session = Session::getSession(); - $msgs = $session->messages; - if (false === empty($msgs)) { + $messages = $session->messages; + if (false === empty($messages)) { $session->messages = array(); - $session->write(); } - return $msgs; + return $messages; } final private function __construct() diff --git a/library/Icinga/Web/Request.php b/library/Icinga/Web/Request.php index 8b09f68fb..ae957f6a9 100644 --- a/library/Icinga/Web/Request.php +++ b/library/Icinga/Web/Request.php @@ -19,6 +19,16 @@ class Request extends Zend_Controller_Request_Http */ private $user; + private $url; + + public function getUrl() + { + if ($this->url === null) { + $this->url = Url::fromRequest($this); + } + return $this->url; + } + /** * Setter for user * diff --git a/library/Icinga/Web/Response.php b/library/Icinga/Web/Response.php index 6ad4f6f87..d0d8912e6 100644 --- a/library/Icinga/Web/Response.php +++ b/library/Icinga/Web/Response.php @@ -21,6 +21,12 @@ class Response extends Zend_Controller_Response_Http } else { $this->setRedirect($url->getAbsoluteUrl()); } + + $session = Session::getSession(); + if ($session->hasChanged()) { + $session->write(); + } + $this->sendHeaders(); exit; } diff --git a/library/Icinga/Web/Session/PhpSession.php b/library/Icinga/Web/Session/PhpSession.php index cb311cc4a..bef978c0b 100644 --- a/library/Icinga/Web/Session/PhpSession.php +++ b/library/Icinga/Web/Session/PhpSession.php @@ -121,7 +121,7 @@ class PhpSession extends Session foreach ($_SESSION as $key => $value) { if (strpos($key, self::NAMESPACE_PREFIX) === 0) { - $namespace = new SessionNamespace($this); + $namespace = new SessionNamespace(); $namespace->setAll($value); $this->namespaces[substr($key, strlen(self::NAMESPACE_PREFIX))] = $namespace; } else { diff --git a/library/Icinga/Web/Session/Session.php b/library/Icinga/Web/Session/Session.php index 0c60d7f98..ab73dcac7 100644 --- a/library/Icinga/Web/Session/Session.php +++ b/library/Icinga/Web/Session/Session.php @@ -75,7 +75,7 @@ abstract class Session extends SessionNamespace unset($this->removedNamespaces[array_search($identifier, $this->removedNamespaces)]); } - $this->namespaces[$identifier] = new SessionNamespace($this); + $this->namespaces[$identifier] = new SessionNamespace(); } return $this->namespaces[$identifier]; @@ -104,13 +104,22 @@ abstract class Session extends SessionNamespace $this->removedNamespaces[] = $identifier; } + /** + * Return whether the session has changed + * + * @return bool + */ + public function hasChanged() + { + return parent::hasChanged() || false === empty($this->namespaces) || false === empty($this->removedNamespaces); + } + /** * Clear all values and namespaces from the session cache */ public function clear() { - $this->values = array(); - $this->removed = array(); + parent::clear(); $this->namespaces = array(); $this->removedNamespaces = array(); } diff --git a/library/Icinga/Web/Session/SessionNamespace.php b/library/Icinga/Web/Session/SessionNamespace.php index b7495683b..c72d69c36 100644 --- a/library/Icinga/Web/Session/SessionNamespace.php +++ b/library/Icinga/Web/Session/SessionNamespace.php @@ -14,13 +14,6 @@ use IteratorAggregate; */ class SessionNamespace implements IteratorAggregate { - /** - * The session this namespace is associated to - * - * @var Session - */ - protected $session; - /** * The actual values stored in this container * @@ -35,16 +28,6 @@ class SessionNamespace implements IteratorAggregate */ protected $removed = array(); - /** - * Create a new session namespace - * - * @param Session $session The session this namespace is associated to - */ - public function __construct(Session $session = null) - { - $this->session = $session; - } - /** * Return an iterator for all values in this namespace * @@ -120,7 +103,18 @@ class SessionNamespace implements IteratorAggregate $this->values[$key] = $value; if (in_array($key, $this->removed)) { - unset($this->removed[array_search($key, $this->values)]); + unset($this->removed[array_search($key, $this->removed)]); + } + + return $this; + } + + public function setByRef($key, &$value) + { + $this->values[$key] = & $value; + + if (in_array($key, $this->removed)) { + unset($this->removed[array_search($key, $this->removed)]); } return $this; @@ -139,6 +133,16 @@ class SessionNamespace implements IteratorAggregate return isset($this->values[$key]) ? $this->values[$key] : $default; } + public function & getByRef($key, $default = null) + { + $value = $default; + if (isset($this->values[$key])) { + $value = & $this->values[$key]; + } + + return $value; + } + /** * Delete the given value from the session * @@ -177,14 +181,21 @@ class SessionNamespace implements IteratorAggregate } /** - * Save the session this namespace is associated to + * Return whether the session namespace has been changed + * + * @return bool */ - public function write() + public function hasChanged() { - if (!$this->session) { - throw new IcingaException('Cannot save, session not set'); - } + return false === empty($this->values) || false === empty($this->removed); + } - $this->session->write(); + /** + * Clear all values from the session namespace + */ + public function clear() + { + $this->values = array(); + $this->removed = array(); } } diff --git a/library/Icinga/Web/StyleSheet.php b/library/Icinga/Web/StyleSheet.php index 3c4baf943..ec926d992 100644 --- a/library/Icinga/Web/StyleSheet.php +++ b/library/Icinga/Web/StyleSheet.php @@ -19,18 +19,21 @@ class StyleSheet 'css/icinga/main-content.less', 'css/icinga/tabs.less', 'css/icinga/forms.less', + 'css/icinga/setup.less', 'css/icinga/widgets.less', 'css/icinga/pagination.less', 'css/icinga/monitoring-colors.less', 'css/icinga/selection-toolbar.less', 'css/icinga/login.less', + '../application/fonts/fontanello-ifont/css/ifont-embedded.css', 'css/vendor/tipsy.css' ); public static function compileForPdf() { + self::checkPhp(); $less = new LessCompiler(); - $basedir = Icinga::app()->getBootstrapDirecory(); + $basedir = Icinga::app()->getBootstrapDirectory(); foreach (self::$lessFiles as $file) { $less->addFile($basedir . '/' . $file); } @@ -53,10 +56,19 @@ class StyleSheet ); } + protected static function checkPhp() + { + // PHP had a rather conservative PCRE backtrack limit unless 5.3.7 + if (version_compare(PHP_VERSION, '5.3.7') <= 0) { + ini_set('pcre.backtrack_limit', 1000000); + } + } + public static function send($minified = false) { + self::checkPhp(); $app = Icinga::app(); - $basedir = $app->getBootstrapDirecory(); + $basedir = $app->getBootstrapDirectory(); foreach (self::$lessFiles as $file) { $lessFiles[] = $basedir . '/' . $file; } diff --git a/library/Icinga/Web/View/helpers/url.php b/library/Icinga/Web/View/helpers/url.php index 935a55a97..901e68803 100644 --- a/library/Icinga/Web/View/helpers/url.php +++ b/library/Icinga/Web/View/helpers/url.php @@ -51,19 +51,32 @@ $this->addHelperFunction('img', function ($url, array $properties = array()) use }); $this->addHelperFunction('icon', function ($img, $title = null, array $properties = array()) use ($view) { - // TODO: join with classes passed in $properties? - $attributes = array( - 'class' => 'icon', - ); - if ($title !== null) { - $attributes['alt'] = $title; - $attributes['title'] = $title; - } + $isClass = strpos($img, '.') === false; + $class = null; - return $view->img( - 'img/icons/' . $img, - array_merge($attributes, $properties) - ); + if ($isClass) { + $class = 'icon-' . $img; + } else { + $class = 'icon'; + } + if ($title !== null) { + $properties['alt'] = $title; + $properties['title'] = $title; + } + + if ($class !== null) { + if (isset($props['class'])) { + $properties['class'] .= ' ' . $class; + } else { + $properties['class'] = $class; + } + } + if ($isClass) { + return sprintf('', $view->propertiesToString($properties)); + + } else { + return $view->img('img/icons/' . $img, $properties); + } }); $this->addHelperFunction('propertiesToString', function ($properties) use ($view) { diff --git a/library/Icinga/Web/Widget/AbstractWidget.php b/library/Icinga/Web/Widget/AbstractWidget.php index fe4d2434d..5b9d8876b 100644 --- a/library/Icinga/Web/Widget/AbstractWidget.php +++ b/library/Icinga/Web/Widget/AbstractWidget.php @@ -34,7 +34,7 @@ abstract class AbstractWidget protected static $view; // TODO: Should we kick this? - protected $properties; + protected $properties = array(); /** * Getter for widget properties diff --git a/library/Icinga/Web/Widget/Chart/InlinePie.php b/library/Icinga/Web/Widget/Chart/InlinePie.php index d22923131..3ff97b2df 100644 --- a/library/Icinga/Web/Widget/Chart/InlinePie.php +++ b/library/Icinga/Web/Widget/Chart/InlinePie.php @@ -73,28 +73,28 @@ EOD; * * @var int The value in px */ - private $width = 28; + private $width = 16; /** * The height of the rendered chart * * @var int The value in px */ - private $height = 28; + private $height = 16; /** * PieChart border width * * @var float */ - private $borderWidth = 0; + private $borderWidth = 1; /** * The color of the border * * @var string */ - private $borderColor = '#888'; + private $borderColor = '#fff'; /** * The title of the chart diff --git a/library/Icinga/Web/Widget/FilterEditor.php b/library/Icinga/Web/Widget/FilterEditor.php index af46a40f2..3721e488c 100644 --- a/library/Icinga/Web/Widget/FilterEditor.php +++ b/library/Icinga/Web/Widget/FilterEditor.php @@ -8,7 +8,9 @@ use Icinga\Data\Filter\Filter; use Icinga\Data\Filter\FilterExpression; use Icinga\Data\Filter\FilterChain; use Icinga\Web\Url; +use Icinga\Application\Icinga; use Icinga\Exception\ProgrammingError; +use Exception; /** * Filter @@ -24,6 +26,16 @@ class FilterEditor extends AbstractWidget protected $query; + protected $url; + + protected $addTo; + + protected $cachedColumnSelect; + + protected $preserveParams = array(); + + protected $ignoreParams = array(); + /** * @var string */ @@ -36,10 +48,200 @@ class FilterEditor extends AbstractWidget */ public function __construct($props) { - $this->filter = $props['filter']; - if (array_key_exists('query', $props)) { - $this->query = $props['query']; + if (array_key_exists('filter', $props)) { + $this->setFilter($props['filter']); } + if (array_key_exists('query', $props)) { + $this->setQuery($props['query']); + } + } + + public function setFilter(Filter $filter) + { + $this->filter = $filter; + return $this; + } + + public function getFilter() + { + if ($this->filter === null) { + $this->filter = Filter::fromQueryString((string) $this->url()->getParams()); + } + return $this->filter; + } + + public function setUrl($url) + { + $this->url = $url; + return $this; + } + + protected function url() + { + if ($this->url === null) { + $this->url = Url::fromRequest(); + } + return $this->url; + } + + public function setQuery($query) + { + $this->query = $query; + return $this; + } + + public function ignoreParams() + { + $this->ignoreParams = func_get_args(); + return $this; + } + + public function preserveParams() + { + $this->preserveParams = func_get_args(); + return $this; + } + + protected function redirectNow($url) + { + $response = Icinga::app()->getFrontController()->getResponse(); + $response->redirectAndExit($url); + } + + protected function mergeRootExpression($filter, $column, $sign, $expression) + { + $found = false; + if ($filter->isChain() && $filter->getOperatorName() === 'AND') { + foreach ($filter->filters() as $f) { + if ($f->isExpression() + && $f->getColumn() === $column + && $f->getSign() === $sign + ) { + $f->setExpression($expression); + $found = true; + break; + } + } + } elseif ($filter->isExpression()) { + if ($filter->getColumn() === $column && $filter->getSign() === $sign) { + $filter->setExpression($expression); + $found = true; + } + } + if (! $found) { + $filter = $filter->andFilter( + Filter::expression($column, $sign, $expression) + ); + } + return $filter; + } + + public function handleRequest($request) + { + $this->setUrl($request->getUrl()->without($this->ignoreParams)); + $params = $this->url()->getParams(); + + $preserve = array(); + foreach ($this->preserveParams as $key) { + if (null !== ($value = $params->shift($key))) { + $preserve[$key] = $value; + } + } + + $add = $params->shift('addFilter'); + $remove = $params->shift('removeFilter'); + $strip = $params->shift('stripFilter'); + $modify = $params->shift('modifyFilter'); + + + + $search = null; + if ($request->isPost()) { + $search = $request->getPost('q'); + } + + if ($search === null) { + $search = $params->shift('q'); + } + + $filter = $this->getFilter(); + + if ($search !== null) { + if (strpos($search, '=') === false) { + // TODO: Ask the view for (multiple) search columns + switch($request->getActionName()) { + case 'services': + $searchCol = 'service_description'; + break; + case 'hosts': + $searchCol = 'host_name'; + break; + case 'hostgroups': + $searchCol = 'hostgroup'; + break; + case 'servicegroups': + $searchCol = 'servicegroup'; + break; + default: + $searchCol = null; + } + + if ($searchCol === null) { + throw new Exception('Cannot search here'); + } + $filter = $this->mergeRootExpression($filter, $searchCol, '=', "*$search*"); + + } else { + list($k, $v) = preg_split('/=/', $search); + $filter = $this->mergeRootExpression($filter, $k, '=', $v); + } + + $url = $this->url()->setQueryString( + $filter->toQueryString() + )->addParams($preserve); + if ($modify) { + $url->getParams()->add('modifyFilter'); + } + $this->redirectNow($url); + } + + if ($remove) { + $redirect = $this->url(); + if ($filter->getById($remove)->isRootNode()) { + $redirect->setQueryString(''); + } else { + $filter->removeId($remove); + $redirect->setQueryString($filter->toQueryString())->getParams()->add('modifyFilter'); + } + $this->redirectNow($redirect->addParams($preserve)); + } + + if ($strip) { + $redirect = $this->url(); + $filter->replaceById($strip, $filter->getById($strip . '-1')); + $redirect->setQueryString($filter->toQueryString())->getParams()->add('modifyFilter'); + $this->redirectNow($redirect->addParams($preserve)); + } + + + if ($modify) { + if ($request->isPost()) { + if ($request->get('cancel') === 'Cancel') { + $this->redirectNow($this->url()->without('modifyFilter')); + } + + $filter = $this->applyChanges($request->getPost()); + $url = $this->url()->setQueryString($filter->toQueryString())->addParams($preserve); + $url->getParams()->add('modifyFilter'); + $this->redirectNow($url); + } + $this->url()->getParams()->add('modifyFilter'); + } + + if ($add) { + $this->addFilterToId($add); + } + return $this; } protected function select($name, $list, $selected, $attributes = null) @@ -50,9 +252,12 @@ class FilterEditor extends AbstractWidget } else { $attributes = $view->propertiesToString($attributes); } - $html = '' . "\n", + $view->escape($name), + $attributes + ); - asort($list); foreach ($list as $k => $v) { $active = ''; if ($k === $selected) { @@ -69,100 +274,169 @@ class FilterEditor extends AbstractWidget return $html; } - public function markIndex($idx) + protected function addFilterToId($id) + { + $this->addTo = $id; + return $this; + } + + protected function removeIndex($idx) { $this->selectedIdx = $idx; return $this; } - public function removeIndex($idx) + protected function removeLink(Filter $filter) { - $this->selectedIdx = $idx; - return $this; + return $this->view()->qlink( + '', + $this->url()->with('removeFilter', $filter->getId()), + null, + array( + 'title' => t('Click to remove this part of your filter'), + 'class' => 'icon-cancel' + ) + ); + } + + protected function addLink(Filter $filter) + { + return $this->view()->qlink( + '', + $this->url()->with('addFilter', $filter->getId()), + null, + array( + 'title' => t('Click to add another filter'), + 'class' => 'icon-plus' + ) + ); + } + + protected function stripLink(Filter $filter) + { + return $this->view()->qlink( + '', + $this->url()->with('stripFilter', $filter->getId()), + null, + array( + 'title' => t('Strip this filter'), + 'class' => 'icon-minus' + ) + ); + } + + protected function cancelLink() + { + return $this->view()->qlink( + '', + $this->url()->without('addFilter'), + null, + array( + 'title' => t('Cancel this operation'), + 'class' => 'icon-cancel' + ) + ); } protected function renderFilter($filter, $level = 0) { - $html = ''; - $url = Url::fromRequest(); - - $view = $this->view(); - $idx = $filter->getId(); - $markUrl = clone($url); - $markUrl->setParam('fIdx', $idx); - - $removeUrl = clone $url; - $removeUrl->setParam('removeFilter', $idx); - $removeLink = ' ' . $view->icon('remove.png') . ''; - - /* - // Temporarilly removed, not implemented yet - $addUrl = clone($url); - $addUrl->setParam('addToId', $idx); - $addLink = ' ' . t('Operator') . ' (&, !, |)'; - $addLink .= ' ' . t('Expression') . ' (=, <, >, <=, >=)'; - */ - $selectedIndex = ($idx === $this->selectedIdx ? ' -<--' : ''); - $selectIndex = ' o'; + if ($level === 0 && $filter->isChain() && $filter->isEmpty()) { + return '
  • ' . $this->renderNewFilter() . '
'; + } if ($filter instanceof FilterChain) { - $parts = array(); - $i = 0; + return $this->renderFilterChain($filter, $level); + } elseif ($filter instanceof FilterExpression) { + return $this->renderFilterExpression($filter); + } else { + throw new ProgrammingError('Got a Filter being neither expression nor chain'); + } + } - foreach ($filter->filters() as $f) { - $i++; - $parts[] = $this->renderFilter($f, $level + 1); - } + protected function renderFilterChain(FilterChain $filter, $level) + { + $html = ' ' + . $this->selectOperator($filter) + . $this->removeLink($filter) + . ($filter->count() === 1 ? $this->stripLink($filter) : '') + . $this->addLink($filter); - $op = $this->select( - 'operator_' . $filter->getId(), - array( - 'OR' => 'OR', - 'AND' => 'AND', - 'NOT' => 'NOT' - ), - $filter->getOperatorName(), - array('style' => 'width: 5em') - ) . $removeLink; // Disabled: . ' ' . t('Add') . ': ' . $addLink; - $html .= ' '; - - if ($level === 0) { - $html .= $op; - if (! empty($parts)) { - $html .= '
  • ' - . implode('
  • ', $parts) - . '
'; - } - } else { - $html .= $op . "
    \n
  • \n" . implode("
  • \n
  • ", $parts) . "
  • \n
\n"; - } + if ($filter->isEmpty() && ! $this->addTo) { return $html; } - if ($filter instanceof FilterExpression) { - $u = $url->without($filter->getColumn()); - } else { - throw new ProgrammingError('Got a Filter being neither expression nor chain'); + $parts = array(); + foreach ($filter->filters() as $f) { + $parts[] = '
  • ' . $this->renderFilter($f, $level + 1) . '
  • '; } - $value = $filter->getExpression(); + + if ($this->addTo && $this->addTo == $filter->getId()) { + $parts[] = '
  • ' . $this->renderNewFilter() .$this->cancelLink(). '
  • '; + } + + $class = $level === 0 ? ' class="datafilter"' : ''; + $html .= sprintf( + "\n%s\n", + $class, + implode("", $parts) + ); + return $html; + } + + protected function renderFilterExpression(FilterExpression $filter) + { + if ($this->addTo && $this->addTo === $filter->getId()) { + return + preg_replace( + '/ class="autosubmit"/', + ' class="autofocus"', + $this->selectOperator() + ) + . '
    • ' + . $this->selectColumn($filter) + . $this->selectSign($filter) + . $this->text($filter) + . $this->removeLink($filter) + . $this->addLink($filter) + . '
    • ' + . $this->renderNewFilter() .$this->cancelLink() + . '
    ' + ; + } else { + return $this->selectColumn($filter) + . $this->selectSign($filter) + . $this->text($filter) + . $this->removeLink($filter) + . $this->addLink($filter) + ; + + } + } + + protected function text(Filter $filter = null) + { + $value = $filter === null ? '' : $filter->getExpression(); if (is_array($value)) { $value = '(' . implode('|', $value) . ')'; } - $html .= $this->selectColumn($filter) . ' ' - . $this->selectSign($filter) - . ' ' . $removeLink; + return sprintf( + '', + $this->elementId('value', $filter), + $value + ); + } - return $html; + protected function renderNewFilter() + { + $html = $this->selectColumn() + . $this->selectSign() + . $this->text(); + + return preg_replace( + '/ class="autosubmit"/', + '', + $html + ); } protected function arrayForSelect($array) @@ -179,9 +453,33 @@ class FilterEditor extends AbstractWidget return $res; } - protected function selectSign($filter) + protected function elementId($prefix, Filter $filter = null) + { + if ($filter === null) { + return $prefix . '_new_' . ($this->addTo ?: '0'); + } else { + return $prefix . '_' . $filter->getId(); + } + } + + protected function selectOperator(Filter $filter = null) + { + $ops = array( + 'AND' => 'AND', + 'OR' => 'OR', + 'NOT' => 'NOT' + ); + + return $this->select( + $this->elementId('operator', $filter), + $ops, + $filter === null ? null : $filter->getOperatorName(), + array('style' => 'width: 5em') + ); + } + + protected function selectSign(Filter $filter = null) { - $name = 'sign_' . $filter->getId(); $signs = array( '=' => '=', '!=' => '!=', @@ -192,17 +490,30 @@ class FilterEditor extends AbstractWidget ); return $this->select( - $name, + $this->elementId('sign', $filter), $signs, - $filter->getSign(), + $filter === null ? null : $filter->getSign(), array('style' => 'width: 4em') ); } - protected function selectColumn($filter) + + protected function selectColumn(Filter $filter = null) { - $name = 'column_' . $filter->getId(); - $cols = $this->arrayForSelect($this->query->getColumns()); - $active = $filter->getColumn(); + $active = $filter === null ? null : $filter->getColumn(); + + if ($this->query === null) { + return sprintf( + '', + $this->elementId('column', $filter), + $this->view()->escape($active) // Escape attribute? + ); + } + + if ($this->cachedColumnSelect === null) { + $this->cachedColumnSelect = $this->arrayForSelect($this->query->getColumns()); + asort($this->cachedColumnSelect); + } + $cols = $this->cachedColumnSelect; $seen = false; foreach ($cols as $k => & $v) { $v = str_replace('_', ' ', ucfirst($v)); @@ -215,32 +526,169 @@ class FilterEditor extends AbstractWidget $cols[$active] = str_replace('_', ' ', ucfirst(ltrim($active, '_'))); } - if ($this->query === null) { - return sprintf( - '', - $name, - $filter->getColumn() - ); - } else { - return $this->select( - $name, - $cols, - $active - ); + return $this->select($this->elementId('column', $filter), $cols, $active); + } + + protected function applyChanges($changes) + { + $filter = $this->filter; + $pairs = array(); + $addTo = null; + $add = array(); + foreach ($changes as $k => $v) { + if (preg_match('/^(column|value|sign|operator)((?:_new)?)_([\d-]+)$/', $k, $m)) { + if ($m[2] === '_new') { + if ($addTo !== null && $addTo !== $m[3]) { + throw new \Exception('F...U'); + } + $addTo = $m[3]; + $add[$m[1]] = $v; + } else { + $pairs[$m[3]][$m[1]] = $v; + } + } } + + $operators = array(); + foreach ($pairs as $id => $fs) { + if (array_key_exists('operator', $fs)) { + $operators[$id] = $fs['operator']; + } else { + $f = $filter->getById($id); + $f->setColumn($fs['column']); + if ($f->getSign() !== $fs['sign']) { + if ($f->isRootNode()) { + $filter = $f->setSign($fs['sign']); + } else { + $filter->replaceById($id, $f->setSign($fs['sign'])); + } + } + $f->setExpression($fs['value']); + } + } + + krsort($operators, version_compare(PHP_VERSION, '5.4.0') >= 0 ? SORT_NATURAL : SORT_REGULAR); + foreach ($operators as $id => $operator) { + $f = $filter->getById($id); + if ($f->getOperatorName() !== $operator) { + if ($f->isRootNode()) { + $filter = $f->setOperatorName($operator); + } else { + $filter->replaceById($id, $f->setOperatorName($operator)); + } + } + } + + if ($addTo !== null) { + if ($addTo === '0') { + $filter = Filter::expression($add['column'], $add['sign'], $add['value']); + } else { + $parent = $filter->getById($addTo); + $f = Filter::expression($add['column'], $add['sign'], $add['value']); + if ($add['operator']) { + switch($add['operator']) { + case 'AND': + if ($parent->isExpression()) { + if ($parent->isRootNode()) { + $filter = Filter::matchAll(clone $parent, $f); + } else { + $filter = $filter->replaceById($addTo, Filter::matchAll(clone $parent, $f)); + } + } else { + $parent->addFilter(Filter::matchAll($f)); + } + break; + case 'OR': + if ($parent->isExpression()) { + if ($parent->isRootNode()) { + $filter = Filter::matchAny(clone $parent, $f); + } else { + $filter = $filter->replaceById($addTo, Filter::matchAny(clone $parent, $f)); + } + } else { + $parent->addFilter(Filter::matchAny($f)); + } + break; + case 'NOT': + if ($parent->isExpression()) { + if ($parent->isRootNode()) { + $filter = Filter::not(Filter::matchAll($parent, $f)); + } else { + $filter = $filter->replaceById($addTo, Filter::not(Filter::matchAll($parent, $f))); + } + } else { + $parent->addFilter(Filter::not($f)); + } + break; + } + } else { + $parent->addFilter($f); + } + } + } + + return $filter; + } + + public function renderSearch() + { + $html = '
    '; + + if ($this->filter->isEmpty()) { + $title = t('Filter this list'); + } else { + $title = t('Modify this filter'); + if (! $this->filter->isEmpty()) { + $title .= ': ' . $this->filter; + } + } + return $html + . '' + . '' + . ''; } public function render() { - return '

    ' - . t('Modify this filter') - . '

    ' + if (! $this->url()->getParam('modifyFilter')) { + return $this->renderSearch() . $this->shorten($this->filter, 50); + } + return $this->renderSearch() . '
    ' . '
    • ' . $this->renderFilter($this->filter) - . '

    ' + . '' + . '
    ' + . '' + . '' + . '
    ' . '
    '; } + + protected function shorten($string, $length) + { + if (strlen($string) > $length) { + return substr($string, 0, $length) . '...'; + } + return $string; + } + + public function __toString() + { + try { + return $this->render(); + } catch (Exception $e) { + return 'ERROR in FilterEditor: ' . $e->getMessage(); + } + } } diff --git a/library/Icinga/Web/Widget/FilterWidget.php b/library/Icinga/Web/Widget/FilterWidget.php index 013f9b252..cf47ef581 100644 --- a/library/Icinga/Web/Widget/FilterWidget.php +++ b/library/Icinga/Web/Widget/FilterWidget.php @@ -88,7 +88,7 @@ class FilterWidget extends AbstractWidget $editorUrl->setParam('modifyFilter', true); if ($this->filter->isEmpty()) { $title = t('Filter this list'); - $txt = $view->icon('create.png'); + $txt = $view->icon('plus'); $remove = ''; } else { $txt = t('Filtered'); @@ -98,7 +98,7 @@ class FilterWidget extends AbstractWidget . '" title="' . t('Remove this filter') . '">' - . $view->icon('remove.png') + . $view->icon('cancel') . ''; } $filter = $this->filter->isEmpty() ? '' : ': ' . $this->filter; diff --git a/library/Icinga/Web/Widget/Tab.php b/library/Icinga/Web/Widget/Tab.php index 92a1a9954..bf7ea9bcc 100644 --- a/library/Icinga/Web/Widget/Tab.php +++ b/library/Icinga/Web/Widget/Tab.php @@ -197,11 +197,18 @@ class Tab extends AbstractWidget public function render() { $view = $this->view(); - $class = $this->active ? ' class="active" ' : ''; + $classes = array(); + if ($this->active) { + $classes[] = 'active'; + } $caption = $view->escape($this->title); if ($this->icon !== null) { - $caption = $view->img($this->icon, array('class' => 'icon')) . ' ' . $caption; + if (strpos($this->icon, '.') === false) { + $classes[] = 'icon-' . $this->icon; + } else { + $caption = $view->img($this->icon, array('class' => 'icon')) . $caption; + } } if ($this->url !== null) { $this->url->overwriteParams($this->urlParams); @@ -218,6 +225,7 @@ class Tab extends AbstractWidget } else { $tab = $caption; } + $class = empty($classes) ? '' : sprintf(' class="%s"', implode(' ', $classes)); return '
  • ' . $tab . "
  • \n"; } } diff --git a/library/Icinga/Web/Widget/Tabs.php b/library/Icinga/Web/Widget/Tabs.php index b2a34e0ec..72522282e 100644 --- a/library/Icinga/Web/Widget/Tabs.php +++ b/library/Icinga/Web/Widget/Tabs.php @@ -34,7 +34,7 @@ EOT; */ private $dropdownTpl = <<< 'EOT'