Merge branch 'master' into feature/deduplicate-puppet-code-6842

Conflicts:
	.vagrant-puppet/manifests/default.pp
	packages/rpm/etc/icingaweb2/resources.ini
This commit is contained in:
Alexander Klimov 2014-11-25 12:29:42 +01:00
commit 1ce99d277a
2868 changed files with 424735 additions and 130000 deletions

4
.gitattributes vendored
View File

@ -1 +1,5 @@
# Exclude files related to git when generating an archive
.git* export-ignore .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

46
.gitignore vendored
View File

@ -1,46 +1,14 @@
# Exclude all hidden files # 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 # Exclude symlink you need for packaging
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
/debian /debian
*.tar.gz
*.komodoproject
build/*

View File

@ -1 +0,0 @@
* -crlf

View File

@ -76,7 +76,7 @@ __function createService(service_type, num) {
enable_active_checks = (service_type != "pending") enable_active_checks = (service_type != "pending")
vars.check_type = service_type vars.check_type = service_type
assign where match("*" + service_type + "*", host.vars.check_config) assign where service_type in host.vars.check_config
} }
} }
@ -102,12 +102,12 @@ __function createHost(checkType, checkConfig, num, checkEnabled) {
} }
__for (num in range(10)) { __for (num in range(10)) {
createHost("ok", "ok", num, true) createHost("ok", [ "ok" ], num, true)
createHost("random", "random,flapping", num, true) createHost("random", [ "random", "flapping" ], num, true)
createHost("down", "warning,critical", num, true) createHost("down", [ "warning", "critical" ], num, true)
createHost("unreachable", "unknown", num, true) createHost("unreachable", [ "unknown" ], num, true)
createHost("pending", "pending", num, false) createHost("pending", [ "pending" ], num, false)
createHost("flap", "flapping", num, true) createHost("flap", [ "flapping" ], num, true)
} }
// EOF // EOF

View File

@ -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`/

1
VERSION Normal file
View File

@ -0,0 +1 @@
v2.0.0-beta1

1
Vagrantfile vendored
View File

@ -54,7 +54,6 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# the path on the host to the actual folder. The second argument is # the path on the host to the actual folder. The second argument is
# the path on the guest to mount the folder. And the optional third # the path on the guest to mount the folder. And the optional third
# argument is a set of non-required options. # argument is a set of non-required options.
config.vm.synced_folder "./config", "/vagrant/config"
config.vm.synced_folder "./var/log", "/vagrant/var/log" config.vm.synced_folder "./var/log", "/vagrant/var/log"
# Provider-specific configuration so you can fine-tune various # Provider-specific configuration so you can fine-tune various

84
aclocal.m4 vendored
View File

@ -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])
)
])

View File

@ -4,6 +4,7 @@
namespace Icinga\Clicommands; namespace Icinga\Clicommands;
use Icinga\Application\Icinga;
use Icinga\Cli\Command; use Icinga\Cli\Command;
use Icinga\Exception\IcingaException; use Icinga\Exception\IcingaException;
@ -30,7 +31,7 @@ class WebCommand extends Command
// throw new IcingaException('Socket is required'); // throw new IcingaException('Socket is required');
} }
if ($basedir === null) { if ($basedir === null) {
$basedir = dirname(ICINGAWEB_APPDIR) . '/public'; $basedir = Icinga::app()->getBaseDir('public');
if (! file_exists($basedir) || ! is_dir($basedir)) { if (! file_exists($basedir) || ! is_dir($basedir)) {
throw new IcingaException('Basedir is required'); throw new IcingaException('Basedir is required');
} }
@ -46,7 +47,7 @@ class WebCommand extends Command
readlink('/proc/self/exe'), readlink('/proc/self/exe'),
$socket, $socket,
$basedir, $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 // TODO: Store webserver log, switch uid, log index.php includes, pid file

View File

@ -6,10 +6,10 @@
use Icinga\Authentication\Backend\AutoLoginBackend; use Icinga\Authentication\Backend\AutoLoginBackend;
use Icinga\Web\Controller\ActionController; use Icinga\Web\Controller\ActionController;
use Icinga\Form\Authentication\LoginForm; use Icinga\Forms\Authentication\LoginForm;
use Icinga\Authentication\AuthChain; use Icinga\Authentication\AuthChain;
use Icinga\Application\Config; use Icinga\Application\Config;
use Icinga\Logger\Logger; use Icinga\Application\Logger;
use Icinga\Exception\AuthenticationException; use Icinga\Exception\AuthenticationException;
use Icinga\Exception\NotReadableError; use Icinga\Exception\NotReadableError;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
@ -33,6 +33,10 @@ class AuthenticationController extends ActionController
*/ */
public function loginAction() public function loginAction()
{ {
if (@file_exists(Config::resolvePath('setup.token')) && !@file_exists(Config::resolvePath('config.ini'))) {
$this->redirectNow(Url::fromPath('setup'));
}
$auth = $this->Auth(); $auth = $this->Auth();
$this->view->form = $form = new LoginForm(); $this->view->form = $form = new LoginForm();
$this->view->title = $this->translate('Icingaweb Login'); $this->view->title = $this->translate('Icingaweb Login');
@ -53,7 +57,7 @@ class AuthenticationController extends ActionController
$config = Config::app('authentication'); $config = Config::app('authentication');
} catch (NotReadableError $e) { } catch (NotReadableError $e) {
throw new ConfigurationError( 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, 0,
$e $e
); );
@ -93,30 +97,30 @@ class AuthenticationController extends ActionController
} }
} }
if ($backendsTried === 0) { if ($backendsTried === 0) {
throw new ConfigurationError( $this->view->form->addError(
$this->translate( $this->translate(
'No authentication methods available. Did you create' 'No authentication methods available. Did you create'
. ' authentication.ini when installing Icinga Web 2?' . ' authentication.ini when setting up Icinga Web 2?'
) )
); );
} } else if ($backendsTried === $backendsWithError) {
if ($backendsTried === $backendsWithError) { $this->view->form->addError(
throw new ConfigurationError(
$this->translate( $this->translate(
'All configured authentication methods failed.' 'All configured authentication methods failed.'
. ' Please check the system log or Icinga Web 2 log for more information.' . ' Please check the system log or Icinga Web 2 log for more information.'
) )
); );
} } elseif ($backendsWithError) {
if ($backendsWithError) { $this->view->form->addError(
$this->view->form->getElement('username')->addError(
$this->translate( $this->translate(
'Please note that not all authentication methods were available.' 'Please note that not all authentication methods were available.'
. ' Check the system log or Icinga Web 2 log for more information.' . ' 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()) { } elseif ($request->isGet()) {
$user = new User(''); $user = new User('');
foreach ($chain as $backend) { foreach ($chain as $backend) {
@ -134,6 +138,8 @@ class AuthenticationController extends ActionController
} catch (Exception $e) { } catch (Exception $e) {
$this->view->errorInfo = $e->getMessage(); $this->view->errorInfo = $e->getMessage();
} }
$this->view->configMissing = is_dir(Config::$configDir) === false;
} }
/** /**

View File

@ -7,12 +7,12 @@ use Icinga\Web\Notification;
use Icinga\Application\Modules\Module; use Icinga\Application\Modules\Module;
use Icinga\Web\Widget; use Icinga\Web\Widget;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;
use Icinga\Application\Config as IcingaConfig; use Icinga\Application\Config;
use Icinga\Form\Config\GeneralConfigForm; use Icinga\Forms\Config\GeneralConfigForm;
use Icinga\Form\Config\AuthenticationBackendReorderForm; use Icinga\Forms\Config\AuthenticationBackendReorderForm;
use Icinga\Form\Config\AuthenticationBackendConfigForm; use Icinga\Forms\Config\AuthenticationBackendConfigForm;
use Icinga\Form\Config\ResourceConfigForm; use Icinga\Forms\Config\ResourceConfigForm;
use Icinga\Form\ConfirmRemovalForm; use Icinga\Forms\ConfirmRemovalForm;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
@ -24,13 +24,13 @@ class ConfigController extends ActionController
public function init() public function init()
{ {
$this->view->tabs = Widget::create('tabs')->add('index', array( $this->view->tabs = Widget::create('tabs')->add('index', array(
'title' => 'Application', 'title' => $this->translate('Application'),
'url' => 'config' 'url' => 'config'
))->add('authentication', array( ))->add('authentication', array(
'title' => 'Authentication', 'title' => $this->translate('Authentication'),
'url' => 'config/authentication' 'url' => 'config/authentication'
))->add('resources', array( ))->add('resources', array(
'title' => 'Resources', 'title' => $this->translate('Resources'),
'url' => 'config/resource' 'url' => 'config/resource'
)); ));
} }
@ -46,7 +46,7 @@ class ConfigController extends ActionController
public function indexAction() public function indexAction()
{ {
$form = new GeneralConfigForm(); $form = new GeneralConfigForm();
$form->setIniConfig(IcingaConfig::app()); $form->setIniConfig(Config::app());
$form->handleRequest(); $form->handleRequest();
$this->view->form = $form; $this->view->form = $form;
@ -99,7 +99,7 @@ class ConfigController extends ActionController
Notification::success(sprintf($this->translate('Module "%s" enabled'), $module)); Notification::success(sprintf($this->translate('Module "%s" enabled'), $module));
$this->rerenderLayout()->reloadCss()->redirectNow('config/modules'); $this->rerenderLayout()->reloadCss()->redirectNow('config/modules');
} catch (Exception $e) { } catch (Exception $e) {
$this->view->exceptionMesssage = $e->getMessage(); $this->view->exceptionMessage = $e->getMessage();
$this->view->moduleName = $module; $this->view->moduleName = $module;
$this->view->action = 'enable'; $this->view->action = 'enable';
$this->render('module-configuration-error'); $this->render('module-configuration-error');
@ -131,7 +131,7 @@ class ConfigController extends ActionController
public function authenticationAction() public function authenticationAction()
{ {
$form = new AuthenticationBackendReorderForm(); $form = new AuthenticationBackendReorderForm();
$form->setIniConfig(IcingaConfig::app('authentication')); $form->setIniConfig(Config::app('authentication'));
$form->handleRequest(); $form->handleRequest();
$this->view->form = $form; $this->view->form = $form;
@ -145,7 +145,7 @@ class ConfigController extends ActionController
public function createauthenticationbackendAction() public function createauthenticationbackendAction()
{ {
$form = new AuthenticationBackendConfigForm(); $form = new AuthenticationBackendConfigForm();
$form->setIniConfig(IcingaConfig::app('authentication')); $form->setIniConfig(Config::app('authentication'));
$form->setResourceConfig(ResourceFactory::getResourceConfigs()); $form->setResourceConfig(ResourceFactory::getResourceConfigs());
$form->setRedirectUrl('config/authentication'); $form->setRedirectUrl('config/authentication');
$form->handleRequest(); $form->handleRequest();
@ -161,7 +161,7 @@ class ConfigController extends ActionController
public function editauthenticationbackendAction() public function editauthenticationbackendAction()
{ {
$form = new AuthenticationBackendConfigForm(); $form = new AuthenticationBackendConfigForm();
$form->setIniConfig(IcingaConfig::app('authentication')); $form->setIniConfig(Config::app('authentication'));
$form->setResourceConfig(ResourceFactory::getResourceConfigs()); $form->setResourceConfig(ResourceFactory::getResourceConfigs());
$form->setRedirectUrl('config/authentication'); $form->setRedirectUrl('config/authentication');
$form->handleRequest(); $form->handleRequest();
@ -177,10 +177,10 @@ class ConfigController extends ActionController
public function removeauthenticationbackendAction() public function removeauthenticationbackendAction()
{ {
$form = new ConfirmRemovalForm(array( $form = new ConfirmRemovalForm(array(
'onSuccess' => function ($request) { 'onSuccess' => function ($form) {
$configForm = new AuthenticationBackendConfigForm(); $configForm = new AuthenticationBackendConfigForm();
$configForm->setIniConfig(IcingaConfig::app('authentication')); $configForm->setIniConfig(Config::app('authentication'));
$authBackend = $request->getQuery('auth_backend'); $authBackend = $form->getRequest()->getQuery('auth_backend');
try { try {
$configForm->remove($authBackend); $configForm->remove($authBackend);
@ -212,7 +212,7 @@ class ConfigController extends ActionController
*/ */
public function resourceAction() public function resourceAction()
{ {
$this->view->resources = IcingaConfig::app('resources', true)->toArray(); $this->view->resources = Config::app('resources', true)->keys();
$this->view->tabs->activate('resources'); $this->view->tabs->activate('resources');
} }
@ -222,7 +222,7 @@ class ConfigController extends ActionController
public function createresourceAction() public function createresourceAction()
{ {
$form = new ResourceConfigForm(); $form = new ResourceConfigForm();
$form->setIniConfig(IcingaConfig::app('resources')); $form->setIniConfig(Config::app('resources'));
$form->setRedirectUrl('config/resource'); $form->setRedirectUrl('config/resource');
$form->handleRequest(); $form->handleRequest();
@ -236,7 +236,7 @@ class ConfigController extends ActionController
public function editresourceAction() public function editresourceAction()
{ {
$form = new ResourceConfigForm(); $form = new ResourceConfigForm();
$form->setIniConfig(IcingaConfig::app('resources')); $form->setIniConfig(Config::app('resources'));
$form->setRedirectUrl('config/resource'); $form->setRedirectUrl('config/resource');
$form->handleRequest(); $form->handleRequest();
@ -250,10 +250,10 @@ class ConfigController extends ActionController
public function removeresourceAction() public function removeresourceAction()
{ {
$form = new ConfirmRemovalForm(array( $form = new ConfirmRemovalForm(array(
'onSuccess' => function ($request) { 'onSuccess' => function ($form) {
$configForm = new ResourceConfigForm(); $configForm = new ResourceConfigForm();
$configForm->setIniConfig(IcingaConfig::app('resources')); $configForm->setIniConfig(Config::app('resources'));
$resource = $request->getQuery('resource'); $resource = $form->getRequest()->getQuery('resource');
try { try {
$configForm->remove($resource); $configForm->remove($resource);
@ -274,9 +274,9 @@ class ConfigController extends ActionController
// Check if selected resource is currently used for authentication // Check if selected resource is currently used for authentication
$resource = $this->getRequest()->getQuery('resource'); $resource = $this->getRequest()->getQuery('resource');
$authConfig = IcingaConfig::app('authentication')->toArray(); $authConfig = Config::app('authentication');
foreach ($authConfig as $backendName => $config) { foreach ($authConfig as $backendName => $config) {
if (array_key_exists('resource', $config) && $config['resource'] === $resource) { if ($config->get('resource') === $resource) {
$form->addError(sprintf( $form->addError(sprintf(
$this->translate( $this->translate(
'The resource "%s" is currently in use by the authentication backend "%s". ' . 'The resource "%s" is currently in use by the authentication backend "%s". ' .

View File

@ -2,111 +2,223 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
use Icinga\Web\Url; use Icinga\Application\Logger;
use Icinga\Logger\Logger; use Icinga\Exception\ProgrammingError;
use Icinga\Config\PreservingIniWriter; use Icinga\Forms\ConfirmRemovalForm;
use Icinga\Application\Config as IcingaConfig; use Icinga\Forms\Dashboard\DashletForm;
use Icinga\Web\Widget\Dashboard; use Icinga\Web\Form;
use Icinga\Form\Dashboard\AddUrlForm; use Icinga\Web\Notification;
use Icinga\Exception\NotReadableError;
use Icinga\Exception\ConfigurationError;
use Icinga\Web\Controller\ActionController; use Icinga\Web\Controller\ActionController;
use Icinga\Exception\IcingaException; use Icinga\Web\Request;
use Icinga\Web\Url;
use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Widget\Tabextension\DashboardSettings;
/** /**
* Handle creation, removal and displaying of dashboards, panes and components * Handle creation, removal and displaying of dashboards, panes and dashlets
* *
* @see Icinga\Web\Widget\Dashboard for more information about dashboards * @see Icinga\Web\Widget\Dashboard for more information about dashboards
*/ */
class DashboardController extends ActionController class DashboardController extends ActionController
{ {
/** /**
* Default configuration * @var Dashboard;
*/ */
const DEFAULT_CONFIG = 'dashboard/dashboard'; private $dashboard;
/** public function init()
* Retrieve a dashboard from the provided config
*
* @param string $config The config to read the dashboard from, or 'dashboard/dashboard' if none is given
*
* @return \Icinga\Web\Widget\Dashboard
*/
private function getDashboard($config = self::DEFAULT_CONFIG)
{ {
$dashboard = new Dashboard(); $this->dashboard = new Dashboard();
try { $this->dashboard->setUser($this->getRequest()->getUser());
$dashboardConfig = IcingaConfig::app($config); $this->dashboard->load();
if (count($dashboardConfig) === 0) {
return null;
}
$dashboard->readConfig($dashboardConfig);
} catch (NotReadableError $e) {
Logger::error(new IcingaException('Cannot load dashboard configuration. An exception was thrown:', $e));
return null;
}
return $dashboard;
} }
/** public function newDashletAction()
* Remove a component from the pane identified by the 'pane' parameter
*/
public function removecomponentAction()
{ {
$pane = $this->_getParam('pane'); $form = new DashletForm();
$dashboard = $this->getDashboard(); $this->createTabs();
try { $dashboard = $this->dashboard;
$dashboard->removeComponent( $form->setDashboard($dashboard);
$pane, if ($this->_request->getParam('url')) {
$this->_getParam('component') $params = $this->_request->getParams();
)->store(); $params['url'] = rawurldecode($this->_request->getParam('url'));
$this->redirectNow(Url::fromPath('dashboard', array('pane' => $pane))); $form->populate($params);
} catch (ConfigurationError $exc ) {
$this->_helper->viewRenderer('show_configuration');
$this->view->exceptionMessage = $exc->getMessage();
$this->view->iniConfigurationString = $dashboard->toIni();
} }
$action = $this;
$form->setOnSuccess(function (Form $form) use ($dashboard, $action) {
try {
$pane = $dashboard->getPane($form->getValue('pane'));
} catch (ProgrammingError $e) {
$pane = new Dashboard\Pane($form->getValue('pane'));
$pane->setUserWidget();
$dashboard->addPane($pane);
}
$dashlet = new Dashboard\Dashlet($form->getValue('dashlet'), $form->getValue('url'), $pane);
$dashlet->setUserWidget();
$pane->addDashlet($dashlet);
try {
$dashboard->write();
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
$action->view->config = $dashboard->createWriter();
$action->render('error');
return false;
}
Notification::success(t('Dashlet created'));
return true;
});
$form->setRedirectUrl('dashboard');
$form->handleRequest();
$this->view->form = $form;
} }
/** public function updateDashletAction()
* Display the form for adding new components or add the new component if submitted
*/
public function addurlAction()
{ {
$this->getTabs()->add( $this->createTabs();
'addurl', $dashboard = $this->dashboard;
array( $form = new DashletForm();
'title' => 'Add Dashboard URL', $form->setDashboard($dashboard);
'url' => Url::fromRequest() $form->setSubmitLabel(t('Update Dashlet'));
) if (! $this->_request->getParam('pane')) {
)->activate('addurl'); throw new Zend_Controller_Action_Exception(
'Missing parameter "pane"',
$form = new AddUrlForm(); 400
$request = $this->getRequest(); );
if ($request->isPost()) {
if ($form->isValid($request->getPost()) && $form->isSubmitted()) {
$dashboard = $this->getDashboard();
$dashboard->setComponentUrl(
$form->getValue('pane'),
$form->getValue('component'),
ltrim($form->getValue('url'), '/')
);
$configFile = IcingaConfig::app('dashboard/dashboard')->getConfigFile();
if ($this->writeConfiguration(new Zend_Config($dashboard->toArray()), $configFile)) {
$this->redirectNow(Url::fromPath('dashboard', array('pane' => $form->getValue('pane'))));
} else {
$this->render('showConfiguration');
return;
}
}
} else {
$form->create()->setDefault('url', htmlspecialchars_decode($request->getParam('url', '')));
} }
if (! $this->_request->getParam('dashlet')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "dashlet"',
400
);
}
$action = $this;
$form->setOnSuccess(function (Form $form) use ($dashboard, $action) {
try {
$pane = $dashboard->getPane($form->getValue('pane'));
} catch (ProgrammingError $e) {
$pane = new Dashboard\Pane($form->getValue('pane'));
$pane->setUserWidget();
$dashboard->addPane($pane);
}
try {
$dashlet = $pane->getDashlet($form->getValue('dashlet'));
$dashlet->setUrl($form->getValue('url'));
} catch (ProgrammingError $e) {
$dashlet = new Dashboard\Dashlet($form->getValue('dashlet'), $form->getValue('url'), $pane);
$pane->addDashlet($dashlet);
}
$dashlet->setUserWidget();
// Rename dashlet
if ($form->getValue('org_dashlet') && $form->getValue('org_dashlet') !== $dashlet->getTitle()) {
$pane->removeDashlet($form->getValue('org_dashlet'));
}
// Move
if ($form->getValue('org_pane') && $form->getValue('org_pane') !== $pane->getTitle()) {
$oldPane = $dashboard->getPane($form->getValue('org_pane'));
$oldPane->removeDashlet($dashlet->getTitle());
}
try {
$dashboard->write();
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
$action->view->config = $dashboard->createWriter();
$action->render('error');
return false;
}
Notification::success(t('Dashlet updated'));
return true;
});
$form->setRedirectUrl('dashboard/settings');
$form->handleRequest();
$pane = $dashboard->getPane($this->getParam('pane'));
$dashlet = $pane->getDashlet($this->getParam('dashlet'));
$form->load($dashlet);
$this->view->form = $form; $this->view->form = $form;
} }
public function removeDashletAction()
{
$form = new ConfirmRemovalForm();
$this->createTabs();
$dashboard = $this->dashboard;
if (! $this->_request->getParam('pane')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "pane"',
400
);
}
if (! $this->_request->getParam('dashlet')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "dashlet"',
400
);
}
$pane = $this->_request->getParam('pane');
$dashlet = $this->_request->getParam('dashlet');
$action = $this;
$form->setOnSuccess(function (Form $form) use ($dashboard, $dashlet, $pane, $action) {
try {
$pane = $dashboard->getPane($pane);
$pane->removeDashlet($dashlet);
$dashboard->write();
Notification::success(t('Dashlet has been removed from') . ' ' . $pane->getTitle());
return true;
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
$action->view->config = $dashboard->createWriter();
$action->render('error');
return false;
} catch (ProgrammingError $e) {
Notification::error($e->getMessage());
return false;
}
return false;
});
$form->setRedirectUrl('dashboard/settings');
$form->handleRequest();
$this->view->pane = $pane;
$this->view->dashlet = $dashlet;
$this->view->form = $form;
}
public function removePaneAction()
{
$form = new ConfirmRemovalForm();
$this->createTabs();
$dashboard = $this->dashboard;
if (! $this->_request->getParam('pane')) {
throw new Zend_Controller_Action_Exception(
'Missing parameter "pane"',
400
);
}
$pane = $this->_request->getParam('pane');
$action = $this;
$form->setOnSuccess(function (Form $form) use ($dashboard, $pane, $action) {
try {
$pane = $dashboard->getPane($pane);
$dashboard->removePane($pane->getTitle());
$dashboard->write();
Notification::success(t('Dashboard has been removed') . ': ' . $pane->getTitle());
return true;
} catch (\Zend_Config_Exception $e) {
$action->view->error = $e;
$action->view->config = $dashboard->createWriter();
$action->render('error');
return false;
} catch (ProgrammingError $e) {
Notification::error($e->getMessage());
return false;
}
return false;
});
$form->setRedirectUrl('dashboard/settings');
$form->handleRequest();
$this->view->pane = $pane;
$this->view->form = $form;
}
/** /**
* Display the dashboard with the pane set in the 'pane' request parameter * Display the dashboard with the pane set in the 'pane' request parameter
* *
@ -115,61 +227,49 @@ class DashboardController extends ActionController
*/ */
public function indexAction() public function indexAction()
{ {
$dashboard = Dashboard::load(); $this->createTabs();
if (! $this->dashboard->hasPanes()) {
if (! $dashboard->hasPanes()) {
$this->view->title = 'Dashboard'; $this->view->title = 'Dashboard';
} else { } else {
if ($this->_getParam('pane')) { if ($this->_getParam('pane')) {
$pane = $this->_getParam('pane'); $pane = $this->_getParam('pane');
$dashboard->activate($pane); $this->dashboard->activate($pane);
} }
if ($this->dashboard === null) {
$this->view->configPath = IcingaConfig::resolvePath(self::DEFAULT_CONFIG);
if ($dashboard === null) {
$this->view->title = 'Dashboard'; $this->view->title = 'Dashboard';
} else { } else {
$this->view->title = $dashboard->getActivePane()->getTitle() . ' :: Dashboard'; $this->view->title = $this->dashboard->getActivePane()->getTitle() . ' :: Dashboard';
$this->view->tabs = $dashboard->getTabs(); if ($this->hasParam('remove')) {
$this->dashboard->getActivePane()->removeDashlet($this->getParam('remove'));
/* Temporarily removed $this->dashboard->write();
$this->redirectNow(URL::fromRequest()->remove('remove'));
}
$this->view->tabs->add( $this->view->tabs->add(
'Add', 'Add',
array( array(
'title' => '+', 'title' => '+',
'url' => Url::fromPath('dashboard/addurl') 'url' => Url::fromPath('dashboard/new-dashlet')
) )
); );
*/ $this->view->dashboard = $this->dashboard;
$this->view->dashboard = $dashboard;
} }
} }
} }
/** /**
* Store the given configuration as INI file * Setting dialog
*
* @param Zend_Config $config The configuration to store
* @param string $target The path where to store the configuration
*
* @return bool Whether the configuartion has been successfully stored
*/ */
protected function writeConfiguration(Zend_Config $config, $target) public function settingsAction()
{ {
$writer = new PreservingIniWriter(array('config' => $config, 'filename' => $target)); $this->createTabs();
$this->view->dashboard = $this->dashboard;
}
try { /**
$writer->write(); * Create tab aggregation
} catch (Exception $e) { */
Logger::error(new ConfiguationError("Cannot write dashboard to $target", 0, $e)); private function createTabs()
$this->view->configString = $writer->render(); {
$this->view->errorMessage = $e->getMessage(); $this->view->tabs = $this->dashboard->getTabs()->extend(new DashboardSettings());
$this->view->filePath = $target;
return false;
}
return true;
} }
} }

View File

@ -4,7 +4,7 @@
// namespace Icinga\Application\Controllers; // namespace Icinga\Application\Controllers;
use Icinga\Logger\Logger; use Icinga\Application\Logger;
use Icinga\Web\Controller\ActionController; use Icinga\Web\Controller\ActionController;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;

View File

@ -4,7 +4,7 @@
use Icinga\Web\Controller\ActionController; use Icinga\Web\Controller\ActionController;
use Icinga\Filter\Filter; use Icinga\Filter\Filter;
use Icinga\Logger\Logger; use Icinga\Application\Logger;
/** /**
* Application wide interface for filtering * Application wide interface for filtering

View File

@ -3,11 +3,9 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
use Icinga\Module\Monitoring\Controller; use Icinga\Module\Monitoring\Controller;
use Icinga\Web\Hook;
use Icinga\Web\Url; use Icinga\Web\Url;
use Icinga\Data\ResourceFactory; use Icinga\Application\Logger;
use Icinga\Logger\Logger; use Icinga\Data\ConfigObject;
use Icinga\Logger\Writer\FileWriter;
use Icinga\Protocol\File\FileReader; use Icinga\Protocol\File\FileReader;
use \Zend_Controller_Action_Exception as ActionError; use \Zend_Controller_Action_Exception as ActionError;
@ -50,7 +48,7 @@ class ListController extends Controller
. ' - (?<message>.*)$/'; // message . ' - (?<message>.*)$/'; // message
$loggerWriter = Logger::getInstance()->getWriter(); $loggerWriter = Logger::getInstance()->getWriter();
$resource = new FileReader(new Zend_Config(array( $resource = new FileReader(new ConfigObject(array(
'filename' => $loggerWriter->getPath(), 'filename' => $loggerWriter->getPath(),
'fields' => $pattern 'fields' => $pattern
))); )));

View File

@ -6,7 +6,7 @@ use Icinga\Web\Controller\BasePreferenceController;
use Icinga\Web\Url; use Icinga\Web\Url;
use Icinga\Web\Widget\Tab; use Icinga\Web\Widget\Tab;
use Icinga\Application\Config; use Icinga\Application\Config;
use Icinga\Form\PreferenceForm; use Icinga\Forms\PreferenceForm;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
use Icinga\User\Preferences\PreferencesStore; use Icinga\User\Preferences\PreferencesStore;
@ -25,9 +25,9 @@ class PreferenceController extends BasePreferenceController
public static function createProvidedTabs() public static function createProvidedTabs()
{ {
return array( return array(
'general' => new Tab( 'preferences' => new Tab(
array( array(
'title' => 'General settings', 'title' => t('Preferences'),
'url' => Url::fromPath('/preference') 'url' => Url::fromPath('/preference')
) )
) )
@ -39,8 +39,8 @@ class PreferenceController extends BasePreferenceController
*/ */
public function indexAction() public function indexAction()
{ {
$storeConfig = Config::app()->preferences; $storeConfig = Config::app()->getSection('preferences');
if ($storeConfig === null) { if ($storeConfig->isEmpty()) {
throw new ConfigurationError(t('You need to configure how to store preferences first.')); throw new ConfigurationError(t('You need to configure how to store preferences first.'));
} }
@ -51,6 +51,6 @@ class PreferenceController extends BasePreferenceController
$form->handleRequest(); $form->handleRequest();
$this->view->form = $form; $this->view->form = $form;
$this->getTabs()->activate('general'); $this->getTabs()->activate('preferences');
} }
} }

View File

@ -4,7 +4,7 @@
use Icinga\Web\Controller\ActionController; use Icinga\Web\Controller\ActionController;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;
use Icinga\Logger\Logger; use Icinga\Application\Logger;
use Icinga\Web\FileCache; use Icinga\Web\FileCache;
use Zend_Controller_Action_Exception as ActionException; use Zend_Controller_Action_Exception as ActionException;

View File

@ -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

View File

@ -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 <i> 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, <your_font_name>.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 <IE9, when
string is too long.
- animate.css - use it to get ideas about spinner rotation animation.
Attention for server setup
--------------------------
You MUST setup server to reply with proper `mime-types` for font files. In other
case, some browsers will fail to show fonts.
Usually, `apache` already has necessary settings, but `nginx` and other
webservers should be tuned. Here is list of mime types for our file extentions:
- `application/vnd.ms-fontobject` - eot
- `application/x-font-woff` - woff
- `application/x-font-ttf` - ttf
- `image/svg+xml` - svg

View File

@ -0,0 +1,706 @@
{
"name": "ifont",
"css_prefix_text": "icon-",
"css_use_suffix": false,
"hinting": true,
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
{
"uid": "9dd9e835aebe1060ba7190ad2b2ed951",
"css": "search",
"code": 59484,
"src": "fontawesome"
},
{
"uid": "8b80d36d4ef43889db10bc1f0dc9a862",
"css": "user",
"code": 59393,
"src": "fontawesome"
},
{
"uid": "31972e4e9d080eaa796290349ae6c1fd",
"css": "users",
"code": 59394,
"src": "fontawesome"
},
{
"uid": "b1887b423d2fd15c345e090320c91ca0",
"css": "dashboard",
"code": 59392,
"src": "fontawesome"
},
{
"uid": "ce3cf091d6ebd004dd0b52d24074e6e3",
"css": "help",
"code": 59483,
"src": "fontawesome"
},
{
"uid": "3d4ea8a78dc34efe891f3a0f3d961274",
"css": "info",
"code": 59482,
"src": "fontawesome"
},
{
"uid": "d7271d490b71df4311e32cdacae8b331",
"css": "home",
"code": 59481,
"src": "fontawesome"
},
{
"uid": "0d6ab6194c0eddda2b8c9cedf2ab248e",
"css": "attach",
"code": 59498,
"src": "fontawesome"
},
{
"uid": "c1f1975c885aa9f3dad7810c53b82074",
"css": "lock",
"code": 59480,
"src": "fontawesome"
},
{
"uid": "657ab647f6248a6b57a5b893beaf35a9",
"css": "lock-open",
"code": 59479,
"src": "fontawesome"
},
{
"uid": "05376be04a27d5a46e855a233d6e8508",
"css": "lock-open-alt",
"code": 59478,
"src": "fontawesome"
},
{
"uid": "c5fd349cbd3d23e4ade333789c29c729",
"css": "eye",
"code": 59475,
"src": "fontawesome"
},
{
"uid": "7fd683b2c518ceb9e5fa6757f2276faa",
"css": "eye-off",
"code": 59491,
"src": "fontawesome"
},
{
"uid": "3db5347bd219f3bce6025780f5d9ef45",
"css": "tag",
"code": 59476,
"src": "fontawesome"
},
{
"uid": "a3f89e106175a5c5c4e9738870b12e55",
"css": "tags",
"code": 59477,
"src": "fontawesome"
},
{
"uid": "acf41aa4018e58d49525665469e35665",
"css": "thumbs-up",
"code": 59495,
"src": "fontawesome"
},
{
"uid": "7533e68038fc6d520ede7a7ffa0a2f64",
"css": "thumbs-down",
"code": 59496,
"src": "fontawesome"
},
{
"uid": "9a76bc135eac17d2c8b8ad4a5774fc87",
"css": "download",
"code": 59400,
"src": "fontawesome"
},
{
"uid": "eeec3208c90b7b48e804919d0d2d4a41",
"css": "upload",
"code": 59401,
"src": "fontawesome"
},
{
"uid": "c6be5a58ee4e63a5ec399c2b0d15cf2c",
"css": "reply",
"code": 59473,
"src": "fontawesome"
},
{
"uid": "1b5597a3bacaeca6600e88ae36d02e0a",
"css": "reply-all",
"code": 59474,
"src": "fontawesome"
},
{
"uid": "3d39c828009c04ddb6764c0b04cd2439",
"css": "forward",
"code": 59472,
"src": "fontawesome"
},
{
"uid": "41087bc74d4b20b55059c60a33bf4008",
"css": "edit",
"code": 59471,
"src": "fontawesome"
},
{
"uid": "7277ded7695b2a307a5f9d50097bb64c",
"css": "print",
"code": 59470,
"src": "fontawesome"
},
{
"uid": "ecb97add13804c190456025e43ec003b",
"css": "keyboard",
"code": 59499,
"src": "fontawesome"
},
{
"uid": "85528017f1e6053b2253785c31047f44",
"css": "comment",
"code": 59464,
"src": "fontawesome"
},
{
"uid": "dcedf50ab1ede3283d7a6c70e2fe32f3",
"css": "chat",
"code": 59465,
"src": "fontawesome"
},
{
"uid": "9c1376672bb4f1ed616fdd78a23667e9",
"css": "comment-empty",
"code": 59463,
"src": "fontawesome"
},
{
"uid": "31951fbb9820ed0690f675b3d495c8da",
"css": "chat-empty",
"code": 59466,
"src": "fontawesome"
},
{
"uid": "cd21cbfb28ad4d903cede582157f65dc",
"css": "bell",
"code": 59467,
"src": "fontawesome"
},
{
"uid": "671f29fa10dda08074a4c6a341bb4f39",
"css": "bell-alt",
"code": 59468,
"src": "fontawesome"
},
{
"uid": "563683020e0bf9f22f3f055a69b5c57a",
"css": "bell-off",
"code": 59488,
"src": "fontawesome"
},
{
"uid": "8a074400a056c59d389f2d0517281bd5",
"css": "bell-off-empty",
"code": 59489,
"src": "fontawesome"
},
{
"uid": "00391fac5d419345ffcccd95b6f76263",
"css": "attention-alt",
"code": 59469,
"src": "fontawesome"
},
{
"uid": "f48ae54adfb27d8ada53d0fd9e34ee10",
"css": "trash",
"code": 59462,
"src": "fontawesome"
},
{
"uid": "5408be43f7c42bccee419c6be53fdef5",
"css": "doc-text",
"code": 59461,
"src": "fontawesome"
},
{
"uid": "9daa1fdf0838118518a7e22715e83abc",
"css": "file-pdf",
"code": 59458,
"src": "fontawesome"
},
{
"uid": "310ffd629da85142bc8669f010556f2d",
"css": "file-word",
"code": 59459,
"src": "fontawesome"
},
{
"uid": "f761c3bbe16ba2d332914ecb28e7a042",
"css": "file-excel",
"code": 59460,
"src": "fontawesome"
},
{
"uid": "9f7e588c66cfd6891f6f507cf6f6596b",
"css": "phone",
"code": 59457,
"src": "fontawesome"
},
{
"uid": "559647a6f430b3aeadbecd67194451dd",
"css": "menu",
"code": 59500,
"src": "fontawesome"
},
{
"uid": "e99461abfef3923546da8d745372c995",
"css": "service",
"code": 59456,
"src": "fontawesome"
},
{
"uid": "98687378abd1faf8f6af97c254eb6cd6",
"css": "services",
"code": 59455,
"src": "fontawesome"
},
{
"uid": "5bb103cd29de77e0e06a52638527b575",
"css": "wrench",
"code": 59453,
"src": "fontawesome"
},
{
"uid": "21b42d3c3e6be44c3cc3d73042faa216",
"css": "sliders",
"code": 59454,
"src": "fontawesome"
},
{
"uid": "531bc468eecbb8867d822f1c11f1e039",
"css": "calendar",
"code": 59452,
"src": "fontawesome"
},
{
"uid": "ead4c82d04d7758db0f076584893a8c1",
"css": "calendar-empty",
"code": 59451,
"src": "fontawesome"
},
{
"uid": "3a00327e61b997b58518bd43ed83c3df",
"css": "endtime",
"code": 59449,
"src": "fontawesome"
},
{
"uid": "0d20938846444af8deb1920dc85a29fb",
"css": "starttime",
"code": 59450,
"src": "fontawesome"
},
{
"uid": "19c50c52858a81de58f9db488aba77bc",
"css": "mic",
"code": 59448,
"src": "fontawesome"
},
{
"uid": "43c629249e2cca7e73cd4ef410c9551f",
"css": "mute",
"code": 59447,
"src": "fontawesome"
},
{
"uid": "e44601720c64e6bb6a2d5cba6b0c588c",
"css": "volume-off",
"code": 59446,
"src": "fontawesome"
},
{
"uid": "fee6e00f36e8ca8ef3e4a62caa213bf6",
"css": "volume-down",
"code": 59445,
"src": "fontawesome"
},
{
"uid": "76857a03fbaa6857fe063b6c25aa98ed",
"css": "volume-up",
"code": 59444,
"src": "fontawesome"
},
{
"uid": "598a5f2bcf3521d1615de8e1881ccd17",
"css": "clock",
"code": 59443,
"src": "fontawesome"
},
{
"uid": "5278ef7773e948d56c4d442c8c8c98cf",
"css": "lightbulb",
"code": 59442,
"src": "fontawesome"
},
{
"uid": "98d9c83c1ee7c2c25af784b518c522c5",
"css": "block",
"code": 59440,
"src": "fontawesome"
},
{
"uid": "e594fc6e5870b4ab7e49f52571d52577",
"css": "resize-full",
"code": 59434,
"src": "fontawesome"
},
{
"uid": "b013f6403e5ab0326614e68d1850fd6b",
"css": "resize-full-alt",
"code": 59433,
"src": "fontawesome"
},
{
"uid": "3c24ee33c9487bbf18796ca6dffa1905",
"css": "resize-small",
"code": 59435,
"src": "fontawesome"
},
{
"uid": "d3b3f17bc3eb7cd809a07bbd4d178bee",
"css": "resize-vertical",
"code": 59438,
"src": "fontawesome"
},
{
"uid": "3c73d058e4589b65a8d959c0fc8f153d",
"css": "resize-horizontal",
"code": 59437,
"src": "fontawesome"
},
{
"uid": "6605ee6441bf499ffa3c63d3c7409471",
"css": "move",
"code": 59436,
"src": "fontawesome"
},
{
"uid": "0b2b66e526028a6972d51a6f10281b4b",
"css": "zoom-in",
"code": 59439,
"src": "fontawesome"
},
{
"uid": "d25d10efa900f529ad1d275657cfd30e",
"css": "zoom-out",
"code": 59441,
"src": "fontawesome"
},
{
"uid": "2d6150442079cbda7df64522dc24f482",
"css": "down-dir",
"code": 59421,
"src": "fontawesome"
},
{
"uid": "80cd1022bd9ea151d554bec1fa05f2de",
"css": "up-dir",
"code": 59422,
"src": "fontawesome"
},
{
"uid": "9dc654095085167524602c9acc0c5570",
"css": "left-dir",
"code": 59423,
"src": "fontawesome"
},
{
"uid": "fb1c799ffe5bf8fb7f8bcb647c8fe9e6",
"css": "right-dir",
"code": 59424,
"src": "fontawesome"
},
{
"uid": "ccddff8e8670dcd130e3cb55fdfc2fd0",
"css": "down-open",
"code": 59425,
"src": "fontawesome"
},
{
"uid": "d870630ff8f81e6de3958ecaeac532f2",
"css": "left-open",
"code": 59428,
"src": "fontawesome"
},
{
"uid": "399ef63b1e23ab1b761dfbb5591fa4da",
"css": "right-open",
"code": 59426,
"src": "fontawesome"
},
{
"uid": "fe6697b391355dec12f3d86d6d490397",
"css": "up-open",
"code": 59427,
"src": "fontawesome"
},
{
"uid": "1c4068ed75209e21af36017df8871802",
"css": "down-big",
"code": 59432,
"src": "fontawesome"
},
{
"uid": "555ef8c86832e686fef85f7af2eb7cde",
"css": "left-big",
"code": 59431,
"src": "fontawesome"
},
{
"uid": "ad6b3fbb5324abe71a9c0b6609cbb9f1",
"css": "right-big",
"code": 59430,
"src": "fontawesome"
},
{
"uid": "95376bf082bfec6ce06ea1cda7bd7ead",
"css": "up-big",
"code": 59429,
"src": "fontawesome"
},
{
"uid": "d407a4707f719b042ed2ad28d2619d7e",
"css": "barchart",
"code": 59420,
"src": "fontawesome"
},
{
"uid": "cd4bfdae4dc89b175ff49330ce29611a",
"css": "wifi",
"code": 59501,
"src": "fontawesome"
},
{
"uid": "500fc1f109021e4b1de4deda2f7ed399",
"css": "host",
"code": 59494,
"src": "fontawesome"
},
{
"uid": "197375a3cea8cb90b02d06e4ddf1433d",
"css": "globe",
"code": 59417,
"src": "fontawesome"
},
{
"uid": "2c413e78faf1d6631fd7b094d14c2253",
"css": "cloud",
"code": 59418,
"src": "fontawesome"
},
{
"uid": "3212f42c65d41ed91cb435d0490e29ed",
"css": "flash",
"code": 59419,
"src": "fontawesome"
},
{
"uid": "567e3e257f2cc8fba2c12bf691c9f2d8",
"css": "moon",
"code": 59502,
"src": "fontawesome"
},
{
"uid": "8772331a9fec983cdb5d72902a6f9e0e",
"css": "scissors",
"code": 59416,
"src": "fontawesome"
},
{
"uid": "b429436ec5a518c78479d44ef18dbd60",
"css": "paste",
"code": 59415,
"src": "fontawesome"
},
{
"uid": "8b9e6a8dd8f67f7c003ed8e7e5ee0857",
"css": "off",
"code": 59413,
"src": "fontawesome"
},
{
"uid": "9755f76110ae4d12ac5f9466c9152031",
"css": "book",
"code": 59414,
"src": "fontawesome"
},
{
"uid": "266d5d9adf15a61800477a5acf9a4462",
"css": "chart-bar",
"code": 59505,
"src": "fontawesome"
},
{
"uid": "7d1ca956f4181a023de4b9efbed92524",
"css": "chart-area",
"code": 59504,
"src": "fontawesome"
},
{
"uid": "554ee96588a6c9ee632624cd051fe6fc",
"css": "chart-pie",
"code": 59503,
"src": "fontawesome"
},
{
"uid": "ea2d9a8c51ca42b38ef0d2a07f16d9a7",
"css": "chart-line",
"code": 59487,
"src": "fontawesome"
},
{
"uid": "3e674995cacc2b09692c096ea7eb6165",
"css": "megaphone",
"code": 59409,
"src": "fontawesome"
},
{
"uid": "7432077e6a2d6aa19984ca821bb6bbda",
"css": "bug",
"code": 59410,
"src": "fontawesome"
},
{
"uid": "9396b2d8849e0213a0f11c5fd7fcc522",
"css": "tasks",
"code": 59411,
"src": "fontawesome"
},
{
"uid": "4109c474ff99cad28fd5a2c38af2ec6f",
"css": "filter",
"code": 59412,
"src": "fontawesome"
},
{
"uid": "0f444c61b0d2c9966016d7ddb12f5837",
"css": "beaker",
"code": 59506,
"src": "fontawesome"
},
{
"uid": "ff70f7b3228702e0d590e60ed3b90bea",
"css": "magic",
"code": 59507,
"src": "fontawesome"
},
{
"uid": "3ed68ae14e9cde775121954242a412b2",
"css": "sort-name-up",
"code": 59407,
"src": "fontawesome"
},
{
"uid": "6586267200a42008a9fc0a1bf7ac06c7",
"css": "sort-name-down",
"code": 59408,
"src": "fontawesome"
},
{
"uid": "0bda4bc779d4c32623dec2e43bd67ee8",
"css": "gauge",
"code": 59405,
"src": "fontawesome"
},
{
"uid": "6fe95ffc3c807e62647d4f814a96e0d7",
"css": "sitemap",
"code": 59406,
"src": "fontawesome"
},
{
"uid": "cda0cdcfd38f5f1d9255e722dad42012",
"css": "spinner",
"code": 59497,
"src": "fontawesome"
},
{
"uid": "af95ef0ddda80a78828c62d386506433",
"css": "cubes",
"code": 59403,
"src": "fontawesome"
},
{
"uid": "347c38a8b96a509270fdcabc951e7571",
"css": "database",
"code": 59404,
"src": "fontawesome"
},
{
"uid": "a14be0c7e0689076e2bdde97f8e309f9",
"css": "plug",
"code": 59490,
"src": "fontawesome"
},
{
"uid": "e7cb72a17f3b21e3576f35c3f0a7639b",
"css": "git",
"code": 59402,
"src": "fontawesome"
},
{
"uid": "465bb89b6f204234e5787c326b4ae54c",
"css": "rewind",
"code": 59486,
"src": "entypo"
},
{
"uid": "bb46b15cb78cc4cc05d3d715d522ac4d",
"css": "cw",
"code": 59493,
"src": "entypo"
},
{
"uid": "3bd18d47a12b8709e9f4fe9ead4f7518",
"css": "reschedule",
"code": 59492,
"src": "entypo"
},
{
"uid": "b90d80c250a9bbdd6cd3fe00e6351710",
"css": "ok",
"code": 59395,
"src": "iconic"
},
{
"uid": "11e664deed5b2587456a4f9c01d720b6",
"css": "cancel",
"code": 59396,
"src": "iconic"
},
{
"uid": "dbd39eb5a1d67beb54cfcb535e840e0f",
"css": "plus",
"code": 59397,
"src": "iconic"
},
{
"uid": "9559f17a471856ef50ed266e726cfa25",
"css": "minus",
"code": 59398,
"src": "iconic"
},
{
"uid": "13ea1e82d38c7ed614d9ee85e9c42053",
"css": "folder-empty",
"code": 59399,
"src": "iconic"
},
{
"uid": "9c3b8d8a6d477da4d3e65b92e4e9c290",
"css": "flapping",
"code": 59485,
"src": "mfglabs"
}
]
}

View File

@ -0,0 +1,85 @@
/*
Animation example, for spinners
*/
.animate-spin {
-moz-animation: spin 2s infinite linear;
-o-animation: spin 2s infinite linear;
-webkit-animation: spin 2s infinite linear;
animation: spin 2s infinite linear;
display: inline-block;
}
@-moz-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-webkit-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-o-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@-ms-keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}
@keyframes spin {
0% {
-moz-transform: rotate(0deg);
-o-transform: rotate(0deg);
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
100% {
-moz-transform: rotate(359deg);
-o-transform: rotate(359deg);
-webkit-transform: rotate(359deg);
transform: rotate(359deg);
}
}

View File

@ -0,0 +1,117 @@
.icon-dashboard:before { content: '\e800'; } /* '' */
.icon-user:before { content: '\e801'; } /* '' */
.icon-users:before { content: '\e802'; } /* '' */
.icon-ok:before { content: '\e803'; } /* '' */
.icon-cancel:before { content: '\e804'; } /* '' */
.icon-plus:before { content: '\e805'; } /* '' */
.icon-minus:before { content: '\e806'; } /* '' */
.icon-folder-empty:before { content: '\e807'; } /* '' */
.icon-download:before { content: '\e808'; } /* '' */
.icon-upload:before { content: '\e809'; } /* '' */
.icon-git:before { content: '\e80a'; } /* '' */
.icon-cubes:before { content: '\e80b'; } /* '' */
.icon-database:before { content: '\e80c'; } /* '' */
.icon-gauge:before { content: '\e80d'; } /* '' */
.icon-sitemap:before { content: '\e80e'; } /* '' */
.icon-sort-name-up:before { content: '\e80f'; } /* '' */
.icon-sort-name-down:before { content: '\e810'; } /* '' */
.icon-megaphone:before { content: '\e811'; } /* '' */
.icon-bug:before { content: '\e812'; } /* '' */
.icon-tasks:before { content: '\e813'; } /* '' */
.icon-filter:before { content: '\e814'; } /* '' */
.icon-off:before { content: '\e815'; } /* '' */
.icon-book:before { content: '\e816'; } /* '' */
.icon-paste:before { content: '\e817'; } /* '' */
.icon-scissors:before { content: '\e818'; } /* '' */
.icon-globe:before { content: '\e819'; } /* '' */
.icon-cloud:before { content: '\e81a'; } /* '' */
.icon-flash:before { content: '\e81b'; } /* '' */
.icon-barchart:before { content: '\e81c'; } /* '' */
.icon-down-dir:before { content: '\e81d'; } /* '' */
.icon-up-dir:before { content: '\e81e'; } /* '' */
.icon-left-dir:before { content: '\e81f'; } /* '' */
.icon-right-dir:before { content: '\e820'; } /* '' */
.icon-down-open:before { content: '\e821'; } /* '' */
.icon-right-open:before { content: '\e822'; } /* '' */
.icon-up-open:before { content: '\e823'; } /* '' */
.icon-left-open:before { content: '\e824'; } /* '' */
.icon-up-big:before { content: '\e825'; } /* '' */
.icon-right-big:before { content: '\e826'; } /* '' */
.icon-left-big:before { content: '\e827'; } /* '' */
.icon-down-big:before { content: '\e828'; } /* '' */
.icon-resize-full-alt:before { content: '\e829'; } /* '' */
.icon-resize-full:before { content: '\e82a'; } /* '' */
.icon-resize-small:before { content: '\e82b'; } /* '' */
.icon-move:before { content: '\e82c'; } /* '' */
.icon-resize-horizontal:before { content: '\e82d'; } /* '' */
.icon-resize-vertical:before { content: '\e82e'; } /* '' */
.icon-zoom-in:before { content: '\e82f'; } /* '' */
.icon-block:before { content: '\e830'; } /* '' */
.icon-zoom-out:before { content: '\e831'; } /* '' */
.icon-lightbulb:before { content: '\e832'; } /* '' */
.icon-clock:before { content: '\e833'; } /* '' */
.icon-volume-up:before { content: '\e834'; } /* '' */
.icon-volume-down:before { content: '\e835'; } /* '' */
.icon-volume-off:before { content: '\e836'; } /* '' */
.icon-mute:before { content: '\e837'; } /* '' */
.icon-mic:before { content: '\e838'; } /* '' */
.icon-endtime:before { content: '\e839'; } /* '' */
.icon-starttime:before { content: '\e83a'; } /* '' */
.icon-calendar-empty:before { content: '\e83b'; } /* '' */
.icon-calendar:before { content: '\e83c'; } /* '' */
.icon-wrench:before { content: '\e83d'; } /* '' */
.icon-sliders:before { content: '\e83e'; } /* '' */
.icon-services:before { content: '\e83f'; } /* '' */
.icon-service:before { content: '\e840'; } /* '' */
.icon-phone:before { content: '\e841'; } /* '' */
.icon-file-pdf:before { content: '\e842'; } /* '' */
.icon-file-word:before { content: '\e843'; } /* '' */
.icon-file-excel:before { content: '\e844'; } /* '' */
.icon-doc-text:before { content: '\e845'; } /* '' */
.icon-trash:before { content: '\e846'; } /* '' */
.icon-comment-empty:before { content: '\e847'; } /* '' */
.icon-comment:before { content: '\e848'; } /* '' */
.icon-chat:before { content: '\e849'; } /* '' */
.icon-chat-empty:before { content: '\e84a'; } /* '' */
.icon-bell:before { content: '\e84b'; } /* '' */
.icon-bell-alt:before { content: '\e84c'; } /* '' */
.icon-attention-alt:before { content: '\e84d'; } /* '' */
.icon-print:before { content: '\e84e'; } /* '' */
.icon-edit:before { content: '\e84f'; } /* '' */
.icon-forward:before { content: '\e850'; } /* '' */
.icon-reply:before { content: '\e851'; } /* '' */
.icon-reply-all:before { content: '\e852'; } /* '' */
.icon-eye:before { content: '\e853'; } /* '' */
.icon-tag:before { content: '\e854'; } /* '' */
.icon-tags:before { content: '\e855'; } /* '' */
.icon-lock-open-alt:before { content: '\e856'; } /* '' */
.icon-lock-open:before { content: '\e857'; } /* '' */
.icon-lock:before { content: '\e858'; } /* '' */
.icon-home:before { content: '\e859'; } /* '' */
.icon-info:before { content: '\e85a'; } /* '' */
.icon-help:before { content: '\e85b'; } /* '' */
.icon-search:before { content: '\e85c'; } /* '' */
.icon-flapping:before { content: '\e85d'; } /* '' */
.icon-rewind:before { content: '\e85e'; } /* '' */
.icon-chart-line:before { content: '\e85f'; } /* '' */
.icon-bell-off:before { content: '\e860'; } /* '' */
.icon-bell-off-empty:before { content: '\e861'; } /* '' */
.icon-plug:before { content: '\e862'; } /* '' */
.icon-eye-off:before { content: '\e863'; } /* '' */
.icon-reschedule:before { content: '\e864'; } /* '' */
.icon-cw:before { content: '\e865'; } /* '' */
.icon-host:before { content: '\e866'; } /* '' */
.icon-thumbs-up:before { content: '\e867'; } /* '' */
.icon-thumbs-down:before { content: '\e868'; } /* '' */
.icon-spinner:before { content: '\e869'; } /* '' */
.icon-attach:before { content: '\e86a'; } /* '' */
.icon-keyboard:before { content: '\e86b'; } /* '' */
.icon-menu:before { content: '\e86c'; } /* '' */
.icon-wifi:before { content: '\e86d'; } /* '' */
.icon-moon:before { content: '\e86e'; } /* '' */
.icon-chart-pie:before { content: '\e86f'; } /* '' */
.icon-chart-area:before { content: '\e870'; } /* '' */
.icon-chart-bar:before { content: '\e871'; } /* '' */
.icon-beaker:before { content: '\e872'; } /* '' */
.icon-magic:before { content: '\e873'; } /* '' */

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,117 @@
.icon-dashboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-minus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-git { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
.icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-gauge { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }
.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80e;&nbsp;'); }
.icon-sort-name-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
.icon-sort-name-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
.icon-megaphone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
.icon-bug { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&nbsp;'); }
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe813;&nbsp;'); }
.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe814;&nbsp;'); }
.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe815;&nbsp;'); }
.icon-book { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
.icon-paste { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
.icon-scissors { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe818;&nbsp;'); }
.icon-globe { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe819;&nbsp;'); }
.icon-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
.icon-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
.icon-barchart { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
.icon-down-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
.icon-up-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&nbsp;'); }
.icon-left-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81f;&nbsp;'); }
.icon-right-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe820;&nbsp;'); }
.icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
.icon-right-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe822;&nbsp;'); }
.icon-up-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.icon-up-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe825;&nbsp;'); }
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe826;&nbsp;'); }
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe827;&nbsp;'); }
.icon-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe828;&nbsp;'); }
.icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe829;&nbsp;'); }
.icon-resize-full { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82a;&nbsp;'); }
.icon-resize-small { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82b;&nbsp;'); }
.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82c;&nbsp;'); }
.icon-resize-horizontal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82d;&nbsp;'); }
.icon-resize-vertical { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82e;&nbsp;'); }
.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82f;&nbsp;'); }
.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe830;&nbsp;'); }
.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe831;&nbsp;'); }
.icon-lightbulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe833;&nbsp;'); }
.icon-volume-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
.icon-volume-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe835;&nbsp;'); }
.icon-volume-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe836;&nbsp;'); }
.icon-mute { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe837;&nbsp;'); }
.icon-mic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe838;&nbsp;'); }
.icon-endtime { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe839;&nbsp;'); }
.icon-starttime { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83a;&nbsp;'); }
.icon-calendar-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83b;&nbsp;'); }
.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83c;&nbsp;'); }
.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83d;&nbsp;'); }
.icon-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83e;&nbsp;'); }
.icon-services { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83f;&nbsp;'); }
.icon-service { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe840;&nbsp;'); }
.icon-phone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe841;&nbsp;'); }
.icon-file-pdf { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe842;&nbsp;'); }
.icon-file-word { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe843;&nbsp;'); }
.icon-file-excel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe844;&nbsp;'); }
.icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe845;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe846;&nbsp;'); }
.icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe847;&nbsp;'); }
.icon-comment { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe848;&nbsp;'); }
.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe849;&nbsp;'); }
.icon-chat-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84a;&nbsp;'); }
.icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84b;&nbsp;'); }
.icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84c;&nbsp;'); }
.icon-attention-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84d;&nbsp;'); }
.icon-print { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84e;&nbsp;'); }
.icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84f;&nbsp;'); }
.icon-forward { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe850;&nbsp;'); }
.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe851;&nbsp;'); }
.icon-reply-all { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe852;&nbsp;'); }
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe853;&nbsp;'); }
.icon-tag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe854;&nbsp;'); }
.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe855;&nbsp;'); }
.icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe856;&nbsp;'); }
.icon-lock-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe857;&nbsp;'); }
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe858;&nbsp;'); }
.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe859;&nbsp;'); }
.icon-info { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85a;&nbsp;'); }
.icon-help { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85b;&nbsp;'); }
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85c;&nbsp;'); }
.icon-flapping { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85d;&nbsp;'); }
.icon-rewind { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85e;&nbsp;'); }
.icon-chart-line { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85f;&nbsp;'); }
.icon-bell-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe860;&nbsp;'); }
.icon-bell-off-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe861;&nbsp;'); }
.icon-plug { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe862;&nbsp;'); }
.icon-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe863;&nbsp;'); }
.icon-reschedule { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe864;&nbsp;'); }
.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe865;&nbsp;'); }
.icon-host { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe866;&nbsp;'); }
.icon-thumbs-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe867;&nbsp;'); }
.icon-thumbs-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe868;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe869;&nbsp;'); }
.icon-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86a;&nbsp;'); }
.icon-keyboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86b;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86c;&nbsp;'); }
.icon-wifi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86d;&nbsp;'); }
.icon-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86e;&nbsp;'); }
.icon-chart-pie { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86f;&nbsp;'); }
.icon-chart-area { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe870;&nbsp;'); }
.icon-chart-bar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe871;&nbsp;'); }
.icon-beaker { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe872;&nbsp;'); }
.icon-magic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe873;&nbsp;'); }

View File

@ -0,0 +1,128 @@
[class^="icon-"], [class*=" icon-"] {
font-family: 'ifont';
font-style: normal;
font-weight: normal;
/* fix buttons height */
line-height: 1em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
}
.icon-dashboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe800;&nbsp;'); }
.icon-user { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe801;&nbsp;'); }
.icon-users { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe802;&nbsp;'); }
.icon-ok { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe803;&nbsp;'); }
.icon-cancel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe804;&nbsp;'); }
.icon-plus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe805;&nbsp;'); }
.icon-minus { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-folder-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-download { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-git { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-cubes { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80b;&nbsp;'); }
.icon-database { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80c;&nbsp;'); }
.icon-gauge { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80d;&nbsp;'); }
.icon-sitemap { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80e;&nbsp;'); }
.icon-sort-name-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80f;&nbsp;'); }
.icon-sort-name-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe810;&nbsp;'); }
.icon-megaphone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe811;&nbsp;'); }
.icon-bug { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe812;&nbsp;'); }
.icon-tasks { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe813;&nbsp;'); }
.icon-filter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe814;&nbsp;'); }
.icon-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe815;&nbsp;'); }
.icon-book { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe816;&nbsp;'); }
.icon-paste { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe817;&nbsp;'); }
.icon-scissors { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe818;&nbsp;'); }
.icon-globe { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe819;&nbsp;'); }
.icon-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81a;&nbsp;'); }
.icon-flash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81b;&nbsp;'); }
.icon-barchart { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81c;&nbsp;'); }
.icon-down-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81d;&nbsp;'); }
.icon-up-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81e;&nbsp;'); }
.icon-left-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe81f;&nbsp;'); }
.icon-right-dir { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe820;&nbsp;'); }
.icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe821;&nbsp;'); }
.icon-right-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe822;&nbsp;'); }
.icon-up-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.icon-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.icon-up-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe825;&nbsp;'); }
.icon-right-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe826;&nbsp;'); }
.icon-left-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe827;&nbsp;'); }
.icon-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe828;&nbsp;'); }
.icon-resize-full-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe829;&nbsp;'); }
.icon-resize-full { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82a;&nbsp;'); }
.icon-resize-small { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82b;&nbsp;'); }
.icon-move { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82c;&nbsp;'); }
.icon-resize-horizontal { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82d;&nbsp;'); }
.icon-resize-vertical { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82e;&nbsp;'); }
.icon-zoom-in { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe82f;&nbsp;'); }
.icon-block { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe830;&nbsp;'); }
.icon-zoom-out { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe831;&nbsp;'); }
.icon-lightbulb { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-clock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe833;&nbsp;'); }
.icon-volume-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
.icon-volume-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe835;&nbsp;'); }
.icon-volume-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe836;&nbsp;'); }
.icon-mute { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe837;&nbsp;'); }
.icon-mic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe838;&nbsp;'); }
.icon-endtime { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe839;&nbsp;'); }
.icon-starttime { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83a;&nbsp;'); }
.icon-calendar-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83b;&nbsp;'); }
.icon-calendar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83c;&nbsp;'); }
.icon-wrench { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83d;&nbsp;'); }
.icon-sliders { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83e;&nbsp;'); }
.icon-services { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe83f;&nbsp;'); }
.icon-service { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe840;&nbsp;'); }
.icon-phone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe841;&nbsp;'); }
.icon-file-pdf { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe842;&nbsp;'); }
.icon-file-word { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe843;&nbsp;'); }
.icon-file-excel { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe844;&nbsp;'); }
.icon-doc-text { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe845;&nbsp;'); }
.icon-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe846;&nbsp;'); }
.icon-comment-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe847;&nbsp;'); }
.icon-comment { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe848;&nbsp;'); }
.icon-chat { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe849;&nbsp;'); }
.icon-chat-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84a;&nbsp;'); }
.icon-bell { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84b;&nbsp;'); }
.icon-bell-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84c;&nbsp;'); }
.icon-attention-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84d;&nbsp;'); }
.icon-print { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84e;&nbsp;'); }
.icon-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe84f;&nbsp;'); }
.icon-forward { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe850;&nbsp;'); }
.icon-reply { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe851;&nbsp;'); }
.icon-reply-all { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe852;&nbsp;'); }
.icon-eye { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe853;&nbsp;'); }
.icon-tag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe854;&nbsp;'); }
.icon-tags { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe855;&nbsp;'); }
.icon-lock-open-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe856;&nbsp;'); }
.icon-lock-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe857;&nbsp;'); }
.icon-lock { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe858;&nbsp;'); }
.icon-home { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe859;&nbsp;'); }
.icon-info { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85a;&nbsp;'); }
.icon-help { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85b;&nbsp;'); }
.icon-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85c;&nbsp;'); }
.icon-flapping { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85d;&nbsp;'); }
.icon-rewind { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85e;&nbsp;'); }
.icon-chart-line { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe85f;&nbsp;'); }
.icon-bell-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe860;&nbsp;'); }
.icon-bell-off-empty { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe861;&nbsp;'); }
.icon-plug { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe862;&nbsp;'); }
.icon-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe863;&nbsp;'); }
.icon-reschedule { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe864;&nbsp;'); }
.icon-cw { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe865;&nbsp;'); }
.icon-host { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe866;&nbsp;'); }
.icon-thumbs-up { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe867;&nbsp;'); }
.icon-thumbs-down { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe868;&nbsp;'); }
.icon-spinner { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe869;&nbsp;'); }
.icon-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86a;&nbsp;'); }
.icon-keyboard { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86b;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86c;&nbsp;'); }
.icon-wifi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86d;&nbsp;'); }
.icon-moon { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86e;&nbsp;'); }
.icon-chart-pie { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe86f;&nbsp;'); }
.icon-chart-area { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe870;&nbsp;'); }
.icon-chart-bar { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe871;&nbsp;'); }
.icon-beaker { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe872;&nbsp;'); }
.icon-magic { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe873;&nbsp;'); }

View File

@ -0,0 +1,168 @@
@font-face {
font-family: 'ifont';
src: url('../font/ifont.eot?81587324');
src: url('../font/ifont.eot?81587324#iefix') format('embedded-opentype'),
url('../font/ifont.woff?81587324') format('woff'),
url('../font/ifont.ttf?81587324') format('truetype'),
url('../font/ifont.svg?81587324#ifont') format('svg');
font-weight: normal;
font-style: normal;
}
/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */
/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */
/*
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'ifont';
src: url('../font/ifont.svg?81587324#ifont') format('svg');
}
}
*/
[class^="icon-"]:before, [class*=" icon-"]:before {
font-family: "ifont";
font-style: normal;
font-weight: normal;
speak: none;
display: inline-block;
text-decoration: inherit;
width: 1em;
margin-right: .2em;
text-align: center;
/* opacity: .8; */
/* For safety - reset parent styles, that can break glyph codes*/
font-variant: normal;
text-transform: none;
/* fix buttons height, for twitter bootstrap */
line-height: 1em;
/* Animation center compensation - margins should be symmetric */
/* remove if not needed */
margin-left: .2em;
/* you can be more comfortable with increased icons size */
/* font-size: 120%; */
/* Uncomment for 3D effect */
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
}
.icon-dashboard:before { content: '\e800'; } /* '' */
.icon-user:before { content: '\e801'; } /* '' */
.icon-users:before { content: '\e802'; } /* '' */
.icon-ok:before { content: '\e803'; } /* '' */
.icon-cancel:before { content: '\e804'; } /* '' */
.icon-plus:before { content: '\e805'; } /* '' */
.icon-minus:before { content: '\e806'; } /* '' */
.icon-folder-empty:before { content: '\e807'; } /* '' */
.icon-download:before { content: '\e808'; } /* '' */
.icon-upload:before { content: '\e809'; } /* '' */
.icon-git:before { content: '\e80a'; } /* '' */
.icon-cubes:before { content: '\e80b'; } /* '' */
.icon-database:before { content: '\e80c'; } /* '' */
.icon-gauge:before { content: '\e80d'; } /* '' */
.icon-sitemap:before { content: '\e80e'; } /* '' */
.icon-sort-name-up:before { content: '\e80f'; } /* '' */
.icon-sort-name-down:before { content: '\e810'; } /* '' */
.icon-megaphone:before { content: '\e811'; } /* '' */
.icon-bug:before { content: '\e812'; } /* '' */
.icon-tasks:before { content: '\e813'; } /* '' */
.icon-filter:before { content: '\e814'; } /* '' */
.icon-off:before { content: '\e815'; } /* '' */
.icon-book:before { content: '\e816'; } /* '' */
.icon-paste:before { content: '\e817'; } /* '' */
.icon-scissors:before { content: '\e818'; } /* '' */
.icon-globe:before { content: '\e819'; } /* '' */
.icon-cloud:before { content: '\e81a'; } /* '' */
.icon-flash:before { content: '\e81b'; } /* '' */
.icon-barchart:before { content: '\e81c'; } /* '' */
.icon-down-dir:before { content: '\e81d'; } /* '' */
.icon-up-dir:before { content: '\e81e'; } /* '' */
.icon-left-dir:before { content: '\e81f'; } /* '' */
.icon-right-dir:before { content: '\e820'; } /* '' */
.icon-down-open:before { content: '\e821'; } /* '' */
.icon-right-open:before { content: '\e822'; } /* '' */
.icon-up-open:before { content: '\e823'; } /* '' */
.icon-left-open:before { content: '\e824'; } /* '' */
.icon-up-big:before { content: '\e825'; } /* '' */
.icon-right-big:before { content: '\e826'; } /* '' */
.icon-left-big:before { content: '\e827'; } /* '' */
.icon-down-big:before { content: '\e828'; } /* '' */
.icon-resize-full-alt:before { content: '\e829'; } /* '' */
.icon-resize-full:before { content: '\e82a'; } /* '' */
.icon-resize-small:before { content: '\e82b'; } /* '' */
.icon-move:before { content: '\e82c'; } /* '' */
.icon-resize-horizontal:before { content: '\e82d'; } /* '' */
.icon-resize-vertical:before { content: '\e82e'; } /* '' */
.icon-zoom-in:before { content: '\e82f'; } /* '' */
.icon-block:before { content: '\e830'; } /* '' */
.icon-zoom-out:before { content: '\e831'; } /* '' */
.icon-lightbulb:before { content: '\e832'; } /* '' */
.icon-clock:before { content: '\e833'; } /* '' */
.icon-volume-up:before { content: '\e834'; } /* '' */
.icon-volume-down:before { content: '\e835'; } /* '' */
.icon-volume-off:before { content: '\e836'; } /* '' */
.icon-mute:before { content: '\e837'; } /* '' */
.icon-mic:before { content: '\e838'; } /* '' */
.icon-endtime:before { content: '\e839'; } /* '' */
.icon-starttime:before { content: '\e83a'; } /* '' */
.icon-calendar-empty:before { content: '\e83b'; } /* '' */
.icon-calendar:before { content: '\e83c'; } /* '' */
.icon-wrench:before { content: '\e83d'; } /* '' */
.icon-sliders:before { content: '\e83e'; } /* '' */
.icon-services:before { content: '\e83f'; } /* '' */
.icon-service:before { content: '\e840'; } /* '' */
.icon-phone:before { content: '\e841'; } /* '' */
.icon-file-pdf:before { content: '\e842'; } /* '' */
.icon-file-word:before { content: '\e843'; } /* '' */
.icon-file-excel:before { content: '\e844'; } /* '' */
.icon-doc-text:before { content: '\e845'; } /* '' */
.icon-trash:before { content: '\e846'; } /* '' */
.icon-comment-empty:before { content: '\e847'; } /* '' */
.icon-comment:before { content: '\e848'; } /* '' */
.icon-chat:before { content: '\e849'; } /* '' */
.icon-chat-empty:before { content: '\e84a'; } /* '' */
.icon-bell:before { content: '\e84b'; } /* '' */
.icon-bell-alt:before { content: '\e84c'; } /* '' */
.icon-attention-alt:before { content: '\e84d'; } /* '' */
.icon-print:before { content: '\e84e'; } /* '' */
.icon-edit:before { content: '\e84f'; } /* '' */
.icon-forward:before { content: '\e850'; } /* '' */
.icon-reply:before { content: '\e851'; } /* '' */
.icon-reply-all:before { content: '\e852'; } /* '' */
.icon-eye:before { content: '\e853'; } /* '' */
.icon-tag:before { content: '\e854'; } /* '' */
.icon-tags:before { content: '\e855'; } /* '' */
.icon-lock-open-alt:before { content: '\e856'; } /* '' */
.icon-lock-open:before { content: '\e857'; } /* '' */
.icon-lock:before { content: '\e858'; } /* '' */
.icon-home:before { content: '\e859'; } /* '' */
.icon-info:before { content: '\e85a'; } /* '' */
.icon-help:before { content: '\e85b'; } /* '' */
.icon-search:before { content: '\e85c'; } /* '' */
.icon-flapping:before { content: '\e85d'; } /* '' */
.icon-rewind:before { content: '\e85e'; } /* '' */
.icon-chart-line:before { content: '\e85f'; } /* '' */
.icon-bell-off:before { content: '\e860'; } /* '' */
.icon-bell-off-empty:before { content: '\e861'; } /* '' */
.icon-plug:before { content: '\e862'; } /* '' */
.icon-eye-off:before { content: '\e863'; } /* '' */
.icon-reschedule:before { content: '\e864'; } /* '' */
.icon-cw:before { content: '\e865'; } /* '' */
.icon-host:before { content: '\e866'; } /* '' */
.icon-thumbs-up:before { content: '\e867'; } /* '' */
.icon-thumbs-down:before { content: '\e868'; } /* '' */
.icon-spinner:before { content: '\e869'; } /* '' */
.icon-attach:before { content: '\e86a'; } /* '' */
.icon-keyboard:before { content: '\e86b'; } /* '' */
.icon-menu:before { content: '\e86c'; } /* '' */
.icon-wifi:before { content: '\e86d'; } /* '' */
.icon-moon:before { content: '\e86e'; } /* '' */
.icon-chart-pie:before { content: '\e86f'; } /* '' */
.icon-chart-area:before { content: '\e870'; } /* '' */
.icon-chart-bar:before { content: '\e871'; } /* '' */
.icon-beaker:before { content: '\e872'; } /* '' */
.icon-magic:before { content: '\e873'; } /* '' */

View File

@ -0,0 +1,434 @@
<!DOCTYPE html>
<html>
<head><!--[if lt IE 9]><script language="javascript" type="text/javascript" src="//html5shim.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
<meta charset="UTF-8"><style>/*
* Bootstrap v2.2.1
*
* Copyright 2012 Twitter, Inc
* Licensed under the Apache License v2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Designed and built with all the love in the world @twitter by @mdo and @fat.
*/
.clearfix {
*zoom: 1;
}
.clearfix:before,
.clearfix:after {
display: table;
content: "";
line-height: 0;
}
.clearfix:after {
clear: both;
}
html {
font-size: 100%;
-webkit-text-size-adjust: 100%;
-ms-text-size-adjust: 100%;
}
a:focus {
outline: thin dotted #333;
outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px;
}
a:hover,
a:active {
outline: 0;
}
button,
input,
select,
textarea {
margin: 0;
font-size: 100%;
vertical-align: middle;
}
button,
input {
*overflow: visible;
line-height: normal;
}
button::-moz-focus-inner,
input::-moz-focus-inner {
padding: 0;
border: 0;
}
body {
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 14px;
line-height: 20px;
color: #333;
background-color: #fff;
}
a {
color: #08c;
text-decoration: none;
}
a:hover {
color: #005580;
text-decoration: underline;
}
.row {
margin-left: -20px;
*zoom: 1;
}
.row:before,
.row:after {
display: table;
content: "";
line-height: 0;
}
.row:after {
clear: both;
}
[class*="span"] {
float: left;
min-height: 1px;
margin-left: 20px;
}
.container,
.navbar-static-top .container,
.navbar-fixed-top .container,
.navbar-fixed-bottom .container {
width: 940px;
}
.span12 {
width: 940px;
}
.span11 {
width: 860px;
}
.span10 {
width: 780px;
}
.span9 {
width: 700px;
}
.span8 {
width: 620px;
}
.span7 {
width: 540px;
}
.span6 {
width: 460px;
}
.span5 {
width: 380px;
}
.span4 {
width: 300px;
}
.span3 {
width: 220px;
}
.span2 {
width: 140px;
}
.span1 {
width: 60px;
}
[class*="span"].pull-right,
.row-fluid [class*="span"].pull-right {
float: right;
}
.container {
margin-right: auto;
margin-left: auto;
*zoom: 1;
}
.container:before,
.container:after {
display: table;
content: "";
line-height: 0;
}
.container:after {
clear: both;
}
p {
margin: 0 0 10px;
}
.lead {
margin-bottom: 20px;
font-size: 21px;
font-weight: 200;
line-height: 30px;
}
small {
font-size: 85%;
}
h1 {
margin: 10px 0;
font-family: inherit;
font-weight: bold;
line-height: 20px;
color: inherit;
text-rendering: optimizelegibility;
}
h1 small {
font-weight: normal;
line-height: 1;
color: #999;
}
h1 {
line-height: 40px;
}
h1 {
font-size: 38.5px;
}
h1 small {
font-size: 24.5px;
}
body {
margin-top: 90px;
}
.header {
position: fixed;
top: 0;
left: 50%;
margin-left: -480px;
background-color: #fff;
border-bottom: 1px solid #ddd;
padding-top: 10px;
z-index: 10;
}
.footer {
color: #ddd;
font-size: 12px;
text-align: center;
margin-top: 20px;
}
.footer a {
color: #ccc;
text-decoration: underline;
}
.the-icons {
font-size: 14px;
line-height: 24px;
}
.switch {
position: absolute;
right: 0;
bottom: 10px;
color: #666;
}
.switch input {
margin-right: 0.3em;
}
.codesOn .i-name {
display: none;
}
.codesOn .i-code {
display: inline;
}
.i-code {
display: none;
}
</style>
<link rel="stylesheet" href="css/ifont.css">
<link rel="stylesheet" href="css/animation.css"><!--[if IE 7]><link rel="stylesheet" href="css/ifont-ie7.css"><![endif]-->
<script>
function toggleCodes(on) {
var obj = document.getElementById('icons');
if (on) {
obj.className += ' codesOn';
} else {
obj.className = obj.className.replace(' codesOn', '');
}
}
</script>
</head>
<body>
<div class="container header">
<h1>
ifont
<small>font demo</small>
</h1>
<label class="switch">
<input type="checkbox" onclick="toggleCodes(this.checked)">show codes
</label>
</div>
<div id="icons" class="container">
<div class="row">
<div title="Code: 0xe800" class="the-icons span3"><i class="icon-dashboard"></i> <span class="i-name">icon-dashboard</span><span class="i-code">0xe800</span></div>
<div title="Code: 0xe801" class="the-icons span3"><i class="icon-user"></i> <span class="i-name">icon-user</span><span class="i-code">0xe801</span></div>
<div title="Code: 0xe802" class="the-icons span3"><i class="icon-users"></i> <span class="i-name">icon-users</span><span class="i-code">0xe802</span></div>
<div title="Code: 0xe803" class="the-icons span3"><i class="icon-ok"></i> <span class="i-name">icon-ok</span><span class="i-code">0xe803</span></div>
</div>
<div class="row">
<div title="Code: 0xe804" class="the-icons span3"><i class="icon-cancel"></i> <span class="i-name">icon-cancel</span><span class="i-code">0xe804</span></div>
<div title="Code: 0xe805" class="the-icons span3"><i class="icon-plus"></i> <span class="i-name">icon-plus</span><span class="i-code">0xe805</span></div>
<div title="Code: 0xe806" class="the-icons span3"><i class="icon-minus"></i> <span class="i-name">icon-minus</span><span class="i-code">0xe806</span></div>
<div title="Code: 0xe807" class="the-icons span3"><i class="icon-folder-empty"></i> <span class="i-name">icon-folder-empty</span><span class="i-code">0xe807</span></div>
</div>
<div class="row">
<div title="Code: 0xe808" class="the-icons span3"><i class="icon-download"></i> <span class="i-name">icon-download</span><span class="i-code">0xe808</span></div>
<div title="Code: 0xe809" class="the-icons span3"><i class="icon-upload"></i> <span class="i-name">icon-upload</span><span class="i-code">0xe809</span></div>
<div title="Code: 0xe80a" class="the-icons span3"><i class="icon-git"></i> <span class="i-name">icon-git</span><span class="i-code">0xe80a</span></div>
<div title="Code: 0xe80b" class="the-icons span3"><i class="icon-cubes"></i> <span class="i-name">icon-cubes</span><span class="i-code">0xe80b</span></div>
</div>
<div class="row">
<div title="Code: 0xe80c" class="the-icons span3"><i class="icon-database"></i> <span class="i-name">icon-database</span><span class="i-code">0xe80c</span></div>
<div title="Code: 0xe80d" class="the-icons span3"><i class="icon-gauge"></i> <span class="i-name">icon-gauge</span><span class="i-code">0xe80d</span></div>
<div title="Code: 0xe80e" class="the-icons span3"><i class="icon-sitemap"></i> <span class="i-name">icon-sitemap</span><span class="i-code">0xe80e</span></div>
<div title="Code: 0xe80f" class="the-icons span3"><i class="icon-sort-name-up"></i> <span class="i-name">icon-sort-name-up</span><span class="i-code">0xe80f</span></div>
</div>
<div class="row">
<div title="Code: 0xe810" class="the-icons span3"><i class="icon-sort-name-down"></i> <span class="i-name">icon-sort-name-down</span><span class="i-code">0xe810</span></div>
<div title="Code: 0xe811" class="the-icons span3"><i class="icon-megaphone"></i> <span class="i-name">icon-megaphone</span><span class="i-code">0xe811</span></div>
<div title="Code: 0xe812" class="the-icons span3"><i class="icon-bug"></i> <span class="i-name">icon-bug</span><span class="i-code">0xe812</span></div>
<div title="Code: 0xe813" class="the-icons span3"><i class="icon-tasks"></i> <span class="i-name">icon-tasks</span><span class="i-code">0xe813</span></div>
</div>
<div class="row">
<div title="Code: 0xe814" class="the-icons span3"><i class="icon-filter"></i> <span class="i-name">icon-filter</span><span class="i-code">0xe814</span></div>
<div title="Code: 0xe815" class="the-icons span3"><i class="icon-off"></i> <span class="i-name">icon-off</span><span class="i-code">0xe815</span></div>
<div title="Code: 0xe816" class="the-icons span3"><i class="icon-book"></i> <span class="i-name">icon-book</span><span class="i-code">0xe816</span></div>
<div title="Code: 0xe817" class="the-icons span3"><i class="icon-paste"></i> <span class="i-name">icon-paste</span><span class="i-code">0xe817</span></div>
</div>
<div class="row">
<div title="Code: 0xe818" class="the-icons span3"><i class="icon-scissors"></i> <span class="i-name">icon-scissors</span><span class="i-code">0xe818</span></div>
<div title="Code: 0xe819" class="the-icons span3"><i class="icon-globe"></i> <span class="i-name">icon-globe</span><span class="i-code">0xe819</span></div>
<div title="Code: 0xe81a" class="the-icons span3"><i class="icon-cloud"></i> <span class="i-name">icon-cloud</span><span class="i-code">0xe81a</span></div>
<div title="Code: 0xe81b" class="the-icons span3"><i class="icon-flash"></i> <span class="i-name">icon-flash</span><span class="i-code">0xe81b</span></div>
</div>
<div class="row">
<div title="Code: 0xe81c" class="the-icons span3"><i class="icon-barchart"></i> <span class="i-name">icon-barchart</span><span class="i-code">0xe81c</span></div>
<div title="Code: 0xe81d" class="the-icons span3"><i class="icon-down-dir"></i> <span class="i-name">icon-down-dir</span><span class="i-code">0xe81d</span></div>
<div title="Code: 0xe81e" class="the-icons span3"><i class="icon-up-dir"></i> <span class="i-name">icon-up-dir</span><span class="i-code">0xe81e</span></div>
<div title="Code: 0xe81f" class="the-icons span3"><i class="icon-left-dir"></i> <span class="i-name">icon-left-dir</span><span class="i-code">0xe81f</span></div>
</div>
<div class="row">
<div title="Code: 0xe820" class="the-icons span3"><i class="icon-right-dir"></i> <span class="i-name">icon-right-dir</span><span class="i-code">0xe820</span></div>
<div title="Code: 0xe821" class="the-icons span3"><i class="icon-down-open"></i> <span class="i-name">icon-down-open</span><span class="i-code">0xe821</span></div>
<div title="Code: 0xe822" class="the-icons span3"><i class="icon-right-open"></i> <span class="i-name">icon-right-open</span><span class="i-code">0xe822</span></div>
<div title="Code: 0xe823" class="the-icons span3"><i class="icon-up-open"></i> <span class="i-name">icon-up-open</span><span class="i-code">0xe823</span></div>
</div>
<div class="row">
<div title="Code: 0xe824" class="the-icons span3"><i class="icon-left-open"></i> <span class="i-name">icon-left-open</span><span class="i-code">0xe824</span></div>
<div title="Code: 0xe825" class="the-icons span3"><i class="icon-up-big"></i> <span class="i-name">icon-up-big</span><span class="i-code">0xe825</span></div>
<div title="Code: 0xe826" class="the-icons span3"><i class="icon-right-big"></i> <span class="i-name">icon-right-big</span><span class="i-code">0xe826</span></div>
<div title="Code: 0xe827" class="the-icons span3"><i class="icon-left-big"></i> <span class="i-name">icon-left-big</span><span class="i-code">0xe827</span></div>
</div>
<div class="row">
<div title="Code: 0xe828" class="the-icons span3"><i class="icon-down-big"></i> <span class="i-name">icon-down-big</span><span class="i-code">0xe828</span></div>
<div title="Code: 0xe829" class="the-icons span3"><i class="icon-resize-full-alt"></i> <span class="i-name">icon-resize-full-alt</span><span class="i-code">0xe829</span></div>
<div title="Code: 0xe82a" class="the-icons span3"><i class="icon-resize-full"></i> <span class="i-name">icon-resize-full</span><span class="i-code">0xe82a</span></div>
<div title="Code: 0xe82b" class="the-icons span3"><i class="icon-resize-small"></i> <span class="i-name">icon-resize-small</span><span class="i-code">0xe82b</span></div>
</div>
<div class="row">
<div title="Code: 0xe82c" class="the-icons span3"><i class="icon-move"></i> <span class="i-name">icon-move</span><span class="i-code">0xe82c</span></div>
<div title="Code: 0xe82d" class="the-icons span3"><i class="icon-resize-horizontal"></i> <span class="i-name">icon-resize-horizontal</span><span class="i-code">0xe82d</span></div>
<div title="Code: 0xe82e" class="the-icons span3"><i class="icon-resize-vertical"></i> <span class="i-name">icon-resize-vertical</span><span class="i-code">0xe82e</span></div>
<div title="Code: 0xe82f" class="the-icons span3"><i class="icon-zoom-in"></i> <span class="i-name">icon-zoom-in</span><span class="i-code">0xe82f</span></div>
</div>
<div class="row">
<div title="Code: 0xe830" class="the-icons span3"><i class="icon-block"></i> <span class="i-name">icon-block</span><span class="i-code">0xe830</span></div>
<div title="Code: 0xe831" class="the-icons span3"><i class="icon-zoom-out"></i> <span class="i-name">icon-zoom-out</span><span class="i-code">0xe831</span></div>
<div title="Code: 0xe832" class="the-icons span3"><i class="icon-lightbulb"></i> <span class="i-name">icon-lightbulb</span><span class="i-code">0xe832</span></div>
<div title="Code: 0xe833" class="the-icons span3"><i class="icon-clock"></i> <span class="i-name">icon-clock</span><span class="i-code">0xe833</span></div>
</div>
<div class="row">
<div title="Code: 0xe834" class="the-icons span3"><i class="icon-volume-up"></i> <span class="i-name">icon-volume-up</span><span class="i-code">0xe834</span></div>
<div title="Code: 0xe835" class="the-icons span3"><i class="icon-volume-down"></i> <span class="i-name">icon-volume-down</span><span class="i-code">0xe835</span></div>
<div title="Code: 0xe836" class="the-icons span3"><i class="icon-volume-off"></i> <span class="i-name">icon-volume-off</span><span class="i-code">0xe836</span></div>
<div title="Code: 0xe837" class="the-icons span3"><i class="icon-mute"></i> <span class="i-name">icon-mute</span><span class="i-code">0xe837</span></div>
</div>
<div class="row">
<div title="Code: 0xe838" class="the-icons span3"><i class="icon-mic"></i> <span class="i-name">icon-mic</span><span class="i-code">0xe838</span></div>
<div title="Code: 0xe839" class="the-icons span3"><i class="icon-endtime"></i> <span class="i-name">icon-endtime</span><span class="i-code">0xe839</span></div>
<div title="Code: 0xe83a" class="the-icons span3"><i class="icon-starttime"></i> <span class="i-name">icon-starttime</span><span class="i-code">0xe83a</span></div>
<div title="Code: 0xe83b" class="the-icons span3"><i class="icon-calendar-empty"></i> <span class="i-name">icon-calendar-empty</span><span class="i-code">0xe83b</span></div>
</div>
<div class="row">
<div title="Code: 0xe83c" class="the-icons span3"><i class="icon-calendar"></i> <span class="i-name">icon-calendar</span><span class="i-code">0xe83c</span></div>
<div title="Code: 0xe83d" class="the-icons span3"><i class="icon-wrench"></i> <span class="i-name">icon-wrench</span><span class="i-code">0xe83d</span></div>
<div title="Code: 0xe83e" class="the-icons span3"><i class="icon-sliders"></i> <span class="i-name">icon-sliders</span><span class="i-code">0xe83e</span></div>
<div title="Code: 0xe83f" class="the-icons span3"><i class="icon-services"></i> <span class="i-name">icon-services</span><span class="i-code">0xe83f</span></div>
</div>
<div class="row">
<div title="Code: 0xe840" class="the-icons span3"><i class="icon-service"></i> <span class="i-name">icon-service</span><span class="i-code">0xe840</span></div>
<div title="Code: 0xe841" class="the-icons span3"><i class="icon-phone"></i> <span class="i-name">icon-phone</span><span class="i-code">0xe841</span></div>
<div title="Code: 0xe842" class="the-icons span3"><i class="icon-file-pdf"></i> <span class="i-name">icon-file-pdf</span><span class="i-code">0xe842</span></div>
<div title="Code: 0xe843" class="the-icons span3"><i class="icon-file-word"></i> <span class="i-name">icon-file-word</span><span class="i-code">0xe843</span></div>
</div>
<div class="row">
<div title="Code: 0xe844" class="the-icons span3"><i class="icon-file-excel"></i> <span class="i-name">icon-file-excel</span><span class="i-code">0xe844</span></div>
<div title="Code: 0xe845" class="the-icons span3"><i class="icon-doc-text"></i> <span class="i-name">icon-doc-text</span><span class="i-code">0xe845</span></div>
<div title="Code: 0xe846" class="the-icons span3"><i class="icon-trash"></i> <span class="i-name">icon-trash</span><span class="i-code">0xe846</span></div>
<div title="Code: 0xe847" class="the-icons span3"><i class="icon-comment-empty"></i> <span class="i-name">icon-comment-empty</span><span class="i-code">0xe847</span></div>
</div>
<div class="row">
<div title="Code: 0xe848" class="the-icons span3"><i class="icon-comment"></i> <span class="i-name">icon-comment</span><span class="i-code">0xe848</span></div>
<div title="Code: 0xe849" class="the-icons span3"><i class="icon-chat"></i> <span class="i-name">icon-chat</span><span class="i-code">0xe849</span></div>
<div title="Code: 0xe84a" class="the-icons span3"><i class="icon-chat-empty"></i> <span class="i-name">icon-chat-empty</span><span class="i-code">0xe84a</span></div>
<div title="Code: 0xe84b" class="the-icons span3"><i class="icon-bell"></i> <span class="i-name">icon-bell</span><span class="i-code">0xe84b</span></div>
</div>
<div class="row">
<div title="Code: 0xe84c" class="the-icons span3"><i class="icon-bell-alt"></i> <span class="i-name">icon-bell-alt</span><span class="i-code">0xe84c</span></div>
<div title="Code: 0xe84d" class="the-icons span3"><i class="icon-attention-alt"></i> <span class="i-name">icon-attention-alt</span><span class="i-code">0xe84d</span></div>
<div title="Code: 0xe84e" class="the-icons span3"><i class="icon-print"></i> <span class="i-name">icon-print</span><span class="i-code">0xe84e</span></div>
<div title="Code: 0xe84f" class="the-icons span3"><i class="icon-edit"></i> <span class="i-name">icon-edit</span><span class="i-code">0xe84f</span></div>
</div>
<div class="row">
<div title="Code: 0xe850" class="the-icons span3"><i class="icon-forward"></i> <span class="i-name">icon-forward</span><span class="i-code">0xe850</span></div>
<div title="Code: 0xe851" class="the-icons span3"><i class="icon-reply"></i> <span class="i-name">icon-reply</span><span class="i-code">0xe851</span></div>
<div title="Code: 0xe852" class="the-icons span3"><i class="icon-reply-all"></i> <span class="i-name">icon-reply-all</span><span class="i-code">0xe852</span></div>
<div title="Code: 0xe853" class="the-icons span3"><i class="icon-eye"></i> <span class="i-name">icon-eye</span><span class="i-code">0xe853</span></div>
</div>
<div class="row">
<div title="Code: 0xe854" class="the-icons span3"><i class="icon-tag"></i> <span class="i-name">icon-tag</span><span class="i-code">0xe854</span></div>
<div title="Code: 0xe855" class="the-icons span3"><i class="icon-tags"></i> <span class="i-name">icon-tags</span><span class="i-code">0xe855</span></div>
<div title="Code: 0xe856" class="the-icons span3"><i class="icon-lock-open-alt"></i> <span class="i-name">icon-lock-open-alt</span><span class="i-code">0xe856</span></div>
<div title="Code: 0xe857" class="the-icons span3"><i class="icon-lock-open"></i> <span class="i-name">icon-lock-open</span><span class="i-code">0xe857</span></div>
</div>
<div class="row">
<div title="Code: 0xe858" class="the-icons span3"><i class="icon-lock"></i> <span class="i-name">icon-lock</span><span class="i-code">0xe858</span></div>
<div title="Code: 0xe859" class="the-icons span3"><i class="icon-home"></i> <span class="i-name">icon-home</span><span class="i-code">0xe859</span></div>
<div title="Code: 0xe85a" class="the-icons span3"><i class="icon-info"></i> <span class="i-name">icon-info</span><span class="i-code">0xe85a</span></div>
<div title="Code: 0xe85b" class="the-icons span3"><i class="icon-help"></i> <span class="i-name">icon-help</span><span class="i-code">0xe85b</span></div>
</div>
<div class="row">
<div title="Code: 0xe85c" class="the-icons span3"><i class="icon-search"></i> <span class="i-name">icon-search</span><span class="i-code">0xe85c</span></div>
<div title="Code: 0xe85d" class="the-icons span3"><i class="icon-flapping"></i> <span class="i-name">icon-flapping</span><span class="i-code">0xe85d</span></div>
<div title="Code: 0xe85e" class="the-icons span3"><i class="icon-rewind"></i> <span class="i-name">icon-rewind</span><span class="i-code">0xe85e</span></div>
<div title="Code: 0xe85f" class="the-icons span3"><i class="icon-chart-line"></i> <span class="i-name">icon-chart-line</span><span class="i-code">0xe85f</span></div>
</div>
<div class="row">
<div title="Code: 0xe860" class="the-icons span3"><i class="icon-bell-off"></i> <span class="i-name">icon-bell-off</span><span class="i-code">0xe860</span></div>
<div title="Code: 0xe861" class="the-icons span3"><i class="icon-bell-off-empty"></i> <span class="i-name">icon-bell-off-empty</span><span class="i-code">0xe861</span></div>
<div title="Code: 0xe862" class="the-icons span3"><i class="icon-plug"></i> <span class="i-name">icon-plug</span><span class="i-code">0xe862</span></div>
<div title="Code: 0xe863" class="the-icons span3"><i class="icon-eye-off"></i> <span class="i-name">icon-eye-off</span><span class="i-code">0xe863</span></div>
</div>
<div class="row">
<div title="Code: 0xe864" class="the-icons span3"><i class="icon-reschedule"></i> <span class="i-name">icon-reschedule</span><span class="i-code">0xe864</span></div>
<div title="Code: 0xe865" class="the-icons span3"><i class="icon-cw"></i> <span class="i-name">icon-cw</span><span class="i-code">0xe865</span></div>
<div title="Code: 0xe866" class="the-icons span3"><i class="icon-host"></i> <span class="i-name">icon-host</span><span class="i-code">0xe866</span></div>
<div title="Code: 0xe867" class="the-icons span3"><i class="icon-thumbs-up"></i> <span class="i-name">icon-thumbs-up</span><span class="i-code">0xe867</span></div>
</div>
<div class="row">
<div title="Code: 0xe868" class="the-icons span3"><i class="icon-thumbs-down"></i> <span class="i-name">icon-thumbs-down</span><span class="i-code">0xe868</span></div>
<div title="Code: 0xe869" class="the-icons span3"><i class="icon-spinner"></i> <span class="i-name">icon-spinner</span><span class="i-code">0xe869</span></div>
<div title="Code: 0xe86a" class="the-icons span3"><i class="icon-attach"></i> <span class="i-name">icon-attach</span><span class="i-code">0xe86a</span></div>
<div title="Code: 0xe86b" class="the-icons span3"><i class="icon-keyboard"></i> <span class="i-name">icon-keyboard</span><span class="i-code">0xe86b</span></div>
</div>
<div class="row">
<div title="Code: 0xe86c" class="the-icons span3"><i class="icon-menu"></i> <span class="i-name">icon-menu</span><span class="i-code">0xe86c</span></div>
<div title="Code: 0xe86d" class="the-icons span3"><i class="icon-wifi"></i> <span class="i-name">icon-wifi</span><span class="i-code">0xe86d</span></div>
<div title="Code: 0xe86e" class="the-icons span3"><i class="icon-moon"></i> <span class="i-name">icon-moon</span><span class="i-code">0xe86e</span></div>
<div title="Code: 0xe86f" class="the-icons span3"><i class="icon-chart-pie"></i> <span class="i-name">icon-chart-pie</span><span class="i-code">0xe86f</span></div>
</div>
<div class="row">
<div title="Code: 0xe870" class="the-icons span3"><i class="icon-chart-area"></i> <span class="i-name">icon-chart-area</span><span class="i-code">0xe870</span></div>
<div title="Code: 0xe871" class="the-icons span3"><i class="icon-chart-bar"></i> <span class="i-name">icon-chart-bar</span><span class="i-code">0xe871</span></div>
<div title="Code: 0xe872" class="the-icons span3"><i class="icon-beaker"></i> <span class="i-name">icon-beaker</span><span class="i-code">0xe872</span></div>
<div title="Code: 0xe873" class="the-icons span3"><i class="icon-magic"></i> <span class="i-name">icon-magic</span><span class="i-code">0xe873</span></div>
</div>
</div>
<div class="container footer">Generated by <a href="http://fontello.com">fontello.com</a></div>
</body>
</html>

Binary file not shown.

View File

@ -0,0 +1,127 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2014 by original authors @ fontello.com</metadata>
<defs>
<font id="ifont" horiz-adv-x="1000" >
<font-face font-family="ifont" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
<missing-glyph horiz-adv-x="1000" />
<glyph glyph-name="dashboard" unicode="&#xe800;" d="m286 154v-108q0-22-16-37t-38-16h-178q-23 0-38 16t-16 37v108q0 22 16 38t38 15h178q22 0 38-15t16-38z m0 285v-107q0-22-16-38t-38-15h-178q-23 0-38 15t-16 38v107q0 23 16 38t38 16h178q22 0 38-16t16-38z m357-285v-108q0-22-16-37t-38-16h-178q-23 0-38 16t-16 37v108q0 22 16 38t38 15h178q23 0 38-15t16-38z m-357 571v-107q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v107q0 22 16 38t38 16h178q22 0 38-16t16-38z m357-286v-107q0-22-16-38t-38-15h-178q-23 0-38 15t-16 38v107q0 23 16 38t38 16h178q23 0 38-16t16-38z m357-285v-108q0-22-16-37t-38-16h-178q-22 0-38 16t-16 37v108q0 22 16 38t38 15h178q23 0 38-15t16-38z m-357 571v-107q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v107q0 22 16 38t38 16h178q23 0 38-16t16-38z m357-286v-107q0-22-16-38t-38-15h-178q-22 0-38 15t-16 38v107q0 23 16 38t38 16h178q23 0 38-16t16-38z m0 286v-107q0-22-16-38t-38-16h-178q-22 0-38 16t-16 38v107q0 22 16 38t38 16h178q23 0 38-16t16-38z" horiz-adv-x="1000" />
<glyph glyph-name="user" unicode="&#xe801;" d="m786 66q0-67-41-106t-108-39h-488q-67 0-108 39t-41 106q0 30 2 58t8 61 15 60 24 55 34 45 48 30 62 11q5 0 24-12t41-27 60-27 75-12 74 12 61 27 41 27 24 12q34 0 62-11t48-30 34-45 24-55 15-60 8-61 2-58z m-179 498q0-88-63-151t-151-63-152 63-62 151 62 152 152 63 151-63 63-152z" horiz-adv-x="785.7" />
<glyph glyph-name="users" unicode="&#xe802;" d="m331 350q-90-3-148-71h-75q-45 0-77 22t-31 66q0 197 69 197 4 0 25-11t54-24 66-12q38 0 75 13-3-21-3-37 0-78 45-143z m598-356q0-66-41-105t-108-39h-488q-68 0-108 39t-41 105q0 30 2 58t8 61 14 61 24 54 35 45 48 30 62 11q6 0 24-12t41-26 59-27 76-12 75 12 60 27 41 26 23 12q35 0 63-11t47-30 35-45 24-54 15-61 8-61 2-58z m-572 713q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m393-214q0-89-63-152t-151-62-152 62-63 152 63 151 152 63 151-63 63-151z m321-126q0-43-31-66t-77-22h-75q-57 68-147 71 45 65 45 143 0 16-3 37 37-13 74-13 33 0 67 12t54 24 24 11q69 0 69-197z m-71 340q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z" horiz-adv-x="1071.4" />
<glyph glyph-name="ok" unicode="&#xe803;" d="m352-10l-334 333 158 160 176-174 400 401 159-160z" horiz-adv-x="928" />
<glyph glyph-name="cancel" unicode="&#xe804;" d="m799 116l-156-157-234 235-235-235-156 157 234 234-234 234 156 157 235-235 234 235 156-157-234-234z" horiz-adv-x="817" />
<glyph glyph-name="plus" unicode="&#xe805;" d="m911 462l0-223-335 0 0-336-223 0 0 336-335 0 0 223 335 0 0 335 223 0 0-335 335 0z" horiz-adv-x="928" />
<glyph glyph-name="minus" unicode="&#xe806;" d="m18 239l0 223 893 0 0-223-893 0z" horiz-adv-x="928" />
<glyph glyph-name="folder-empty" unicode="&#xe807;" d="m464 685l447 0 0-669q0-47-33-80t-79-33l-669 0q-46 0-79 33t-33 80l0 781 446 0 0-112z m-334 0l0-223 669 0 0 112-446 0 0 111-223 0z m669-669l0 335-669 0 0-335 669 0z" horiz-adv-x="928" />
<glyph glyph-name="download" unicode="&#xe808;" d="m714 100q0 15-10 25t-25 11-26-11-10-25 10-25 26-11 25 11 10 25z m143 0q0 15-10 25t-26 11-25-11-10-25 10-25 25-11 26 11 10 25z m72 125v-179q0-22-16-37t-38-16h-821q-23 0-38 16t-16 37v179q0 22 16 38t38 16h259l75-76q33-32 76-32t76 32l76 76h259q22 0 38-16t16-38z m-182 318q10-23-8-40l-250-250q-10-10-25-10t-25 10l-250 250q-17 17-8 40 10 21 33 21h143v250q0 15 11 25t25 11h143q14 0 25-11t10-25v-250h143q24 0 33-21z" horiz-adv-x="928.6" />
<glyph glyph-name="upload" unicode="&#xe809;" d="m714 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m143 0q0 14-10 25t-26 10-25-10-10-25 10-26 25-10 26 10 10 26z m72 125v-179q0-22-16-38t-38-16h-821q-23 0-38 16t-16 38v179q0 22 16 38t38 15h238q12-31 39-51t62-20h143q34 0 61 20t40 51h238q22 0 38-15t16-38z m-182 361q-9-22-33-22h-143v-250q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v250h-143q-23 0-33 22-9 22 8 39l250 250q10 10 25 10t25-10l250-250q18-17 8-39z" horiz-adv-x="928.6" />
<glyph glyph-name="git" unicode="&#xe80a;" d="m332 5q0 56-92 56-88 0-88-58 0-57 96-57 84 0 84 59z m-33 421q0 35-17 57t-49 23q-69 0-69-81 0-75 69-75 66 0 66 76z m150 181v-112q-20-7-44-13 9-24 9-47 0-70-41-120t-110-63q-22-5-33-15t-11-33q0-17 13-28t32-18 44-12 48-15 44-21 32-35 13-55q0-170-203-170-38 0-72 7t-65 23-49 46-18 71q0 92 102 125v3q-38 22-38 70 0 61 35 76v3q-40 13-66 60t-27 92q0 78 53 130t131 51q54 0 100-26 54 0 121 26z m178-491h-124q2 25 2 74v340q0 53-2 72h124q-3-19-3-70v-342q0-49 3-74z m335 124v-110q-40-22-97-22-35 0-60 12t-39 27-22 44-10 51-2 58v196h1v2q-4 0-11 0t-10 1q-12 0-33-3v106h54v42q0 30-4 50h127q-3-23-3-92h95v-106q-8 0-24 1t-24 1h-47v-204q0-73 48-73 34 0 61 19z m-321 528q0-32-22-57t-54-24q-32 0-54 24t-23 57q0 33 22 57t55 25q33 0 54-25t22-57z" horiz-adv-x="1000" />
<glyph glyph-name="cubes" unicode="&#xe80b;" d="m357-61l214 107v176l-214-92v-191z m-36 254l226 96-226 97-225-97z m608-254l214 107v176l-214-92v-191z m-36 254l225 96-225 97-226-97z m-250 163l214 92v149l-214-92v-149z m-36 212l246 105-246 106-246-106z m607-289v-233q0-20-10-37t-29-26l-250-125q-14-8-32-8t-32 8l-250 125q-3 1-4 2-1-1-4-2l-250-125q-14-8-32-8t-31 8l-250 125q-19 9-29 26t-11 37v233q0 21 12 39t32 26l242 104v223q0 22 12 39t31 27l250 107q13 6 28 6t28-6l250-107q20-9 32-27t12-39v-223l242-104q20-9 32-26t11-40z" horiz-adv-x="1285.7" />
<glyph glyph-name="database" unicode="&#xe80c;" d="m429 421q132 0 247 24t181 71v-95q0-38-57-71t-157-52-214-20-215 20-156 52-58 71v95q66-47 181-71t248-24z m0-428q132 0 247 24t181 71v-95q0-39-57-72t-157-52-214-19-215 19-156 52-58 72v95q66-47 181-71t248-24z m0 214q132 0 247 24t181 71v-95q0-38-57-71t-157-52-214-20-215 20-156 52-58 71v95q66-47 181-71t248-24z m0 643q116 0 214-19t157-52 57-72v-71q0-39-57-72t-157-52-214-19-215 19-156 52-58 72v71q0 39 58 72t156 52 215 19z" horiz-adv-x="857.1" />
<glyph glyph-name="gauge" unicode="&#xe80d;" d="m214 207q0 30-21 51t-50 21-51-21-21-51 21-50 51-21 50 21 21 50z m107 250q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m239-268l57 213q3 14-5 27t-21 16-27-3-17-22l-56-213q-33-3-60-25t-35-55q-11-43 11-81t66-50 81 11 50 66q9 33-4 65t-40 51z m369 18q0 30-21 51t-51 21-50-21-21-51 21-50 50-21 51 21 21 50z m-358 357q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m250-107q0 30-20 51t-51 21-50-21-21-51 21-50 50-21 51 21 20 50z m179-250q0-145-79-269-10-17-30-17h-782q-20 0-30 17-79 123-79 269 0 102 40 194t106 160 160 107 194 39 194-39 160-107 106-160 40-194z" horiz-adv-x="1000" />
<glyph glyph-name="sitemap" unicode="&#xe80e;" d="m1000 154v-179q0-22-16-38t-38-16h-178q-22 0-38 16t-16 38v179q0 22 16 38t38 15h53v107h-285v-107h53q23 0 38-15t16-38v-179q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v179q0 22 16 38t38 15h53v107h-285v-107h53q22 0 38-15t16-38v-179q0-22-16-38t-38-16h-178q-23 0-38 16t-16 38v179q0 22 16 38t38 15h53v107q0 29 21 51t51 21h285v107h-53q-23 0-38 15t-16 38v179q0 22 16 38t38 16h178q23 0 38-16t16-38v-179q0-22-16-38t-38-15h-53v-107h285q29 0 51-21t21-51v-107h53q23 0 38-15t16-38z" horiz-adv-x="1000" />
<glyph glyph-name="sort-name-up" unicode="&#xe80f;" d="m665 622h98l-40 122-6 26q-2 9-2 11h-2l-2-11q0 0-1-10t-5-16z m-254-576q0-6-6-13l-178-178q-5-5-13-5-6 0-13 5l-178 179q-8 9-4 19 4 11 17 11h107v768q0 8 5 13t13 5h107q8 0 13-5t5-13v-768h107q8 0 13-5t5-13z m466-66v-130h-326v50l206 295q7 10 12 16l6 5v1q-1 0-4 0t-4 0q-6-2-16-2h-130v-64h-67v128h317v-50l-206-296q-4-4-12-14l-6-7v-1l8 1q5 2 16 2h139v66h67z m50 501v-60h-161v60h42l-26 80h-136l-26-80h42v-60h-160v60h39l128 369h90l129-369h39z" horiz-adv-x="928.6" />
<glyph glyph-name="sort-name-down" unicode="&#xe810;" d="m665 51h98l-40 122-6 26q-2 9-2 11h-2l-2-11q0-1-1-10t-5-16z m-254-5q0-6-6-13l-178-178q-5-5-13-5-6 0-13 5l-178 179q-8 9-4 19 4 11 17 11h107v768q0 8 5 13t13 5h107q8 0 13-5t5-13v-768h107q8 0 13-5t5-13z m516-137v-59h-161v59h42l-26 80h-136l-26-80h42v-59h-160v59h39l128 370h90l129-370h39z m-50 642v-130h-326v51l206 295q7 10 12 15l6 5v2q-1 0-4-1t-4 0q-6-2-16-2h-130v-64h-67v128h317v-50l-206-295q-4-5-12-15l-6-6v-1l8 1q5 1 16 1h139v66h67z" horiz-adv-x="928.6" />
<glyph glyph-name="megaphone" unicode="&#xe811;" d="m929 493q29 0 50-21t21-51-21-50-50-21v-214q0-29-22-50t-50-22q-233 194-453 212-32-10-51-36t-17-57 22-51q-11-19-13-37t4-32 18-31 27-28 35-28q-17-32-63-46t-94-7-73 31q-4 13-17 49t-18 53-12 50-9 56 2 55 12 62h-68q-36 0-63 26t-26 63v107q0 37 26 63t63 26h268q243 0 500 215 29 0 50-22t22-50v-214z m-72-337v532q-220-168-428-191v-151q210-23 428-190z" horiz-adv-x="1000" />
<glyph glyph-name="bug" unicode="&#xe812;" d="m911 314q0-14-11-25t-25-10h-125q0-96-37-162l116-117q10-11 10-25t-10-25q-10-11-25-11t-26 11l-110 110q-3-3-8-7t-24-16-36-21-46-16-54-7v500h-71v-500q-29 0-57 7t-49 19-36 22-25 18l-8 8-102-116q-11-12-27-12-13 0-24 9-11 10-11 25t8 26l113 127q-32 63-32 153h-125q-15 0-25 10t-11 25 11 25 25 11h125v164l-97 97q-11 10-11 25t11 25 25 10 25-10l97-97h471l96 97q11 10 25 10t26-10 10-25-10-25l-97-97v-164h125q15 0 25-11t11-25z m-268 322h-357q0 74 52 126t126 52 127-52 52-126z" horiz-adv-x="928.6" />
<glyph glyph-name="tasks" unicode="&#xe813;" d="m571 64h358v72h-358v-72z m-214 286h572v71h-572v-71z m357 286h215v71h-215v-71z m286-465v-142q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v142q0 15 11 26t25 10h928q15 0 25-10t11-26z m0 286v-143q0-14-11-25t-25-10h-928q-15 0-25 10t-11 25v143q0 15 11 25t25 11h928q15 0 25-11t11-25z m0 286v-143q0-15-11-25t-25-11h-928q-15 0-25 11t-11 25v143q0 14 11 25t25 11h928q15 0 25-11t11-25z" horiz-adv-x="1000" />
<glyph glyph-name="filter" unicode="&#xe814;" d="m783 685q9-23-8-39l-275-275v-414q0-23-22-33-7-3-14-3-15 0-25 11l-143 143q-10 10-10 25v271l-275 275q-18 16-8 39 9 22 33 22h714q23 0 33-22z" horiz-adv-x="785.7" />
<glyph glyph-name="off" unicode="&#xe815;" d="m857 350q0-87-34-166t-91-137-137-92-166-34-167 34-136 92-92 137-34 166q0 102 45 191t126 151q24 18 54 14t46-28q18-23 14-53t-28-47q-54-41-84-101t-30-127q0-58 22-111t62-91 91-61 111-23 110 23 92 61 61 91 22 111q0 68-30 127t-84 101q-24 18-28 47t14 53q17 24 47 28t53-14q81-61 126-151t45-191z m-357 429v-358q0-29-21-50t-50-21-51 21-21 50v358q0 29 21 50t51 21 50-21 21-50z" horiz-adv-x="857.1" />
<glyph glyph-name="book" unicode="&#xe816;" d="m915 583q22-32 10-72l-154-505q-10-36-42-60t-69-25h-515q-43 0-83 30t-55 74q-14 37-1 71 0 2 1 15t3 20q0 5-2 12t-2 11q1 6 5 12t9 13 9 13q13 21 25 51t17 51q2 6 0 17t0 16q2 6 9 15t10 13q12 20 23 51t14 51q1 5-1 17t0 16q2 7 12 17t13 13q10 14 23 47t16 54q0 4-2 14t-1 15q1 4 5 10t10 13 10 11q4 7 9 17t8 20 9 20 11 18 15 13 20 6 26-3l0-1q21 5 28 5h425q41 0 63-32t10-72l-152-506q-20-66-40-85t-72-20h-485q-15 0-21-8-6-9-1-24 14-39 81-39h515q16 0 31 9t19 23l168 550q4 13 3 32 21-8 33-24z m-594-1q-2-7 1-12t11-6h339q8 0 15 6t9 12l12 36q2 7-2 12t-11 6h-339q-7 0-14-6t-9-12z m-46-143q-3-7 1-12t11-6h339q7 0 14 6t10 12l11 36q3 7-1 13t-11 5h-339q-8 0-14-5t-10-13z" horiz-adv-x="928.6" />
<glyph glyph-name="paste" unicode="&#xe817;" d="m429-79h500v358h-233q-22 0-38 15t-15 38v232h-214v-643z m142 804v36q0 7-5 12t-12 6h-393q-7 0-13-6t-5-12v-36q0-7 5-13t13-5h393q7 0 12 5t5 13z m143-375h167l-167 167v-167z m286-71v-375q0-23-16-38t-38-16h-535q-23 0-38 16t-16 38v89h-303q-23 0-38 16t-16 37v750q0 23 16 38t38 16h607q22 0 38-16t15-38v-183q12-7 20-15l228-228q16-16 27-42t11-50z" horiz-adv-x="1000" />
<glyph glyph-name="scissors" unicode="&#xe818;" d="m536 350q14 0 25-11t10-25-10-25-25-10-25 10-11 25 11 25 25 11z m167-36l283-222q16-11 14-31-3-20-20-28l-71-36q-7-4-16-4-10 0-17 4l-385 216-62-37q-4-2-7-2 8-28 6-54-4-43-31-83t-74-69q-74-47-154-47-76 0-124 44-51 47-44 116 4 42 31 82t73 69q74 47 155 47 46 0 84-18 5 8 13 13l68 40-68 41q-8 5-13 12-38-17-84-17-81 0-155 47-46 29-73 69t-31 82q-3 33 8 63t36 52q47 44 124 44 80 0 154-47 46-29 74-68t31-83q2-27-6-54 3-1 7-3l62-37 385 216q7 5 17 5 9 0 16-4l71-36q17-9 20-28 2-20-14-32z m-380 145q26 24 12 61t-59 65q-52 33-107 33-42 0-63-20-26-24-12-60t59-66q51-33 107-33 41 0 63 20z m-47-415q45 28 59 65t-12 60q-22 20-63 20-56 0-107-33-45-28-59-65t12-60q21-20 63-20 55 0 107 33z m99 342l54-33v7q0 20 18 31l8 4-44 26-15-14q-1-2-5-6t-7-7q-1-1-2-2t-2-1z m125-125l54-18 410 321-71 36-429-240v-64l-89-53 5-5q1-1 4-3 2-2 6-7t6-6l15-15z m393-232l71 35-290 228-99-77q-1-2-7-4z" horiz-adv-x="1000" />
<glyph glyph-name="globe" unicode="&#xe819;" d="m429 779q116 0 215-58t156-156 57-215-57-215-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58z m152-291q-1-1-5-5t-7-6q1 0 2 3t3 6 2 4q3 4 12 8 8 4 29 7 19 5 29-6-1 1 5 7t8 7q2 1 8 2t9 5l1 12q-7-1-10 4t-3 12q0-2-4-5 0 4-2 5t-7-1-5-1q-5 2-8 5t-5 9-2 8q-1 3-5 6t-5 6q-1 1-2 3t-2 4-2 3-3 1-4-3-4-5-2-3q-2 1-4 1t-2-1-3-2-3-2q-1-1-4-1t-5-1q8 3-1 6-5 2-9 1 5 3 5 7t-5 8h3q-1 2-5 5t-10 4-7 4q-5 3-19 5t-18 0q-3-3-3-5t2-8 2-7q1-4-3-7t-3-7q0-4 7-9t6-12q-2-4-9-9t-9-6q-3-5-1-11t6-9q1-1 1-2t-2-3-3-2-4-2l-1-1q-7-3-12 3t-7 15q-4 14-9 17-13 4-17-1-2 7-22 15-14 5-33 2 4 0 0 8-4 9-10 7 1 3 2 10t0 7q2 7 7 13 1 1 4 5t5 7 1 4q19-3 28 6 2 2 6 9t6 10q5 3 8 3t8-3 8-3q8-1 8 6t-4 11q7 0 2 10-3 4-5 5-6 2-15-3-4-2 2-4-1 0-6-6t-9-10-9 3q0 0-3 7t-5 8q-5 0-9-9 1 5-6 9t-14 4q11 7-4 15-4 3-12 3t-11-2q-2-4-3-7t3-4 6-3 6-2 5-2q8-6 5-8-1 0-5-2t-6-2-4-3q-2-2 0-7t-1-8q-3 3-5 10t-4 9q4-5-14-4l-5 1q-3 0-9-1t-12-1-7 5q-3 4 0 11 0 2 2 1-2 2-6 5t-6 5q-25-8-52-23 3 0 6 1 3 1 8 3t5 4q19 7 24 3l3 3q7-9 11-14-4 3-17 1-11-4-12-7 4-7 2-10-2 2-6 6t-8 6-8 3q-9 0-13-1-81-45-131-124 4-4 7-4 2-1 3-5t1-6 6 1q5-4 2-10 1 0 25-15 10-10 11-12 2-6-5-10-1 1-5 5t-5 2q-2-3 0-10t6-7q-4 0-5-9t-2-20 0-13l1-1q-2-6 3-19t12-11q-7-1 11-24 3-4 4-5 2-1 7-4t9-6 5-5q2-3 6-13t8-13q-2-3 5-11t6-13q-1 0-2-1t-1 0q2-4 9-8t8-7q1-2 1-6t2-6 4-1q2 11-13 34-8 14-9 17-2 2-4 8t-2 8q1 0 3 0t5-2 4-3 1-1q-1-4 1-10t7-10 10-11 6-7q4-4 8-11t0-8q5 0 11-5t10-11q3-5 4-15t3-13q1-4 5-8t7-5l9-5t7-3q3-2 10-6t12-7q6-2 9-2t8 1 8 2q8 1 16-8t12-12q20-10 30-6-1 0 1-4t4-9 5-8 3-5q3-3 10-8t10-8q4 2 4 5-1-5 4-11t10-6q8 2 8 18-17-9-27 10 0 0-2 3t-2 5-1 4 0 5 2 1q5 0 6 2t-1 7-2 8q-1 4-6 11t-7 8q-3-5-9-4t-9 5q0-1-1-3t-1-4q-7 0-8 0 1 2 1 10t2 13q1 2 3 6t5 9 2 7-3 5-9 1q-11 0-15-11-1-2-2-6t-2-6-5-4q-4-2-14-1t-13 3q-8 4-13 16t-5 20q0 6 1 15t2 14-3 14q2 1 5 5t5 6q2 1 3 1t2 0 3 1 1 3q0 1-2 2-2 1-2 1 4-1 16 1t15-1q9-6 12 1 0 1-1 6t0 7q3-15 16-5 2-1 9-3t9-2q2-1 4-3t3-3 3 0 5 4q5-8 7-13 6-23 10-25 4-2 6-1t3 5 0 8-1 7l-1 4v11l0 4q-8 2-10 7t0 10 9 10q0 1 4 2t9 4 7 4q12 11 8 20 4 0 6 5 0 0-2 2t-5 2-2 2q5 2 1 8 3 2 4 7t4 5q5-7 12-1 4 5 1 9 2 4 11 6t10 5q4-1 5 1t0 7 2 7q2 2 8 5t8 2l9 7q2 2 0 2 10-1 18 6 5 6-4 11 2 3-2 5t-8 3q2 1 7 1t5 1q9 5-4 9-9 2-24-7z m-90-490q114 21 195 106-1 2-7 2t-7 2q-10 4-13 5 1 4-1 7t-5 5-7 5-6 4q-1 1-4 3t-4 3-4 2-5 2-5-1l-2-1q-2 0-3-1t-3-2-2-1 0-2q-12 10-20 13-3 0-7 3t-5 4-6 0-6-4q-3-2-4-8t-1-7q-4 3 0 10t1 10q-1 3-6 2t-6-2-7-5-5-3-4-3-5-5q-2-2-4-6t-2-7q-1 3-7 4t-5 3q1-5 2-19t3-22q4-17-7-26-15-14-16-23-2-12 7-14 0-4-5-12t-4-12q0-3 2-9z" horiz-adv-x="857.1" />
<glyph glyph-name="cloud" unicode="&#xe81a;" d="m1071 207q0-89-62-151t-152-63h-607q-103 0-177 73t-73 177q0 74 40 135t104 91q-1 15-1 24 0 118 84 202t202 84q88 0 159-50t105-128q39 35 93 35 59 0 101-42t42-101q0-42-23-77 72-17 119-75t46-134z" horiz-adv-x="1071.4" />
<glyph glyph-name="flash" unicode="&#xe81b;" d="m494 534q10-11 4-24l-302-646q-7-14-23-14-2 0-8 1-9 3-14 11t-3 16l110 451-226-56q-2-1-7-1-10 0-17 7-10 8-7 21l112 461q2 8 9 13t15 5h183q11 0 18-7t7-17q0-4-2-10l-96-258 221 54q5 2 7 2 11 0 19-9z" horiz-adv-x="500" />
<glyph glyph-name="barchart" unicode="&#xe81c;" d="m143 46v-107q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v107q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 72v-179q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v179q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 143v-322q0-8-5-13t-12-5h-108q-7 0-12 5t-5 13v322q0 8 5 13t12 5h108q7 0 12-5t5-13z m215 214v-536q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v536q0 8 5 13t13 5h107q8 0 13-5t5-13z m214 286v-822q0-8-5-13t-13-5h-107q-8 0-13 5t-5 13v822q0 8 5 13t13 5h107q8 0 13-5t5-13z" horiz-adv-x="1000" />
<glyph glyph-name="down-dir" unicode="&#xe81d;" d="m571 457q0-14-10-25l-250-250q-11-11-25-11t-25 11l-250 250q-11 11-11 25t11 25 25 11h500q14 0 25-11t10-25z" horiz-adv-x="571.4" />
<glyph glyph-name="up-dir" unicode="&#xe81e;" d="m571 171q0-14-10-25t-25-10h-500q-15 0-25 10t-11 25 11 26l250 250q10 10 25 10t25-10l250-250q10-11 10-26z" horiz-adv-x="571.4" />
<glyph glyph-name="left-dir" unicode="&#xe81f;" d="m357 600v-500q0-14-10-25t-26-11-25 11l-250 250q-10 11-10 25t10 25l250 250q11 11 25 11t26-11 10-25z" horiz-adv-x="357.1" />
<glyph glyph-name="right-dir" unicode="&#xe820;" d="m321 350q0-14-10-25l-250-250q-11-11-25-11t-25 11-11 25v500q0 15 11 25t25 11 25-11l250-250q10-10 10-25z" horiz-adv-x="357.1" />
<glyph glyph-name="down-open" unicode="&#xe821;" d="m939 399l-414-413q-10-11-25-11t-25 11l-414 413q-11 11-11 26t11 25l92 92q11 11 26 11t25-11l296-296 296 296q11 11 25 11t26-11l92-92q11-11 11-25t-11-26z" horiz-adv-x="1000" />
<glyph glyph-name="right-open" unicode="&#xe822;" d="m618 361l-414-415q-11-10-25-10t-26 10l-92 93q-11 11-11 25t11 25l296 297-296 296q-11 11-11 25t11 25l92 93q11 10 26 10t25-10l414-414q10-11 10-25t-10-25z" horiz-adv-x="714.3" />
<glyph glyph-name="up-open" unicode="&#xe823;" d="m939 107l-92-92q-11-10-26-10t-25 10l-296 297-296-297q-11-10-25-10t-26 10l-92 92q-11 11-11 26t11 25l414 414q11 10 25 10t25-10l414-414q11-11 11-25t-11-26z" horiz-adv-x="1000" />
<glyph glyph-name="left-open" unicode="&#xe824;" d="m653 682l-296-296 296-297q11-10 11-25t-11-25l-92-93q-11-10-25-10t-25 10l-414 415q-11 10-11 25t11 25l414 414q10 10 25 10t25-10l92-93q11-10 11-25t-11-25z" horiz-adv-x="714.3" />
<glyph glyph-name="up-big" unicode="&#xe825;" d="m899 308q0-28-21-50l-42-42q-21-21-50-21-30 0-51 21l-164 164v-393q0-29-20-47t-51-19h-71q-30 0-51 19t-21 47v393l-164-164q-20-21-50-21t-50 21l-42 42q-21 21-21 50 0 30 21 51l363 363q20 21 50 21 30 0 51-21l363-363q21-22 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="right-big" unicode="&#xe826;" d="m821 314q0-30-20-50l-363-364q-22-20-51-20-29 0-50 20l-42 42q-22 21-22 51t22 51l163 163h-393q-29 0-47 21t-18 51v71q0 30 18 51t47 20h393l-163 164q-22 21-22 51t22 50l42 42q21 21 50 21 29 0 51-21l363-363q20-20 20-51z" horiz-adv-x="857.1" />
<glyph glyph-name="left-big" unicode="&#xe827;" d="m857 350v-71q0-30-18-51t-47-21h-393l164-164q21-20 21-50t-21-50l-42-43q-21-20-51-20-29 0-50 20l-364 364q-20 21-20 50 0 29 20 51l364 363q21 21 50 21 29 0 51-21l42-42q21-21 21-50t-21-51l-164-164h393q29 0 47-20t18-51z" horiz-adv-x="857.1" />
<glyph glyph-name="down-big" unicode="&#xe828;" d="m899 386q0-30-21-50l-363-364q-22-21-51-21-29 0-50 21l-363 364q-21 20-21 50 0 29 21 51l41 41q22 21 51 21 29 0 50-21l164-164v393q0 29 21 50t51 22h71q29 0 50-22t21-50v-393l164 164q21 21 51 21 29 0 50-21l42-42q21-21 21-50z" horiz-adv-x="928.6" />
<glyph glyph-name="resize-full-alt" unicode="&#xe829;" d="m716 548l-198-198 198-198 80 80q16 18 39 8 22-9 22-33v-250q0-14-10-25t-26-11h-250q-23 0-32 23-10 21 7 38l81 81-198 198-198-198 80-81q17-17 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l80-80 198 198-198 198-80-80q-11-11-25-11-7 0-14 3-22 9-22 33v250q0 14 11 25t25 11h250q23 0 33-23 9-22-8-38l-80-81 198-198 198 198-81 81q-17 16-7 38 9 23 32 23h250q15 0 26-11t10-25v-250q0-24-22-33-7-3-14-3-14 0-25 11z" horiz-adv-x="857.1" />
<glyph glyph-name="resize-full" unicode="&#xe82a;" d="m421 261q0-8-5-13l-185-185 80-81q10-10 10-25t-10-25-25-11h-250q-15 0-25 11t-11 25v250q0 15 11 25t25 11 25-11l80-80 185 185q6 6 13 6t13-6l64-63q5-6 5-13z m436 482v-250q0-15-10-25t-26-11-25 11l-80 80-185-185q-6-6-13-6t-13 6l-64 63q-5 6-5 13t5 13l186 185-81 81q-10 10-10 25t10 25 25 11h250q15 0 26-11t10-25z" horiz-adv-x="857.1" />
<glyph glyph-name="resize-small" unicode="&#xe82b;" d="m429 314v-250q0-14-11-25t-25-10-25 10l-81 81-185-186q-5-5-13-5t-13 5l-63 64q-6 5-6 13t6 13l185 185-80 80q-11 11-11 25t11 25 25 11h250q14 0 25-11t11-25z m421 375q0-7-6-13l-185-185 80-80q11-11 11-25t-11-25-25-11h-250q-14 0-25 11t-10 25v250q0 14 10 25t25 10 25-10l81-81 185 186q6 5 13 5t13-5l63-64q6-5 6-13z" horiz-adv-x="857.1" />
<glyph glyph-name="move" unicode="&#xe82c;" d="m1000 350q0-14-11-25l-142-143q-11-11-26-11t-25 11-10 25v72h-215v-215h72q14 0 25-10t11-25-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-11 11-11 26t11 25 25 10h72v215h-215v-72q0-14-10-25t-25-11-26 11l-142 143q-11 11-11 25t11 25l142 143q11 11 26 11t25-11 10-25v-72h215v215h-72q-14 0-25 10t-11 25 11 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26t-11-25-25-10h-72v-215h215v72q0 14 10 25t25 11 26-11l142-143q11-10 11-25z" horiz-adv-x="1000" />
<glyph glyph-name="resize-horizontal" unicode="&#xe82d;" d="m1000 350q0-14-11-25l-142-143q-11-11-26-11t-25 11-10 25v72h-572v-72q0-14-10-25t-25-11-25 11l-143 143q-11 11-11 25t11 25l143 143q10 11 25 11t25-11 10-25v-72h572v72q0 14 10 25t25 11 26-11l142-143q11-10 11-25z" horiz-adv-x="1000" />
<glyph glyph-name="resize-vertical" unicode="&#xe82e;" d="m393 671q0-14-11-25t-25-10h-71v-572h71q15 0 25-10t11-25-11-26l-143-142q-10-11-25-11t-25 11l-143 142q-10 11-10 26t10 25 25 10h72v572h-72q-14 0-25 10t-10 25 10 26l143 142q11 11 25 11t25-11l143-142q11-11 11-26z" horiz-adv-x="428.6" />
<glyph glyph-name="zoom-in" unicode="&#xe82f;" d="m571 404v-36q0-7-5-13t-12-5h-125v-125q0-7-6-13t-12-5h-36q-7 0-13 5t-5 13v125h-125q-7 0-12 5t-6 13v36q0 7 6 12t12 5h125v125q0 8 5 13t13 5h36q7 0 12-5t6-13v-125h125q7 0 12-5t5-12z m72-18q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-21-50t-51-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="block" unicode="&#xe830;" d="m732 352q0 90-48 164l-421-420q76-50 166-50 62 0 118 25t96 65 65 97 24 119z m-557-167l421 421q-75 50-167 50-83 0-153-40t-110-112-41-152q0-91 50-167z m682 167q0-88-34-168t-91-137-137-92-166-34-167 34-137 92-91 137-34 168 34 167 91 137 137 91 167 34 166-34 137-91 91-137 34-167z" horiz-adv-x="857.1" />
<glyph glyph-name="zoom-out" unicode="&#xe831;" d="m571 404v-36q0-7-5-13t-12-5h-322q-7 0-12 5t-6 13v36q0 7 6 12t12 5h322q7 0 12-5t5-12z m72-18q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-21-50t-51-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="lightbulb" unicode="&#xe832;" d="m411 529q0-8-6-13t-12-5-13 5-5 13q0 25-30 39t-59 14q-8 0-13 5t-5 13 5 13 13 5q28 0 55-9t49-30 21-50z m89 0q0 40-19 74t-50 57-69 35-76 12-76-12-69-35-50-57-20-74q0-57 38-101 6-6 17-18t17-19q72-85 79-166h127q8 81 79 166 6 6 17 19t17 18q38 44 38 101z m71 0q0-87-57-150-25-27-42-49t-33-53-19-60q26-15 26-46 0-20-14-35 14-15 14-36 0-29-25-45 8-13 8-26 0-26-18-40t-43-14q-11-25-34-39t-48-15-49 15-33 39q-26 0-44 14t-17 40q0 13 7 26-25 16-25 45 0 21 14 36-14 15-14 35 0 31 26 46-2 28-19 60t-33 53-41 49q-58 63-58 150 0 55 25 103t65 79 92 49 104 19 104-19 91-49 66-79 24-103z" horiz-adv-x="571.4" />
<glyph glyph-name="clock" unicode="&#xe833;" d="m500 546v-250q0-7-5-12t-13-5h-178q-8 0-13 5t-5 12v36q0 8 5 13t13 5h125v196q0 8 5 13t12 5h36q8 0 13-5t5-13z m232-196q0 83-41 152t-110 111-152 41-153-41-110-111-41-152 41-152 110-111 153-41 152 41 110 111 41 152z m125 0q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z" horiz-adv-x="857.1" />
<glyph glyph-name="volume-up" unicode="&#xe834;" d="m429 654v-608q0-14-11-25t-25-10-25 10l-186 186h-146q-15 0-25 11t-11 25v214q0 15 11 25t25 11h146l186 186q10 10 25 10t25-10 11-25z m214-304q0-42-24-79t-63-52q-5-3-14-3-14 0-25 10t-10 26q0 12 6 20t17 14 19 12 16 20 6 32-6 32-16 20-19 12-17 14-6 20q0 15 10 26t25 10q9 0 14-3 39-15 63-52t24-79z m143 0q0-85-48-158t-125-105q-8-3-14-3-15 0-26 11t-10 25q0 22 21 33 32 16 43 25 41 30 64 75t23 97-23 97-64 75q-11 9-43 25-21 11-21 33 0 14 10 25t25 11q7 0 15-3 78-33 125-105t48-158z m143 0q0-128-71-236t-189-158q-7-3-14-3-15 0-26 11t-10 25q0 20 22 33 4 2 12 6t13 6q25 14 45 28 69 51 108 127t38 161-38 161-108 127q-20 14-45 28-4 3-13 6t-12 6q-22 13-22 33 0 14 10 25t26 11q7 0 14-3 118-51 189-158t71-236z" horiz-adv-x="928.6" />
<glyph glyph-name="volume-down" unicode="&#xe835;" d="m429 654v-608q0-14-11-25t-25-10-25 10l-186 186h-146q-15 0-25 11t-11 25v214q0 15 11 25t25 11h146l186 186q10 10 25 10t25-10 11-25z m214-304q0-42-24-79t-63-52q-5-3-14-3-14 0-25 10t-10 26q0 12 6 20t17 14 19 12 16 20 6 32-6 32-16 20-19 12-17 14-6 20q0 15 10 26t25 10q9 0 14-3 39-15 63-52t24-79z" horiz-adv-x="642.9" />
<glyph glyph-name="volume-off" unicode="&#xe836;" d="m429 654v-608q0-14-11-25t-25-10-25 10l-186 186h-146q-15 0-25 11t-11 25v214q0 15 11 25t25 11h146l186 186q10 10 25 10t25-10 11-25z" horiz-adv-x="428.6" />
<glyph glyph-name="mute" unicode="&#xe837;" d="m151 323l-56-57q-24 58-24 120v71q0 15 11 25t25 11 25-11 11-25v-71q0-30 8-63z m622 336l-202-202v-71q0-74-52-126t-126-53q-31 0-61 11l-54-54q55-28 115-28 103 0 176 73t74 177v71q0 15 10 25t26 11 25-11 10-25v-71q0-124-82-215t-203-104v-74h142q15 0 26-11t10-25-10-25-26-11h-357q-14 0-25 11t-10 25 10 25 25 11h143v74q-70 7-131 45l-142-142q-5-6-13-6t-12 6l-46 46q-6 5-6 13t6 12l688 689q6 6 13 6t13-6l46-46q5-5 5-13t-5-12z m-212 73l-347-346v285q0 74 53 127t126 52q57 0 103-33t65-85z" horiz-adv-x="785.7" />
<glyph glyph-name="mic" unicode="&#xe838;" d="m643 457v-71q0-124-82-215t-204-104v-74h143q15 0 25-11t11-25-11-25-25-11h-357q-15 0-25 11t-11 25 11 25 25 11h143v74q-121 13-204 104t-82 215v71q0 15 11 25t25 11 25-11 10-25v-71q0-104 74-177t176-73 177 73 73 177v71q0 15 11 25t25 11 25-11 11-25z m-143 214v-285q0-74-52-126t-127-53-126 53-52 126v285q0 74 52 127t126 52 127-52 52-127z" horiz-adv-x="642.9" />
<glyph glyph-name="endtime" unicode="&#xe839;" d="m661 350q0-14-11-25l-303-304q-11-10-26-10t-25 10-10 25v161h-250q-15 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 10 25t25 10 26-10l303-304q11-10 11-25z m196 196v-392q0-67-47-114t-114-47h-178q-7 0-13 5t-5 13q0 2-1 11t0 15 2 13 5 11 12 3h178q37 0 63 27t27 63v392q0 37-27 63t-63 27h-174t-6 0-6 2-5 3-4 5-1 8q0 2-1 11t0 15 2 13 5 11 12 3h178q67 0 114-47t47-114z" horiz-adv-x="857.1" />
<glyph glyph-name="starttime" unicode="&#xe83a;" d="m357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-27t-27-63v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
<glyph glyph-name="calendar-empty" unicode="&#xe83b;" d="m71-79h786v572h-786v-572z m215 679v161q0 8-5 13t-13 5h-36q-8 0-13-5t-5-13v-161q0-8 5-13t13-5h36q8 0 13 5t5 13z m428 0v161q0 8-5 13t-13 5h-35q-8 0-13-5t-5-13v-161q0-8 5-13t13-5h35q8 0 13 5t5 13z m215 36v-715q0-29-22-50t-50-21h-786q-29 0-50 21t-21 50v715q0 29 21 50t50 21h72v54q0 36 26 63t63 26h36q37 0 63-26t26-63v-54h214v54q0 36 27 63t63 26h35q37 0 63-26t27-63v-54h71q29 0 50-21t22-50z" horiz-adv-x="928.6" />
<glyph glyph-name="calendar" unicode="&#xe83c;" d="m71-79h161v161h-161v-161z m197 0h178v161h-178v-161z m-197 197h161v178h-161v-178z m197 0h178v178h-178v-178z m-197 214h161v161h-161v-161z m411-411h179v161h-179v-161z m-214 411h178v161h-178v-161z m428-411h161v161h-161v-161z m-214 197h179v178h-179v-178z m-196 482v161q0 7-6 12t-12 6h-36q-7 0-12-6t-6-12v-161q0-7 6-13t12-5h36q7 0 12 5t6 13z m410-482h161v178h-161v-178z m-214 214h179v161h-179v-161z m214 0h161v161h-161v-161z m18 268v161q0 7-5 12t-13 6h-35q-8 0-13-6t-5-12v-161q0-7 5-13t13-5h35q8 0 13 5t5 13z m215 36v-715q0-29-22-50t-50-21h-786q-29 0-50 21t-21 50v715q0 29 21 50t50 21h72v54q0 36 26 63t63 26h36q37 0 63-26t26-63v-54h214v54q0 36 27 63t63 26h35q37 0 63-26t27-63v-54h71q29 0 50-21t22-50z" horiz-adv-x="928.6" />
<glyph glyph-name="wrench" unicode="&#xe83d;" d="m214 29q0 14-10 25t-25 10-26-10-10-25 10-26 26-10 25 10 10 26z m360 234l-381-381q-21-20-50-20-29 0-51 20l-59 61q-21 20-21 50 0 29 21 51l380 380q22-55 64-97t97-64z m353 243q0-22-12-59-27-75-92-122t-144-46q-104 0-177 73t-73 177 73 176 177 74q32 0 67-10t60-26q9-6 9-15t-9-16l-163-94v-125l108-60q2 2 44 27t75 45 40 20q8 0 13-5t4-14z" horiz-adv-x="928.6" />
<glyph glyph-name="sliders" unicode="&#xe83e;" d="m196 64v-71h-196v71h196z m197 72q14 0 25-11t11-25v-143q0-14-11-25t-25-11h-143q-14 0-25 11t-11 25v143q0 15 11 25t25 11h143z m89 214v-71h-482v71h482z m-357 286v-72h-125v72h125z m732-572v-71h-411v71h411z m-536 643q15 0 26-10t10-26v-142q0-15-10-26t-26-10h-142q-15 0-26 10t-10 26v142q0 15 10 26t26 10h142z m358-286q14 0 25-10t10-25v-143q0-15-10-25t-25-11h-143q-15 0-25 11t-11 25v143q0 14 11 25t25 10h143z m178-71v-71h-125v71h125z m0 286v-72h-482v72h482z" horiz-adv-x="857.1" />
<glyph glyph-name="services" unicode="&#xe83f;" d="m500 350q0 59-42 101t-101 42-101-42-42-101 42-101 101-42 101 42 42 101z m429-286q0 29-22 51t-50 21-50-21-21-51q0-29 21-50t50-21 51 21 21 50z m0 572q0 29-22 50t-50 21-50-21-21-50q0-30 21-51t50-21 51 21 21 51z m-215-235v-103q0-6-4-11t-9-6l-86-14q-6-19-18-42 19-27 50-64 4-6 4-11 0-7-4-11-13-17-46-50t-44-33q-6 0-11 4l-64 50q-21-11-43-17-6-60-13-87-4-13-17-13h-104q-6 0-11 4t-5 10l-13 85q-19 6-42 18l-66-50q-4-4-11-4-6 0-12 4-80 75-80 90 0 5 4 10 5 8 23 30t26 34q-13 24-20 46l-85 13q-5 1-9 5t-4 11v103q0 6 4 11t9 6l86 14q7 19 18 42-19 27-50 64-4 6-4 11 0 7 4 11 12 17 46 50t44 33q6 0 12-4l64-50q19 10 43 18 6 60 13 86 3 13 16 13h104q6 0 11-4t6-10l13-85q19-6 41-17l66 49q5 4 11 4 7 0 12-4 81-75 81-90 0-5-4-10-7-9-24-30t-25-34q13-27 19-46l85-12q5-2 9-6t4-11z m357-298v-78q0-9-83-17-6-15-16-29 28-63 28-77 0-2-2-4-68-40-69-40-5 0-26 27t-29 37q-11-1-17-1t-17 1q-7-11-29-37t-25-27q-1 0-69 40-3 2-3 4 0 14 29 77-10 14-17 29-83 8-83 17v78q0 9 83 18 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 1 17 1t17-1q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-9 83-18z m0 572v-78q0-9-83-18-6-15-16-29 28-63 28-77 0-2-2-4-68-39-69-39-5 0-26 26t-29 38q-11-1-17-1t-17 1q-7-12-29-38t-25-26q-1 0-69 39-3 2-3 4 0 14 29 77-10 14-17 29-83 9-83 18v78q0 9 83 17 7 16 17 29-29 63-29 77 0 2 3 4 2 1 19 11t33 19 17 9q4 0 25-26t29-38q12 2 17 2t17-2q28 40 51 63l4 1q2 0 69-39 2-2 2-4 0-14-28-77 9-13 16-29 83-8 83-17z" horiz-adv-x="1071.4" />
<glyph glyph-name="service" unicode="&#xe840;" d="m571 350q0 59-41 101t-101 42-101-42-42-101 42-101 101-42 101 42 41 101z m286 61v-124q0-7-4-13t-11-7l-104-16q-10-30-21-51 19-27 59-77 6-6 6-13t-5-13q-15-21-55-61t-53-39q-7 0-14 5l-77 60q-25-13-51-21-9-76-16-104-4-16-20-16h-124q-8 0-14 5t-6 12l-16 103q-27 9-50 21l-79-60q-6-5-14-5-8 0-14 6-70 64-92 94-4 5-4 13 0 6 5 12 8 12 28 37t30 40q-15 28-23 55l-102 15q-7 1-11 7t-5 13v124q0 7 5 13t10 7l104 16q8 25 22 51-23 32-60 77-6 7-6 14 0 5 5 12 15 20 55 60t53 40q7 0 15-5l77-60q24 13 50 21 9 76 17 104 3 15 20 15h124q7 0 13-4t7-12l15-103q28-9 50-21l80 60q5 5 13 5 7 0 14-5 72-67 92-95 4-5 4-13 0-6-4-12-9-12-29-38t-30-39q14-28 23-55l102-15q7-1 12-7t4-13z" horiz-adv-x="857.1" />
<glyph glyph-name="phone" unicode="&#xe841;" d="m786 158q0-15-6-39t-12-38q-11-28-68-60-52-28-103-28-16 0-30 2t-32 7-26 8-31 11-28 10q-54 20-97 47-72 44-148 120t-120 148q-27 43-46 97-2 5-10 28t-12 31-8 26-7 32-2 29q0 52 29 104 31 56 59 68 14 6 38 12t39 6q8 0 12-2 10-3 30-43 6-10 16-30t20-35 17-30q2-2 10-14t12-20 4-16q0-11-16-28t-35-30-34-30-16-25q0-5 3-13t4-11 8-14 7-10q42-77 97-132t131-97q1 0 10-6t14-8 11-5 13-2q10 0 25 15t30 35 31 35 28 16q7 0 15-4t20-12 14-10q14-8 30-17t35-20 31-17q39-19 42-29 2-4 2-12z" horiz-adv-x="785.7" />
<glyph glyph-name="file-pdf" unicode="&#xe842;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-287 331q18-14 47-31 33 4 65 4 82 0 99-27 9-13 1-29 0-1-1-1l-1-2v0q-3-21-39-21-27 0-65 11t-72 29q-123-13-219-46-85-146-135-146-8 0-15 4l-14 6q0 1-3 3-6 6-4 20 5 23 32 51t73 54q8 5 13-3 1-1 1-2 29 47 60 110 38 76 58 146-13 46-17 89t4 71q6 22 23 22h12q13 0 20-8 10-12 5-38-1-3-2-4 0-2 0-5v-17q-1-68-8-107 31-91 82-133z m-322-229q30 13 77 88-29-22-49-47t-28-41z m223 513q-9-23-2-73 1 4 4 24 0 2 4 24 1 3 3 5-1 0-1 1t0 1-1 1q0 12-7 20 0-1 0-1v-2z m-70-368q76 30 159 45-1 0-7 5t-9 8q-43 37-71 98-15-48-47-110-16-31-25-46z m361 8q-14 14-78 14 42-16 69-16 8 0 10 1 0 0-1 1z" horiz-adv-x="857.1" />
<glyph glyph-name="file-word" unicode="&#xe843;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-656 500v-59h39l92-369h88l72 271q4 11 5 25 1 9 1 14h3l1-14q1-1 2-11t3-14l72-271h89l91 369h39v59h-167v-59h50l-55-245q-3-11-4-25l-1-12h-3l-1 12q-1 2-2 11t-3 14l-81 304h-63l-81-304q-1-5-2-13t-2-12l-2-12h-2l-2 12q-1 14-4 25l-55 245h50v59h-167z" horiz-adv-x="857.1" />
<glyph glyph-name="file-excel" unicode="&#xe844;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-547 131v-59h157v59h-42l58 90q3 4 5 9t5 8 2 2h1q0-2 2-6 2-2 3-4t3-4 4-5l60-90h-43v-59h163v59h-38l-107 152 108 158h38v59h-156v-59h41l-57-89q-2-4-6-9t-5-8l-1-1h-1q-1 2-3 5-3 6-9 13l-59 89h42v59h-162v-59h38l106-152-109-158h-38z" horiz-adv-x="857.1" />
<glyph glyph-name="doc-text" unicode="&#xe845;" d="m819 638q16-16 27-42t11-50v-642q0-23-15-38t-38-16h-750q-23 0-38 16t-16 38v892q0 23 16 38t38 16h500q22 0 49-11t42-27z m-248 136v-210h210q-5 16-12 23l-175 175q-6 7-23 12z m215-853v572h-232q-23 0-38 15t-16 38v233h-429v-858h715z m-572 483q0 7 5 12t13 5h393q8 0 13-5t5-12v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36z m411-125q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z m0-143q8 0 13-5t5-13v-36q0-8-5-13t-13-5h-393q-8 0-13 5t-5 13v36q0 8 5 13t13 5h393z" horiz-adv-x="857.1" />
<glyph glyph-name="trash" unicode="&#xe846;" d="m286 439v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m143 0v-321q0-8-5-13t-13-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q8 0 13-5t5-13z m142 0v-321q0-8-5-13t-12-5h-36q-8 0-13 5t-5 13v321q0 8 5 13t13 5h36q7 0 12-5t5-13z m72-404v529h-500v-529q0-12 4-22t8-15 6-5h464q2 0 6 5t8 15 4 22z m-375 601h250l-27 65q-4 5-9 6h-177q-6-1-10-6z m518-18v-36q0-8-5-13t-13-5h-54v-529q0-46-26-80t-63-34h-464q-37 0-63 33t-27 79v531h-53q-8 0-13 5t-5 13v36q0 8 5 13t13 5h172l39 93q9 21 31 35t44 15h178q22 0 44-15t30-35l39-93h173q8 0 13-5t5-13z" horiz-adv-x="785.7" />
<glyph glyph-name="comment-empty" unicode="&#xe847;" d="m500 636q-114 0-213-39t-157-105-59-142q0-62 40-119t113-98l48-28-15-54q-13-50-39-95 85 35 154 95l24 21 31-3q39-5 73-5 114 0 213 39t157 105 59 142-59 142-157 105-213 39z m500-286q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-7-63-12h-3q-8 0-15 6t-9 15v1q-2 2 0 7t1 5 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 97 67 179t182 130 251 48 251-48 182-130 67-179z" horiz-adv-x="1000" />
<glyph glyph-name="comment" unicode="&#xe848;" d="m1000 350q0-97-67-179t-182-130-251-48q-39 0-81 4-110-97-257-135-27-8-63-12-10-1-17 5t-10 16v1q-2 2 0 6t1 6 2 5l4 5t4 5 4 5q4 5 17 19t20 22 17 22 18 28 15 33 15 42q-88 50-138 123t-51 157q0 73 40 139t106 114 160 76 194 28q136 0 251-48t182-130 67-179z" horiz-adv-x="1000" />
<glyph glyph-name="chat" unicode="&#xe849;" d="m786 421q0-77-53-143t-143-104-197-38q-48 0-98 9-70-49-155-72-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4 1 3l1 3t2 3 2 3 3 3 2 2q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125q0 78 53 144t143 104 197 38 197-38 143-104 53-144z m214-142q0-67-40-126t-108-98q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-13-4q-27 4-48 9-85 23-155 72-50-9-98-9-151 0-263 74 32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128z" horiz-adv-x="1000" />
<glyph glyph-name="chat-empty" unicode="&#xe84a;" d="m393 636q-85 0-160-29t-118-79-44-107q0-45 30-88t83-73l54-32-19-46q19 11 34 21l25 18 30-6q43-8 85-8 85 0 159 29t118 79 44 106-44 107-118 79-159 29z m0 71q106 0 197-38t143-104 53-144-53-143-143-104-197-38q-48 0-98 9-70-49-155-72-21-5-48-9h-2q-6 0-12 5t-6 12q-1 1-1 3t1 4 1 3l1 3t2 3 2 3 3 3 2 2q3 3 13 14t15 16 12 17 14 21 11 25q-69 40-108 98t-40 125q0 78 53 144t143 104 197 38z m459-652q5-14 11-25t14-21 13-16 14-17 13-14q0 0 2-2t3-3 2-3 2-3l1-3t1-3 1-4-1-3q-2-8-7-13t-13-4q-27 4-48 9-85 23-155 72-50-9-98-9-151 0-263 74 32-3 49-3 90 0 172 25t148 72q69 52 107 119t37 141q0 43-13 85 72-39 114-99t42-128q0-67-40-126t-108-98z" horiz-adv-x="1000" />
<glyph glyph-name="bell" unicode="&#xe84b;" d="m509-96q0 8-9 8-33 0-57 24t-23 57q0 9-9 9t-9-9q0-41 29-70t69-28q9 0 9 9z m-372 160h726q-149 168-149 465 0 28-13 58t-39 58-67 45-95 17-95-17-67-45-39-58-13-58q0-297-149-465z m827 0q0-29-21-50t-50-21h-250q0-59-42-101t-101-42-101 42-42 101h-250q-29 0-50 21t-21 50q28 24 51 49t47 67 42 89 27 114 11 146q0 84 66 157t171 89q-5 10-5 21 0 23 16 38t38 16 38-16 16-38q0-11-5-21 106-16 171-89t66-157q0-78 11-146t27-114 42-89 47-67 51-49z" horiz-adv-x="1000" />
<glyph glyph-name="bell-alt" unicode="&#xe84c;" d="m509-96q0 8-9 8-33 0-57 24t-23 57q0 9-9 9t-9-9q0-41 29-70t69-28q9 0 9 9z m455 160q0-29-21-50t-50-21h-250q0-59-42-101t-101-42-101 42-42 101h-250q-29 0-50 21t-21 50q28 24 51 49t47 67 42 89 27 114 11 146q0 84 66 157t171 89q-5 10-5 21 0 23 16 38t38 16 38-16 16-38q0-11-5-21 106-16 171-89t66-157q0-78 11-146t27-114 42-89 47-67 51-49z" horiz-adv-x="1000" />
<glyph glyph-name="attention-alt" unicode="&#xe84d;" d="m286 154v-125q0-15-11-25t-25-11h-143q-14 0-25 11t-11 25v125q0 14 11 25t25 10h143q15 0 25-10t11-25z m16 589l-15-429q-1-14-12-25t-25-10h-143q-14 0-25 10t-12 25l-15 429q-1 14 9 25t25 11h179q14 0 25-11t9-25z" horiz-adv-x="357.1" />
<glyph glyph-name="print" unicode="&#xe84e;" d="m214-7h500v143h-500v-143z m0 357h500v214h-89q-22 0-38 16t-16 38v89h-357v-357z m643-36q0 15-10 25t-26 11-25-11-10-25 10-25 25-10 26 10 10 25z m72 0v-232q0-7-6-12t-12-6h-125v-89q0-22-16-38t-38-16h-536q-22 0-37 16t-16 38v89h-125q-7 0-13 6t-5 12v232q0 44 32 76t75 31h36v304q0 22 16 38t37 16h375q23 0 50-12t42-26l85-85q15-16 27-43t11-49v-143h35q45 0 76-31t32-76z" horiz-adv-x="928.6" />
<glyph glyph-name="edit" unicode="&#xe84f;" d="m496 189l64 65-85 85-64-65v-31h53v-54h32z m245 402q-9 9-18 0l-196-196q-9-9 0-18t18 0l196 196q9 9 0 18z m45-331v-106q0-67-47-114t-114-47h-464q-67 0-114 47t-47 114v464q0 66 47 113t114 48h464q35 0 65-14 9-4 10-13 2-10-5-16l-27-28q-8-8-18-4-13 3-25 3h-464q-37 0-63-26t-27-63v-464q0-37 27-63t63-27h464q37 0 63 27t26 63v70q0 7 5 12l36 36q8 8 20 4t11-16z m-54 411l161-160-375-375h-161v160z m248-73l-51-52-161 161 51 51q16 16 38 16t38-16l85-84q16-16 16-38t-16-38z" horiz-adv-x="1000" />
<glyph glyph-name="forward" unicode="&#xe850;" d="m1000 493q0-15-11-25l-285-286q-11-11-25-11t-26 11-10 25v143h-125q-55 0-98-3t-86-12-74-24-59-39-45-56-27-77-10-101q0-31 3-69 0-4 2-13t1-15q0-8-5-14t-13-6q-9 0-15 10-4 5-8 12t-7 17-6 13q-71 159-71 252 0 111 30 186 90 225 488 225h125v143q0 14 10 25t26 10 25-10l285-286q11-11 11-25z" horiz-adv-x="1000" />
<glyph glyph-name="reply" unicode="&#xe851;" d="m1000 225q0-93-71-252-2-4-6-13t-7-17-8-12q-6-10-15-10-9 0-13 6t-5 14q0 5 1 15t2 13q3 38 3 69 0 56-10 101t-27 77-45 56-59 39-74 24-86 12-98 3h-125v-143q0-14-10-25t-26-11-25 11l-285 286q-11 10-11 25t11 25l285 286q11 10 25 10t26-10 10-25v-143h125q398 0 488-225 30-75 30-186z" horiz-adv-x="1000" />
<glyph glyph-name="reply-all" unicode="&#xe852;" d="m357 246v-39q0-23-22-33-7-3-14-3-15 0-25 11l-285 286q-11 10-11 25t11 25l285 286q17 17 39 7 22-9 22-32v-39l-221-222q-11-11-11-25t11-25z m643-21q0-32-9-74t-22-77-27-70-22-51l-12-22q-4-10-15-10-3 0-5 1-14 4-13 19 24 223-59 315-36 40-95 62t-150 29v-140q0-23-21-33-8-3-14-3-15 0-25 11l-286 286q-11 10-11 25t11 25l286 286q16 17 39 7 21-9 21-32v-147q230-15 335-123 94-97 94-284z" horiz-adv-x="1000" />
<glyph glyph-name="eye" unicode="&#xe853;" d="m929 314q-85 132-213 197 34-58 34-125 0-104-73-177t-177-73-177 73-73 177q0 67 34 125-128-65-213-197 75-114 187-182t242-68 242 68 187 182z m-402 215q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m473-215q0-19-11-38-78-129-210-206t-279-77-279 77-210 206q-11 19-11 38t11 39q78 128 210 205t279 78 279-78 210-205q11-20 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="tag" unicode="&#xe854;" d="m250 600q0 30-21 51t-50 20-51-20-21-51 21-50 51-21 50 21 21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z" horiz-adv-x="857.1" />
<glyph glyph-name="tags" unicode="&#xe855;" d="m250 600q0 30-21 51t-50 20-51-20-21-51 21-50 51-21 50 21 21 50z m595-321q0-30-20-51l-274-274q-22-21-51-21-30 0-50 21l-399 399q-21 21-36 57t-15 65v232q0 29 21 50t50 22h233q29 0 65-15t57-36l399-399q20-21 20-50z m215 0q0-30-21-51l-274-274q-22-21-51-21-20 0-33 8t-29 25l262 262q21 21 21 51 0 29-21 50l-399 399q-21 21-57 36t-65 15h125q29 0 65-15t57-36l399-399q21-21 21-50z" horiz-adv-x="1071.4" />
<glyph glyph-name="lock-open-alt" unicode="&#xe856;" d="m589 421q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v179q0 103 74 177t176 73 177-73 73-177q0-15-10-25t-25-11h-36q-14 0-25 11t-11 25q0 59-42 101t-101 42-101-42-41-101v-179h410z" horiz-adv-x="642.9" />
<glyph glyph-name="lock-open" unicode="&#xe857;" d="m929 529v-143q0-15-11-25t-25-11h-36q-14 0-25 11t-11 25v143q0 59-41 101t-101 41-101-41-42-101v-108h53q23 0 38-15t16-38v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h375v108q0 103 73 176t177 74 176-74 74-176z" horiz-adv-x="928.6" />
<glyph glyph-name="lock" unicode="&#xe858;" d="m179 421h285v108q0 59-42 101t-101 41-101-41-41-101v-108z m464-53v-322q0-22-16-37t-38-16h-535q-23 0-38 16t-16 37v322q0 22 16 38t38 15h17v108q0 102 74 176t176 74 177-74 73-176v-108h18q23 0 38-15t16-38z" horiz-adv-x="642.9" />
<glyph glyph-name="home" unicode="&#xe859;" d="m786 296v-267q0-15-11-26t-25-10h-214v214h-143v-214h-214q-15 0-25 10t-11 26v267q0 1 0 2t0 2l321 264 321-264q1-1 1-4z m124 39l-34-41q-5-5-12-6h-2q-7 0-12 3l-386 322-386-322q-7-4-13-4-7 2-12 7l-35 41q-4 5-3 13t6 12l401 334q18 15 42 15t43-15l136-114v109q0 8 5 13t13 5h107q8 0 13-5t5-13v-227l122-102q5-5 6-12t-4-13z" horiz-adv-x="928.6" />
<glyph glyph-name="info" unicode="&#xe85a;" d="m357 100v-71q0-15-10-25t-26-11h-285q-15 0-25 11t-11 25v71q0 15 11 25t25 11h35v214h-35q-15 0-25 11t-11 25v71q0 15 11 25t25 11h214q15 0 25-11t11-25v-321h35q15 0 26-11t10-25z m-71 643v-107q0-15-11-25t-25-11h-143q-14 0-25 11t-11 25v107q0 14 11 25t25 11h143q15 0 25-11t11-25z" horiz-adv-x="357.1" />
<glyph glyph-name="help" unicode="&#xe85b;" d="m393 149v-134q0-9-7-16t-15-6h-134q-9 0-16 6t-7 16v134q0 9 7 16t16 6h134q8 0 15-6t7-16z m176 335q0-30-8-56t-20-43-31-33-32-25-34-19q-23-13-38-37t-15-37q0-10-7-18t-16-9h-134q-8 0-14 10t-6 21v26q0 46 37 87t79 60q33 15 47 32t14 42q0 23-26 41t-60 18q-36 0-60-16-20-14-60-64-7-9-17-9-7 0-14 4l-91 70q-8 6-9 14t3 16q89 148 259 148 45 0 90-17t81-46 59-72 23-88z" horiz-adv-x="571.4" />
<glyph glyph-name="search" unicode="&#xe85c;" d="m643 386q0 103-74 176t-176 74-177-74-73-176 73-177 177-73 176 73 74 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 152-31 126-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="flapping" unicode="&#xe85d;" d="m0 34v173h229q28 0 52 10 31-84 98-145-71-38-150-38h-229z m0 458v173h229q65 0 123-25t101-67 68-101 25-123q0-58 41-100t101-42h85q1 0 3 0t4 0v52q0 16 10 22t22-3l234-144q8-5 8-14 0-3-2-7t-4-5l-2-2-234-143q-13-9-22-3t-10 21v54q-1 0-4-1t-3 0h-85q-64 0-123 25t-101 67-67 101-25 122q0 59-42 101t-101 42h-229z m538 136q68 37 150 37h85q1 0 3 0t4 0v54q0 15 10 21t22-3l234-144q8-6 8-14 0-4-2-7t-4-5l-2-2-234-144q-13-8-22-2t-10 21v53q-1 0-4 0t-3-1h-85q-26 0-51-10-32 85-99 146z" horiz-adv-x="1054.7" />
<glyph glyph-name="rewind" unicode="&#xe85e;" d="m532 736q170 0 289-120t119-290-119-290-289-120q-142 0-252 88l70 74q84-60 182-60 126 0 216 90t90 218-90 218-216 90q-124 0-214-87t-92-211l142 0-184-204-184 204 124 0q2 166 122 283t286 117z" horiz-adv-x="940" />
<glyph glyph-name="chart-line" unicode="&#xe85f;" d="m1143-7v-72h-1143v858h71v-786h1072z m-72 696v-242q0-12-10-17t-20 4l-68 68-353-353q-6-6-13-6t-13 6l-130 130-232-233-107 108 326 326q6 6 13 6t13-6l130-130 259 259-67 67q-9 9-5 20t17 11h243q7 0 12-5t5-13z" horiz-adv-x="1142.9" />
<glyph glyph-name="bell-off" unicode="&#xe860;" d="m869 375q34-199 167-311 0-29-22-50t-50-21h-250q0-59-42-101t-101-42-100 42-42 100z m-298-480q9 0 9 9t-9 8q-32 0-56 24t-24 57q0 9-9 9t-9-9q0-41 29-70t69-28z m560 892q4-5 4-13t-6-12l-1045-905q-5-5-13-4t-12 6l-47 53q-4 6-4 14t6 12l104 89q-11 18-11 37 28 24 51 49t47 67 42 89 28 114 11 146q0 84 65 157t171 89q-4 10-4 21 0 23 15 38t38 16 38-16 16-38q0-11-4-21 69-10 122-46t82-88l234 202q5 5 13 4t12-6z" horiz-adv-x="1142.9" />
<glyph glyph-name="bell-off-empty" unicode="&#xe861;" d="m580-96q0 8-9 8-32 0-56 24t-24 57q0 9-9 9t-9-9q0-41 29-70t69-28q9 0 9 9z m-299 265l489 424q-23 49-74 81t-125 33q-51 0-94-17t-68-45-38-58-14-58q0-215-76-360z m755-105q0-29-22-50t-50-21h-250q0-59-42-101t-101-42-100 42-42 100l83 72h422q-92 105-127 256l62 55q34-199 167-311z m48 777l47-54q4-5 4-13t-6-12l-1045-905q-5-5-13-4t-12 6l-47 53q-4 6-4 14t6 12l104 89q-11 18-11 37 28 24 51 49t47 67 42 89 28 114 11 146q0 84 65 157t171 89q-4 10-4 21 0 23 15 38t38 16 38-16 16-38q0-11-4-21 69-10 122-46t82-88l234 202q5 5 13 4t12-6z" horiz-adv-x="1142.9" />
<glyph glyph-name="plug" unicode="&#xe862;" d="m979 597q21-20 21-50t-21-51l-223-223 83-84-89-89q-91-91-217-104t-230 56l-202-202h-101v101l202 202q-69 103-56 230t104 217l89 89 84-83 223 223q21 21 51 21t50-21 21-50-21-51l-223-224 131-130 223 223q22 21 51 21t50-21z" horiz-adv-x="1000" />
<glyph glyph-name="eye-off" unicode="&#xe863;" d="m310 105l43 79q-48 35-76 88t-27 114q0 67 34 125-128-65-213-197 94-144 239-209z m217 424q0 11-8 19t-19 7q-70 0-120-50t-50-119q0-12 8-19t19-8 19 8 8 19q0 48 34 82t82 34q11 0 19 8t8 19z m202 106q0-4 0-5-59-105-176-316t-176-316l-28-50q-5-9-15-9-7 0-75 39-9 6-9 16 0 7 25 49-80 36-147 96t-117 137q-11 17-11 38t11 39q86 131 212 207t277 76q50 0 100-10l31 54q5 9 15 9 3 0 10-3t18-9 18-10 18-10 10-7q9-5 9-15z m21-249q0-78-44-142t-117-92l157 281q4-26 4-47z m250-72q0-19-11-38-22-36-61-81-84-96-194-149t-234-53l41 74q119 10 219 76t169 171q-65 100-158 164l35 63q53-36 102-86t81-102q11-19 11-39z" horiz-adv-x="1000" />
<glyph glyph-name="reschedule" unicode="&#xe864;" d="m186 140l116 116 0-292-276 16 88 86q-116 122-114 290t120 288q100 100 240 116l4-102q-100-16-172-88-88-88-90-213t84-217z m332 598l276-16-88-86q116-122 114-290t-120-288q-96-98-240-118l-2 104q98 16 170 88 88 88 90 213t-84 217l-114-116z" horiz-adv-x="820" />
<glyph glyph-name="cw" unicode="&#xe865;" d="m408 760q168 0 287-116t123-282l122 0-184-206-184 206 144 0q-4 124-94 210t-214 86q-126 0-216-90t-90-218q0-126 90-216t216-90q104 0 182 60l70-76q-110-88-252-88-168 0-288 120t-120 290 120 290 288 120z" horiz-adv-x="940" />
<glyph glyph-name="host" unicode="&#xe866;" d="m232 136q-37 0-63 26t-26 63v393q0 37 26 63t63 26h607q37 0 63-26t27-63v-393q0-37-27-63t-63-26h-607z m-18 482v-393q0-7 6-13t12-5h607q8 0 13 5t5 13v393q0 7-5 12t-13 6h-607q-7 0-12-6t-6-12z m768-518h89v-54q0-22-26-37t-63-16h-893q-36 0-63 16t-26 37v54h982z m-402-54q9 0 9 9t-9 9h-89q-9 0-9-9t9-9h89z" horiz-adv-x="1071.4" />
<glyph glyph-name="thumbs-up" unicode="&#xe867;" d="m143 100q0 15-11 25t-25 11-25-11-11-25 11-25 25-11 25 11 11 25z m643 321q0 29-22 50t-50 22h-196q0 32 27 89t26 89q0 55-17 81t-72 27q-14-15-21-48t-17-70-33-61q-13-13-43-51-2-3-13-17t-18-22-19-24-22-25-22-19-22-16-20-5h-18v-357h18q7 0 18-1t18-4 21-6 20-7 20-7 16-5q118-41 191-41h67q107 0 107 93 0 15-2 31 16 9 26 30t10 41-10 38q29 28 29 67 0 13-5 31t-14 26q18 1 30 26t12 45z m71 1q0-50-27-91 5-18 5-38 0-43-21-81 1-12 1-24 0-56-33-99 0-78-48-123t-126-45h-72q-54 0-106 13t-121 36q-65 23-77 23h-161q-29 0-50 21t-21 50v357q0 30 21 51t50 21h153q20 13 77 86 32 42 60 72 13 14 19 47t17 71 35 60q22 21 50 21 47 0 84-18t57-57 20-104q0-51-27-107h98q58 0 101-42t42-100z" horiz-adv-x="857.1" />
<glyph glyph-name="thumbs-down" unicode="&#xe868;" d="m143 600q0 15-11 25t-25 11-25-11-11-25 11-25 25-11 25 11 11 25z m643-321q0 19-12 45t-30 26q8 10 14 27t5 30q0 39-29 67 10 18 10 38t-10 41-26 30q2 16 2 31 0 47-27 70t-76 23h-71q-73 0-191-41-3-1-16-6t-20-7-20-6-21-6-18-4-18-1h-18v-358h18q9 0 20-5t22-15 22-19 22-25 19-24 18-23 13-16q30-38 43-51 23-24 33-61t17-70 21-48q54 0 72 27t17 81q0 32-26 89t-27 89h196q28 0 50 22t22 49z m71-1q0-57-42-100t-101-42h-98q27-55 27-107 0-66-20-104-19-39-57-57t-84-18q-28 0-50 21-19 18-30 45t-14 51-10 47-17 36q-27 28-60 71-57 73-77 86h-153q-29 0-50 21t-21 51v357q0 29 21 50t50 21h161q12 0 77 22 72 25 125 37t111 13h63q78 0 126-45t48-120v-3q33-43 33-99 0-13-1-24 21-38 21-81 0-20-5-38 27-41 27-91z" horiz-adv-x="857.1" />
<glyph glyph-name="spinner" unicode="&#xe869;" d="m277 100q0-33-24-57t-57-23q-33 0-56 23t-24 57 24 57 56 23q33 0 57-23t24-57z m241-107q0-30-21-51t-51-21-50 21-21 51 21 50 50 21 51-21 21-50z m-339 357q0-37-27-63t-63-26-63 26-26 63 26 63 63 26 63-26 27-63z m580-250q0-26-18-44t-45-18-44 18-18 44 18 44 44 19 45-19 18-44z m-464 500q0-41-29-69t-70-29-69 29-29 69 29 69 69 29 70-29 29-69z m259 107q0-45-32-76t-76-31-75 31-32 76 32 76 75 31 76-31 32-76z m303-357q0-22-15-38t-38-16-38 16-16 38 16 38 38 16 38-16 15-38z m-116 250q0-18-13-32t-32-13-31 13-13 32 13 31 31 14 32-14 13-31z" horiz-adv-x="875" />
<glyph glyph-name="attach" unicode="&#xe86a;" d="m783 77q0-65-44-109t-109-44q-75 0-131 55l-434 434q-63 64-63 151 0 88 62 150t150 62q88 0 152-63l338-338q5-5 5-12 0-9-17-26t-26-17q-7 0-13 5l-338 339q-44 43-101 43-59 0-100-42t-40-101q0-58 42-101l433-433q35-35 81-35 36 0 59 23t24 59q0 46-36 81l-324 324q-14 14-33 14-16 0-27-11t-11-27q0-18 14-33l229-228q6-6 6-13 0-9-18-26t-26-17q-7 0-12 5l-229 229q-35 34-35 83 0 46 32 78t77 32q49 0 83-36l325-324q55-54 55-131z" horiz-adv-x="785.7" />
<glyph glyph-name="keyboard" unicode="&#xe86b;" d="m214 198v-53q0-9-9-9h-53q-9 0-9 9v53q0 9 9 9h53q9 0 9-9z m72 143v-53q0-9-9-9h-125q-9 0-9 9v53q0 9 9 9h125q9 0 9-9z m-72 143v-54q0-9-9-9h-53q-9 0-9 9v54q0 9 9 9h53q9 0 9-9z m572-286v-53q0-9-9-9h-482q-9 0-9 9v53q0 9 9 9h482q9 0 9-9z m-357 143v-53q0-9-9-9h-54q-9 0-9 9v53q0 9 9 9h54q9 0 9-9z m-72 143v-54q0-9-9-9h-53q-9 0-9 9v54q0 9 9 9h53q9 0 9-9z m214-143v-53q0-9-8-9h-54q-9 0-9 9v53q0 9 9 9h54q8 0 8-9z m-71 143v-54q0-9-9-9h-53q-9 0-9 9v54q0 9 9 9h53q9 0 9-9z m214-143v-53q0-9-9-9h-53q-9 0-9 9v53q0 9 9 9h53q9 0 9-9z m215-143v-53q0-9-9-9h-54q-9 0-9 9v53q0 9 9 9h54q9 0 9-9z m-286 286v-54q0-9-9-9h-54q-9 0-9 9v54q0 9 9 9h54q9 0 9-9z m143 0v-54q0-9-9-9h-54q-9 0-9 9v54q0 9 9 9h54q9 0 9-9z m143 0v-196q0-9-9-9h-125q-9 0-9 9v53q0 9 9 9h62v134q0 9 9 9h54q9 0 9-9z m71-420v500h-929v-500h929z m71 500v-500q0-29-21-50t-50-21h-929q-29 0-50 21t-21 50v500q0 30 21 51t50 21h929q30 0 50-21t21-51z" horiz-adv-x="1071.4" />
<glyph glyph-name="menu" unicode="&#xe86c;" d="m857 100v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 25t25 11h785q15 0 26-11t10-25z m0 286v-72q0-14-10-25t-26-10h-785q-15 0-25 10t-11 25v72q0 14 11 25t25 10h785q15 0 26-10t10-25z m0 285v-71q0-15-10-25t-26-11h-785q-15 0-25 11t-11 25v71q0 15 11 26t25 10h785q15 0 26-10t10-26z" horiz-adv-x="857.1" />
<glyph glyph-name="wifi" unicode="&#xe86d;" d="m571 0q-11 0-51 41t-41 52q0 18 35 30t57 13 58-13 35-30q0-11-41-52t-52-41z m151 151q-1 0-22 14t-57 28-72 14-71-14-57-28-22-14q-10 0-52 42t-43 52q0 7 6 13 44 43 109 67t130 25 130-25 110-67q5-6 5-13 0-10-42-52t-52-42z m152 152q-6 0-12 5-76 58-141 86t-150 27q-47 0-95-12t-83-29-63-35-44-30-18-12q-9 0-51 42t-42 52q0 7 6 12 73 74 178 115t212 40 212-40 179-115q6-5 6-12 0-10-42-52t-52-42z m152 151q-6 0-13 5-100 88-207 132t-235 45-234-45-207-132q-7-5-13-5-9 0-51 42t-43 52q0 7 6 13 104 104 248 161t294 56 295-56 248-161q5-6 5-13 0-10-42-52t-51-42z" horiz-adv-x="1142.9" />
<glyph glyph-name="moon" unicode="&#xe86e;" d="m704 123q-30-5-61-5-102 0-188 50t-137 137-50 188q0 107 58 199-112-33-183-128t-72-214q0-73 29-139t76-113 114-77 139-28q80 0 152 34t123 96z m114 47q-53-113-159-181t-230-68q-87 0-167 34t-136 92-92 137-34 166q0 85 32 163t87 135 132 92 161 38q25 1 34-22 10-23-8-40-48-43-73-101t-26-122q0-83 41-152t111-111 152-41q66 0 127 29 23 10 40-7 8-8 10-19t-2-22z" horiz-adv-x="857.1" />
<glyph glyph-name="chart-pie" unicode="&#xe86f;" d="m429 353l304-304q-59-61-138-94t-166-34q-117 0-216 58t-155 156-58 215 58 215 155 156 216 58v-426z m104-3h431q0-88-33-167t-94-138z m396 71h-429v429q117 0 215-57t156-156 58-216z" horiz-adv-x="1000" />
<glyph glyph-name="chart-area" unicode="&#xe870;" d="m1143-7v-72h-1143v858h71v-786h1072z m-214 571l142-500h-928v322l250 321 321-321z" horiz-adv-x="1142.9" />
<glyph glyph-name="chart-bar" unicode="&#xe871;" d="m357 350v-286h-143v286h143z m214 286v-572h-142v572h142z m572-643v-72h-1143v858h71v-786h1072z m-357 500v-429h-143v429h143z m214 214v-643h-143v643h143z" horiz-adv-x="1142.9" />
<glyph glyph-name="beaker" unicode="&#xe872;" d="m852 42q31-50 12-85t-78-36h-643q-59 0-79 36t12 85l281 442v223h-36q-14 0-25 11t-10 25 10 25 25 11h286q15 0 25-11t11-25-11-25-25-11h-36v-223z m-435 405l-151-240h397l-152 240-11 17v243h-71v-243z" horiz-adv-x="928.6" />
<glyph glyph-name="magic" unicode="&#xe873;" d="m664 526l164 163-60 60-164-164z m249 163q0-15-10-25l-717-718q-10-10-25-10t-25 10l-111 111q-10 10-10 25t10 25l718 718q10 10 25 10t25-10l110-111q10-10 10-25z m-753 106l54-16-54-17-17-55-17 55-55 17 55 16 17 55z m195-90l109-34-109-33-34-109-33 109-109 33 109 34 33 109z m519-267l55-17-55-16-17-55-17 55-54 16 54 17 17 55z m-357 357l54-16-54-17-17-55-17 55-54 17 54 16 17 55z" horiz-adv-x="928.6" />
</font>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Binary file not shown.

View File

@ -2,7 +2,7 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Authentication; namespace Icinga\Forms\Authentication;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Url; use Icinga\Web\Url;

View File

@ -2,7 +2,7 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Authentication; namespace Icinga\Forms\Config\Authentication;
use Zend_Validate_Callback; use Zend_Validate_Callback;
use Icinga\Web\Form; use Icinga\Web\Form;
@ -31,7 +31,9 @@ class AutologinBackendForm extends Form
array( array(
'required' => true, 'required' => true,
'label' => t('Backend Name'), '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( 'validators' => array(
array( array(
'Regex', 'Regex',
@ -50,9 +52,8 @@ class AutologinBackendForm extends Form
'text', 'text',
'strip_username_regexp', 'strip_username_regexp',
array( array(
'required' => true, 'label' => t('Filter Pattern'),
'label' => t('Backend Domain 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'),
'description' => t('The domain pattern of this authentication backend'),
'value' => '/\@[^$]+$/', 'value' => '/\@[^$]+$/',
'validators' => array( 'validators' => array(
new Zend_Validate_Callback(function ($value) { new Zend_Validate_Callback(function ($value) {
@ -65,7 +66,7 @@ class AutologinBackendForm extends Form
'hidden', 'hidden',
'backend', 'backend',
array( array(
'required' => true, 'disabled' => true,
'value' => 'autologin' 'value' => 'autologin'
) )
); );
@ -82,7 +83,7 @@ class AutologinBackendForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidAuthenticationBackend(Form $form) public static function isValidAuthenticationBackend(Form $form)
{ {
return true; return true;
} }

View File

@ -2,11 +2,11 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Authentication; namespace Icinga\Forms\Config\Authentication;
use Exception; use Exception;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Request; use Icinga\Data\ConfigObject;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
use Icinga\Authentication\Backend\DbUserBackend; use Icinga\Authentication\Backend\DbUserBackend;
@ -54,7 +54,9 @@ class DbBackendForm extends Form
array( array(
'required' => true, 'required' => true,
'label' => t('Backend Name'), '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( $this->addElement(
@ -73,7 +75,7 @@ class DbBackendForm extends Form
'hidden', 'hidden',
'backend', 'backend',
array( array(
'required' => true, 'disabled' => true,
'value' => 'db' 'value' => 'db'
) )
); );
@ -86,9 +88,9 @@ class DbBackendForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (false === $this->isValidAuthenticationBackend($this)) { if (false === static::isValidAuthenticationBackend($this)) {
return false; return false;
} }
} }
@ -100,21 +102,29 @@ class DbBackendForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidAuthenticationBackend(Form $form) public static function isValidAuthenticationBackend(Form $form)
{ {
$element = $form->getElement('resource');
try { try {
$dbUserBackend = new DbUserBackend(ResourceFactory::create($element->getValue())); $dbUserBackend = new DbUserBackend(ResourceFactory::createResource($form->getResourceConfig()));
if ($dbUserBackend->count() < 1) { 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; return false;
} }
} catch (Exception $e) { } 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 false;
} }
return true; return true;
} }
/**
* Return the configuration for the chosen resource
*
* @return ConfigObject
*/
public function getResourceConfig()
{
return ResourceFactory::getResourceConfig($this->getValue('resource'));
}
} }

View File

@ -2,12 +2,13 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Authentication; namespace Icinga\Forms\Config\Authentication;
use Exception; use Exception;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Request; use Icinga\Data\ConfigObject;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
use Icinga\Exception\AuthenticationException;
use Icinga\Authentication\Backend\LdapUserBackend; use Icinga\Authentication\Backend\LdapUserBackend;
/** /**
@ -54,7 +55,9 @@ class LdapBackendForm extends Form
array( array(
'required' => true, 'required' => true,
'label' => t('Backend Name'), '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( $this->addElement(
@ -93,11 +96,20 @@ class LdapBackendForm extends Form
'hidden', 'hidden',
'backend', 'backend',
array( array(
'required' => true, 'disabled' => true,
'value' => 'ldap' '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; return $this;
} }
@ -106,9 +118,9 @@ class LdapBackendForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (false === $this->isValidAuthenticationBackend($this)) { if (false === static::isValidAuthenticationBackend($this)) {
return false; return false;
} }
} }
@ -120,22 +132,34 @@ class LdapBackendForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidAuthenticationBackend(Form $form) public static function isValidAuthenticationBackend(Form $form)
{ {
$element = $form->getElement('resource');
try { try {
$ldapUserBackend = new LdapUserBackend( $ldapUserBackend = new LdapUserBackend(
ResourceFactory::create($element->getValue()), ResourceFactory::createResource($form->getResourceConfig()),
$form->getElement('user_class')->getValue(), $form->getElement('user_class')->getValue(),
$form->getElement('user_name_attribute')->getValue() $form->getElement('user_name_attribute')->getValue(),
$form->getElement('base_dn')->getValue()
); );
$ldapUserBackend->assertAuthenticationPossible(); $ldapUserBackend->assertAuthenticationPossible();
} catch (AuthenticationException $e) {
$form->addError($e->getMessage());
return false;
} catch (Exception $e) { } 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 false;
} }
return true; return true;
} }
/**
* Return the configuration for the chosen resource
*
* @return ConfigObject
*/
public function getResourceConfig()
{
return ResourceFactory::getResourceConfig($this->getValue('resource'));
}
} }

View File

@ -2,18 +2,19 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config; namespace Icinga\Forms\Config;
use InvalidArgumentException; use InvalidArgumentException;
use Icinga\Web\Request; use Icinga\Forms\ConfigForm;
use Icinga\Form\ConfigForm;
use Icinga\Web\Notification; use Icinga\Web\Notification;
use Icinga\Application\Config; use Icinga\Application\Config;
use Icinga\Application\Platform; use Icinga\Application\Platform;
use Icinga\Data\ConfigObject;
use Icinga\Data\ResourceFactory;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
use Icinga\Form\Config\Authentication\DbBackendForm; use Icinga\Forms\Config\Authentication\DbBackendForm;
use Icinga\Form\Config\Authentication\LdapBackendForm; use Icinga\Forms\Config\Authentication\LdapBackendForm;
use Icinga\Form\Config\Authentication\AutologinBackendForm; use Icinga\Forms\Config\Authentication\AutologinBackendForm;
class AuthenticationBackendConfigForm extends ConfigForm class AuthenticationBackendConfigForm extends ConfigForm
{ {
@ -39,8 +40,6 @@ class AuthenticationBackendConfigForm extends ConfigForm
* @param Config $resources The resource configuration * @param Config $resources The resource configuration
* *
* @return self * @return self
*
* @throws ConfigurationError In case no resources are available for authentication
*/ */
public function setResourceConfig(Config $resourceConfig) public function setResourceConfig(Config $resourceConfig)
{ {
@ -49,10 +48,6 @@ class AuthenticationBackendConfigForm extends ConfigForm
$resources[strtolower($resource->type)][] = $name; $resources[strtolower($resource->type)][] = $name;
} }
if (empty($resources)) {
throw new ConfigurationError(t('Could not find any resources for authentication'));
}
$this->resources = $resources; $this->resources = $resources;
return $this; return $this;
} }
@ -97,12 +92,12 @@ class AuthenticationBackendConfigForm extends ConfigForm
$name = isset($values['name']) ? $values['name'] : ''; $name = isset($values['name']) ? $values['name'] : '';
if (! $name) { if (! $name) {
throw new InvalidArgumentException(t('Authentication backend name missing')); throw new InvalidArgumentException(t('Authentication backend name missing'));
} elseif ($this->config->get($name) !== null) { } elseif ($this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Authentication backend already exists')); throw new InvalidArgumentException(t('Authentication backend already exists'));
} }
unset($values['name']); unset($values['name']);
$this->config->{$name} = $values; $this->config->setSection($name, $values);
return $this; return $this;
} }
@ -122,18 +117,19 @@ class AuthenticationBackendConfigForm extends ConfigForm
throw new InvalidArgumentException(t('Old authentication backend name missing')); throw new InvalidArgumentException(t('Old authentication backend name missing'));
} elseif (! ($newName = isset($values['name']) ? $values['name'] : '')) { } elseif (! ($newName = isset($values['name']) ? $values['name'] : '')) {
throw new InvalidArgumentException(t('New authentication backend name missing')); throw new InvalidArgumentException(t('New authentication backend name missing'));
} elseif (($backendConfig = $this->config->get($name)) === null) { } elseif (! $this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Unknown authentication backend provided')); throw new InvalidArgumentException(t('Unknown authentication backend provided'));
} }
$backendConfig = $this->config->getSection($name);
if ($newName !== $name) { if ($newName !== $name) {
// Only remove the old entry if it has changed as the order gets screwed when editing backend names // Only remove the old entry if it has changed as the order gets screwed when editing backend names
unset($this->config->{$name}); $this->config->removeSection($name);
} }
unset($values['name']); unset($values['name']);
$this->config->{$newName} = array_merge($backendConfig->toArray(), $values); $this->config->setSection($newName, $backendConfig->merge($values));
return $this->config->{$newName}; return $backendConfig;
} }
/** /**
@ -149,11 +145,12 @@ class AuthenticationBackendConfigForm extends ConfigForm
{ {
if (! $name) { if (! $name) {
throw new InvalidArgumentException(t('Authentication backend name missing')); throw new InvalidArgumentException(t('Authentication backend name missing'));
} elseif (($backendConfig = $this->config->get($name)) === null) { } elseif (! $this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Unknown authentication backend provided')); throw new InvalidArgumentException(t('Unknown authentication backend provided'));
} }
unset($this->config->{$name}); $backendConfig = $this->config->getSection($name);
$this->config->removeSection($name);
return $backendConfig; return $backendConfig;
} }
@ -171,7 +168,7 @@ class AuthenticationBackendConfigForm extends ConfigForm
{ {
if (! $name) { if (! $name) {
throw new InvalidArgumentException(t('Authentication backend name missing')); throw new InvalidArgumentException(t('Authentication backend name missing'));
} elseif ($this->config->get($name) === null) { } elseif (! $this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Unknown authentication backend provided')); throw new InvalidArgumentException(t('Unknown authentication backend provided'));
} }
@ -181,10 +178,10 @@ class AuthenticationBackendConfigForm extends ConfigForm
$newConfig = array(); $newConfig = array();
foreach ($backendOrder as $backendName) { foreach ($backendOrder as $backendName) {
$newConfig[$backendName] = $this->config->get($backendName); $newConfig[$backendName] = $this->config->getSection($backendName);
} }
$config = new Config($newConfig); $config = Config::fromArray($newConfig);
$this->config = $config->setConfigFile($this->config->getConfigFile()); $this->config = $config->setConfigFile($this->config->getConfigFile());
return $this; return $this;
} }
@ -197,17 +194,17 @@ class AuthenticationBackendConfigForm extends ConfigForm
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) { if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) {
$backendForm = $this->getBackendForm($this->getElement('type')->getValue()); $backendForm = $this->getBackendForm($this->getElement('type')->getValue());
if (false === $backendForm->isValidAuthenticationBackend($this)) { if (false === $backendForm::isValidAuthenticationBackend($this)) {
$this->addElement($this->getForceCreationCheckbox()); $this->addElement($this->getForceCreationCheckbox());
return false; return false;
} }
} }
$authBackend = $request->getQuery('auth_backend'); $authBackend = $this->request->getQuery('auth_backend');
try { try {
if ($authBackend === null) { // create new backend if ($authBackend === null) { // create new backend
$this->add($this->getValues()); $this->add($this->getValues());
@ -235,22 +232,33 @@ class AuthenticationBackendConfigForm extends ConfigForm
* *
* @throws ConfigurationError In case the backend name is missing in the request or is invalid * @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 !== null) {
if ($authBackend === '') { if ($authBackend === '') {
throw new ConfigurationError(t('Authentication backend name missing')); throw new ConfigurationError(t('Authentication backend name missing'));
} elseif (false === isset($this->config->{$authBackend})) { } elseif (! $this->config->hasSection($authBackend)) {
throw new ConfigurationError(t('Unknown authentication backend provided')); throw new ConfigurationError(t('Unknown authentication backend provided'));
} elseif (false === isset($this->config->{$authBackend}->backend)) { } elseif ($this->config->getSection($authBackend)->backend === null) {
throw new ConfigurationError(sprintf(t('Backend "%s" has no `backend\' setting'), $authBackend)); throw new ConfigurationError(sprintf(t('Backend "%s" has no `backend\' setting'), $authBackend));
} }
$configValues = $this->config->{$authBackend}->toArray(); $configValues = $this->config->getSection($authBackend)->toArray();
$configValues['type'] = $configValues['backend']; $configValues['type'] = $configValues['backend'];
$configValues['name'] = $authBackend; $configValues['name'] = $authBackend;
$this->populate($configValues); $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 +288,7 @@ class AuthenticationBackendConfigForm extends ConfigForm
public function createElements(array $formData) public function createElements(array $formData)
{ {
$backendTypes = array(); $backendTypes = array();
$backendType = isset($formData['type']) ? $formData['type'] : 'db'; $backendType = isset($formData['type']) ? $formData['type'] : null;
if (isset($this->resources['db'])) { if (isset($this->resources['db'])) {
$backendTypes['db'] = t('Database'); $backendTypes['db'] = t('Database');
@ -299,6 +307,10 @@ class AuthenticationBackendConfigForm extends ConfigForm
$backendTypes['autologin'] = t('Autologin'); $backendTypes['autologin'] = t('Autologin');
} }
if ($backendType === null) {
$backendType = key($backendTypes);
}
$this->addElement( $this->addElement(
'select', 'select',
'type', 'type',
@ -307,7 +319,7 @@ class AuthenticationBackendConfigForm extends ConfigForm
'required' => true, 'required' => true,
'autosubmit' => true, 'autosubmit' => true,
'label' => t('Backend Type'), '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 'multiOptions' => $backendTypes
) )
); );
@ -319,4 +331,14 @@ class AuthenticationBackendConfigForm extends ConfigForm
$this->addElements($this->getBackendForm($backendType)->createElements($formData)->getElements()); $this->addElements($this->getBackendForm($backendType)->createElements($formData)->getElements());
} }
/**
* Return the configuration for the chosen resource
*
* @return ConfigObject
*/
public function getResourceConfig()
{
return ResourceFactory::getResourceConfig($this->getValue('resource'));
}
} }

View File

@ -2,12 +2,11 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config; namespace Icinga\Forms\Config;
use InvalidArgumentException; use InvalidArgumentException;
use Icinga\Web\Request;
use Icinga\Web\Notification; use Icinga\Web\Notification;
use Icinga\Form\ConfigForm; use Icinga\Forms\ConfigForm;
class AuthenticationBackendReorderForm extends ConfigForm class AuthenticationBackendReorderForm extends ConfigForm
{ {
@ -30,17 +29,26 @@ class AuthenticationBackendReorderForm extends ConfigForm
return $this->config->keys(); 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 * Update the authentication backend order and save the configuration
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
$formData = $this->getRequestData($request); $newPosData = $this->getValue('backend_newpos');
if (isset($formData['backend_newpos'])) { if ($newPosData) {
$configForm = $this->getConfigForm(); $configForm = $this->getConfigForm();
list($backendName, $position) = explode('|', $formData['backend_newpos'], 2); list($backendName, $position) = explode('|', $newPosData, 2);
try { try {
if ($configForm->move($backendName, $position)->save()) { if ($configForm->move($backendName, $position)->save()) {

View File

@ -2,12 +2,14 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\General; namespace Icinga\Forms\Config\General;
use DateTimeZone; use DateTimeZone;
use Icinga\Web\Form; use Icinga\Application\Icinga;
use Icinga\Util\Translator;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
use Icinga\Util\Translator;
use Icinga\Web\Form;
/** /**
* Form class to modify the general application configuration * Form class to modify the general application configuration
@ -27,56 +29,18 @@ class ApplicationConfigForm extends Form
*/ */
public function createElements(array $formData) 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( $this->addElement(
'text', 'text',
'global_modulePath', 'global_module_path',
array( array(
'label' => t('Module Path'), 'label' => t('Module Path'),
'required' => true, 'required' => true,
'value' => implode(':', Icinga::app()->getModuleManager()->getModuleDirs()),
'description' => t( 'description' => t(
'Contains the directories that will be searched for available modules, separated by ' '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 ' . '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.' . 'the module folder, but won\'t show up in the list of disabled modules.'
), )
'value' => realpath(ICINGAWEB_APPDIR . '/../modules')
) )
); );

View File

@ -2,10 +2,10 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\General; namespace Icinga\Forms\Config\General;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;
use Icinga\Logger\Logger; use Icinga\Application\Logger;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Form\Validator\WritablePathValidator; use Icinga\Web\Form\Validator\WritablePathValidator;
@ -30,13 +30,13 @@ class LoggingConfigForm extends Form
'logging_log', 'logging_log',
array( array(
'required' => true, 'required' => true,
'class' => 'autosubmit', 'autosubmit' => true,
'label' => t('Logging Type'), 'label' => t('Logging Type'),
'description' => t('The type of logging to utilize.'), 'description' => t('The type of logging to utilize.'),
'multiOptions' => array( 'multiOptions' => array(
'syslog' => 'Syslog', 'syslog' => 'Syslog',
'file' => t('File'), 'file' => t('File', 'app.config.logging.type'),
'none' => t('None') 'none' => t('None', 'app.config.logging.type')
) )
) )
); );
@ -50,16 +50,16 @@ class LoggingConfigForm extends Form
'label' => t('Logging Level'), 'label' => t('Logging Level'),
'description' => t('The maximum logging level to emit.'), 'description' => t('The maximum logging level to emit.'),
'multiOptions' => array( 'multiOptions' => array(
Logger::$levels[Logger::ERROR] => t('Error'), Logger::$levels[Logger::ERROR] => t('Error', 'app.config.logging.level'),
Logger::$levels[Logger::WARNING] => t('Warning'), Logger::$levels[Logger::WARNING] => t('Warning', 'app.config.logging.level'),
Logger::$levels[Logger::INFO] => t('Information'), Logger::$levels[Logger::INFO] => t('Information', 'app.config.logging.level'),
Logger::$levels[Logger::DEBUG] => t('Debug') 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( $this->addElement(
'text', 'text',
'logging_application', 'logging_application',

View File

@ -2,13 +2,12 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config; namespace Icinga\Forms\Config;
use Icinga\Web\Request;
use Icinga\Web\Notification; use Icinga\Web\Notification;
use Icinga\Form\ConfigForm; use Icinga\Forms\ConfigForm;
use Icinga\Form\Config\General\LoggingConfigForm; use Icinga\Forms\Config\General\LoggingConfigForm;
use Icinga\Form\Config\General\ApplicationConfigForm; use Icinga\Forms\Config\General\ApplicationConfigForm;
/** /**
* Form class for application-wide and logging specific settings * Form class for application-wide and logging specific settings
@ -38,18 +37,18 @@ class GeneralConfigForm extends ConfigForm
/** /**
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
$sections = array(); $sections = array();
foreach ($this->getValues() as $sectionAndPropertyName => $value) { foreach ($this->getValues() as $sectionAndPropertyName => $value) {
list($section, $property) = explode('_', $sectionAndPropertyName); list($section, $property) = explode('_', $sectionAndPropertyName, 2);
if (! isset($sections[$section])) { if (! isset($sections[$section])) {
$sections[$section] = array(); $sections[$section] = array();
} }
$sections[$section][$property] = $value; $sections[$section][$property] = $value;
} }
foreach ($sections as $section => $config) { foreach ($sections as $section => $config) {
$this->config->{$section} = $config; $this->config->setSection($section, $config);
} }
if ($this->save()) { if ($this->save()) {
@ -62,7 +61,7 @@ class GeneralConfigForm extends ConfigForm
/** /**
* @see Form::onRequest() * @see Form::onRequest()
*/ */
public function onRequest(Request $request) public function onRequest()
{ {
$values = array(); $values = array();
foreach ($this->config as $section => $properties) { foreach ($this->config as $section => $properties) {

View File

@ -2,14 +2,13 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Resource; namespace Icinga\Forms\Config\Resource;
use Exception; use Exception;
use Zend_Config;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Request; use Icinga\Data\ConfigObject;
use Icinga\Web\Form\Element\Number;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
use Icinga\Application\Platform;
/** /**
* Form class for adding/modifying database resources * Form class for adding/modifying database resources
@ -29,6 +28,23 @@ class DbResourceForm extends Form
*/ */
public function createElements(array $formData) 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( $this->addElement(
'select', 'select',
'db', 'db',
@ -36,11 +52,7 @@ class DbResourceForm extends Form
'required' => true, 'required' => true,
'label' => t('Database Type'), 'label' => t('Database Type'),
'description' => t('The type of SQL database'), 'description' => t('The type of SQL database'),
'multiOptions' => array( 'multiOptions' => $dbChoices
'mysql' => 'MySQL',
'pgsql' => 'PostgreSQL'
//'oracle' => 'Oracle'
)
) )
); );
$this->addElement( $this->addElement(
@ -54,14 +66,13 @@ class DbResourceForm extends Form
) )
); );
$this->addElement( $this->addElement(
new Number( 'number',
array( 'port',
'required' => true, array(
'name' => 'port', 'required' => true,
'label' => t('Port'), 'label' => t('Port'),
'description' => t('The port to use'), 'description' => t('The port to use'),
'value' => 3306 'value' => 3306
)
) )
); );
$this->addElement( $this->addElement(
@ -101,9 +112,9 @@ class DbResourceForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (false === $this->isValidResource($this)) { if (false === static::isValidResource($this)) {
return false; return false;
} }
} }
@ -115,10 +126,10 @@ class DbResourceForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidResource(Form $form) public static function isValidResource(Form $form)
{ {
try { try {
$resource = ResourceFactory::createResource(new Zend_Config($form->getValues())); $resource = ResourceFactory::createResource(new ConfigObject($form->getValues()));
$resource->getConnection()->getConnection(); $resource->getConnection()->getConnection();
} catch (Exception $e) { } catch (Exception $e) {
$form->addError(t('Connectivity validation failed, connection to the given resource not possible.')); $form->addError(t('Connectivity validation failed, connection to the given resource not possible.'));

View File

@ -2,7 +2,7 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Resource; namespace Icinga\Forms\Config\Resource;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Form\Validator\ReadablePathValidator; use Icinga\Web\Form\Validator\ReadablePathValidator;
@ -25,6 +25,15 @@ class FileResourceForm extends Form
*/ */
public function createElements(array $formData) 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( $this->addElement(
'text', 'text',
'filename', 'filename',

View File

@ -2,13 +2,11 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Resource; namespace Icinga\Forms\Config\Resource;
use Exception; use Exception;
use Zend_Config;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Request; use Icinga\Data\ConfigObject;
use Icinga\Web\Form\Element\Number;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
/** /**
@ -29,6 +27,15 @@ class LdapResourceForm extends Form
*/ */
public function createElements(array $formData) 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( $this->addElement(
'text', 'text',
'hostname', 'hostname',
@ -40,14 +47,13 @@ class LdapResourceForm extends Form
) )
); );
$this->addElement( $this->addElement(
new Number( 'number',
array( 'port',
'required' => true, array(
'name' => 'port', 'required' => true,
'label' => t('Port'), 'label' => t('Port'),
'description' => t('The port of the LDAP server to use for authentication'), 'description' => t('The port of the LDAP server to use for authentication'),
'value' => 389 'value' => 389
)
) )
); );
$this->addElement( $this->addElement(
@ -56,7 +62,7 @@ class LdapResourceForm extends Form
array( array(
'required' => true, 'required' => true,
'label' => t('Root DN'), '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( $this->addElement(
@ -87,9 +93,9 @@ class LdapResourceForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (false === $this->isValidResource($this)) { if (false === static::isValidResource($this)) {
return false; return false;
} }
} }
@ -101,11 +107,17 @@ class LdapResourceForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidResource(Form $form) public static function isValidResource(Form $form)
{ {
try { try {
$resource = ResourceFactory::createResource(new Zend_Config($form->getValues())); $resource = ResourceFactory::createResource(new ConfigObject($form->getValues()));
$resource->connect(); if (false === $resource->testCredentials(
$form->getElement('bind_dn')->getValue(),
$form->getElement('bind_pw')->getValue()
)
) {
throw new Exception();
}
} catch (Exception $e) { } catch (Exception $e) {
$form->addError(t('Connectivity validation failed, connection to the given resource not possible.')); $form->addError(t('Connectivity validation failed, connection to the given resource not possible.'));
return false; return false;

View File

@ -2,13 +2,12 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config\Resource; namespace Icinga\Forms\Config\Resource;
use Exception; use Exception;
use Zend_Config;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Web\Request;
use Icinga\Application\Icinga; use Icinga\Application\Icinga;
use Icinga\Data\ConfigObject;
use Icinga\Data\ResourceFactory; use Icinga\Data\ResourceFactory;
/** /**
@ -29,6 +28,15 @@ class LivestatusResourceForm extends Form
*/ */
public function createElements(array $formData) 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( $this->addElement(
'text', 'text',
'socket', 'socket',
@ -48,9 +56,9 @@ class LivestatusResourceForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (false === $this->isValidResource($this)) { if (false === static::isValidResource($this)) {
return false; return false;
} }
} }
@ -62,10 +70,10 @@ class LivestatusResourceForm extends Form
* *
* @return bool Whether validation succeeded or not * @return bool Whether validation succeeded or not
*/ */
public function isValidResource(Form $form) public static function isValidResource(Form $form)
{ {
try { try {
$resource = ResourceFactory::createResource(new Zend_Config($form->getValues())); $resource = ResourceFactory::createResource(new ConfigObject($form->getValues()));
$resource->connect()->disconnect(); $resource->connect()->disconnect();
} catch (Exception $e) { } catch (Exception $e) {
$form->addError(t('Connectivity validation failed, connection to the given resource not possible.')); $form->addError(t('Connectivity validation failed, connection to the given resource not possible.'));

View File

@ -2,16 +2,15 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Config; namespace Icinga\Forms\Config;
use InvalidArgumentException; use InvalidArgumentException;
use Icinga\Web\Request;
use Icinga\Web\Notification; use Icinga\Web\Notification;
use Icinga\Form\ConfigForm; use Icinga\Forms\ConfigForm;
use Icinga\Form\Config\Resource\DbResourceForm; use Icinga\Forms\Config\Resource\DbResourceForm;
use Icinga\Form\Config\Resource\FileResourceForm; use Icinga\Forms\Config\Resource\FileResourceForm;
use Icinga\Form\Config\Resource\LdapResourceForm; use Icinga\Forms\Config\Resource\LdapResourceForm;
use Icinga\Form\Config\Resource\LivestatusResourceForm; use Icinga\Forms\Config\Resource\LivestatusResourceForm;
use Icinga\Application\Platform; use Icinga\Application\Platform;
use Icinga\Exception\ConfigurationError; use Icinga\Exception\ConfigurationError;
@ -64,12 +63,12 @@ class ResourceConfigForm extends ConfigForm
$name = isset($values['name']) ? $values['name'] : ''; $name = isset($values['name']) ? $values['name'] : '';
if (! $name) { if (! $name) {
throw new InvalidArgumentException(t('Resource name missing')); throw new InvalidArgumentException(t('Resource name missing'));
} elseif ($this->config->{$name} !== null) { } elseif ($this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Resource already exists')); throw new InvalidArgumentException(t('Resource already exists'));
} }
unset($values['name']); unset($values['name']);
$this->config->{$name} = $values; $this->config->setSection($name, $values);
return $this; return $this;
} }
@ -89,14 +88,15 @@ class ResourceConfigForm extends ConfigForm
throw new InvalidArgumentException(t('Old resource name missing')); throw new InvalidArgumentException(t('Old resource name missing'));
} elseif (! ($newName = isset($values['name']) ? $values['name'] : '')) { } elseif (! ($newName = isset($values['name']) ? $values['name'] : '')) {
throw new InvalidArgumentException(t('New resource name missing')); throw new InvalidArgumentException(t('New resource name missing'));
} elseif (($resourceConfig = $this->config->get($name)) === null) { } elseif (! $this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Unknown resource provided')); throw new InvalidArgumentException(t('Unknown resource provided'));
} }
$resourceConfig = $this->config->getSection($name);
$this->config->removeSection($name);
unset($values['name']); unset($values['name']);
unset($this->config->{$name}); $this->config->setSection($newName, $resourceConfig->merge($values));
$this->config->{$newName} = array_merge($resourceConfig->toArray(), $values); return $resourceConfig;
return $this->config->{$newName};
} }
/** /**
@ -112,11 +112,12 @@ class ResourceConfigForm extends ConfigForm
{ {
if (! $name) { if (! $name) {
throw new InvalidArgumentException(t('Resource name missing')); throw new InvalidArgumentException(t('Resource name missing'));
} elseif (($resourceConfig = $this->config->get($name)) === null) { } elseif (! $this->config->hasSection($name)) {
throw new InvalidArgumentException(t('Unknown resource provided')); throw new InvalidArgumentException(t('Unknown resource provided'));
} }
unset($this->config->{$name}); $resourceConfig = $this->config->getSection($name);
$this->config->removeSection($name);
return $resourceConfig; return $resourceConfig;
} }
@ -128,17 +129,17 @@ class ResourceConfigForm extends ConfigForm
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) { if (($el = $this->getElement('force_creation')) === null || false === $el->isChecked()) {
$resourceForm = $this->getResourceForm($this->getElement('type')->getValue()); $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()); $this->addElement($this->getForceCreationCheckbox());
return false; return false;
} }
} }
$resource = $request->getQuery('resource'); $resource = $this->request->getQuery('resource');
try { try {
if ($resource === null) { // create new resource if ($resource === null) { // create new resource
$this->add($this->getValues()); $this->add($this->getValues());
@ -166,17 +167,17 @@ class ResourceConfigForm extends ConfigForm
* *
* @throws ConfigurationError In case the backend name is missing in the request or is invalid * @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 !== null) {
if ($resource === '') { if ($resource === '') {
throw new ConfigurationError(t('Resource name missing')); throw new ConfigurationError(t('Resource name missing'));
} elseif (false === isset($this->config->{$resource})) { } elseif (! $this->config->hasSection($resource)) {
throw new ConfigurationError(t('Unknown resource provided')); throw new ConfigurationError(t('Unknown resource provided'));
} }
$configValues = $this->config->{$resource}->toArray(); $configValues = $this->config->getSection($resource)->toArray();
$configValues['name'] = $resource; $configValues['name'] = $resource;
$this->populate($configValues); $this->populate($configValues);
} }
@ -220,15 +221,6 @@ class ResourceConfigForm extends ConfigForm
$resourceTypes['db'] = t('SQL Database'); $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( $this->addElement(
'select', 'select',
'type', 'type',

View File

@ -2,12 +2,13 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form; namespace Icinga\Forms;
use Exception; use Exception;
use Zend_Form_Decorator_Abstract;
use Icinga\Web\Form; use Icinga\Web\Form;
use Icinga\Application\Config; use Icinga\Application\Config;
use Icinga\Config\PreservingIniWriter; use Icinga\File\Ini\IniWriter;
/** /**
* Form base-class providing standard functionality for configuration forms * Form base-class providing standard functionality for configuration forms
@ -43,7 +44,7 @@ class ConfigForm extends Form
*/ */
public function save() public function save()
{ {
$writer = new PreservingIniWriter( $writer = new IniWriter(
array( array(
'config' => $this->config, 'config' => $this->config,
'filename' => $this->config->getConfigFile() 'filename' => $this->config->getConfigFile()
@ -58,7 +59,8 @@ class ConfigForm extends Form
'viewScript' => 'showConfiguration.phtml', 'viewScript' => 'showConfiguration.phtml',
'errorMessage' => $e->getMessage(), 'errorMessage' => $e->getMessage(),
'configString' => $writer->render(), 'configString' => $writer->render(),
'filePath' => $this->config->getConfigFile() 'filePath' => $this->config->getConfigFile(),
'placement' => Zend_Form_Decorator_Abstract::PREPEND
)); ));
return false; return false;
} }

View File

@ -2,7 +2,7 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form; namespace Icinga\Forms;
use Icinga\Web\Form; use Icinga\Web\Form;

View File

@ -1,116 +0,0 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form\Dashboard;
use Icinga\Application\Config as IcingaConfig;
use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Form;
/**
* Form to add an url a dashboard pane
*/
class AddUrlForm extends Form
{
/**
* Initialize this form
*/
public function init()
{
$this->setName('form_dashboard_addurl');
$this->setSubmitLabel(t('Add To Dashboard'));
}
/**
* @see Form::createElements()
*/
public function createElements(array $formData)
{
$this->addElement(
'text',
'url',
array(
'required' => true,
'label' => t('Url'),
'helptext' => t('The url being loaded in the dashlet')
)
);
$paneSelectionValues = $this->getDashboardPaneSelectionValues();
if (empty($paneSelectionValues) ||
((isset($formData['create_new_pane']) && $formData['create_new_pane'] != false) &&
(false === isset($formData['use_existing_dashboard']) || $formData['use_existing_dashboard'] != true))
) {
$this->addElement(
'text',
'pane',
array(
'required' => true,
'label' => t("The New Pane's Title"),
'style' => 'display: inline-block'
)
);
$this->addElement( // Prevent the button from being displayed again on validation errors
'hidden',
'create_new_pane',
array(
'value' => 1
)
);
if (false === empty($paneSelectionValues)) {
$this->addElement(
'submit',
'use_existing_dashboard',
array(
'ignore' => true,
'label' => t('Use An Existing Pane'),
'style' => 'display: inline-block'
)
);
}
} else {
$this->addElement(
'select',
'pane',
array(
'required' => true,
'label' => t('Pane'),
'style' => 'display: inline-block;',
'multiOptions' => $paneSelectionValues
)
);
$this->addElement(
'submit',
'create_new_pane',
array(
'ignore' => true,
'label' => t('Create A New Pane'),
'style' => 'display: inline-block'
)
);
}
$this->addElement(
'text',
'component',
array(
'required' => true,
'label' => t('Title'),
'helptext' => t('The title for the dashlet')
)
);
}
/**
* Return the names and titles of the available dashboard panes as key-value array
*
* @return array
*/
protected function getDashboardPaneSelectionValues()
{
$dashboard = new Dashboard();
$dashboard->readConfig(IcingaConfig::app('dashboard/dashboard'));
return $dashboard->getPaneKeyTitleArray();
}
}

View File

@ -0,0 +1,158 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Forms\Dashboard;
use Icinga\Web\Widget\Dashboard;
use Icinga\Web\Form;
use Icinga\Web\Url;
use Icinga\Web\Widget\Dashboard\Dashlet;
/**
* Form to add an url a dashboard pane
*/
class DashletForm extends Form
{
/**
* @var Dashboard
*/
private $dashboard;
/**
* Initialize this form
*/
public function init()
{
$this->setName('form_dashboard_addurl');
if (! $this->getSubmitLabel()) {
$this->setSubmitLabel(t('Add To Dashboard'));
}
$this->setAction(URL::fromRequest());
}
/**
* Build AddUrl form elements
*
* @see Form::createElements()
*/
public function createElements(array $formData)
{
$groupElements = array();
$panes = array();
if ($this->dashboard) {
$panes = $this->dashboard->getPaneKeyTitleArray();
}
$this->addElement(
'hidden',
'org_pane',
array(
'required' => false
)
);
$this->addElement(
'hidden',
'org_dashlet',
array(
'required' => false
)
);
$this->addElement(
'text',
'url',
array(
'required' => true,
'label' => t('Url'),
'description' =>
t('Enter url being loaded in the dashlet. You can paste the full URL, including filters.')
)
);
$this->addElement(
'text',
'dashlet',
array(
'required' => true,
'label' => t('Dashlet Title'),
'description' => t('Enter a title for the dashlet.')
)
);
$this->addElement(
'note',
'note',
array(
'decorators' => array(
array('HtmlTag', array('tag' => 'hr'))
)
)
);
if (empty($panes) || ((isset($formData['create_new_pane']) && $formData['create_new_pane'] != false))) {
$this->addElement(
'text',
'pane',
array(
'required' => true,
'label' => t("New Dashboard Title"),
'description' =>
t('Enter a title for the new pane.')
)
);
} else {
$this->addElement(
'select',
'pane',
array(
'required' => true,
'label' => t('Dashboard'),
'multiOptions' => $panes,
'description' =>
t('Select a pane you want to add the dashlet.')
)
);
}
$this->addElement(
'checkbox',
'create_new_pane',
array(
'required' => false,
'label' => t('New dashboard'),
'class' => 'autosubmit',
'description' => t('Check this box if you want to add the dashlet to a new dashboard')
)
);
}
/**
* @param \Icinga\Web\Widget\Dashboard $dashboard
*/
public function setDashboard(Dashboard $dashboard)
{
$this->dashboard = $dashboard;
}
/**
* @return \Icinga\Web\Widget\Dashboard
*/
public function getDashboard()
{
return $this->dashboard;
}
/**
* @param Dashlet $dashlet
*/
public function load(Dashlet $dashlet)
{
$this->populate(array(
'pane' => $dashlet->getPane()->getName(),
'org_pane' => $dashlet->getPane()->getName(),
'dashlet' => $dashlet->getTitle(),
'org_dashlet' => $dashlet->getTitle(),
'url' => $dashlet->getUrl()
));
}
}

View File

@ -0,0 +1,75 @@
<?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Forms;
use Icinga\Web\Form;
class LdapDiscoveryForm extends Form
{
/**
* Initialize this page
*/
public function init()
{
$this->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;
}
return true;
}
}

View File

@ -2,18 +2,19 @@
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}} // {{{ICINGA_LICENSE_HEADER}}}
namespace Icinga\Form; namespace Icinga\Forms;
use Exception; use Exception;
use DateTimeZone; use DateTimeZone;
use Icinga\Web\Form; use Icinga\Application\Logger;
use Icinga\Web\Request; use Icinga\Authentication\Manager;
use Icinga\Web\Session;
use Icinga\Web\Notification;
use Icinga\Util\Translator;
use Icinga\Util\TimezoneDetect;
use Icinga\User\Preferences; use Icinga\User\Preferences;
use Icinga\User\Preferences\PreferencesStore; use Icinga\User\Preferences\PreferencesStore;
use Icinga\Util\TimezoneDetect;
use Icinga\Util\Translator;
use Icinga\Web\Form;
use Icinga\Web\Notification;
use Icinga\Web\Session;
/** /**
* Form class to adjust user preferences * Form class to adjust user preferences
@ -40,7 +41,6 @@ class PreferenceForm extends Form
public function init() public function init()
{ {
$this->setName('form_config_preferences'); $this->setName('form_config_preferences');
$this->setSubmitLabel(t('Save Changes'));
} }
/** /**
@ -75,7 +75,6 @@ class PreferenceForm extends Form
*/ */
public function save() public function save()
{ {
$this->store->load(); // Necessary for patching existing preferences
$this->store->save($this->preferences); $this->store->save($this->preferences);
return $this; return $this;
} }
@ -85,11 +84,13 @@ class PreferenceForm extends Form
* *
* @see Form::onSuccess() * @see Form::onSuccess()
*/ */
public function onSuccess(Request $request) public function onSuccess()
{ {
$this->preferences = new Preferences($this->store->load());
$webPreferences = $this->preferences->get('icingaweb', array()); $webPreferences = $this->preferences->get('icingaweb', array());
foreach ($this->getValues() as $key => $value) { foreach ($this->getValues() as $key => $value) {
if ($value === null) { if ($value === null || $value === 'autodetect') {
if (isset($webPreferences[$key])) { if (isset($webPreferences[$key])) {
unset($webPreferences[$key]); unset($webPreferences[$key]);
} }
@ -99,15 +100,17 @@ class PreferenceForm extends Form
} }
$this->preferences->icingaweb = $webPreferences; $this->preferences->icingaweb = $webPreferences;
// TODO: Is this even necessary in case the session is written on response? Session::getSession()->user->setPreferences($this->preferences);
$session = Session::getSession();
$session->user->setPreferences($this->preferences);
$session->write();
try { try {
$this->save(); if ($this->getElement('btn_submit_preferences')->isChecked()) {
Notification::success(t('Preferences successfully saved')); $this->save();
Notification::success(t('Preferences successfully saved'));
} else {
Notification::success(t('Preferences successfully saved for the current session'));
}
} catch (Exception $e) { } catch (Exception $e) {
Logger::error($e);
Notification::error($e->getMessage()); Notification::error($e->getMessage());
} }
} }
@ -117,11 +120,19 @@ class PreferenceForm extends Form
* *
* @see Form::onRequest() * @see Form::onRequest()
*/ */
public function onRequest(Request $request) public function onRequest()
{ {
$values = $this->preferences->get('icingaweb', array()); $auth = Manager::getInstance();
$values['browser_language'] = false === isset($values['language']); $values = $auth->getUser()->getPreferences()->get('icingaweb');
$values['local_timezone'] = false === isset($values['timezone']);
if (! isset($values['language'])) {
$values['language'] = 'autodetect';
}
if (! isset($values['timezone'])) {
$values['timezone'] = 'autodetect';
}
$this->populate($values); $this->populate($values);
} }
@ -131,72 +142,40 @@ class PreferenceForm extends Form
public function createElements(array $formData) public function createElements(array $formData)
{ {
$languages = array(); $languages = array();
$languages['autodetect'] = sprintf(t('Browser (%s)', 'preferences.form'), $this->getLocale());
foreach (Translator::getAvailableLocaleCodes() as $language) { foreach (Translator::getAvailableLocaleCodes() as $language) {
$languages[$language] = $language; $languages[$language] = $language;
} }
$tzList = array(); $tzList = array();
$tzList['autodetect'] = sprintf(t('Browser (%s)', 'preferences.form'), $this->getDefaultTimezone());
foreach (DateTimeZone::listIdentifiers() as $tz) { foreach (DateTimeZone::listIdentifiers() as $tz) {
$tzList[$tz] = $tz; $tzList[$tz] = $tz;
} }
$this->addElement( $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', 'select',
'language', 'language',
array( array(
'required' => false === $useBrowserLanguage, 'required' => true,
'label' => t('Your Current Language'), 'label' => t('Your Current Language'),
'description' => t('Use the following language to display texts and messages'), 'description' => t('Use the following language to display texts and messages'),
'multiOptions' => $languages, 'multiOptions' => $languages,
'value' => substr(setlocale(LC_ALL, 0), 0, 5) 'value' => substr(setlocale(LC_ALL, 0), 0, 5)
) )
); );
if ($useBrowserLanguage) {
$languageSelection->setAttrib('disabled', 'disabled');
}
$this->addElement($languageSelection);
$this->addElement( $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', 'select',
'timezone', 'timezone',
array( array(
'required' => false === $useLocalTimezone, 'required' => true,
'label' => t('Your Current Timezone'), 'label' => t('Your Current Timezone'),
'description' => t('Use the following timezone for dates and times'), 'description' => t('Use the following timezone for dates and times'),
'multiOptions' => $tzList, 'multiOptions' => $tzList,
'value' => $this->getDefaultTimezone() 'value' => $this->getDefaultTimezone()
) )
); );
if ($useLocalTimezone) {
$timezoneSelection->setAttrib('disabled', 'disabled');
}
$this->addElement($timezoneSelection);
$this->addElement( $this->addElement(
'checkbox', 'checkbox',
@ -206,6 +185,43 @@ class PreferenceForm extends Form
'label' => t('Use benchmark') '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'))
)
)
);
} }
/** /**
@ -219,7 +235,18 @@ class PreferenceForm extends Form
if ($detect->success()) { if ($detect->success()) {
return $detect->getTimezoneName(); return $detect->getTimezoneName();
} else { } 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;
}
} }

View File

@ -15,7 +15,7 @@ if (! $this->auth()->isAuthenticated()) {
id="menu" data-last-update="<?= (time() - 14) ?>000" data-base-target="_main" class="container" data-icinga-url="<?=$this->href('layout/menu');?>" id="menu" data-last-update="<?= (time() - 14) ?>000" data-base-target="_main" class="container" data-icinga-url="<?=$this->href('layout/menu');?>"
data-icinga-refresh="15" data-icinga-refresh="15"
> >
<? if (SearchDashboard::search('dummy')->getPane('search')->hasComponents()): ?> <? if (SearchDashboard::search('dummy')->getPane('search')->hasDashlets()): ?>
<form action="<?= $this->href('search') ?>" method="get" role="search"> <form action="<?= $this->href('search') ?>" method="get" role="search">
<input type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>" <input type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>"
autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" /> autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" />

File diff suppressed because it is too large Load Diff

View File

@ -1,11 +1,11 @@
<div id="login"> <div id="login">
<div class="logo"> <div class="logo">
<div class="image"> <div class="image">
<img src="<?= $this->baseUrl('img/logo_icinga_big.png') ?>" alt="<?= t('The Icinga logo') ?>" > <img class="fade-in one" src="<?= $this->baseUrl('img/logo_icinga_big.png') ?>" alt="<?= t('The Icinga logo') ?>" >
</div> </div>
</div> </div>
<div class="form" data-base-target="layout"> <div class="form" data-base-target="layout">
<h1><?= $this->translate('Icingaweb Login') ?></h1> <h1>Welcome to Icinga Web 2</h1>
<?php <?php
/* TODO: remove this as soon as notifications and forms are ready */ /* TODO: remove this as soon as notifications and forms are ready */
if (isset($this->errorInfo)): ?> if (isset($this->errorInfo)): ?>
@ -14,6 +14,18 @@
</div> </div>
<?php endif ?> <?php endif ?>
<?= $this->form ?> <?= $this->form ?>
<div class="footer">Icinga Web 2 &copy; 2013-2014 Icinga Team</div> <div class="footer">Icinga Web 2 &copy; 2013-2014<br><a href="https://www.icinga.org">The Icinga Project</a></div>
<?php if ($configMissing): ?>
<div class="config-note"><?= sprintf(
t(
'You seem not to have Icinga Web 2 configured yet so it\'s not possible to log in without any defined '
. 'authentication method. Please define a authentication method by following the instructions in the'
. ' %1$sdocumentation%3$s or by using our %2$sweb-based setup-wizard%3$s.'
),
'<a href="http://docs.icinga.org/" title="Icinga Web 2 Documentation">', // TODO: Documentation link
'<a href="' . $this->href('setup') . '" title="Icinga Web 2 Setup-Wizard">',
'</a>'
); ?></div>
<?php endif ?>
</div> </div>
</div> </div>

View File

@ -4,7 +4,7 @@
<div class="content" data-base-target="_next"> <div class="content" data-base-target="_next">
<p> <p>
<a href="<?= $this->href('/config/createAuthenticationBackend'); ?>"> <a href="<?= $this->href('/config/createAuthenticationBackend'); ?>">
<?= $this->icon('create.png'); ?><?= $this->translate('Create A New Authentication Backend'); ?> <?= $this->icon('plus'); ?><?= $this->translate('Create A New Authentication Backend'); ?>
</a> </a>
</p> </p>
<?= $form; ?> <?= $form; ?>

View File

@ -1,5 +1,6 @@
<div class="controls"> <div class="controls">
<?= $this->tabs ?> <?= $this->tabs ?>
<h1><?= $this->escape($module->getTitle()) ?></h1>
</div> </div>
<div class="content"> <div class="content">
<?php if (! $module): ?> <?php if (! $module): ?>
@ -12,7 +13,6 @@ $permissions = $module->getProvidedPermissions();
$state = $moduleData->enabled ? ($moduleData->loaded ? 'enabled' : 'failed') : 'disabled' $state = $moduleData->enabled ? ($moduleData->loaded ? 'enabled' : 'failed') : 'disabled'
?> ?>
<h1><?= $this->escape($module->getTitle()) ?></h1>
<table class="avp"> <table class="avp">
<tr> <tr>
<th><?= $this->escape('Name') ?></th> <th><?= $this->escape('Name') ?></th>

View File

@ -11,9 +11,9 @@
<tr> <tr>
<td> <td>
<?php if ($module->enabled): ?> <?php if ($module->enabled): ?>
<?= $this->icon('success.png', $this->translate('Module is enabled')) ?> <?= $this->icon('thumbs-up', $this->translate('Module is enabled')) ?>
<?php else: ?> <?php else: ?>
<?= $this->icon('remove.png', $this->translate('Module is disabled')) ?> <?= $this->icon('thumbs-down', $this->translate('Module is disabled')) ?>
<?php endif ?> <?php endif ?>
<a href="<?= $this->url( <a href="<?= $this->url(
'config/module/', 'config/module/',

View File

@ -4,7 +4,7 @@
<div class="content" data-base-target="_next"> <div class="content" data-base-target="_next">
<p> <p>
<a href="<?= $this->href('/config/createresource'); ?>"> <a href="<?= $this->href('/config/createresource'); ?>">
<?= $this->icon('create.png'); ?> <?= $this->translate('Create A New Resource'); ?> <?= $this->icon('plus'); ?> <?= $this->translate('Create A New Resource'); ?>
</a> </a>
</p> </p>
<table class="action"> <table class="action">
@ -13,16 +13,16 @@
<th style="width: 5em"><?= $this->translate('Remove'); ?></th> <th style="width: 5em"><?= $this->translate('Remove'); ?></th>
</thead> </thead>
<tbody> <tbody>
<?php foreach ($this->resources as $name => $resource): ?> <?php foreach ($this->resources as $name): ?>
<tr> <tr>
<td> <td>
<a href="<?= $this->href('config/editresource', array('resource' => $name)); ?>"> <a href="<?= $this->href('config/editresource', array('resource' => $name)); ?>">
<?= $this->icon('edit.png'); ?> <?= $this->escape($name); ?> <?= $this->icon('edit'); ?> <?= $this->escape($name); ?>
</a> </a>
</td> </td>
<td style="text-align: center"> <td style="text-align: center">
<a href="<?= $this->href('config/removeresource', array('resource' => $name)); ?>"> <a href="<?= $this->href('config/removeresource', array('resource' => $name)); ?>">
<?= $this->icon('remove.png'); ?> <?= $this->icon('cancel'); ?>
</a> </a>
</td> </td>
</tr> </tr>

View File

@ -1,12 +0,0 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= $this->escape($this->translate('This feature is deactivated at the moment.')); ?></h1>
<p>
<?=
$this->escape($this->translate('Please have a little patience, we are hard working on it, take a look at icingaweb2 issues.'));
?>
</p>
</div>

View File

@ -0,0 +1,13 @@
<div class="content">
<h1><?= t('Could not persist dashboard'); ?></h1>
<p>
<?= t('Please copy the following dashboard snippet to '); ?>
<strong><?= $this->config->getFilename(); ?>;</strong>.
<br>
<?= t('Make sure that the webserver can write to this file.'); ?>
</p>
<pre><?= (string) $this->config->render(); ?></pre>
<hr>
<h2><?= t('Error details') ?></h2>
<p><?= $this->error->getMessage(); ?></p>
</div>

View File

@ -8,9 +8,11 @@
<?php else: ?> <?php else: ?>
<div class="content"> <div class="content">
<h1><?= $this->escape($this->translate('Welcome to Icinga Web!')) ?></h1> <h1><?= $this->escape($this->translate('Welcome to Icinga Web!')) ?></h1>
<p><?= sprintf( <p>
$this->escape($this->translate('Currently there is no dashlet available. This might change once you enabled some of the available %s.')), <?= sprintf(
$this->qlink($this->translate('modules'), 'config/modules') $this->escape($this->translate('Currently there is no dashlet available. This might change once you enabled some of the available %s.')),
) ?></p> $this->qlink($this->translate('modules'), 'config/modules')
) ?>
</p>
</div> </div>
<?php endif ?> <?php endif ?>

View File

@ -0,0 +1,7 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Add Dashlet To Dashboard'); ?></h1>
<?= $this->form; ?>
</div>

View File

@ -0,0 +1,14 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Remove Dashlet From Dashboard'); ?></h1>
<p>
<?= $this->translate('Please confirm the removal'); ?>:
<?= $this->pane; ?>/<?= $this->dashlet; ?>
</p>
<?= $this->form; ?>
</div>

View File

@ -0,0 +1,14 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Remove Dashboard'); ?></h1>
<p>
<?= $this->translate('Please confirm the removal of'); ?>:
<?= $this->pane; ?>
</p>
<?= $this->form; ?>
</div>

View File

@ -0,0 +1,63 @@
<?php
?>
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Dashboard Settings'); ?></h1>
<table class="avp action" data-base-target="_next">
<thead>
<tr>
<th style="width: 18em;">
<strong><?= t('Dashlet Name') ?></strong>
</th>
<th>
<strong><?= t('Url') ?></strong>
</th>
<th style="width: 1.4em;">&nbsp;</th>
</tr>
</thead>
<tbody>
<?php foreach ($this->dashboard->getPanes() as $pane): ?>
<tr style="background-color: #f1f1f1;">
<th colspan="2" style="text-align: left; padding: 0.5em;">
<?= $pane->getName(); ?>
</th>
<th>
<a href="<?= $this->href('dashboard/remove-pane', array('pane' => $pane->getName())); ?>">
<?= $this->icon('cancel'); ?>
</a>
</th>
</tr>
<?php $dashlets = $pane->getDashlets(); ?>
<?php if(empty($dashlets)): ?>
<tr>
<td colspan="3">
<?= $this->translate('No dashlets added to dashboard') ?>.
</td>
</tr>
<?php else: ?>
<?php foreach ($dashlets as $dashlet): ?>
<?php if ($dashlet->getDisabled() === true) continue; ?>
<tr>
<td>
<a href="<?= $this->href('dashboard/update-dashlet', array('pane' => $pane->getName(), 'dashlet' => $dashlet->getTitle())); ?>">
<?= $dashlet->getTitle(); ?>
</a>
</td>
<td style="table-layout: fixed; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
<a href="<?= $this->href($dashlet->getUrl()); ?>"><?= $dashlet->getUrl(); ?></a>
</td>
<td>
<a href="<?= $this->href('dashboard/remove-dashlet', array('pane' => $pane->getName(), 'dashlet' => $dashlet->getTitle())); ?>">
<?= $this->icon('cancel'); ?>
</a>
</td>
</tr>
<?php endforeach; ?>
<?php endif; ?>
<?php endforeach; ?>
</tbody>
</table>
</div>

View File

@ -1,28 +0,0 @@
<br/>
<div class="alert alert-error">
<h4><i>{{WARNING_ICON}}</i>Saving Dashboard Failed</h4>
<br/>
<p>
Your dashboard couldn't be stored (error: "<?= $this->exceptionMessage; ?>"). This could have one or more
of the following reasons:
</p>
<ul>
<li>You don't have permissions to write to the dashboard file</li>
<li>Something went wrong while writing the file</li>
<li>There's an application error preventing you from persisting the configuration</li>
</ul>
</div>
<p>
Details can be seen in your application log (if you don't have access to this file, call your administrator in this case).
<br/>
In case you can access the configuration file (config/dashboard/dashboard.ini) by yourself, you can open it and
insert the config manually:
</p>
<p>
<pre>
<code>
<?= $this->escape($this->iniConfigurationString); ?>
</code>
</pre>
</p>

View File

@ -0,0 +1,8 @@
<div class="controls">
<?= $this->tabs ?>
</div>
<div class="content">
<h1><?= t('Edit Dashlet'); ?></h1>
<?= $this->form; ?>
</div>

View File

@ -11,23 +11,23 @@
<tr> <tr>
<td class="action"> <td class="action">
<a href="<?= $this->href('config/editAuthenticationBackend', array('auth_backend' => $backendNames[$i])); ?>"> <a href="<?= $this->href('config/editAuthenticationBackend', array('auth_backend' => $backendNames[$i])); ?>">
<?= $this->icon('edit.png'); ?> <?= $this->escape($backendNames[$i]); ?> <?= $this->icon('edit'); ?> <?= $this->escape($backendNames[$i]); ?>
</a> </a>
</td> </td>
<td> <td>
<a href="<?= $this->href('config/removeAuthenticationBackend', array('auth_backend' => $backendNames[$i])); ?>"> <a href="<?= $this->href('config/removeAuthenticationBackend', array('auth_backend' => $backendNames[$i])); ?>">
<?= $this->icon('remove.png', $this->translate('Remove')); ?> <?= $this->icon('cancel', $this->translate('Remove')); ?>
</a> </a>
</td> </td>
<td> <td>
<?php if ($i > 0): ?> <?php if ($i > 0): ?>
<button type="submit" name="backend_newpos" value="<?= sprintf('%s|%s', $backendNames[$i], $i - 1); ?>"> <button type="submit" name="backend_newpos" value="<?= sprintf('%s|%s', $backendNames[$i], $i - 1); ?>">
<?= $this->icon('up.png', $this->translate('Move up in authentication order')); ?> <?= $this->icon('up-big', $this->translate('Move up in authentication order')); ?>
</button> </button>
<?php endif; ?> <?php endif; ?>
<?php if ($i + 1 < count($backendNames)): ?> <?php if ($i + 1 < count($backendNames)): ?>
<button type="submit" name="backend_newpos" value="<?= sprintf('%s|%s', $backendNames[$i], $i + 1); ?>"> <button type="submit" name="backend_newpos" value="<?= sprintf('%s|%s', $backendNames[$i], $i + 1); ?>">
<?= $this->icon('down.png', $this->translate('Move down in authentication order')); ?> <?= $this->icon('down-big', $this->translate('Move down in authentication order')); ?>
</button> </button>
<?php endif; ?> <?php endif; ?>
</td> </td>

View File

@ -0,0 +1,99 @@
<?php
use Icinga\Web\Url;
if ($xAxisPaginator->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;
?>
<table class="joystick-pagination">
<tbody>
<tr>
<td>&nbsp;</td>
<td>
<?php if ($prevYAxisPage): ?>
<a target="_self" href="<?= Url::fromRequest()->overwriteParams(array(
'page' => $currentXAxisPage . ',' . $prevYAxisPage
))->getAbsoluteUrl(); ?>" title="<?= sprintf(
$fromTo,
t('Hosts'),
($prevYAxisPage - 1) * $yAxisPages->itemCountPerPage + 1,
$prevYAxisPage * $yAxisPages->itemCountPerPage,
$yAxisPages->totalItemCount
); ?>"><?= $this->icon('up-open'); ?></a>
<?php else: ?>
<?= $this->icon('up-open'); ?>
<?php endif ?>
</td>
<td>&nbsp;</td>
</tr>
<tr>
<td>
<?php if ($prevXAxisPage): ?>
<a target="_self" href="<?= Url::fromRequest()->overwriteParams(array(
'page' => $prevXAxisPage . ',' . $currentYAxisPage
))->getAbsoluteUrl(); ?>" title="<?= sprintf(
$fromTo,
t('Services'),
($prevXAxisPage - 1) * $xAxisPages->itemCountPerPage + 1,
$prevXAxisPage * $xAxisPages->itemCountPerPage,
$xAxisPages->totalItemCount
); ?>"><?= $this->icon('left-open'); ?></a>
<?php else: ?>
<?= $this->icon('left-open'); ?>
<?php endif ?>
</td>
<td>&nbsp;</td>
<td>
<?php if ($nextXAxisPage): ?>
<a target="_self" href="<?= Url::fromRequest()->overwriteParams(array(
'page' => $nextXAxisPage . ',' . $currentYAxisPage
))->getAbsoluteUrl(); ?>" title="<?= sprintf(
$fromTo,
t('Services'),
$currentXAxisPage * $xAxisPages->itemCountPerPage + 1,
$nextXAxisPage === $xAxisPages->last ? $xAxisPages->totalItemCount : $nextXAxisPage * $xAxisPages->itemCountPerPage,
$xAxisPages->totalItemCount
); ?>"><?= $this->icon('right-open'); ?></a>
<?php else: ?>
<?= $this->icon('right-open'); ?>
<?php endif ?>
</td>
</tr>
<tr>
<td>&nbsp;</td>
<td>
<?php if ($nextYAxisPage): ?>
<a target="_self" href="<?= Url::fromRequest()->overwriteParams(array(
'page' => $currentXAxisPage . ',' . $nextYAxisPage
))->getAbsoluteUrl(); ?>" title="<?= sprintf(
$fromTo,
t('Hosts'),
$currentYAxisPage * $yAxisPages->itemCountPerPage + 1,
$nextYAxisPage === $yAxisPages->last ? $yAxisPages->totalItemCount : $nextYAxisPage * $yAxisPages->itemCountPerPage,
$yAxisPages->totalItemCount
); ?>"><?= $this->icon('down-open'); ?></a>
<?php else: ?>
<?= $this->icon('down-open'); ?>
<?php endif ?>
</td>
<td>&nbsp;</td>
</tr>
</tbody>
</table>

View File

@ -2,7 +2,7 @@
use Icinga\Web\Widget\SearchDashboard; use Icinga\Web\Widget\SearchDashboard;
?> ?>
<? if (SearchDashboard::search('dummy')->getPane('search')->hasComponents()): ?> <? if (SearchDashboard::search('dummy')->getPane('search')->hasDashlets()): ?>
<form action="<?= $this->href('search') ?>" method="get" role="search"> <form action="<?= $this->href('search') ?>" method="get" role="search">
<input <input
type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>" type="text" name="q" class="search autofocus" placeholder="<?= $this->translate('Search...') ?>"

View File

@ -1,6 +1,5 @@
<div> <div>
<h4><?= $this->translate('Saving Configuration Failed'); ?></h4> <h4><?= $this->translate('Saving Configuration Failed'); ?></h4>
<br>
<p> <p>
<?= sprintf( <?= sprintf(
$this->translate('The file %s couldn\'t be stored. (Error: "%s")'), $this->translate('The file %s couldn\'t be stored. (Error: "%s")'),

View File

@ -1,6 +1,8 @@
#!/usr/bin/php #!/usr/bin/env php
<?php <?php
// {{{ICINGA_LICENSE_HEADER}}}
// {{{ICINGA_LICENSE_HEADER}}}
use Icinga\Application\Cli;
require_once dirname(__DIR__) . '/library/Icinga/Application/Cli.php'; require_once dirname(__DIR__) . '/library/Icinga/Application/Cli.php';
Cli::start()->dispatch();
Icinga\Application\Cli::start()->dispatch();

View File

@ -1,4 +1,4 @@
#!/usr/bin/python #!/usr/bin/env python
# {{{ICINGA_LICENSE_HEADER}}} # {{{ICINGA_LICENSE_HEADER}}}
# {{{ICINGA_LICENSE_HEADER}}} # {{{ICINGA_LICENSE_HEADER}}}

6
config/.gitignore vendored
View File

@ -1,6 +0,0 @@
authentication.ini
config.ini
modules/monitoring/backends.ini
modules/monitoring/instances.ini
resources.ini

View File

@ -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

View File

@ -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

View File

@ -1 +0,0 @@
Enabled modules shall be symlinked here.

View File

@ -1,4 +0,0 @@
# Use given CA file
TLS_REQCERT demand
TLS_CACERT @prefix@/config/ssl/cacerts/trusted.crt

View File

@ -1,4 +0,0 @@
# This config file will allow TLS-based LDAP connections ignoring
# unknown certificates
TLS_REQCERT never

View File

@ -1,9 +0,0 @@
[membership-set1]
backend = groupX
users = icingaadmin,tgelf
groups = admin,users
[membership-set2]
backend = groupY
users = icingaadmin
groups = support1,support2

View File

@ -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

View File

@ -1,2 +0,0 @@
[security]
protected_customvars = "*pw*,*pass*,community"

View File

@ -1,2 +0,0 @@
[icinga]
path = "@icinga_commandpipe@"

View File

@ -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

View File

@ -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 = "/^(?<datetime>[0-9]{4}(-[0-9]{2}){2}T[0-9]{2}(:[0-9]{2}){2}(\\+[0-9]{2}:[0-9]{2})?) - (?<loglevel>[A-Za-z]+) - (?<message>.*)$/"
; format: PCRE

View File

@ -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*"

4125
configure vendored

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -1,35 +0,0 @@
# Application and Module Configuration
## Basic usage
The \Icinga\Application\Config class is a general purpose service to help you find, load and save
configuration data. It is used both by the Icinga Web 2 modules and the framework itself. With
INI files as source it enables you to store configuration in a familiar format. Icinga Web 2
defines some configuration files for its own purposes. Please note that both modules and framework
keep their main configuration in the INI file called config.ini. Here's some example code:
```php
<?php
use \Icinga\Application\Config as IcingaConfig;
// Retrieve the default timezone using 'Europe/Berlin' in case it is not set
IcingaConfig::app()->global->get('defaultTimezone', 'Europe/Berlin');
// If you don't pass a configuration name to IcingaConfig::app it tries to load values from the
// application's config.ini. For using other files you have to pass this parameter though.
// The following example loads a section from the application's authentication.ini:
IcingaConfig::app('authentication')->get('ldap-authentication');
// If you don't pass a configuration name to IcingaConfig::module it tries to load values from
// the module's config.ini. For using other files you have to pass this parameter though.
// The following example loads values from the example module's extra.ini:
IcingaConfig::module('example', 'extra')->logging->get('enabled', true);
```
## Reload from disk
If you want to force reading a configuration from disk (i.e. after you modified it), you can use the $fromDisk flag in
the IcingaConfig::app/IcingaConfig::module call:
IcingaConfig::app('authentication', true)-> ... // read authentication from disk
IcingaConfig::module('example', 'extra', true)->... // read module configuration from disk

File diff suppressed because one or more lines are too long

View File

@ -1,125 +0,0 @@
/* ==========================================================================
Styles ONLY used for documentation
========================================================================== */
html {
font-family: sans-serif;
}
/* Projektname - color customer CI */
.docu-project-name {
font-size: 2em;
color: #049BAF;
padding-bottom: 10px;
}
.docu-main {
width: 100%;
padding: 20px;
margin: 0 auto;
margin-top: 50px;
display: block;
}
.docu-main-headline {
font-size: 2em;
color: #333;
/* customer CI */
padding-bottom: 10px;
padding-top: 40px;
}
.docu-sub-headline {
font-size: 1.5em;
color: #333;
padding-bottom: 3px;
padding-top: 10px;
}
.docu-section {
border: 1px solid #dddddd;
overflow: hidden;
display: block;
}
.docu-description {
padding-bottom: 10px;
}
.docu-example {
background-color: #FFFFFF;
padding: 10px;
}
.docu-example:before {
color: #BBBBBB;
content: "Example";
font-weight: bold;
letter-spacing: 1px;
margin-bottom: 10px;
}
.docu-module {
/* width: 320px; */
/* show your modules in device width */
padding-top: 10px;
}
.docu-codeblock {
background-color: #F7F7F9;
border-top: 1px solid #e1e1e8;
padding: 10px;
overflow: hidden;
height: 100%;
}
.docu-codeblock:before {
color: #BBBBBB;
content: "Code";
font-weight: bold;
letter-spacing: 1px;
margin-bottom: 10px;
}
.docu-code {
font-family: "Courier New", Courier, monospace;
font-weight: bold;
color: #777;
padding-top: 10px;
border: none;
background-color: transparent;
display: block;
width: 100%;
height: 150px;
}
.docu-footer {
margin-top: 40px;
padding-top: 10px;
border-top: 1px solid #dddddd;
font-size: 0.75em;
color: #ccc;
}
.docu-classes {
background-color: #FEFBED;
padding: 3px;
color: #c6b256;
font-family: "Courier New", Courier, monospace, sans-serif;
font-weight: bold;
}

View File

@ -1,974 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Icinga Documentation</title>
<link media="screen" href="bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="icinga-design.css">
<link rel="stylesheet" href="documentation.css">
<link rel="apple-touch-icon-precomposed" href="../apple-touch-icon-152×152-precomposed.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<!-- ######### Top Navbar ##########-->
<nav role="navigation" id="icingatopbar" class="navbar navbar-default navbar-fixed-top">
<div class="navbar-header">
<a class="navbar-brand icinga-logo pull-left" href="/icinga2-web/">Icinga</a>
</div>
<div class="pull-left icinga-navbar icinga-navbar-hosts-container">
<span class="icinga-navbar-pills icinga-navbar-pills-up">999/999</span>
<span class="icinga-navbar-pills icinga-navbar-pills-unreachable">999/999</span>
<span class="icinga-navbar-pills icinga-navbar-pills-down">999/999</span>
</div>
<div class="pull-left icinga-navbar icinga-navbar-services-container">
<span class="icinga-navbar-pills icinga-navbar-pills-ok">999/999</span>
<span class="icinga-navbar-pills icinga-navbar-pills-critical">999/999</span>
<span class="icinga-navbar-pills icinga-navbar-pills-warning">999/999</span>
<span class="icinga-navbar-pills icinga-navbar-pills-unknown">999/999</span>
</div>
<div class="pull-left icinga-navbar icinga-navbar-reload">
<a class="button btn-common btn-small" href="#">
<span class="icon-refresh icon-btn-small"></span>
</a>
</div>
<div class="pull-left icinga-navbar icinga-navbar-search-container">
<input type="text" class="form-control input-sm icinga-navbar-search" />
</div>
<ul class="nav navbar-nav pull-right">
<li class="dropdown">
<a id="icinga_app_nav_useraction" data-toggle="dropdown" class="dropdown-toggle" href="#">
<span id="icinga_app_nav_username">
jdoe </span>
<i class="icinga-icon-user"></i>
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
<li id="icinga_app_nav_preferences">
<a href="/icinga2-web/preference">Preferences </a>
</li>
<li id="icinga_app_nav_logout">
<a title="Logout" href="/icinga2-web/authentication/logout">Logout</a>
</li>
</ul>
</li>
</ul>
</nav>
<div class="docu-main">
<h1 class="docu-project-name">Icinga Documentation</h1>
<!-- <div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div> -->
<h1 class="docu-main-headline">Basic Elements</h1>
<h1 class="docu-sub-headline">Headlines</h1>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<h1>Main headline h1</h1>
<h2>Sub headline h2</h2>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code"><h1>Main Headline H1</h1>
<h2>Sub headline h2</h2>
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-sub-headline">Textblocks</h1>
<div class="docu-description">
Used on simple pages with continuous text e.g. Imprint or Privacy.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At <a href="#">vero eos et accusam et justo</a> duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata <a href="#">sanctus est Lorem ipsum</a> dolor sit amet.
</p>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">
<p>
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At <a href="#">vero eos et accusam et justo</a> duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata <a href="#">sanctus est Lorem ipsum</a> dolor sit amet.
</p>
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-sub-headline">Table</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<table class="table table-condensed">
<thead>
<tr>
<th colspan="3">Status</th>
<th>Output</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
12
</a>
</span>
<div>
<b>Up</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok<br />
<span class="output-text">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</span>
</td>
</tr>
<tr>
<td class="tacheader-status-unreachable">
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
<div class="icon-table icon-flapping"></div>
<div class="icon-table icon-comment"></div>
<div class="icon-table icon-unhandled"></div>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
6
</a>
</span>
<div>
<b>Unreachable</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok
<span class="output-text">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</span>
</td>
</tr>
<tr>
<td class="tacheader-status-down">
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
6
</a>
</span>
<div>
<b>Down</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok
</td>
</tr>
<tr>
<td class="">
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
6
</a>
</span>
<div>
<b>Up</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok
</td>
</tr>
<tr>
<td class="">
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
6
</a>
</span>
<div>
<b>Up</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok
<span class="output-text">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</span>
</td>
</tr>
<tr>
<td class="tacheader-status-down">
<a href="/icingawebinsfx/monitoring/show/host?host=host_000" style="visibility:hidden"></a>
</td>
<td>
<div class="icon-table icon-flapping"></div>
<div class="icon-table icon-comment"></div>
<div class="icon-table icon-unhandled"></div>
</td>
<td title="UP since 2013-09-30 16:57:58">
<span class="badge-container_">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge pull-right">
6
</a>
</span>
<div>
<b>Down</b><br />
Since&nbsp;
30.09.
</div>
</td>
<td>
<a href="/icingawebinsfx/monitoring/list/services?host=host_000">
<b>host_000</b>
<i>127.0.0.1</i>
</a><br />
host_000 (checked by localhost.localdomain) OK: random hostcheck ok
<span class="output-text">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
</span>
</td>
</tr>
</tbody>
</table>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">
code...
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Pagination</h1>
<div class="docu-description">
The pagination is placed on top and bottom of every list.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<ul class="pagination pagination-sm">
<!-- Previous page link -->
<li class="disabled"><span>« Prev</span></li>
<!-- Numbered page links -->
<li class="active">
<a title="1 to 20 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=1">
1 </a>
</li>
<li>
<a title="21 to 40 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=2">
2 </a>
</li>
<li>
<a title="41 to 60 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=3">
3 </a>
</li>
<li>
<a title="61 to 80 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=4">
4 </a>
</li>
<li>
<a title="81 to 100 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=5">
5 </a>
</li>
<li>
<a title="101 to 111 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=6">
6 </a>
</li>
<!-- Next page link -->
<li>
<a title="21 to 40 of 111" href="/icinga2-web/monitoring/list/hosts?detail=%2Ficinga2-web%2Fmonitoring%2Fshow%2Fhost%3Fhost%3Dhost_001&amp;page=2">Next »
</a>
</li>
</ul>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">Code... Code...
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Details</h1>
<h1 class="docu-sub-headline">Basic Example</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<div class="panel-heading border-status-critical">
<div class="panel-hostname">
Host Status host_000 ölaierjoe paeurüuaeraeüure <span class="panel-header-status">- Unreachable since 15:59</span></div>
</div>
<hr class="separator" />
<div class="panel-body">
<div class="panel-row">
<p>host_000 (checked by localhost.localdomain) OK: random hostcheck ok sometimes with multiline and html tags\n </p>
</div>
<div class="panel-row">
<a href="#" class="button btn-cta btn-wide">Recheck</a>
</div>
<div class="panel-row">
<div class="panel-label">
Last Check
</div>
<div class="panel-content">
1381308168
</div>
</div>
<div class="panel-row">
<div class="panel-label">
Next Check
</div>
<div class="panel-content">
1381309978
</div>
<div class="panel-button">
<a href="#" class="button btn-common btn-small"><span class="icon-reschedule icon-btn-small"></span></a>
</div>
</div>
<div class="panel-row">
<div class="panel-label">
Host Address
</div>
<div class="panel-content">
127.0.0.1
</div>
</div>
<div class="panel-row">
<div class="panel-label">
Alias
</div>
<div class="panel-content">
random_000
</div>
</div>
<div class="panel-row">
<a href="#" class="button btn-common btn-half-left">View Services For This Host </a>
<a href="#" class="button btn-common btn-half-right">Recheck All Services</a>
</div>
</div>
<!-- ########## Box mit Tabelle ############# -->
<div class="panel-heading">
<div class="panel-hostname">
Box mit Tabelle</div>
</div>
<hr class="separator" />
<div class="panel-body">
<table class="table table-condensed table-detail">
<tbody>
<tr>
<th>Lorem</th>
<th>Ipsum xyz</th>
<th>blablubb</th>
</tr>
<tr>
<td>08.10. 15:51</td>
<td><a href="#">Lorem ipusm_002</a></td>
<td><a href="#" class="button btn-common btn-small pull-right"><span class="icon-downtime icon-btn-small"></span></a></td>
</tr>
<tr>
<td>08.10. 15:51</td>
<td>Ich bin ein toller Text</td>
<td><a href="#" class="button btn-common btn-small pull-right"><span class="icon-edit icon-btn-small"></span></a></td>
</tr>
<tr>
<td>Hallo hallo</td>
<td>Server 123 blabla</td>
<td>Noch ein Text</td>
</tr>
<tr>
<td>Lorem ipsum</td>
<td>Juhuhallo_host01</td>
<td>128747404</td>
</tr>
</tbody>
</table>
</div>
<!-- ########## Heading ############# -->
<div class="panel-heading">
<div class="panel-hostname">
Heading</div>
</div>
<hr class="separator" />
<div class="panel-body">
<table class="table table-condensed table-detail">
<tbody>
<tr>
<td>Passive Checks</td>
<td><div class="icon-table-hint icon-edit pull-left"></div></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" checked /></td>
</tr>
<tr>
<td>Active Checks</td>
<td></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" /></td>
</tr>
<tr>
<td>Obsessing</td>
<td><div class="icon-table-hint icon-edit pull-left"></div></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" checked /></td>
</tr>
<tr>
<td>Notifications</td>
<td></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" checked /></td>
</tr>
<tr>
<td>Event Handler</td>
<td><div class="icon-table-hint icon-edit pull-left"></div></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" /></td>
</tr>
<tr>
<td>Flap Detection</td>
<td></td>
<td><input type="checkbox" id="#" name="#" class="pull-right" /></td>
</tr>
</tbody>
</table>
</div>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">Code... Code...
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Form Elements</h1>
<h1 class="docu-sub-headline">Select</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<form data-icinga-component="app/form" action="" method="get" class="form-inline" name="hosts" id="icinga-component-0">
<div id="sort-element" class="form-group">
<label for="sort">Sort By</label>
<select data-icinga-form-autosubmit="1" class="form-control input-sm" id="sort" name="sort">
<option value="host_last_check">Last Host Check</option>
<option value="host_severity">Host Severity</option>
<option value="host_state">Hard State</option>
<option value="host_name">Host Name</option>
<option value="host_address">Address</option>
</select>
</div>
<div id="dir-element" class="form-group"><label for="dir">&nbsp;</label>
<select data-icinga-form-autosubmit="1" class="form-control input-sm" id="dir" name="dir">
<option value="desc">Desc</option>
<option value="asc">Asc</option>
</select></div>
<div id="submit_hosts-element" class="form-group"><label for="submit_hosts">&nbsp;</label><noscript>
&lt;input type="submit" name="submit_hosts" id="submit_hosts" value="Sort" class="btn btn-default form-control input-sm" condition="0" addLabelPlaceholder="1"&gt;</noscript>
</div>
</form>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">
...
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Main Navigation</h1>
<h1 class="docu-sub-headline">Without Subnavigation</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<ul id="icinganavigation" role="navigation" class="nav nav-stacked">
<li class="icon-main-nav nav-icon-hosts">
<a href="/icinga2-web/monitoring/list/hosts">Hosts</a>
</li>
<li class="icon-main-nav nav-icon-services">
<a href="/icinga2-web/monitoring/list/services" class="nav-notification">Services</a>
<span class="badge-container-nav">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge-nav">
12
</a>
</span>
</li>
<li class="icon-main-nav nav-icon-downtimes">
<a href="/icinga2-web/monitoring/list/downtimes">Downtimes</a>
</li>
<li class="icon-main-nav nav-icon-notifications">
<a href="/icinga2-web/monitoring/list/notifications">Notifications</a>
</li>
<li class="icon-main-nav nav-icon-comments">
<a href="/icinga2-web/monitoring/list/comments">Comments</a>
</li>
<li class="icon-main-nav nav-icon-dashboard active">
<a href="/icinga2-web/dashboard/index">Dashboard</a>
</li>
<li class="icon-main-nav nav-icon-configuration">
<a href="/icinga2-web/config/index">Configuration</a>
</li>
</ul>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
</div><!-- .docu-section -->
<h1 class="docu-sub-headline">With Subnavigation</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<ul id="icinganavigation" role="navigation" class="nav nav-stacked">
<li class="icon-main-nav nav-icon-hosts">
<a href="/icinga2-web/monitoring/list/hosts">Hosts</a>
</li>
<li class="icon-main-nav nav-icon-services">
<a href="/icinga2-web/monitoring/list/services" class="nav-notification">Services</a>
<span class="badge-container-nav">
<a href="/icingawebinsfx/monitoring/list/services?host=host_000&amp;service_problems=1" class="badge-nav">
12
</a>
</span>
</li>
<li class="icon-main-nav nav-icon-downtimes">
<a href="/icinga2-web/monitoring/list/downtimes">Downtimes</a>
</li>
<li class="icon-main-nav nav-icon-notifications">
<a href="/icinga2-web/monitoring/list/notifications">Notifications</a>
</li>
<!-- ##### Sub Nav ######## -->
<ul class="icinga-subnavigation">
<li class="icon-main-nav subnav-icon-configuration">
<a href="#">Lorem Ipsum lorem</a>
</li>
<li class="icon-main-nav subnav-icon-configuration">
<a href="#" class="nav-notification">Submenüpunkt 2</a>
<span class="badge-container-subnav">
<a href="#" class="badge-subnav">
12
</a>
</span>
</li>
<li class="icon-main-nav subnav-icon-configuration active">
<a href="#">Dritter toller Punkt</a>
</li>
</ul>
<li class="icon-main-nav nav-icon-comments">
<a href="/icinga2-web/monitoring/list/comments">Comments</a>
</li>
<li class="icon-main-nav nav-icon-dashboard">
<a href="/icinga2-web/dashboard/index">Dashboard</a>
</li>
<li class="icon-main-nav nav-icon-configuration">
<a href="/icinga2-web/config/index">Configuration</a>
</li>
</ul>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Dashboard</h1>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<div class="dashboard-container">
<table class="table table-condensed table-detail table-dashboard">
<thead class="sep">
<tr>
<th colspan="3" class="test">
<a href="#">Dies ist eine tolle Headline</a>
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="border-status-critical">09.10. 17:40</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>Service</strong></a> on <a href="#">Hosta</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
<tr>
<td class="border-status-warning">11.10.</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>random_06</strong></a> on <a href="#">Host_insertEFFECT</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
</tbody>
</table>
</div>
<div class="dashboard-container">
<table class="table table-condensed table-detail">
<tbody>
<tr>
<th colspan="3" class="test">
<a href="#">Dies ist eine tolle Headline</a>
</th>
</tr>
<tr>
<td class="border-status-critical">09.10.</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_0815</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
<tr>
<td class="border-status-warning">11.10.</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>random_06</strong></a> on <a href="#">Host_insertEFFECT</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
<tr>
<td class="border-status-unknown">unknown</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
</td>
<td><a href="#"><strong>Ping</strong></a> on <a href="#">Host_123456</a></td>
</tr>
<tr>
<td class="border-status-warning">11.10.</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>random_06</strong></a> on <a href="#">Host_insertEFFECT</a></td>
</tr>
<tr>
<td class="border-status-warning">11.10.</td>
<td>
<i class="dashboard-icons icon-unhandled"></i>
<i class="dashboard-icons icon-flapping"></i>
<i class="dashboard-icons icon-comment"></i>
</td>
<td><a href="#"><strong>random_06</strong></a> on <a href="#">Host_insertEFFECT</a></td>
</tr>
</tbody>
</table>
</div>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
</div><!-- .docu-section -->
<h1 class="docu-main-headline">Main Header</h1>
<h1 class="docu-sub-headline">Sub Header</h1>
<div class="docu-description">
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum.
</div>
<div class="docu-section">
<div class="docu-example">
<div class="docu-module">
<h1>bla</h1>
<h2>blubb</h2>
</div><!-- .docu-module -->
</div><!-- .docu-example -->
<div class="docu-codeblock">
<textarea class="docu-code">Code... Code...
</textarea>
</div><!-- .docu-codeblock -->
</div><!-- .docu-section -->
<!-- END CONTENT ####################### -->
<div class="docu-footer">
09/2013 - insertEFFECT GmbH
</div>
</div><!-- .docu-main -->
<script src="../js/vendor/requirejs/require.js" data-main="../js/main"></script>
</body>
</html>

View File

@ -1,955 +0,0 @@
/* ==========================================================================
Icinga Design
========================================================================== */
html {
font-family: sans-serif; /* 1 */
-ms-text-size-adjust: 100%; /* 2 */
-webkit-text-size-adjust: 100%; /* 2 */
overflow-y: scroll;
}
body {
margin: 0;
color: #262625;
font-family: "Lucida Grande","Lucida Sans Unicode",Verdana,Helvetica,Arial,sans-serif;
font-size: 16px;
}
p {
line-height: 18px;
}
.gap {
margin-bottom: 15px;
}
/* ==========================================================================
Links
========================================================================== */
a {
color: #049baf;
text-decoration: none;
}
/**
* Address `outline` inconsistency between Chrome and other browsers.
*/
a:focus {
outline: thin dotted;
}
/**
* Improve readability when focused and also mouse hovered in all browsers.
*/
a:active,
a:hover {
outline: 0;
color: #049baf;
text-decoration: underline;
}
/* ==========================================================================
Typography
========================================================================== */
/**
* Address variable `h1` font-size and margin within `section` and `article`
* contexts in Firefox 4+, Safari 5, and Chrome.
*/
h1 {
color: #262625;
font-size: 20px;
}
h2 {
color: #262625;
font-size: 16px;
}
p {
margin-top: 0;
}
/* ==========================================================================
Tables
========================================================================== */
table, th, td {
text-align: left;
vertical-align: top;
}
table {
border-collapse: collapse;
border-spacing: 0;
}
th {
font-weight: bold;
font-size: 18px;
padding: 8px 8px 10px 8px;
border-bottom: 2px solid #ddd;
}
.table-detail th {
font-size: 16px;
border-top: 0;
}
.table-detail thead > tr > th, .table tbody > tr > th,
.table-detail tbody > tr > td, .table tfoot > tr > td {
border-top: 0 !important;
}
.table-detail > thead {
border-top: 0 !important;
}
td {
padding: 8px 10px 8px 8px !important;
border-bottom: 1px dotted #ddd !important;
border-top: none;
}
.pull-right {
float: right !important;
clear: right !important;
display: block;
clear: right;
overflow: hidden;
}
.badge-container {
display: block;
overflow: hidden;
}
.badge {
background-color: #fff;
border-radius: 2px;
color: #ff3300;
display: inline-block;
font-size: 12px;
font-weight: bold;
line-height: 1;
min-width: 10px;
padding-bottom: 3px;
padding-left: 10px;
padding-right: 10px;
padding-top: 3px;
text-align: center;
vertical-align: baseline;
white-space: nowrap;
border: 1px solid #ff3300;
}
.badge a,
.badge a:active,
.badge a:hover,
.badge:hover {
color: #ff3300 !important;
display: inline-block !important;
}
.host-name {
display: block;
margin-top: 5px;
font-weight: bold;
}
.active {
background-color: #f5f5f5;
}
.output-text {
font-size: 12px;
line-height: 14px;
display: inline-block;
}
.panel-disabled {
border-left: 8px solid #FF3300;
}
.panel-enabled {
border-left: 8px solid #00CC33;
}
/* ==========================================================================
Forms
========================================================================== */
.form-inline .form-group {
display: inline-block;
margin-bottom: 0;
vertical-align: middle;
}
.form-group {
margin-bottom: 15px;
}
label {
display: inline-block;
font-weight: bold;
margin-bottom: 5px;
}
.input-sm {
border-radius: 3px;
font-size: 16px;
padding: 5px;
margin-right: 15px;
}
.form-control {
background-color: #FFFFFF;
border: 1px solid #CCCCCC;
border-radius: 4px;
padding: 5px;
box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075) inset;
color: #555555;
display: block;
vertical-align: middle;
width: 100%;
}
select.input-sm {
}
/* ==========================================================================
Pagination
========================================================================== */
.pagination > .active > a,
.pagination > .active > span,
.pagination > .active > a:hover,
.pagination > .active > span:hover,
.pagination > .active > a:focus,
.pagination > .active > span:focus {
background-color: #049baf !important;
border-color: fuchsia !important;
}
.pagination-sm > li > a, .pagination-sm > li > span {
font-size: 16px !important;
}
/* ==========================================================================
Status colors
========================================================================== */
.status-up {
background-color: #00cc33; /* green */
}
.status-warning {
background-color: #00cc33; /* xx */
}
.status-critical {
background-color: #ff3300; /* red */
}
.status-unknown {
background-color: #00cc33; /* xx */
}
.status-pending {
background-color: #00cc33; /* xx */
}
/** Service status **/
.tacheader-status-critical {
background-color: #FF3300;
}
.tacheader-status-ok {
background-color: #00CC33;
}
.tacheader-status-warning {
background-color: #FFA500;
}
.tacheader-status-unknown {
background-color: #E066FF;
}
/** Host status **/
.tacheader-status-unreachable {
background-color: #E066FF;
}
.tacheader-status-down {
background-color: #FF3300;
}
.tacheader-status-up {
background-color: #00CC33;
}
/* Borders for Detail Headers */
.border-status-critical {
border-left: 10px solid #FF3300;
}
.border-status-ok {
border-left: 10px solid #00CC33;
}
.border-status-warning {
border-left: 10px solid #FFA500;
}
.border-status-unknown {
border-left: 10px solid #E066FF;
}
/** Host status **/
.border-status-unreachable {
border-left: 10px solid #E066FF;
}
.border-status-down {
border-left: 10px solid #FF3300;
}
.border-status-up {
background-color: #00CC33;
}
/* ==========================================================================
Icons
========================================================================== */
.icon-table {
width: 16px;
height: 20px;
display: block;
background-position: 50% 0;
}
.icon-header {
background-position: 0 50%;
padding-left: 25px;
height: 20px;
}
.icon-btn-small {
background-position: 0 0;
width: 16px;
height: 16px;
display: block;
}
.icon-table-hint {
width: 16px;
height: 20px;
display: block;
background-position: 50% 50%;
}
.icon-table-hint:after {
content: "edited";
padding-left: 22px;
}
.icon-flapping {
background-image: url('images/flapping.png');
background-repeat: no-repeat;
}
.icon-comment {
background-image: url('images/comment.png');
background-repeat: no-repeat;
}
.icon-unhandled {
background-image: url('images/unhandled.png');
background-repeat: no-repeat;
}
.icon-host {
background-image: url('images/host.png');
background-repeat: no-repeat;
}
.icon-acknowledgement {
background-image: url('images/acknowledgement.png');
background-repeat: no-repeat;
}
.icon-remove {
background-image: url('images/remove.png');
background-repeat: no-repeat;
}
.icon-submit {
background-image: url('images/submit.png');
background-repeat: no-repeat;
}
.icon-create {
background-image: url('images/create.png');
background-repeat: no-repeat;
}
.icon-dashboard {
background-image: url('images/dashboard.png');
background-repeat: no-repeat;
}
.icon-disable {
background-image: url('images/disable.png');
background-repeat: no-repeat;
}
.icon-edit {
background-image: url('images/edit.png');
background-repeat: no-repeat;
}
.icon-error {
background-image: url('images/error.png');
background-repeat: no-repeat;
}
.icon-downtime {
background-image: url('images/in_downtime.png');
background-repeat: no-repeat;
}
.icon-save {
background-image: url('images/save.png');
background-repeat: no-repeat;
}
.icon-service {
background-image: url('images/service.png');
background-repeat: no-repeat;
}
.icon-user {
background-image: url('images/user.png');
background-repeat: no-repeat;
}
.icon-reschedule {
background-image: url('images/reschedule.png');
background-repeat: no-repeat;
}
.icon-refresh {
background-image: url('images/refresh.png');
background-repeat: no-repeat;
}
/* ==========================================================================
Details Panel
========================================================================== */
.panel-heading {
border-bottom: 0;
margin-bottom: 0px !important;
padding-left: 5px;
padding-bottom: 3px;
padding-top: 5px;
overflow: hidden;
border-radius: 0;
}
.panel-hostname {
font-weight: bold;
}
.separator {
border-top: 2px solid #ddd;
border-bottom: 0;
margin: 0;
height: 2px;
}
.panel-header-status {
font-weight: normal;
}
.panel-row {
display: block;
margin-bottom: 10px;
overflow: hidden;
border-bottom: 1px dotted #ddd;
padding-bottom: 10px;
}
.panel-label {
float: left;
padding-right: 10px;
width: 30%;
clear: left;
}
.panel-content {
float: left;
padding-right: 10px;
display: inline-block;
max-width: 40%;
}
.panel-button {
float: right;
display: inline-block;
overflow: hidden;
}
.panel-body {
margin-bottom: 45px;
}
/* ==========================================================================
Buttons
========================================================================== */
.button {
text-align: center;
padding: 3px;
border-width: 1px;
border-style: solid;
border-radius: 3px;
}
.btn-common {
border-color: #ddd;
color: #262625;
background: rgb(255,255,255); /* Old browsers */
background: -moz-linear-gradient(top, rgb(255,255,255) 1%, rgb(245,245,245) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgb(255,255,255)), color-stop(100%,rgb(245,245,245))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* W3C */
}
.panel-row > a:hover,
.btn-common:hover {
border-color: #262625 !important;
color: #262625 !important;
text-decoration: none;
}
.btn-cta {
border-color: #049BAF;
color: #049BAF;
background: rgb(255,255,255); /* Old browsers */
background: -moz-linear-gradient(top, rgb(255,255,255) 1%, rgb(245,245,245) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(1%,rgb(255,255,255)), color-stop(100%,rgb(245,245,245))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgb(255,255,255) 1%,rgb(245,245,245) 100%); /* W3C */
}
.btn-small {
width: 25px;
height: 25px;
display: inline-block;
}
.btn-wide {
width: 100%;
display: block;
}
.btn-half-left {
float: left;
width: 48%;
}
.btn-half-right {
float: right;
width: 48%;
}
/* ==========================================================================
Main Navigation
========================================================================== */
.nav-stacked > li + li {
margin-left: 0;
margin-top: 0;
}
.nav-stacked {
background-color: #f8f8f8;
}
.icinga-subnavigation {
list-style: none;
}
.nav-stacked > li {
padding-top: 7px;
padding-bottom: 7px;
border-bottom: 1px dotted #049baf;
border-right: 1px dotted #049baf;
}
.nav-stacked > li:first-child {
border-top: 1px dotted #049baf;
}
.icinga-subnavigation > li {
padding-top: 8px;
padding-bottom: 8px;
border-bottom: 1px dotted #049baf;
border-right: 1px dotted #049baf;
}
ul.icinga-subnavigation {
border-bottom: 1px dotted #049baf;
margin-left: 0;
padding-left: 15px;
}
.icinga-subnavigation > li:last-child {
padding-top: 8px;
padding-bottom: 8px;
border-bottom: 0;
}
.nav-stacked > li > a,
.icinga-subnavigation > li > a {
padding-left: 40px;
padding-right: 3px;
border-left: 6px solid #049baf;
display: inline-block;
}
.nav-stacked > li > a.nav-notification,
.icinga-subnavigation > li > a.nav-notification {
border-left: 6px solid red !important;
}
.nav-stacked > li > a:hover,
.icinga-subnavigation > li > a:focus {
/* font-weight: bold;*/
background-color: transparent !important;
display: inline-block;
}
.nav-stacked > li:hover,
.nav-stacked > li:focus,
.icinga-subnavigation > li:hover,
.icinga-subnavigation > li:focus {
background-color: #fff;
}
.nav-stacked > li.active,
.icinga-subnavigation > li.active {
background-color: #fff;
border-right: 0;
}
.nav-icon-hosts {
background-image: url('images/host_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.nav-icon-services {
background-image: url('images/service_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.nav-icon-downtimes {
background-image: url('images/in_downtime_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.nav-icon-notifications {
background-image: url('images/notification_petrol.png');
background-repeat: no-repeat;
background-position: 19px 20px;
}
.nav-icon-comments {
background-image: url('images/comment_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.nav-icon-dashboard {
background-image: url('images/dashboard_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.nav-icon-configuration {
background-image: url('images/configuration_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.subnav-icon-configuration {
background-image: url('images/configuration_petrol.png');
background-repeat: no-repeat;
background-position: 19px 50%;
}
.badge-container-nav {
display: inline-block;
overflow: hidden;
padding-top: 0;
margin-bottom: 5px;
}
.badge-nav {
background-color: #fff;
border-radius: 2px;
color: #ff3300;
display: inline-block;
font-size: 12px;
font-weight: bold;
line-height: 1;
min-width: 10px;
padding-bottom: 3px;
padding-left: 7px;
padding-right: 7px;
padding-top: 3px;
text-align: center;
vertical-align: baseline;
white-space: nowrap;
border: 1px solid #ff3300;
}
.badge-container-subnav {
position: absolute;
overflow: hidden;
padding-top: 0;
margin-left: 2px;
margin-top: -8px;
}
.badge-subnav {
background-color: #fff;
border-radius: 2px;
color: #ff3300;
display: inline-block;
font-size: 10px;
font-weight: bold;
line-height: 1;
min-width: 10px;
padding-bottom: 2px;
padding-left: 5px;
padding-right: 5px;
padding-top: 2px;
text-align: center;
vertical-align: baseline;
white-space: nowrap;
border: 1px solid #ff3300;
}
/* ==========================================================================
Dashboard
========================================================================== */
.dashboard-container {
margin-right: 40px;
margin-bottom: 20px;
display: inline-block;
vertical-align: top;
}
.dashboard-icons {
display: inline-block;
height: 16px;
width: 16px;
}
/* ==========================================================================
Top Navbar
========================================================================== */
.icinga-logo {
background-attachment: scroll;
background-clip: border-box;
background-color: rgba(0, 0, 0, 0);
background-image: url("images/logo_icinga.png");
background-origin: padding-box;
background-position: center center;
background-repeat: no-repeat;
background-size: auto auto;
display: block;
height: 33px;
margin-bottom: 0;
margin-left: 8px;
margin-right: 30px;
margin-top: 8px;
text-indent: -999px;
width: 94px;
}
.icinga-icon-user {
background-attachment: scroll;
background-clip: border-box;
background-color: rgba(0, 0, 0, 0);
background-image: url("images/user.png");
background-origin: padding-box;
background-position: center center;
background-repeat: no-repeat;
background-size: auto auto;
display: inline-block;
height: 16px;
width: 16px;
}
.icinga-navbar {
margin-right: 15px;
}
.icinga-navbar-reload {
margin-top: 13px;
margin-right: 40px;
}
.icinga-navbar-search {
background-image: url('images/search.png');
background-repeat: no-repeat;
background-position: 5px 50%;
padding-left: 25px !important;
}
.icinga-navbar-search-container {
border-left: 1px solid #ddd;
padding-left: 15px;
margin-top: 12px;
}
.icinga-navbar-hosts-container {
background-image: url('images/host.png');
background-repeat: no-repeat;
background-position: 5px 50%;
padding-left: 30px !important;
margin-top: 15px;
}
.icinga-navbar-services-container {
background-image: url('images/service.png');
background-repeat: no-repeat;
background-position: 5px 50%;
padding-left: 25px !important;
margin-top: 15px;
}
.icinga-navbar-pills {
border-style: solid;
border-width: 1px;
padding: 3px 5px 3px 5px;
border-radius: 3px;
font-size: 13px;
}
/** Service status **/
.icinga-navbar-pills-critical {
border-color: #FF3300;
color: #FF3300;
}
.icinga-navbar-pills-ok {
border-color: #00CC33;
color: #00CC33;
}
.icinga-navbar-pills-warning {
border-color: #FFA500;
color: #FFA500;
}
.icinga-navbar-pills-unknown {
border-color: #E066FF;
color: #E066FF;
}
/** Host status **/
.icinga-navbar-pills-unreachable {
border-color: #E066FF;
color: #E066FF;
}
.icinga-navbar-pills-down {
border-color: #FF3300;
color: #FF3300;
}
.icinga-navbar-pills-up {
border-color: #00CC33;
color: #00CC33;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 501 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 502 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 B

Some files were not shown because too many files have changed in this diff Show More