diff --git a/Dockerfile/dockbix-xxl-4.2/Dockerfile b/Dockerfile/dockbix-xxl-4.2/Dockerfile new file mode 100644 index 0000000..4144033 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/Dockerfile @@ -0,0 +1,213 @@ +FROM centos:centos7 +LABEL maintainer "Jan Garaj " + +ENV \ + ZABBIX_VERSION=4.2 \ + ZABBIX_SOURCES=https://git.zabbix.com/scm/zbx/zabbix.git \ + ZS_enabled=true \ + ZA_enabled=true \ + ZW_enabled=true \ + ZJ_enabled=false \ + ZP_enabled=false \ + SNMPTRAP_enabled=false \ + STATUS_PAGE_ALLOWED_IP=127.0.0.1 \ + JAVA_HOME=/usr/lib/jvm/jre \ + JAVA=/usr/bin/java \ + PHP_date_timezone=UTC \ + PHP_max_execution_time=300 \ + PHP_max_input_time=300 \ + PHP_memory_limit=128M \ + PHP_error_reporting=E_ALL \ + ZS_LogType=console \ + ZS_PidFile=/var/run/zabbix_server.pid \ + ZS_User=zabbix \ + ZS_DBHost=zabbix.db \ + ZS_DBName=zabbix \ + ZS_DBUser=zabbix \ + ZS_DBPassword=zabbix \ + ZS_DBPort=3306 \ + ZS_PidFile=/tmp/zabbix_server.pid \ + ZS_AlertScriptsPath=/usr/local/share/zabbix/alertscripts \ + ZS_ExternalScripts=/usr/local/share/zabbix/externalscripts \ + ZS_SSLCertLocation=/usr/local/share/zabbix/ssl/certs \ + ZS_SSLKeyLocation=/usr/local/share/zabbix/ssl/keys \ + ZS_LoadModulePath=/usr/lib/zabbix/modules \ + ZS_JavaGateway=127.0.0.1 \ + ZS_JavaGatewayPort=10052 \ + ZS_SNMPTrapperFile=/tmp/zabbix_traps.tmp \ + ZW_ZBX_SERVER=localhost \ + ZW_ZBX_SERVER_PORT=10051 \ + ZW_ZBX_SERVER_NAME="Zabbix Server" \ + ZA_LogType=console \ + ZA_Hostname="Zabbix Server" \ + ZA_User=zabbix \ + ZA_PidFile=/tmp/zabbix_agentd.pid \ + ZA_Server=127.0.0.1 \ + ZA_ServerActive=127.0.0.1 \ + ZJ_LISTEN_IP=0.0.0.0 \ + ZJ_LISTEN_PORT=10052 \ + ZJ_PID_FILE=/tmp/zabbix_java.pid \ + ZJ_START_POLLERS=5 \ + ZJ_TIMEOUT=3 \ + ZJ_LogLevel=error \ + ZJ_TCP_TIMEOUT=3000 \ + ZP_LogType=console \ + ZP_DBHost=zabbixproxy.db \ + ZP_DBName=zabbix \ + ZP_DBUser=zabbix \ + ZP_DBPassword=zabbix \ + ZP_User=zabbix \ + XXL_searcher=true \ + XXL_updatechecker=true \ + XXL_zapix=false \ + XXL_grapher=false \ + XXL_api=true \ + XXL_apiuser=Admin \ + XXL_apipass=zabbix \ + XXL_analytics=true \ + TERM=xterm + +# Layer: base +RUN \ + yum clean all && \ + yum update -y && \ + yum install -y epel-release && \ + yum clean all && \ + yum install -y supervisor && \ + yum install -y http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm && \ + yum install -y nginx inotify-tools && \ + groupmod --gid 80 --new-name www nginx && \ + usermod --uid 80 --home /data/www --gid 80 --login www --shell /bin/bash --comment www nginx && \ + rm -rf /etc/nginx/*.d /etc/nginx/*_params && \ + mkdir -p /etc/nginx/ssl && \ + openssl genrsa -out /etc/nginx/ssl/dummy.key 2048 && \ + openssl req -new -key /etc/nginx/ssl/dummy.key -out /etc/nginx/ssl/dummy.csr -subj "/C=GB/L=London/O=Company Ltd/CN=zabbix-docker" && \ + openssl x509 -req -days 3650 -in /etc/nginx/ssl/dummy.csr -signkey /etc/nginx/ssl/dummy.key -out /etc/nginx/ssl/dummy.crt && \ + yum install -y http://rpms.remirepo.net/enterprise/remi-release-7.rpm && \ + yum install -y --enablerepo=remi-php71 php-fpm \ + php-gd php-bcmath php-ctype php-xml php-xmlreader php-xmlwriter \ + php-session php-net-socket php-mbstring php-gettext php-cli \ + php-mysqlnd php-opcache php-pdo php-snmp php-ldap && \ + yum clean all && rm -rf /tmp/* +ADD container-files-base / + +# Layer: zabbix +COPY container-files-zabbix / +RUN \ + export FPING_VERSION=4.0 && \ + yum clean all && \ + yum install -y https://repo.zabbix.com/zabbix/4.2/rhel/7/x86_64/zabbix-release-4.2-1.el7.noarch.rpm && \ + yum update -y && \ + yum install -y tar git gcc automake make nmap traceroute iptstate wget \ + net-snmp-devel net-snmp-libs net-snmp net-snmp-perl iksemel \ + net-snmp-python net-snmp-utils java-1.8.0-openjdk \ + java-1.8.0-openjdk-devel mariadb-devel libxml2-devel gettext \ + libcurl-devel OpenIPMI-devel mysql iksemel-devel libssh2-devel \ + unixODBC unixODBC-devel mysql-connector-odbc postgresql-odbc \ + openldap-devel telnet net-tools snmptt sudo rubygems ruby-devel \ + jq openssh-clients python-httplib2 python-simplejson \ + libevent-devel openldap-clients && \ + yum -y -q reinstall glibc-common && \ + cp /usr/local/etc/zabbix_agentd.conf /tmp && \ + git clone ${ZABBIX_SOURCES} --branch release/${ZABBIX_VERSION} --depth 1 --single-branch /usr/local/src/zabbix && \ + cd /usr/local/src/zabbix && \ + DATE=$(date +%Y-%m-%d) && \ + sed -i "s/ZABBIX_VERSION.*'\(.*\)'/ZABBIX_VERSION', '\1 Dockbix XXL ($DATE)'/g" frontends/php/include/defines.inc.php && \ + sed -i "s/ZABBIX_VERSION_RC.*\"\(.*\)\"/ZABBIX_VERSION_RC \"\1 Dockbix XXL (${DATE})\"/g" include/version.h && \ + sed -i "s/String VERSION =.*\"\(.*\)\"/String VERSION = \"\1 Dockbix XXL (${DATE})\"/g" src/zabbix_java/src/com/zabbix/gateway/GeneralInformation.java && \ + zabbix_revision=$(svn info svn://svn.zabbix.com/${ZABBIX_VERSION} |grep "Last Changed Rev"|awk '{print $4;}') && \ + zabbix_revision=$(git rev-parse --short HEAD) && \ + sed -i "s/{ZABBIX_REVISION}/$zabbix_revision/g" include/version.h && \ + ./bootstrap.sh && \ + export CFLAGS="-fPIC -pie -Wl,-z,relro -Wl,-z,now" && \ + ./configure --enable-server --enable-agent --with-mysql --enable-java \ + --with-net-snmp --with-libcurl --with-libxml2 --with-openipmi \ + --enable-ipv6 --with-jabber --with-openssl --with-ssh2 \ + --enable-proxy --with-ldap --with-unixodbc && \ + make -j"$(nproc)" dbschema && \ + make -j"$(nproc)" install && \ + mv /health/ /usr/local/src/zabbix/frontends/php/ && \ + cp /usr/local/etc/web/zabbix.conf.php /usr/local/src/zabbix/frontends/php/conf/ && \ + wget https://github.com/schweikert/fping/releases/download/v${FPING_VERSION}/fping-${FPING_VERSION}.tar.gz && \ + tar -xvf fping-${FPING_VERSION}.tar.gz && \ + cd fping-${FPING_VERSION}/ && \ + ./configure --prefix=/usr --disable-ipv6; make clean install && \ + ./configure --prefix=/usr --disable-ipv4 --program-suffix=6; make clean install && \ + setcap cap_net_raw+ep /usr/sbin/fping || echo 'Warning: setcap cap_net_raw+ep /usr/sbin/fping' && \ + setcap cap_net_raw+ep /usr/sbin/fping6 || echo 'Warning: setcap cap_net_raw+ep /usr/sbin/fping6' && \ + chmod 4710 /usr/sbin/fping && \ + chmod 4710 /usr/sbin/fping6 && \ + cd .. && \ + cp -f /tmp/zabbix_agentd.conf /usr/local/etc/ && \ + rm -rf fping-${FPING_VERSION} && \ + rm -rf ${FPING_VERSION}.tar.gz && \ + cd /usr/local/src/zabbix/frontends/php && \ + locale/make_mo.sh && \ + yum autoremove -y gettext svn gcc automake mariadb-devel \ + java-1.8.0-openjdk-devel libxml2-devel libcurl-devel \ + OpenIPMI-devel iksemel-devel rubygems ruby-devel \ + ruby-devel unixODBC-devel && \ + yum install -y OpenIPMI-libs && \ + chmod +x /config/bootstrap.sh && \ + chmod +x /config/ds.sh && \ + chmod +x /usr/local/src/zabbix/misc/snmptrap/zabbix_trap_receiver.pl && \ + chmod +x /usr/share/snmptt/snmptthandler-embedded && \ + sed -i -e "s/Defaults requiretty.*/ #Defaults requiretty/g" /etc/sudoers && \ + localedef -i en_US -f UTF-8 en_US.UTF-8 && \ + yum clean all && \ + mkdir -p /usr/local/share/ssl/certs && \ + mkdir -p /usr/local/share/ssl/keys && \ + mkdir -p /usr/lib/zabbix/modules && \ + mkdir -p /etc/zabbix/snmp/mibs && \ + rm -rf /usr/local/src/zabbix/[a,A,b,c,C,i,I,m,M,n,N,r,R,s,t,u,r,\.]* /usr/local/src/zabbix/depcomp /usr/local/src/zabbix/.svn && \ + rm -rf /usr/local/src/zabbix/database/[i,M,o,p,s]* && \ + rm -rf /tmp/* + # TODO apply http://geofrogger.net/review/snmptt-hide-generic-part.patch + +# Layer: dockbix-xxl +COPY container-files-dockbix-xxl / +RUN \ + chmod +x /usr/local/src/zabbix/supervisord-listener.py && \ + yum -y -q reinstall glibc-common && \ + cd /tmp && \ + yumdownloader glibc-common && \ + rpm2cpio glibc-common*.rpm | cpio -idmv && \ + rm -vf /usr/lib/locale/locale-archive.tmpl && \ + cp -vf ./usr/lib/locale/locale-archive.tmpl /usr/lib/locale/ && \ + build-locale-archive && \ + rm -rf /tmp/* && \ + yum install -y ipa-pgothic-fonts python-boto python-pip && \ + cp /usr/share/fonts/ipa-pgothic/ipagp.ttf /usr/local/src/zabbix/frontends/php/fonts && \ + pip install pyzabbix && \ + yum autoremove -y ipa-pgothic-fonts python-pip && \ + yum clean all && \ + grep 'XXL' /usr/local/src/zabbix/frontends/php/include/defines.inc.php && \ + sed -i "s#]))->addClass(ZBX_STYLE_FOOTER);#,' / ',(new CLink('Monitoring Artist Ltd', 'http://www.monitoringartist.com'))->addClass(ZBX_STYLE_GREY)->addClass(ZBX_STYLE_LINK_ALT)->setAttribute('target', '_blank'),]))->addClass(ZBX_STYLE_FOOTER);#g" /usr/local/src/zabbix/frontends/php/include/html.inc.php && \ + true || grep 'www.monitoringartist.com' /usr/local/src/zabbix/frontends/php/include/html.inc.php && \ + sed -i "s/(new CDiv())->addClass(ZBX_STYLE_SIGNIN_LOGO),/(new CDiv())->addClass(ZBX_STYLE_SIGNIN_LOGO),(new CDiv())->addClass(ZBX_STYLE_CENTER)->addItem((new CTag('h1', true, _('Dockbix XXL')))->addClass(ZBX_STYLE_BLUE))->addItem((new CLink(_('Maintained by Monitoring Artist'), 'http:\/\/www.monitoringartist.com'))->setTarget('_blank')->addClass(ZBX_STYLE_GREY)),/g" /usr/local/src/zabbix/frontends/php/include/views/general.login.php && \ + true || grep 'www.monitoringartist.com' /usr/local/src/zabbix/frontends/php/include/views/general.login.php && \ + sed -i "s#echo '';#echo \"\";#g" /usr/local/src/zabbix/frontends/php/include/page_footer.php && \ + grep 'UA-72810204-2' /usr/local/src/zabbix/frontends/php/include/page_footer.php && \ + sed -i "s#echo '';#echo \"\";#g" /usr/local/src/zabbix/frontends/php/app/views/layout.htmlpage.php && \ + grep 'UA-72810204-2' /usr/local/src/zabbix/frontends/php/app/views/layout.htmlpage.php && \ + ZVERSION=$(zabbix_agentd -V | grep ^zabbix_agentd | awk -F'\\(Zabbix\\) ' '{print $2}') && \ + sed -i "s#^var xxlCurrentVersion =.*#var xxlCurrentVersion = \"$ZVERSION\";#" /usr/local/src/zabbix/frontends/php/updatechecker/updatechecker.js && \ + grep "$ZVERSION" /usr/local/src/zabbix/frontends/php/updatechecker/updatechecker.js && \ + sed -i "s#.*.*#echo \"\";\n&#" /usr/local/src/zabbix/frontends/php/include/page_footer.php && \ + grep 'updatechecker.js' /usr/local/src/zabbix/frontends/php/include/page_footer.php && \ + sed -i "s###g" /usr/local/src/zabbix/frontends/php/app/views/layout.htmlpage.php && \ + grep 'updatechecker.js' /usr/local/src/zabbix/frontends/php/app/views/layout.htmlpage.php && \ + sed -i "s#'login' => \[#'xxl' => \n[\n'label' => _('XXL extensions'),\n'user_type' => USER_TYPE_SUPER_ADMIN,\n'default_page_id' => 0,\n'pages' => [\n['url' => 'searcher.php','label' => _('Searcher'),],\n['url' => 'zapix.php','label' => _('Zapix'),],\n['url' => 'grapher.php','label' => _('Grapher'),],\n['url' => 'about.php','label' => _('About'),]\n]],\n'login' => [#g" /usr/local/src/zabbix/frontends/php/include/menu.inc.php && \ + grep 'XXL extensions' /usr/local/src/zabbix/frontends/php/include/menu.inc.php && \ + sed -i "s#'admin': 0},# 'admin': 0, 'xxl': 0},#g" /usr/local/src/zabbix/frontends/php/js/main.js && \ + grep "'xxl': 0}" /usr/local/src/zabbix/frontends/php/js/main.js && \ + INITIAL_ADMIN_SEARCH="'Admin','Zabbix','Administrator','5fce1b3e34b520afeffb37ce08c7cd66'" && \ + INITIAL_ADMIN_REPLACE="'$XXL_apiuser','Zabbix','Administrator','$(echo -n $XXL_apipass | md5sum | awk '{print $1}')'" && \ + grep "$INITIAL_ADMIN_SEARCH" /usr/local/src/zabbix/database/mysql/data.sql && \ + sed -i "s/$INITIAL_ADMIN_SEARCH/$INITIAL_ADMIN_REPLACE/" /usr/local/src/zabbix/database/mysql/data.sql && \ + rm -rf /tmp/* && \ + touch /tmp/zabbix_traps.tmp + +CMD ["/config/bootstrap.sh"] + +EXPOSE 80/TCP 162/UDP 10051/TCP 10052/TCP diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/bootstrap.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/bootstrap.sh new file mode 100644 index 0000000..2cc25b4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/bootstrap.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +set -e +set -u + +# Supervisord default params +SUPERVISOR_PARAMS='-c /etc/supervisord.conf' + + +# Create directories for supervisor's UNIX socket and logs (which might be missing +# as container might start with /data mounted from another data-container). +mkdir -p /data/conf /data/run /data/logs +chmod 711 /data/conf /data/run /data/logs + +if [ "$(ls /config/init/)" ]; then + for init in /config/init/*.sh; do + . $init + done +fi + + +# We have TTY, so probably an interactive container... +if test -t 0; then + # Run supervisord detached... + exec supervisord $SUPERVISOR_PARAMS + + # Some command(s) has been passed to container? Execute them and exit. + # No commands provided? Run bash. + if [[ $@ ]]; then + eval $@ + else + export PS1='[\u@\h : \w]\$ ' + /bin/bash + fi + +# Detached mode? Run supervisord in foreground, which will stay until container is stopped. +else + # If some extra params were passed, execute them before. + # @TODO It is a bit confusing that the passed command runs *before* supervisord, + # while in interactive mode they run *after* supervisor. + # Not sure about that, but maybe when any command is passed to container, + # it should be executed *always* after supervisord? And when the command ends, + # container exits as well. + if [[ $@ ]]; then + eval $@ + fi + exec supervisord -n $SUPERVISOR_PARAMS +fi diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-cache-dirs.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-cache-dirs.sh new file mode 100644 index 0000000..c856418 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-cache-dirs.sh @@ -0,0 +1,13 @@ +#!/bin/sh + +# +# This script will be placed in /config/init/ and run when container starts. +# It creates (if they're not exist yet) necessary Nginx directories +# @see /etc/nginx/addon.d/fastcgi-cache.example +# + +set -e + +mkdir -p /run/user/nginx-cache +mkdir -p /run/user/nginx-cache-tmp +chown -R www:www /run/user/nginx-cache* diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-data-dirs.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-data-dirs.sh new file mode 100644 index 0000000..cc0d448 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-data-dirs.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +# +# This script will be placed in /config/init/ and run when container starts. +# It creates (if they're not exist yet) necessary directories +# from where custom Nginx configs can be loaded (from mounted /data volumes). +# + +set -e + +mkdir -p /data/conf/nginx/addon.d +mkdir -p /data/conf/nginx/conf.d +mkdir -p /data/conf/nginx/hosts.d +mkdir -p /data/conf/nginx/nginx.d +chmod 711 /data/conf/nginx + +mkdir -p /data/www/default +echo "default vhost # created on $(date)" > /data/www/default/index.html + +chown -R www:www /data/www diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-internal-proxy.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-internal-proxy.sh new file mode 100644 index 0000000..9f766db --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-internal-proxy.sh @@ -0,0 +1,21 @@ +#!/bin/sh + +# +# Configure internal transparent proxy on specified port (SET_INTERNAL_PROXY_ON_PORT) +# which redirect all traffic to localhost:80. See README for more info. +# + +PROXY_SOURCE_CONF="/config/init/vhost-proxy.conf" +PROXY_SOURCE_CONF_HTTPS="/config/init/vhost-proxy-https.conf" +PROXY_TARGET_CONF="/etc/nginx/hosts.d/internal-proxy.conf" +PROXY_TARGET_CONF_HTTPS="/etc/nginx/hosts.d/internal-proxy-https.conf" + +if [ ! -z "${SET_INTERNAL_PROXY_ON_PORT+xxx}" ] && [ ! -z "${SET_INTERNAL_PROXY_ON_PORT}" ]; then + cat $PROXY_SOURCE_CONF | sed "s/%proxy_port%/$SET_INTERNAL_PROXY_ON_PORT/g" > $PROXY_TARGET_CONF + echo "Nginx: internal proxy set on port :$SET_INTERNAL_PROXY_ON_PORT."; echo +fi + +if [ ! -z "${SET_INTERNAL_HTTPS_PROXY_ON_PORT+xxx}" ] && [ ! -z "${SET_INTERNAL_HTTPS_PROXY_ON_PORT}" ]; then + cat $PROXY_SOURCE_CONF_HTTPS | sed "s/%proxy_port%/$SET_INTERNAL_HTTPS_PROXY_ON_PORT/g" > $PROXY_TARGET_CONF_HTTPS + echo "Nginx: internal HTTPS proxy set on port :$SET_INTERNAL_HTTPS_PROXY_ON_PORT."; echo +fi diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-stub-status.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-stub-status.sh new file mode 100644 index 0000000..b2fe358 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-nginx-stub-status.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# +# Configure access IP address for nginx status page under /nginx_status +# +set -eu +export TERM=xterm +# Bash Colors +red=`tput setaf 1` +green=`tput setaf 2` +yellow=`tput setaf 3` +white=`tput setaf 7` +bold=`tput bold` +reset=`tput sgr0` +separator=$(echo && printf '=%.0s' {1..100} && echo) + +# Logging functions +log() { + if [[ "$@" ]]; then echo "${bold}${green}`date +'%Y-%m-%d %H:%M:%S,000'` INFO${reset} $@"; + else echo -n; fi +} + +sed -i "s|allow 127.0.0.1|allow ${STATUS_PAGE_ALLOWED_IP}|g" /etc/nginx/conf.d/stub-status.conf +log "Nginx status page: allowed address set to $STATUS_PAGE_ALLOWED_IP." diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-php-fpm-status.sh b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-php-fpm-status.sh new file mode 100644 index 0000000..df62b53 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/10-php-fpm-status.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# +# Configure access IP address for PHP-FPM satus page under /fpm_status +# + +set -eu +export TERM=xterm +# Bash Colors +red=`tput setaf 1` +green=`tput setaf 2` +yellow=`tput setaf 3` +white=`tput setaf 7` +bold=`tput bold` +reset=`tput sgr0` +separator=$(echo && printf '=%.0s' {1..100} && echo) + +# Logging functions +log() { + if [[ "$@" ]]; then echo "${bold}${green}`date +'%Y-%m-%d %H:%M:%S,000'` INFO${reset} $@"; + else echo -n; fi +} + +sed -i "s|allow 127.0.0.1|allow ${STATUS_PAGE_ALLOWED_IP}|g" /etc/nginx/conf.d/fpm-status.conf +log "PHP-FPM status page: allowed address set to $STATUS_PAGE_ALLOWED_IP." diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy-https.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy-https.conf new file mode 100644 index 0000000..bac6aa4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy-https.conf @@ -0,0 +1,14 @@ +# Internal proxy, HTTPS version +server { + listen %proxy_port% ssl; + ssl_certificate /etc/nginx/ssl/dummy.crt; + ssl_certificate_key /etc/nginx/ssl/dummy.key; + + location / { + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_redirect off; + proxy_pass https://127.0.0.1:443; + } +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy.conf new file mode 100644 index 0000000..65362e0 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/config/init/vhost-proxy.conf @@ -0,0 +1,11 @@ +# Internal proxy, HTTP version +server { + listen %proxy_port%; + location / { + proxy_set_header Host $host; + proxy_set_header X-Forwarded-Port $server_port; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_redirect off; + proxy_pass http://127.0.0.1:80; + } +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/fastcgi-cache.example b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/fastcgi-cache.example new file mode 100644 index 0000000..d9de77d --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/fastcgi-cache.example @@ -0,0 +1,23 @@ +# +# Pre-configured FastCGI cache. +# It's not used until specified in location {} context. +# +# Usage: rename this file to fastcgi-cache.conf +# and your vhost config add something like this: +# location ~ \.php$ { +# include fastcgi_params; +# fastcgi_pass php-upstream; +# fastcgi_cache APPCACHE; +# fastcgi_cache_valid 60m; +# } +# +# To achieve best performance, mount /run (or /var/run) +# which is usually tmpfs memory drive, into your docker container: +# docker run ... -v /run/user/my-container:/run/user ... +# +fastcgi_cache_path /run/user/nginx-cache levels=1:2 keys_zone=APPCACHE:10m inactive=120m; +fastcgi_temp_path /run/user/nginx-cache-tmp; +fastcgi_cache_key "$scheme$request_method$host$request_uri"; +fastcgi_cache_use_stale error timeout invalid_header http_500; +fastcgi_ignore_headers Cache-Control Expires Set-Cookie; +fastcgi_cache_lock on; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/http_realip.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/http_realip.conf new file mode 100644 index 0000000..fc66100 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/http_realip.conf @@ -0,0 +1,3 @@ +set_real_ip_from 127.0.0.1; +real_ip_header X-Forwarded-For; +real_ip_recursive off; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/php-upstream.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/php-upstream.conf new file mode 100644 index 0000000..4a7084a --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/addon.d/php-upstream.conf @@ -0,0 +1,3 @@ +upstream php-upstream { + server unix:/var/run/php-fpm-www.sock; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-01-security.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-01-security.conf new file mode 100644 index 0000000..4b6c346 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-01-security.conf @@ -0,0 +1,5 @@ +# no access to .hidden files (eg .htaccess) +location ~ /\. { + deny all; + log_not_found off; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-10-expires.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-10-expires.conf new file mode 100644 index 0000000..579332a --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-10-expires.conf @@ -0,0 +1,8 @@ +# static content: +# - images +# - flash +# - fonts +# - css/js +location ~* \.(?:jpe?g|gif|png|ico|swf|svg|eot|ttf|otf|woff|htc|css|js)$ { + expires max; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-20-common-files.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-20-common-files.conf new file mode 100644 index 0000000..c440469 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/default-20-common-files.conf @@ -0,0 +1,8 @@ +location = /favicon.ico { + log_not_found off; +} + +location = /robots.txt { + allow all; + log_not_found off; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/fpm-status.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/fpm-status.conf new file mode 100644 index 0000000..3b64025 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/fpm-status.conf @@ -0,0 +1,8 @@ +location /fpm_status { + access_log off; + allow 127.0.0.1; + deny all; + include fastcgi_params; + fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_pass php-upstream; +} \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/php-location.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/php-location.conf new file mode 100644 index 0000000..c2b8aab --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/php-location.conf @@ -0,0 +1,4 @@ +location ~ \.php$ { + include fastcgi_params; + fastcgi_pass php-upstream; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/stub-status.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/stub-status.conf new file mode 100644 index 0000000..2a81c9e --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/conf.d/stub-status.conf @@ -0,0 +1,5 @@ +location /nginx_status { + stub_status; + allow 127.0.0.1; + deny all; +} \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/fastcgi_params b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/fastcgi_params new file mode 100644 index 0000000..2703e3a --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/fastcgi_params @@ -0,0 +1,44 @@ +fastcgi_param QUERY_STRING $query_string; +fastcgi_param REQUEST_METHOD $request_method; +fastcgi_param CONTENT_TYPE $content_type; +fastcgi_param CONTENT_LENGTH $content_length; + +fastcgi_param PATH_INFO $fastcgi_script_name; +fastcgi_param SCRIPT_NAME $fastcgi_script_name; +fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; +fastcgi_param REQUEST_URI $request_uri; +fastcgi_param DOCUMENT_URI $document_uri; +fastcgi_param DOCUMENT_ROOT $document_root; +fastcgi_param SERVER_PROTOCOL $server_protocol; +fastcgi_param HTTPS $https if_not_empty; + +fastcgi_param GATEWAY_INTERFACE CGI/1.1; +fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; + +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param REMOTE_PORT $remote_port; +fastcgi_param SERVER_ADDR $server_addr; + +# SERVER_PORT needs to be commented out and has to be determined from other fields (e.g. HTTP_HOST) +# Otherwise it points invalid port when container port is mapped to different port on host machine, +# which might result with invalid links generated in a PHP app. +#fastcgi_param SERVER_PORT $server_port; + +# Using $http_host instead of $server_name - $server_name doesn't work correctly when using regexps in vhosts' server_name declaration. +#fastcgi_param SERVER_NAME $server_name; +fastcgi_param SERVER_NAME $http_host; + +# PHP only, required if PHP was built with --enable-force-cgi-redirect +fastcgi_param REDIRECT_STATUS 200; + +fastcgi_index index.php; +fastcgi_connect_timeout 10; +fastcgi_send_timeout 600; +fastcgi_read_timeout 600; +fastcgi_buffer_size 32k; +fastcgi_buffers 32 4k; +fastcgi_busy_buffers_size 64k; +fastcgi_temp_file_write_size 256k; +fastcgi_intercept_errors on; +fastcgi_pass_header on; +fastcgi_keep_conn on; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/hosts.d/default.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/hosts.d/default.conf new file mode 100644 index 0000000..b3bac77 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/hosts.d/default.conf @@ -0,0 +1,17 @@ +server { + listen 80 default; + root /data/www/default; + index index.php index.html; + + include /etc/nginx/conf.d/default-*.conf; + include /data/conf/nginx/conf.d/default-*.conf; + + # PHP backend is not in the default-*.conf file set, + # as some vhost might not want to include it. + include /etc/nginx/conf.d/php-location.conf; + + # Import configuration files for status pages for Nginx and PHP-FPM + include /etc/nginx/conf.d/stub-status.conf; + include /etc/nginx/conf.d/fpm-status.conf; + +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.conf new file mode 100644 index 0000000..592665f --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.conf @@ -0,0 +1,27 @@ +daemon off; +pid /var/run/nginx.pid; + +user www; +error_log stderr notice; + +worker_processes auto; +events { + multi_accept on; + use epoll; + worker_connections 1024; +} + +http { + # Somehow it's not inherited by vhosts (server{} context) when using with 'stderr' value. + # Therefore it's re-defined here to avoid specyfing it for each vhost. + error_log stderr notice; + + include /etc/nginx/nginx.d/*.conf; + include /data/conf/nginx/nginx.d/*.conf; + + include /etc/nginx/addon.d/*.conf; + include /data/conf/nginx/addon.d/*.conf; + + include /etc/nginx/hosts.d/*.conf; + include /data/conf/nginx/hosts.d/*.conf; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/10-mime.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/10-mime.conf new file mode 100644 index 0000000..d1851c6 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/10-mime.conf @@ -0,0 +1,2 @@ +include /etc/nginx/mime.types; +default_type application/octet-stream; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/20-logs.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/20-logs.conf new file mode 100644 index 0000000..5916f58 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/20-logs.conf @@ -0,0 +1,2 @@ +access_log off; +error_log /data/logs/nginx-error.log; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/30-gzip.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/30-gzip.conf new file mode 100644 index 0000000..fb2fbb4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/30-gzip.conf @@ -0,0 +1,9 @@ +gzip on; +gzip_http_version 1.0; +gzip_comp_level 4; +gzip_min_length 1024; +gzip_proxied any; +gzip_vary off; +gzip_types text/plain text/css application/x-javascript text/xml application/xml application/rss+xml application/atom+xml text/javascript application/javascript application/json text/mathml; + +gzip_static on; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-buffers.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-buffers.conf new file mode 100644 index 0000000..3423646 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-buffers.conf @@ -0,0 +1,7 @@ +# Increase buffer size for client requests (incl. file uploads) +# so uploading the file up to xMB won't result with Nginx warning: +# "a client request body is buffered to a temporary file ..." +client_body_buffer_size 5M; + +# Set max upload size +client_max_body_size 256M; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-proxy-buffers.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-proxy-buffers.conf new file mode 100644 index 0000000..450bc69 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/80-proxy-buffers.conf @@ -0,0 +1,5 @@ +# Increase slightly proxy buffer size and amount so it can +# handle up to 512KB into the memory (vs. default 32|64kB). +# Only used when proxy_pass directive is in place. +proxy_buffer_size 32k; +proxy_buffers 16 32k; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/90-misc.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/90-misc.conf new file mode 100644 index 0000000..b3b5098 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/nginx/nginx.d/90-misc.conf @@ -0,0 +1,12 @@ +server_tokens off; + +sendfile on; + +server_names_hash_bucket_size 128; +types_hash_max_size 2048; +types_hash_bucket_size 64; + +tcp_nopush on; +tcp_nodelay on; + +keepalive_timeout 15; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.conf new file mode 100644 index 0000000..1f212de --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.conf @@ -0,0 +1,7 @@ +include=/etc/php-fpm.d/*.conf + +[global] +daemonize = no +pid = /var/run/php-fpm.pid +error_log = /data/logs/php-fpm-daemon.log +log_level = warning diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.d/www.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.d/www.conf new file mode 100644 index 0000000..d8d7022 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php-fpm.d/www.conf @@ -0,0 +1,17 @@ +[www] +user = www +listen = /var/run/php-fpm-www.sock +listen.owner = www + +pm = ondemand +pm.max_children = 10 +pm.max_requests = 500 +pm.process_idle_timeout = 10s +pm.status_path = /fpm_status + +ping.path = /ping + +slowlog = /data/logs/php-fpm-slow.log +request_slowlog_timeout = 60 +catch_workers_output = yes + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php-56.ini b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php-56.ini new file mode 100644 index 0000000..2edeb44 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php-56.ini @@ -0,0 +1,4 @@ +; Completely switch off populating $HTTP_RAW_POST_DATA +; to remove the warning about deprecated usage. +; http://php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data +always_populate_raw_post_data = -1 diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php.ini b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php.ini new file mode 100644 index 0000000..f8033cc --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/php.d/zz-php.ini @@ -0,0 +1,19 @@ +; Basic configuration override +expose_php = Off +memory_limit = 512M +post_max_size = 128M +upload_max_filesize = 128M +date.timezone = GMT +max_execution_time = 120 + +; Error reporting +display_errors = On +display_startup_errors = On + +; A bit of performance tuning +realpath_cache_size = 128k + +; OpCache tuning +opcache.max_accelerated_files = 32000 +opcache.memory_consumption = 128 +opcache.fast_shutdown = 0 diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/nginx.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/nginx.conf new file mode 100644 index 0000000..524cea9 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/nginx.conf @@ -0,0 +1,10 @@ +[program:nginx] +command = /usr/sbin/nginx +autorestart = true +stderr_logfile = NONE +stdout_logfile = NONE + +# Watch for changes in Nginx conf directories and restart Nginx when a config change occured +[program:nginx-reload] +command=bash -c 'while inotifywait -q -r -e create,delete,modify,move,attrib --exclude "/\." /etc/nginx/ /data/conf/nginx/; do nginx -t && nginx -s reload; done' + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/php-fpm.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/php-fpm.conf new file mode 100644 index 0000000..37febc9 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisor.d/php-fpm.conf @@ -0,0 +1,5 @@ +[program:php-fpm] +command = php-fpm +autorestart = true +stdout_logfile = /data/logs/php-fpm.log +stderr_logfile = /data/logs/php-fpm.log diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisord.conf b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisord.conf new file mode 100644 index 0000000..980e835 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-base/etc/supervisord.conf @@ -0,0 +1,24 @@ +[supervisord] +pidfile = /run/supervisord.pid +# It seems that it's not possible to swith this log to NONE (it creates NONE logfile) +logfile = /data/logs/supervisord.log +# Set loglevel=debug, only then all logs from child services are printed out +# to container logs (and thus available via `docker logs [container]` +loglevel = debug + +# These two (unix_http_server, rpcinterface) are needed for supervisorctl to work +[inet_http_server] +port = :9111 +username = sv +password = password + +[rpcinterface:supervisor] +supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface + +[supervisorctl] +serverurl = http://localhost:9111 +username = sv +password = password + +[include] +files = /etc/supervisor.d/*.conf diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/11-xxl.sh b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/11-xxl.sh new file mode 100644 index 0000000..8fb0c51 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/11-xxl.sh @@ -0,0 +1,155 @@ +#!/bin/sh + +set -eu +export TERM=xterm +# Bash Colors +red=`tput setaf 1` +green=`tput setaf 2` +yellow=`tput setaf 3` +white=`tput setaf 7` +bold=`tput bold` +reset=`tput sgr0` +separator=$(echo && printf '=%.0s' {1..100} && echo) + +# Logging functions +log() { + if [[ "$@" ]]; then echo "${bold}${green}`date +'%Y-%m-%d %H:%M:%S,000'` INFO${reset} $@"; + else echo -n; fi +} + +xxl_config() { + cid=$(md5sum <<< $(hostname) | awk -F - '{print $1}' | tr -d ' ') + XXL_updatechecker=${XXL_updatechecker:-true} + XXL_analytics=${XXL_analytics:-true} + # disable/enable XXL features + if ! $XXL_searcher; then + sed -i "/'searcher.php'/d" /usr/local/src/zabbix/frontends/php/include/menu.inc.php + rm -rf /usr/local/src/zabbix/frontends/php/searcher/ /usr/local/src/zabbix/frontends/php/searcher.php + else + if $XXL_analytics; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=XXL_searcher&el=${XXL_searcher}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + fi + if ! $XXL_zapix; then + sed -i "/'zapix.php'/d" /usr/local/src/zabbix/frontends/php/include/menu.inc.php + rm -rf /usr/local/src/zabbix/frontends/php/zapix/ /usr/local/src/zabbix/frontends/php/zapix.php + else + if $XXL_analytics; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=XXL_zapix&el=${XXL_zapix}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + fi + if ! $XXL_grapher; then + sed -i "/'grapher.php'/d" /usr/local/src/zabbix/frontends/php/include/menu.inc.php + rm -rf /usr/local/src/zabbix/frontends/php/grapher/ /usr/local/src/zabbix/frontends/php/grapher.php + else + if $XXL_analytics; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=XXL_grapher&el=${XXL_grapher}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + fi + if ! $XXL_updatechecker; then + rm -rf /usr/local/src/zabbix/frontends/php/updatechecker/ + sed -i "s#echo \".*\";##g" /usr/local/src/zabbix/frontends/php/include/page_footer.php + else + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=XXL_updatechecker&el=${XXL_grapher}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + if ! $XXL_analytics; then + # remove analytics + sed -i "s###g" /usr/local/src/zabbix/frontends/php/include/page_footer.php + sed -i "s###g" /usr/local/src/zabbix/frontends/php/app/views/layout.htmlpage.php + else + export ZABBIX_VERSION_FULL=$(zabbix_server -V | grep "(Zabbix)" | awk '{print $3"-"$4}') + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Ping&ea=Version&el=${ZABBIX_VERSION_FULL}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=Version&el=${ZABBIX_VERSION_FULL}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + if $ZS_enabled; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=ZS_enabled&el=${ZS_enabled}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + if $ZA_enabled; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=ZA_enabled&el=${ZA_enabled}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + if $ZW_enabled; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=ZW_enabled&el=${ZW_enabled}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + if $ZP_enabled; then + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=ZP_enabled&el=${ZP_enabled}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + fi +} + +xxl_api() { + XXL_api=${XXL_api:-true} + if [ "$XXL_api" = false ] || [ "$ZW_enabled" = false ]; then + return 0 + fi + + XXL_apiuser=${XXL_apiuser:-Admin} + XXL_apipass=${XXL_apipass:-zabbix} + + # wait 120sec for Zabbix API start + retry=24 + until curl --output /dev/null --silent --head --fail localhost:80 &>/dev/null + do + log "Waiting for API, it's still not available" + retry=`expr $retry - 1` + if [ $retry -eq 0 ]; then + error "API is not available!" + exit 1 + fi + sleep 5 + done + log "API is available" + + AUTH_TOKEN=$(curl -s -X POST -H 'Content-Type: application/json-rpc' -d "{\"jsonrpc\":\"2.0\",\"method\":\"user.login\",\"id\":0,\"auth\":null,\"params\":{\"user\":\"${XXL_apiuser}\",\"password\":\"${XXL_apipass}\"}}" http://0.0.0.0/api_jsonrpc.php | jq -r .result) + if [ "$AUTH_TOKEN" != "null" ]; then + log "API access succesfull" + if [ -d "/etc/zabbix/api" ]; then + ID=1 + LAST_ID=0 + files=$(find /etc/zabbix/api -regex '.*\(.xml\|.api\|.sh\|.sql\)$' -type f|sort) + set +e + for file in $files; do + if $XXL_analytics; then + curl -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Stat&ea=API&el=${file}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & + fi + if [[ "$file" == *xml ]]; then + # API XML import + log "API XML import: $file" + template=$(cat $file | sed -e 's/\"/\\\"/g' | sed -e 's/^[ \t]*//' | tr --delete '\n') + apicall="{\"jsonrpc\":\"2.0\",\"method\":\"configuration.import\",\"id\":,\"auth\":\"\",\"params\":{\"format\":\"xml\",\"rules\":{\"templates\":{\"createMissing\":true,\"updateExisting\":true},\"images\":{\"createMissing\":true,\"updateExisting\":true},\"groups\":{\"createMissing\":true},\"triggers\":{\"createMissing\":true,\"updateExisting\":true},\"valueMaps\":{\"createMissing\":true,\"updateExisting\":true},\"hosts\":{\"createMissing\":true,\"updateExisting\":true},\"items\":{\"createMissing\":true,\"updateExisting\":true},\"maps\":{\"createMissing\":true,\"updateExisting\":true},\"screens\":{\"createMissing\":true,\"updateExisting\":true},\"templateScreens\":{\"createMissing\":true,\"updateExisting\":true},\"templateLinkage\":{\"createMissing\":true},\"applications\":{\"createMissing\":true},\"graphs\":{\"createMissing\":true,\"updateExisting\":true},\"discoveryRules\":{\"createMissing\":true,\"updateExisting\":true}},\"source\":\"${template}\"}}" + command=$(echo $apicall | sed -e "s//$ID/g" | sed -e "s//$AUTH_TOKEN/g") + output=$(echo $command | curl -s -X POST -H 'Content-Type: application/json-rpc' -d @- http://0.0.0.0/api_jsonrpc.php) + log "API response: $output" + ID=$((ID+1)) + elif [[ "$file" == *api ]]; then + # API command + log "API command: $file" + while read line + do + log "API call: $line" + command=$(echo $line | sed -e "s//$ID/g" | sed -e "s//$AUTH_TOKEN/g" | sed -e "s//$LAST_ID/g") + output=$(curl -s -X POST -H 'Content-Type: application/json-rpc' -d "${command}" http://0.0.0.0/api_jsonrpc.php) + log "API response: $output" + LAST_ID=$(echo $output | jq -r 'first(.result[]?)|.[]?') + ID=$((ID+1)) + done < $file + elif [[ "$file" == *sql ]]; then + log "SQL command: $file" + output=$(/usr/bin/mysql --host=${ZS_DBHost} --port=$ZS_DBPort --user=$ZS_DBUser --password=$ZS_DBPassword --database=$ZS_DBName < $file 2>&1) + log "SQL command output: $output" + elif [[ "$file" == *sh ]]; then + # bash script - environment variable are available in the script + log "API script: $file" + output=$(bash $file) + log "API script output: $output" + fi + done + set -e + fi + else + log "API access not succesfull - try to set up env. variables XXL_apiuser/XXL_apipass" + fi +} + +log "Preparing XXL features" +xxl_config +xxl_api & +log "XXL configuration done." diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/12-xxl-ping.sh b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/12-xxl-ping.sh new file mode 100644 index 0000000..061c508 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/12-xxl-ping.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +if $XXL_analytics; then + export ZABBIX_VERSION_FULL=$(zabbix_server -V | grep "(Zabbix)" | awk '{print $3"-"$4}') + curl --connect-timeout 20 --max-time 30 -ks -o /dev/null "http://www.google-analytics.com/r/collect?v=1&tid=UA-72810204-2&cid=${cid}&t=event&ec=Ping&ea=Version&el=${ZABBIX_VERSION_FULL}&ev=1&dp=%2F&dl=http%3A%2F%2Fgithub.com%2Fmonitoringartist%2Fdockbix-xxl" &> /dev/null & +fi diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/14-xxl-env-variables.sh b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/14-xxl-env-variables.sh new file mode 100644 index 0000000..5ce5216 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/config/init/14-xxl-env-variables.sh @@ -0,0 +1,8 @@ +#!/bin/sh +# Save env variables and then source them in alertscripts + +# source /etc/zabbix/environment_variables_declare +declare -p > /etc/zabbix/environment_variables_declare + +# key=value format +printenv > /etc/zabbix/environment_variables_printenv diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/supervisor.d/analytics.conf b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/supervisor.d/analytics.conf new file mode 100644 index 0000000..5b6dcd9 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/supervisor.d/analytics.conf @@ -0,0 +1,12 @@ +[supervisord] +nodaemon = true + +[program:analytics] +command = /usr/bin/bash -c 'while true; do sleep 3600; /usr/bin/bash /config/init/12-xxl-ping.sh; done' +autorestart = true +auto_start = true + +stdout_logfile = /dev/null +stdout_logfile_maxbytes = 0 +stderr_logfile = /dev/null +stderr_logfile_maxbytes = 0 diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/01-enable-zabbix-server.api b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/01-enable-zabbix-server.api new file mode 100644 index 0000000..7c505fc --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/01-enable-zabbix-server.api @@ -0,0 +1 @@ +{"jsonrpc":"2.0","method":"host.update","id":,"auth":"","params":{"hostid":"10084","status":0}} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/02-create-regular-expressions.sql b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/02-create-regular-expressions.sql new file mode 100644 index 0000000..e7ca215 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/02-create-regular-expressions.sql @@ -0,0 +1,14 @@ +BEGIN; +SET @rid = IFNULL((SELECT MAX(regexpid) AS id FROM regexps),0); +SET @eid = IFNULL((SELECT MAX(expressionid) AS id FROM expressions),0); +INSERT INTO `regexps` (regexpid,name,test_string) VALUES +(@rid+1,'Exclude Docker related file systems','/var/lib/docker/devicemapper/mnt/123456'), +(@rid+2,'Exclude Docker related network interfaces','veth29caba3'); +INSERT INTO `expressions` +(expressionid,regexpid,expression,expression_type,exp_delimiter,case_sensitive) +VALUES +(@eid+1,@rid+1,'(/devicemapper/mnt/|/aufs/mnt/)',4,',',1), +(@eid+2,@rid+2,'^veth',4,',',1); +DELETE FROM ids WHERE table_name='regexps' AND field_name='regexpid'; +DELETE FROM ids WHERE table_name='expressions' AND field_name='expressionid'; +COMMIT; diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/03-Zabbix-Template-App-Docker.xml b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/03-Zabbix-Template-App-Docker.xml new file mode 100644 index 0000000..a14bc16 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/03-Zabbix-Template-App-Docker.xml @@ -0,0 +1,461 @@ + + + 2.0 + 2015-07-22T01:35:05Z + + + Templates + + + + + + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/04-Zabbix-Template-App-Docker-active.xml b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/04-Zabbix-Template-App-Docker-active.xml new file mode 100644 index 0000000..9290f2d --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/04-Zabbix-Template-App-Docker-active.xml @@ -0,0 +1,461 @@ + + + 2.0 + 2015-07-22T01:34:34Z + + + Templates + + + + + + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/05-Zabbix-Template-OS-Linux-for-Dockbix-Agent-XXL.xml b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/05-Zabbix-Template-OS-Linux-for-Dockbix-Agent-XXL.xml new file mode 100644 index 0000000..6cba26a --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/05-Zabbix-Template-OS-Linux-for-Dockbix-Agent-XXL.xml @@ -0,0 +1,2326 @@ + + + 3.2 + 2017-02-25T23:18:56Z + + + Templates + + + + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:vfs.file.cksum[/rootfs/etc/passwd].diff(0)}>0 + 0 + + /etc/passwd has been changed on {HOST.NAME} + 0 + + + 0 + 2 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:kernel.maxfiles.last(0)}<1024 + 0 + + Configured max number of opened files is too low on {HOST.NAME} + 0 + + + 0 + 1 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:kernel.maxproc.last(0)}<256 + 0 + + Configured max number of processes is too low on {HOST.NAME} + 0 + + + 0 + 1 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.cpu.util[,iowait].avg(5m)}>20 + 0 + + Disk I/O is overloaded on {HOST.NAME} + 0 + + + 0 + 2 + OS spends significant time waiting for I/O (input/output) operations. It could be indicator of performance issues with storage system. + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.uname.diff(0)}>0 + 0 + + Host information was changed on {HOST.NAME} + 0 + + + 0 + 1 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.hostname.diff(0)}>0 + 0 + + Hostname was changed on {HOST.NAME} + 0 + + + 0 + 1 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:vm.memory.size[available].last(0)}<20M + 0 + + Lack of available memory on server {HOST.NAME} + 0 + + + 0 + 3 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.swap.size[,pfree].last(0)}<50 + 0 + + Lack of free swap space on {HOST.NAME} + 0 + + + 0 + 2 + It probably means that the systems requires more physical memory. + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.cpu.load[percpu,avg1].avg(5m)}>5 + 0 + + Processor load is too high on {HOST.NAME} + 0 + + + 0 + 2 + + 0 + 0 + + + + + {Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com:system.uptime.change(0)}<0 + 0 + + {HOST.NAME} has just been restarted + 0 + + + 0 + 1 + + 0 + 0 + + + + + + + CPU jumps + 900 + 200 + 0.0000 + 100.0000 + 1 + 1 + 0 + 1 + 0 + 0.0000 + 0.0000 + 0 + 0 + 0 + 0 + + + 0 + 0 + 009900 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.switches + + + + 1 + 0 + 000099 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.intr + + + + + + CPU load + 900 + 200 + 0.0000 + 100.0000 + 1 + 1 + 0 + 1 + 0 + 0.0000 + 0.0000 + 1 + 0 + 0 + 0 + + + 0 + 0 + 009900 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.load[percpu,avg1] + + + + 1 + 0 + 000099 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.load[percpu,avg5] + + + + 2 + 0 + 990000 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.load[percpu,avg15] + + + + + + CPU utilization + 900 + 200 + 0.0000 + 100.0000 + 1 + 0 + 1 + 1 + 0 + 0.0000 + 0.0000 + 1 + 1 + 0 + 0 + + + 0 + 1 + FF5555 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,steal] + + + + 1 + 1 + 55FF55 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,softirq] + + + + 2 + 1 + 009999 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,interrupt] + + + + 3 + 1 + 990099 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,nice] + + + + 4 + 1 + 999900 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,iowait] + + + + 5 + 1 + 990000 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,system] + + + + 6 + 1 + 000099 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,user] + + + + 7 + 1 + 009900 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.cpu.util[,idle] + + + + + + Memory usage + 900 + 200 + 0.0000 + 100.0000 + 1 + 1 + 0 + 1 + 0 + 0.0000 + 0.0000 + 1 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + vm.memory.size[total] + + + + 0 + 5 + 00C800 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + vm.memory.size[available] + + + + + + Swap usage + 600 + 340 + 0.0000 + 100.0000 + 0 + 0 + 2 + 1 + 1 + 0.0000 + 0.0000 + 0 + 0 + 0 + 0 + + + 0 + 0 + AA0000 + 0 + 2 + 2 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.swap.size[,total] + + + + 1 + 0 + 00AA00 + 0 + 2 + 0 + + Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com + system.swap.size[,free] + + + + + + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/06-enable-dockbix-agent-auto-registration.api b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/06-enable-dockbix-agent-auto-registration.api new file mode 100644 index 0000000..84374f1 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/etc/zabbix/api/06-enable-dockbix-agent-auto-registration.api @@ -0,0 +1,2 @@ +{"jsonrpc":"2.0","method":"template.get","id":,"auth":"","params":{"output":"templateid","filter":{"host":"Template OS Linux for Dockbix Agent XXL - www.monitoringartist.com"}}} +{"jsonrpc":"2.0","method":"action.create","id":,"auth":"","params":{"name":"Dockbix Agent XXL auto registration","eventsource":2,"status":0,"esc_period":120,"def_shortdata":"Dockbix Agent XXL auto registration: {HOST.HOST}","def_longdata":"Host name: {HOST.HOST}\r\nHost IP: {HOST.IP}\r\nAgent port: {HOST.PORT}","filter":{"evaltype":0,"conditions":[{"conditiontype":24,"operator":2,"value":"dockbix-agent-xxl"}]},"operations":[{"operationtype":6,"optemplate":[{"templateid":""}]}]}} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/about.php b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/about.php new file mode 100644 index 0000000..386f73f --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/about.php @@ -0,0 +1,132 @@ +setTitle(_('Dockbix XXL')) + ->setControls((new CList()) + ->addItem(get_icon('fullscreen', ['fullscreen' => getRequest('fullscreen')])) + ); +$widget->show(); +?> +

+Dockbix XXL contains standard Zabbix + additional XXL (community) +extensions and everything is packaged into Docker image for easy deployment.
+Source repo: https://github.com/monitoringartist/dockbix-xxl +

+

+ + + +

+

+ +

+

Author

+

+
+ + DevOps / Docker / Kubernetes / AWS ECS / Zabbix / Zenoss / Terraform / Monitoring + + + Monitoring Artist is a company, which provides professional devops, automation, cloud and monitoring services.
+ Most of the projects are related to open source monitoring tools such as Zabbix, Zenoss, Grafana, ...

+ Feel free to contact us (info@monitoringartist.com) for commercial support of your Dockerized Zabbix or Docker/Kubernetes/AWS ECS/Mesos monitoring. +
+
+

+ +

+ + +
+ + + + + + + +
+

Grapher

+
    +
  • Host
  • +
  • Graph + + Select All +
  • +
  • Item + + +Normal | + +Stacked +
  • +
+
+ +
+
+
+ +
+
+ +\"\'\`]/.test(text)) { + return text; + } + map = { + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`" + }; + unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g; + return text.replace(unsafe_chars, function(chr) { + return map[chr] || "&"; + }); + }; + + return SelectParser; + + })(); + + SelectParser.select_to_array = function(select) { + var child, parser, _i, _len, _ref; + parser = new SelectParser(); + _ref = select.childNodes; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + child = _ref[_i]; + parser.add_node(child); + } + return parser.parsed; + }; + + AbstractChosen = (function() { + function AbstractChosen(form_field, options) { + this.form_field = form_field; + this.options = options != null ? options : {}; + if (!AbstractChosen.browser_is_supported()) { + return; + } + this.is_multiple = this.form_field.multiple; + this.set_default_text(); + this.set_default_values(); + this.setup(); + this.set_up_html(); + this.register_observers(); + this.on_ready(); + } + + AbstractChosen.prototype.set_default_values = function() { + var _this = this; + this.click_test_action = function(evt) { + return _this.test_active_click(evt); + }; + this.activate_action = function(evt) { + return _this.activate_field(evt); + }; + this.active_field = false; + this.mouse_on_container = false; + this.results_showing = false; + this.result_highlighted = null; + this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; + this.disable_search_threshold = this.options.disable_search_threshold || 0; + this.disable_search = this.options.disable_search || false; + this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; + this.group_search = this.options.group_search != null ? this.options.group_search : true; + this.search_contains = this.options.search_contains || false; + this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; + this.max_selected_options = this.options.max_selected_options || Infinity; + this.inherit_select_classes = this.options.inherit_select_classes || false; + this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; + this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; + return this.include_group_label_in_selected = this.options.include_group_label_in_selected || false; + }; + + AbstractChosen.prototype.set_default_text = function() { + if (this.form_field.getAttribute("data-placeholder")) { + this.default_text = this.form_field.getAttribute("data-placeholder"); + } else if (this.is_multiple) { + this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; + } else { + this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; + } + return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; + }; + + AbstractChosen.prototype.choice_label = function(item) { + if (this.include_group_label_in_selected && (item.group_label != null)) { + return "" + item.group_label + "" + item.html; + } else { + return item.html; + } + }; + + AbstractChosen.prototype.mouse_enter = function() { + return this.mouse_on_container = true; + }; + + AbstractChosen.prototype.mouse_leave = function() { + return this.mouse_on_container = false; + }; + + AbstractChosen.prototype.input_focus = function(evt) { + var _this = this; + if (this.is_multiple) { + if (!this.active_field) { + return setTimeout((function() { + return _this.container_mousedown(); + }), 50); + } + } else { + if (!this.active_field) { + return this.activate_field(); + } + } + }; + + AbstractChosen.prototype.input_blur = function(evt) { + var _this = this; + if (!this.mouse_on_container) { + this.active_field = false; + return setTimeout((function() { + return _this.blur_test(); + }), 100); + } + }; + + AbstractChosen.prototype.results_option_build = function(options) { + var content, data, _i, _len, _ref; + content = ''; + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + if (data.group) { + content += this.result_add_group(data); + } else { + content += this.result_add_option(data); + } + if (options != null ? options.first : void 0) { + if (data.selected && this.is_multiple) { + this.choice_build(data); + } else if (data.selected && !this.is_multiple) { + this.single_set_selected_text(this.choice_label(data)); + } + } + } + return content; + }; + + AbstractChosen.prototype.result_add_option = function(option) { + var classes, option_el; + if (!option.search_match) { + return ''; + } + if (!this.include_option_in_results(option)) { + return ''; + } + classes = []; + if (!option.disabled && !(option.selected && this.is_multiple)) { + classes.push("active-result"); + } + if (option.disabled && !(option.selected && this.is_multiple)) { + classes.push("disabled-result"); + } + if (option.selected) { + classes.push("result-selected"); + } + if (option.group_array_index != null) { + classes.push("group-option"); + } + if (option.classes !== "") { + classes.push(option.classes); + } + option_el = document.createElement("li"); + option_el.className = classes.join(" "); + option_el.style.cssText = option.style; + option_el.setAttribute("data-option-array-index", option.array_index); + option_el.innerHTML = option.search_text; + if (option.title) { + option_el.title = option.title; + } + return this.outerHTML(option_el); + }; + + AbstractChosen.prototype.result_add_group = function(group) { + var classes, group_el; + if (!(group.search_match || group.group_match)) { + return ''; + } + if (!(group.active_options > 0)) { + return ''; + } + classes = []; + classes.push("group-result"); + if (group.classes) { + classes.push(group.classes); + } + group_el = document.createElement("li"); + group_el.className = classes.join(" "); + group_el.innerHTML = group.search_text; + if (group.title) { + group_el.title = group.title; + } + return this.outerHTML(group_el); + }; + + AbstractChosen.prototype.results_update_field = function() { + this.set_default_text(); + if (!this.is_multiple) { + this.results_reset_cleanup(); + } + this.result_clear_highlight(); + this.results_build(); + if (this.results_showing) { + return this.winnow_results(); + } + }; + + AbstractChosen.prototype.reset_single_select_options = function() { + var result, _i, _len, _ref, _results; + _ref = this.results_data; + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + result = _ref[_i]; + if (result.selected) { + _results.push(result.selected = false); + } else { + _results.push(void 0); + } + } + return _results; + }; + + AbstractChosen.prototype.results_toggle = function() { + if (this.results_showing) { + return this.results_hide(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.results_search = function(evt) { + if (this.results_showing) { + return this.winnow_results(); + } else { + return this.results_show(); + } + }; + + AbstractChosen.prototype.winnow_results = function() { + var escapedSearchText, option, regex, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref; + this.no_results_clear(); + results = 0; + searchText = this.get_search_text(); + escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); + zregex = new RegExp(escapedSearchText, 'i'); + regex = this.get_search_regex(escapedSearchText); + _ref = this.results_data; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + option.search_match = false; + results_group = null; + if (this.include_option_in_results(option)) { + if (option.group) { + option.group_match = false; + option.active_options = 0; + } + if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { + results_group = this.results_data[option.group_array_index]; + if (results_group.active_options === 0 && results_group.search_match) { + results += 1; + } + results_group.active_options += 1; + } + option.search_text = option.group ? option.label : option.html; + if (!(option.group && !this.group_search)) { + option.search_match = this.search_string_match(option.search_text, regex); + if (option.search_match && !option.group) { + results += 1; + } + if (option.search_match) { + if (searchText.length) { + startpos = option.search_text.search(zregex); + text = option.search_text.substr(0, startpos + searchText.length) + '' + option.search_text.substr(startpos + searchText.length); + option.search_text = text.substr(0, startpos) + '' + text.substr(startpos); + } + if (results_group != null) { + results_group.group_match = true; + } + } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { + option.search_match = true; + } + } + } + } + this.result_clear_highlight(); + if (results < 1 && searchText.length) { + this.update_results_content(""); + return this.no_results(searchText); + } else { + this.update_results_content(this.results_option_build()); + return this.winnow_results_set_highlight(); + } + }; + + AbstractChosen.prototype.get_search_regex = function(escaped_search_string) { + var regex_anchor; + regex_anchor = this.search_contains ? "" : "^"; + return new RegExp(regex_anchor + escaped_search_string, 'i'); + }; + + AbstractChosen.prototype.search_string_match = function(search_string, regex) { + var part, parts, _i, _len; + if (regex.test(search_string)) { + return true; + } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) { + parts = search_string.replace(/\[|\]/g, "").split(" "); + if (parts.length) { + for (_i = 0, _len = parts.length; _i < _len; _i++) { + part = parts[_i]; + if (regex.test(part)) { + return true; + } + } + } + } + }; + + AbstractChosen.prototype.choices_count = function() { + var option, _i, _len, _ref; + if (this.selected_option_count != null) { + return this.selected_option_count; + } + this.selected_option_count = 0; + _ref = this.form_field.options; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + option = _ref[_i]; + if (option.selected) { + this.selected_option_count += 1; + } + } + return this.selected_option_count; + }; + + AbstractChosen.prototype.choices_click = function(evt) { + evt.preventDefault(); + if (!(this.results_showing || this.is_disabled)) { + return this.results_show(); + } + }; + + AbstractChosen.prototype.keyup_checker = function(evt) { + var stroke, _ref; + stroke = (_ref = evt.which) != null ? _ref : evt.keyCode; + this.search_field_scale(); + switch (stroke) { + case 8: + if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { + return this.keydown_backstroke(); + } else if (!this.pending_backstroke) { + this.result_clear_highlight(); + return this.results_search(); + } + break; + case 13: + evt.preventDefault(); + if (this.results_showing) { + return this.result_select(evt); + } + break; + case 27: + if (this.results_showing) { + this.results_hide(); + } + return true; + case 9: + case 38: + case 40: + case 16: + case 91: + case 17: + break; + default: + return this.results_search(); + } + }; + + AbstractChosen.prototype.clipboard_event_checker = function(evt) { + var _this = this; + return setTimeout((function() { + return _this.results_search(); + }), 50); + }; + + AbstractChosen.prototype.container_width = function() { + if (this.options.width != null) { + return this.options.width; + } else { + return "" + this.form_field.offsetWidth + "px"; + } + }; + + AbstractChosen.prototype.include_option_in_results = function(option) { + if (this.is_multiple && (!this.display_selected_options && option.selected)) { + return false; + } + if (!this.display_disabled_options && option.disabled) { + return false; + } + if (option.empty) { + return false; + } + return true; + }; + + AbstractChosen.prototype.search_results_touchstart = function(evt) { + this.touch_started = true; + return this.search_results_mouseover(evt); + }; + + AbstractChosen.prototype.search_results_touchmove = function(evt) { + this.touch_started = false; + return this.search_results_mouseout(evt); + }; + + AbstractChosen.prototype.search_results_touchend = function(evt) { + if (this.touch_started) { + return this.search_results_mouseup(evt); + } + }; + + AbstractChosen.prototype.outerHTML = function(element) { + var tmp; + if (element.outerHTML) { + return element.outerHTML; + } + tmp = document.createElement("div"); + tmp.appendChild(element); + return tmp.innerHTML; + }; + + AbstractChosen.browser_is_supported = function() { + if (window.navigator.appName === "Microsoft Internet Explorer") { + return document.documentMode >= 8; + } + if (/iP(od|hone)/i.test(window.navigator.userAgent)) { + return false; + } + if (/Android/i.test(window.navigator.userAgent)) { + if (/Mobile/i.test(window.navigator.userAgent)) { + return false; + } + } + return true; + }; + + AbstractChosen.default_multiple_text = "Select Some Options"; + + AbstractChosen.default_single_text = "Select an Option"; + + AbstractChosen.default_no_result_text = "No results match"; + + return AbstractChosen; + + })(); + + $ = jQuery; + + $.fn.extend({ + chosen: function(options) { + if (!AbstractChosen.browser_is_supported()) { + return this; + } + return this.each(function(input_field) { + var $this, chosen; + $this = $(this); + chosen = $this.data('chosen'); + if (options === 'destroy' && chosen instanceof Chosen) { + chosen.destroy(); + } else if (!(chosen instanceof Chosen)) { + $this.data('chosen', new Chosen(this, options)); + } + }); + } + }); + + Chosen = (function(_super) { + __extends(Chosen, _super); + + function Chosen() { + _ref = Chosen.__super__.constructor.apply(this, arguments); + return _ref; + } + + Chosen.prototype.setup = function() { + this.form_field_jq = $(this.form_field); + this.current_selectedIndex = this.form_field.selectedIndex; + return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl"); + }; + + Chosen.prototype.set_up_html = function() { + var container_classes, container_props; + container_classes = ["chosen-container"]; + container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); + if (this.inherit_select_classes && this.form_field.className) { + container_classes.push(this.form_field.className); + } + if (this.is_rtl) { + container_classes.push("chosen-rtl"); + } + container_props = { + 'class': container_classes.join(' '), + 'style': "width: " + (this.container_width()) + ";", + 'title': this.form_field.title + }; + if (this.form_field.id.length) { + container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; + } + this.container = $("
", container_props); + if (this.is_multiple) { + this.container.html('
    '); + } else { + this.container.html('' + this.default_text + '
      '); + } + this.form_field_jq.hide().after(this.container); + this.dropdown = this.container.find('div.chosen-drop').first(); + this.search_field = this.container.find('input').first(); + this.search_results = this.container.find('ul.chosen-results').first(); + this.search_field_scale(); + this.search_no_results = this.container.find('li.no-results').first(); + if (this.is_multiple) { + this.search_choices = this.container.find('ul.chosen-choices').first(); + this.search_container = this.container.find('li.search-field').first(); + } else { + this.search_container = this.container.find('div.chosen-search').first(); + this.selected_item = this.container.find('.chosen-single').first(); + } + this.results_build(); + this.set_tab_index(); + return this.set_label_behavior(); + }; + + Chosen.prototype.on_ready = function() { + return this.form_field_jq.trigger("chosen:ready", { + chosen: this + }); + }; + + Chosen.prototype.register_observers = function() { + var _this = this; + this.container.bind('touchstart.chosen', function(evt) { + _this.container_mousedown(evt); + return evt.preventDefault(); + }); + this.container.bind('touchend.chosen', function(evt) { + _this.container_mouseup(evt); + return evt.preventDefault(); + }); + this.container.bind('mousedown.chosen', function(evt) { + _this.container_mousedown(evt); + }); + this.container.bind('mouseup.chosen', function(evt) { + _this.container_mouseup(evt); + }); + this.container.bind('mouseenter.chosen', function(evt) { + _this.mouse_enter(evt); + }); + this.container.bind('mouseleave.chosen', function(evt) { + _this.mouse_leave(evt); + }); + this.search_results.bind('mouseup.chosen', function(evt) { + _this.search_results_mouseup(evt); + }); + this.search_results.bind('mouseover.chosen', function(evt) { + _this.search_results_mouseover(evt); + }); + this.search_results.bind('mouseout.chosen', function(evt) { + _this.search_results_mouseout(evt); + }); + this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) { + _this.search_results_mousewheel(evt); + }); + this.search_results.bind('touchstart.chosen', function(evt) { + _this.search_results_touchstart(evt); + }); + this.search_results.bind('touchmove.chosen', function(evt) { + _this.search_results_touchmove(evt); + }); + this.search_results.bind('touchend.chosen', function(evt) { + _this.search_results_touchend(evt); + }); + this.form_field_jq.bind("chosen:updated.chosen", function(evt) { + _this.results_update_field(evt); + }); + this.form_field_jq.bind("chosen:activate.chosen", function(evt) { + _this.activate_field(evt); + }); + this.form_field_jq.bind("chosen:open.chosen", function(evt) { + _this.container_mousedown(evt); + }); + this.form_field_jq.bind("chosen:close.chosen", function(evt) { + _this.input_blur(evt); + }); + this.search_field.bind('blur.chosen', function(evt) { + _this.input_blur(evt); + }); + this.search_field.bind('keyup.chosen', function(evt) { + _this.keyup_checker(evt); + }); + this.search_field.bind('keydown.chosen', function(evt) { + _this.keydown_checker(evt); + }); + this.search_field.bind('focus.chosen', function(evt) { + _this.input_focus(evt); + }); + this.search_field.bind('cut.chosen', function(evt) { + _this.clipboard_event_checker(evt); + }); + this.search_field.bind('paste.chosen', function(evt) { + _this.clipboard_event_checker(evt); + }); + if (this.is_multiple) { + return this.search_choices.bind('click.chosen', function(evt) { + _this.choices_click(evt); + }); + } else { + return this.container.bind('click.chosen', function(evt) { + evt.preventDefault(); + }); + } + }; + + Chosen.prototype.destroy = function() { + $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); + if (this.search_field[0].tabIndex) { + this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; + } + this.container.remove(); + this.form_field_jq.removeData('chosen'); + return this.form_field_jq.show(); + }; + + Chosen.prototype.search_field_disabled = function() { + this.is_disabled = this.form_field_jq[0].disabled; + if (this.is_disabled) { + this.container.addClass('chosen-disabled'); + this.search_field[0].disabled = true; + if (!this.is_multiple) { + this.selected_item.unbind("focus.chosen", this.activate_action); + } + return this.close_field(); + } else { + this.container.removeClass('chosen-disabled'); + this.search_field[0].disabled = false; + if (!this.is_multiple) { + return this.selected_item.bind("focus.chosen", this.activate_action); + } + } + }; + + Chosen.prototype.container_mousedown = function(evt) { + if (!this.is_disabled) { + if (evt && evt.type === "mousedown" && !this.results_showing) { + evt.preventDefault(); + } + if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { + if (!this.active_field) { + if (this.is_multiple && this.search_field.val()==this.default_text) { + this.search_field.val(""); + } + $(this.container[0].ownerDocument).bind('click.chosen', this.click_test_action); + this.results_show(); + } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { + evt.preventDefault(); + this.results_toggle(); + } + return this.activate_field(); + } + } + }; + + Chosen.prototype.container_mouseup = function(evt) { + if (evt.target.nodeName === "ABBR" && !this.is_disabled) { + return this.results_reset(evt); + } + }; + + Chosen.prototype.search_results_mousewheel = function(evt) { + var delta; + if (evt.originalEvent) { + delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail; + } + if (delta != null) { + evt.preventDefault(); + if (evt.type === 'DOMMouseScroll') { + delta = delta * 40; + } + return this.search_results.scrollTop(delta + this.search_results.scrollTop()); + } + }; + + Chosen.prototype.blur_test = function(evt) { + if (!this.active_field && this.container.hasClass("chosen-container-active")) { + return this.close_field(); + } + }; + + Chosen.prototype.close_field = function() { + $(this.container[0].ownerDocument).unbind("click.chosen", this.click_test_action); + this.active_field = false; + this.results_hide(); + this.container.removeClass("chosen-container-active"); + this.clear_backstroke(); + this.show_search_field_default(); + return this.search_field_scale(); + }; + + Chosen.prototype.activate_field = function() { + this.container.addClass("chosen-container-active"); + this.active_field = true; + this.search_field.val(this.search_field.val()); + return this.search_field.focus(); + }; + + Chosen.prototype.test_active_click = function(evt) { + var active_container; + active_container = $(evt.target).closest('.chosen-container'); + if (active_container.length && this.container[0] === active_container[0]) { + return this.active_field = true; + } else { + return this.close_field(); + } + }; + + Chosen.prototype.results_build = function() { + this.parsing = true; + this.selected_option_count = null; + this.results_data = SelectParser.select_to_array(this.form_field); + if (this.is_multiple) { + this.search_choices.find("li.search-choice").remove(); + } else if (!this.is_multiple) { + this.single_set_selected_text(); + if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { + this.search_field[0].readOnly = true; + this.container.addClass("chosen-container-single-nosearch"); + } else { + this.search_field[0].readOnly = false; + this.container.removeClass("chosen-container-single-nosearch"); + } + } + this.update_results_content(this.results_option_build({ + first: true + })); + this.search_field_disabled(); + this.show_search_field_default(); + this.search_field_scale(); + return this.parsing = false; + }; + + Chosen.prototype.result_do_highlight = function(el) { + var high_bottom, high_top, maxHeight, visible_bottom, visible_top; + if (el.length) { + this.result_clear_highlight(); + this.result_highlight = el; + this.result_highlight.addClass("highlighted"); + maxHeight = parseInt(this.search_results.css("maxHeight"), 10); + visible_top = this.search_results.scrollTop(); + visible_bottom = maxHeight + visible_top; + high_top = this.result_highlight.position().top + this.search_results.scrollTop(); + high_bottom = high_top + this.result_highlight.outerHeight(); + if (high_bottom >= visible_bottom) { + return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); + } else if (high_top < visible_top) { + return this.search_results.scrollTop(high_top); + } + } + }; + + Chosen.prototype.result_clear_highlight = function() { + if (this.result_highlight) { + this.result_highlight.removeClass("highlighted"); + } + return this.result_highlight = null; + }; + + Chosen.prototype.results_show = function() { + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + this.container.addClass("chosen-with-drop"); + this.results_showing = true; + this.search_field.focus(); + this.search_field.val(this.search_field.val()); + this.winnow_results(); + return this.form_field_jq.trigger("chosen:showing_dropdown", { + chosen: this + }); + }; + + Chosen.prototype.update_results_content = function(content) { + return this.search_results.html(content); + }; + + Chosen.prototype.results_hide = function() { + if (this.results_showing) { + this.result_clear_highlight(); + this.container.removeClass("chosen-with-drop"); + this.form_field_jq.trigger("chosen:hiding_dropdown", { + chosen: this + }); + } + return this.results_showing = false; + }; + + Chosen.prototype.set_tab_index = function(el) { + var ti; + if (this.form_field.tabIndex) { + ti = this.form_field.tabIndex; + this.form_field.tabIndex = -1; + return this.search_field[0].tabIndex = ti; + } + }; + + Chosen.prototype.set_label_behavior = function() { + var _this = this; + this.form_field_label = this.form_field_jq.parents("label"); + if (!this.form_field_label.length && this.form_field.id.length) { + this.form_field_label = $("label[for='" + this.form_field.id + "']"); + } + if (this.form_field_label.length > 0) { + return this.form_field_label.bind('click.chosen', function(evt) { + if (_this.is_multiple) { + return _this.container_mousedown(evt); + } else { + return _this.activate_field(); + } + }); + } + }; + + Chosen.prototype.show_search_field_default = function() { + if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { + if(this.search_field.val()=='') this.search_field.val(this.default_text); + return this.search_field.addClass("default"); + } else { + if(this.search_field.val()==this.default_text) this.search_field.val(""); + return this.search_field.removeClass("default"); + } + }; + + Chosen.prototype.search_results_mouseup = function(evt) { + var target; + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target.length) { + this.result_highlight = target; + this.result_select(evt); + return this.search_field.focus(); + } + //deselect + target = $(evt.target).hasClass("result-selected") ? $(evt.target) : $(evt.target).parents(".result-selected").first(); + if( target.length ){ + this.result_highlight = target; + var i=target[0].getAttribute("data-option-array-index"); + $('ul.chosen-choices a.search-choice-close[data-option-array-index='+i+']').parent('li').remove(); + evt.preventDefault(); + return this.result_deselect(i); + } + }; + + Chosen.prototype.search_results_mouseover = function(evt) { + var target; + target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); + if (target) { + return this.result_do_highlight(target); + } + }; + + Chosen.prototype.search_results_mouseout = function(evt) { + if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) { + return this.result_clear_highlight(); + } + }; + + Chosen.prototype.choice_build = function(item) { + var choice, close_link, + _this = this; + choice = $('
    • ', { + "class": "search-choice" + }).html("" + (this.choice_label(item)) + ""); + if (item.disabled) { + choice.addClass('search-choice-disabled'); + } else { + close_link = $('', { + "class": 'search-choice-close', + 'data-option-array-index': item.array_index + }); + close_link.bind('click.chosen', function(evt) { + return _this.choice_destroy_link_click(evt); + }); + choice.append(close_link); + } + return this.search_container.before(choice); + }; + + Chosen.prototype.choice_destroy_link_click = function(evt) { + evt.preventDefault(); + evt.stopPropagation(); + if (!this.is_disabled) { + return this.choice_destroy($(evt.target)); + } + }; + + Chosen.prototype.choice_destroy = function(link) { + if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { + this.show_search_field_default(); + if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) { + this.results_hide(); + } + link.parents('li').first().remove(); + return this.search_field_scale(); + } + }; + + Chosen.prototype.results_reset = function() { + this.reset_single_select_options(); + this.form_field.options[0].selected = true; + this.single_set_selected_text(); + this.show_search_field_default(); + this.results_reset_cleanup(); + this.form_field_jq.trigger("change"); + if (this.active_field) { + return this.results_hide(); + } + }; + + Chosen.prototype.results_reset_cleanup = function() { + this.current_selectedIndex = this.form_field.selectedIndex; + return this.selected_item.find("abbr").remove(); + }; + + Chosen.prototype.result_select = function(evt) { + var high, item; + if (this.result_highlight) { + high = this.result_highlight; + this.result_clear_highlight(); + if (this.is_multiple && this.max_selected_options <= this.choices_count()) { + this.form_field_jq.trigger("chosen:maxselected", { + chosen: this + }); + return false; + } + if (this.is_multiple) { + high.removeClass("active-result"); + } else { + this.reset_single_select_options(); + } + high.addClass("result-selected"); + item = this.results_data[high[0].getAttribute("data-option-array-index")]; + item.selected = true; + this.form_field.options[item.options_index].selected = true; + this.selected_option_count = null; + if (this.is_multiple) { + this.choice_build(item); + } else { + this.single_set_selected_text(this.choice_label(item)); + } + if (!this.is_multiple) { + this.results_hide(); + this.search_field.val(""); + } + if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { + this.form_field_jq.trigger("change", { + 'selected': this.form_field.options[item.options_index].value + }); + } + this.current_selectedIndex = this.form_field.selectedIndex; + evt.preventDefault(); + return this.search_field_scale(); + } + }; + + Chosen.prototype.single_set_selected_text = function(text) { + if (text == null) { + text = this.default_text; + } + if (text === this.default_text) { + this.selected_item.addClass("chosen-default"); + } else { + this.single_deselect_control_build(); + this.selected_item.removeClass("chosen-default"); + } + return this.selected_item.find("span").html(text); + }; + + Chosen.prototype.result_deselect = function(pos) { + var result_data; + result_data = this.results_data[pos]; + if (!this.form_field.options[result_data.options_index].disabled) { + result_data.selected = false; + this.form_field.options[result_data.options_index].selected = false; + this.selected_option_count = null; + this.result_clear_highlight(); + if (this.results_showing) { + this.winnow_results(); + } + this.form_field_jq.trigger("change", { + deselected: this.form_field.options[result_data.options_index].value + }); + this.search_field_scale(); + return true; + } else { + return false; + } + }; + + Chosen.prototype.single_deselect_control_build = function() { + if (!this.allow_single_deselect) { + return; + } + if (!this.selected_item.find("abbr").length) { + this.selected_item.find("span").first().after(""); + } + return this.selected_item.addClass("chosen-single-with-deselect"); + }; + + Chosen.prototype.get_search_text = function() { + return $('
      ').text($.trim(this.search_field.val())).html(); + }; + + Chosen.prototype.winnow_results_set_highlight = function() { + var do_high, selected_results; + selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; + do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); + if (do_high != null) { + return this.result_do_highlight(do_high); + } + }; + + Chosen.prototype.no_results = function(terms) { + var no_results_html; + no_results_html = $('
    • ' + this.results_none_found + ' ""
    • '); + no_results_html.find("span").first().html(terms); + this.search_results.append(no_results_html); + return this.form_field_jq.trigger("chosen:no_results", { + chosen: this + }); + }; + + Chosen.prototype.no_results_clear = function() { + return this.search_results.find(".no-results").remove(); + }; + + Chosen.prototype.keydown_arrow = function() { + var next_sib; + if (this.results_showing && this.result_highlight) { + next_sib = this.result_highlight.nextAll("li.active-result").first(); + if (next_sib) { + return this.result_do_highlight(next_sib); + } + } else { + return this.results_show(); + } + }; + + Chosen.prototype.keyup_arrow = function() { + var prev_sibs; + if (!this.results_showing && !this.is_multiple) { + return this.results_show(); + } else if (this.result_highlight) { + prev_sibs = this.result_highlight.prevAll("li.active-result"); + if (prev_sibs.length) { + return this.result_do_highlight(prev_sibs.first()); + } else { + if (this.choices_count() > 0) { + this.results_hide(); + } + return this.result_clear_highlight(); + } + } + }; + + Chosen.prototype.keydown_backstroke = function() { + var next_available_destroy; + if (this.pending_backstroke) { + this.choice_destroy(this.pending_backstroke.find("a").first()); + return this.clear_backstroke(); + } else { + next_available_destroy = this.search_container.siblings("li.search-choice").last(); + if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { + this.pending_backstroke = next_available_destroy; + if (this.single_backstroke_delete) { + return this.keydown_backstroke(); + } else { + return this.pending_backstroke.addClass("search-choice-focus"); + } + } + } + }; + + Chosen.prototype.clear_backstroke = function() { + if (this.pending_backstroke) { + this.pending_backstroke.removeClass("search-choice-focus"); + } + return this.pending_backstroke = null; + }; + + Chosen.prototype.keydown_checker = function(evt) { + var stroke, _ref1; + stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode; + this.search_field_scale(); + if (stroke !== 8 && this.pending_backstroke) { + this.clear_backstroke(); + } + switch (stroke) { + case 8: + this.backstroke_length = this.search_field.val().length; + break; + case 9: + if (this.results_showing && !this.is_multiple) { + this.result_select(evt); + } + this.mouse_on_container = false; + break; + case 13: + if (this.results_showing) { + evt.preventDefault(); + } + break; + case 32: + if (this.disable_search) { + evt.preventDefault(); + } + break; + case 38: + evt.preventDefault(); + this.keyup_arrow(); + break; + case 40: + evt.preventDefault(); + this.keydown_arrow(); + break; + } + }; + + Chosen.prototype.search_field_scale = function() { + var div, f_width, h, style, style_block, styles, w, _i, _len; + if (this.is_multiple) { + h = 0; + w = 0; + style_block = "position:absolute; left: -1000px; top: -1000px; display:none;"; + styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing']; + for (_i = 0, _len = styles.length; _i < _len; _i++) { + style = styles[_i]; + style_block += style + ":" + this.search_field.css(style) + ";"; + } + div = $('
      ', { + 'style': style_block + }); + div.text(this.search_field.val()); + $('body').append(div); + w = div.width() + 25; + div.remove(); + f_width = this.container.outerWidth(); + if (w > f_width - 10) { + w = f_width - 10; + } + return this.search_field.css({ + 'width': w + 'px' + }); + } + }; + + return Chosen; + + })(AbstractChosen); + +}).call(this); diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.css b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.css new file mode 100644 index 0000000..0588380 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.css @@ -0,0 +1,80 @@ +/*hide chosen items*/ +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + height: inherit; +} +.chosen-container-multi .chosen-choices li.search-choice { + display: none; +} + +/*allow deselect selected*/ +.chosen-container-multi .chosen-drop .result-selected { + color: #fff; + background-color: #4885e3; + cursor: pointer; + display: list-item; +} +.chosen-container-multi .chosen-choices li.search-field { + width: 100%; + white-space: inherit; +} +.chosen-container .chosen-results li.highlighted,li.selected-result{ + background-color:#2a62bc; + background-image: none; + color:#fff +} +.header-title .chosen-container ul {bottom: 0;} +.header-title .chosen-container ul li {float: inherit;} +/*select optgroup*/ +.chosen-container .chosen-results li.group-result {cursor: pointer;} + +/* number hint and clear button*/ +.chsn-hint, .chsn-clean { + color: #999; + display: inline; + float: right; + padding-top: 4px; +} +.chsn-clean { + font-size: 21px; + cursor: pointer; + font-weight: 700; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + padding-left: 10px; +} +.chsn-clean:hover { + color: #F00; +} + +/* pics */ +#pics { + text-align: center; +} +div.flickerfreescreen { + display: inline-block; + position: relative; + margin: 10px; + vertical-align: top; + width: 730px; + min-height: 400px; +} +div.flickerfreescreen:hover div.close-graph {display: block;} +div.close-graph { + display: none; + font-size: 21px; + cursor: pointer; + font-weight: 700; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif; + color: #ccc; + position: absolute; + right: 10px; + top: 0; + z-index: 10; +} +div.close-graph:after {content: '\00d7';} +div.close-graph:hover {color: #F00;} + +/*pager*/ +span.link.bold { + text-decoration: none; + cursor: default; +} \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.js new file mode 100644 index 0000000..a52b604 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/grapher/grapher.js @@ -0,0 +1,536 @@ +// zabbixGrapher +// https://github.com/sepich/zabbixGrapher + +jQuery(function() { + var options = { + url: '/api_jsonrpc.php', // zabbix API url + timeout: 5000, // to API in msec + ssid: getCookie('zbx_sessionid'), // key to API, get from current logged in user + pagelen: 24, // graphs per page + width: 600, // of graph + height: 200 // of graph + }, + itemgraphs=[], //array of items obj to draw + skipHistory=false, //do not save this draw to history (from navigation) + timeoutID, + $=jQuery; + console.log('starting'); + + //timeline init + window.flickerfreeScreenShadow.timeout = 30000 ; + window.flickerfreeScreenShadow.responsiveness = 10000; + var d=new Date(); + d.setFullYear(d.getFullYear() - 1); + timeControl.addObject("scrollbar", { + "period": 10800, + "starttime": cdumpts(d), + "isNow": 1 + }, + { + "id":'scrollbar', + "loadScroll":1, + "mainObject":1, + "periodFixed":'1', + "sliderMaximumTimePeriod":63072000 + }); + timeControl.processObjects(); + cookie.init(); + + //ZabbixApi wrapper + function ZabbixApi(method, params, success) { + $.ajax({ + contentType: 'application/json-rpc', + type: 'POST', + timeout: options.timeout, + url: options.url, + data: JSON.stringify({ + jsonrpc: '2.0', + method: method, + id: 0, + auth: options.ssid, + params: params, + }), + success: function(response, status) { + success(response, status); + } + }); + } + + //Hosts list + $("#hosts").chosen({search_contains: true}).change(function(e){ + console.log('hosts changed'); + updateHint(this); + //delay update while user is clicking (shift-click race) + window.clearTimeout(timeoutID); + timeoutID = window.setTimeout(function(){ + updateGraphs(); + updateItems(); + }, 1500); + }); + //fill in hosts list on start + ZabbixApi('hostgroup.get', { + monitored_hosts: 1, + sortfield: 'name', + selectHosts: ['name'], + output: ['name'] + }, + function(r){ + $.each(r.result, function(){ + var og = $(''); + $.each(this.hosts, function(){ + $(''); + $.each(items, function(i,v){ + $('
      '); + }); + $('li.search-field').click(function(){ + $(this).find('input').focus(); + }); + $('.chsn-clean').click(function(){ + var s=$(this).closest('.chosen-container').prev('select'); + s.find('option:selected').removeAttr('selected'); + s.trigger('chosen:updated'); + s.trigger('change'); + $(this).prev('input').val(''); + }); + function updateHint(o){ + if($(o).val() == null){ + $(o).next().find('.chsn-hint').html(''); + $(o).next().find('.chsn-clean').html(''); + } + else { + $(o).next().find('.chsn-hint').html( $(o).val().length + ' selected' ); + $(o).next().find('.chsn-clean').html('×'); + } + } + //Click optgroup to toggle all subitems + $(document).on('click', '.group-result', function() { + var unselected = $(this).nextUntil('.group-result').not('.result-selected'); + if(unselected.length) unselected.trigger('mouseup'); + else $(this).nextUntil('.group-result').each(function() { + $('a.search-choice-close[data-option-array-index="' + $(this).data('option-array-index') + '"]').trigger('click'); + }); + }); + + //Draw selected graphs (page) + function drawGraphs(page){ + //cleanup + $('#pics').empty(); + timeControl.objectList={}; + $.each(flickerfreeScreen.screens, function(){ + if(this.timeoutHandler!=null) clearTimeout(this.timeoutHandler); + }); + flickerfreeScreen.screens=[]; + ZBX_SBOX={}; + + //prepare graphs ids + graphs=[] + if($('#graphs').val()!=null) $.each( $('#graphs').val(), function(){ + graphs=graphs.concat(this.split(',')); + }); + var stime = cdumpts((timeControl.timeline._usertime-timeControl.timeline._period)*1000); + //prepage pager + if(graphs.length > options.pagelen){ + if(page==undefined) page=0; + pages=Math.floor(graphs.length/options.pagelen); + start = page * options.pagelen; + end = Math.min(start + options.pagelen, graphs.length); + var s=''; + for(var i=0; i<=pages; i++){ + s+=(i==page)? ''+(i+1)+'' : ''+(i+1)+''; + } + if(page>0) s='< Previous'+s; + if(page!=pages) s+='Next >'; + pager=$('
      ').append(s); + pager=$('
      ').append(pager); + pager.appendTo( $('#pics') ); + } + else { + start=0; + end=graphs.length; + } + //add itemgraphs + for (var i=0; i') + .append('
      ') + .append('
      ') + ); + timeControl.addObject(id, { + "period": timeControl.timeline._period, + "starttime": cdumpts(timeControl.timeline._starttime), + "usertime": cdumpts(timeControl.timeline._usertime), + "isNow": timeControl.timeline._isNow + }, + { + "containerid":"itemgraph_"+id, + "objDims":{ + "shiftYtop":35, + "yaxis":"0", + "graphtype":"0", + "graphHeight": options.height, + "shiftXleft": 65, + "shiftXright": 65, + "width": options.width + }, + "loadSBox":1, + "loadImage":1, + "periodFixed":"1", + "sliderMaximumTimePeriod": timeControl.timeline.maxperiod, + "src": 'chart.php?'+uri+'type='+itemgraphs[i].type+'&batch=1&width='+options.width+'&height='+options.height+'&period='+timeControl.timeline._period+'&stime='+stime + }); + window.flickerfreeScreen.add({ + "id": id, + "isFlickerfree":true, + "pageFile":'history.php', + "resourcetype":'17', + "mode":2, + "interval":'60', + "timeline":{ + "period": timeControl.timeline._period, + "stime": stime, + "isNow": timeControl.timeline._isNow + }, + "data":{"itemids":[itemgraphs[i].items],"action":'showgraph',"filter":'',"filterTask":null,"markColor":1} + }); + } + //add graphs + for (var i=start; i') + .append('') + .append('
      ') + ); + timeControl.addObject(id, + { + "period": timeControl.timeline._period, + "starttime": cdumpts(timeControl.timeline._starttime), + "usertime": cdumpts(timeControl.timeline._usertime), + "isNow": timeControl.timeline._isNow + }, + { + "containerid":"graph_container_"+id, + "objDims":{ + "shiftYtop":35, + "yaxis":"0", + "graphtype":"0", + "graphHeight": options.height, + "shiftXleft": 65, + "shiftXright": 65, + "width": options.width + }, + "loadSBox":1, + "loadImage":1, + "periodFixed":"1", + "sliderMaximumTimePeriod": timeControl.timeline.maxperiod, + "src": "chart2.php?graphid="+id+'&width='+options.width+'&height='+options.height+'&period='+timeControl.timeline._period+'&stime='+stime + }); + window.flickerfreeScreen.add({ + "id": id, + "isFlickerfree":true, + "pageFile":'screens.php', + "resourcetype":'0', + "mode":0, + // "timestamp":1450022637, + "interval":'60', + // "screenitemid":'336', + // "screenid":'34', + // "groupid":null, + // "hostid":0, + "timeline":{ + "period": timeControl.timeline._period, + "stime": stime, + // "stimeNow":'20161212070357', + // "starttime":'20131213080357', + // "usertime":'20151213080357', + "isNow": timeControl.timeline._isNow + }, + // "profileIdx":'web.screens', + // "profileIdx2":'34', + // "updateProfile":true, + "data":null + }); + }; + //pager at bottom + if(graphs.length > options.pagelen) { + pager.clone().appendTo( $('#pics') ); + $('div.paging-btn-container a').click(function(){ + drawGraphs( $(this).data('num') ); + }); + } + //attach close button event + $('.close-graph').click(function(e){ + removeGraph(this); + }); + //live update/select time period + timeControl.useTimeRefresh(60); + timeControl.processObjects(); + chkbxRange.init(); + //update url/history + if(skipHistory) skipHistory=false; + else{ + var state={hosts: $('#hosts').val(), itemgraphs: itemgraphs, graphs: graphs, page: page}; + history.pushState(state, '', makeUrl(state)); + } + } + + // Remove graph (id) + function removeGraph(o){ + var id=$(o).data('id'); + if($(o).prev('a[id^=graph_container_]').length){ + //deselect graph + if($('#hosts').val().length==1){ + $('#graphs option[value='+id+']').removeAttr('selected'); + $('#graphs').trigger('chosen:updated'); + $('#graphs').trigger('change'); + } + else{ + $('div#flickerfreescreen_'+id).remove(); + } + } + else{ + //remove itemgraph + for(var i=0; i diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher.php b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher.php new file mode 100644 index 0000000..0fdaee4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher.php @@ -0,0 +1,73 @@ +setTitle(_('Search Zabbix projects')) + ->setControls((new CList()) + ->addItem(get_icon('fullscreen', ['fullscreen' => getRequest('fullscreen')])) + ); +$widget->show(); +?> + + + + + +
      + + × + +
      +
      List of Zabbix projects is updated by
      + + +
      + +
      + +
      +
        +
      + +
      + Loading +
      + +
      +
      +
      Sorry, no results
      +

      + Help your future self by creating and adding + project to +

      +

      + Github Zabbix community repos +

      +
      +
      + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.jpg b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.jpg new file mode 100644 index 0000000..5f8a561 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.jpg differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.png new file mode 100644 index 0000000..43661a1 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/Monitoring-Artist-logo.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button.png new file mode 100644 index 0000000..77fd992 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button2.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button2.png new file mode 100644 index 0000000..378fff3 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/assets/donate-button2.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/search.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/search.js new file mode 100644 index 0000000..6da5f01 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/search.js @@ -0,0 +1,57 @@ +$jq(document).on('search:ready', function () { + if (location.hash.length) { + search($jq('.speedy-filter').val(location.hash.substr(1)).val().replace('_',' ')) + } else { + search() + } +}) + +function search (keyword) { + var keyword = typeof keyword === 'undefined' ? '' : keyword + $jq('.keyword').text(keyword) + keyword = keyword.trim() + + if (window.speedy_keyword !== keyword) { + window.speedy_keyword = keyword + if (keyword.length) { + $jq('.result').hide() + $jq('.result').each(function () { + if($jq(this).text().toLowerCase().indexOf(keyword.toLowerCase()) > -1) { + $jq(this).show() + } + }) + } else { + $jq('.result').show() + } + } + setRelatedDOMVisibility(keyword) +} + +function setRelatedDOMVisibility (keyword) { + var foundSomething = Boolean($jq('.result:visible').length) + $jq('.no-results').toggle( !foundSomething ) + + if (keyword.length >= 3) { + if (!foundSomething) { + ga('send', 'event', 'search', 'no results for ' + keyword) + } else { + ga('send', 'event', 'search', keyword) + } + } +} + +$jq(document).on('search keyup', '.speedy-filter', function () { + location.hash = $jq(this).val().replace(' ', '_') +}) + +$jq(document).on('click', '.speedy-remover', function () { + $jq('.speedy-filter').val('') + $jq('.result').show() + location.hash = '' +}) + +window.onhashchange = function () { + search($jq('.speedy-filter').val(location.hash.substr(1)).val().replace('_',' ')) + $jq('[href^="#"]').removeClass('active') + $jq("[href='#{location.hash}']").addClass('active') +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/stuff.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/stuff.js new file mode 100644 index 0000000..575bd51 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/javascripts/stuff.js @@ -0,0 +1,96 @@ +$jq(document).on('search:ready', function () { + $jq(".input-search").focus() + $jq(".loading").remove() +}) + +function focusOnSearch (e) { + var searchField = $jq('.input-search')[0] + if (e.keyCode == 191 && !searchField.length) { + searchField.focus() + var t = searchField.get(0) + if (t.value.length) { + t.selectionStart = 0 + t.selectionEnd = t.value.length + } + return false + } +} + +var counter = 1 +$jq.getJSON('https://monitoringartist.github.io/zabbix-searcher/sources/github-community-repos.json', function (projects) { + var container = $jq('.container') + Object.keys(projects).forEach( function (key) { + var project = projects[key] + var charHTML + charHTML = "" + container.append("
    • " + + charHTML + "" + project["keywords"] + "
    • ") + counter++ + }) + $jq(document).trigger('source-github:ready') + $jq(document).trigger('search:ready') +}) +/* +$jq(document).on('source-github:ready', function () { + $jq.getJSON('//monitoringartist.github.io/zabbix-searcher/sources/share-zabbix.json', function (projects) { + var container = $jq('.container') + Object.keys(projects).forEach( function (key) { + var project = projects[key] + var charHTML + charHTML = "" + container.append("
    • " + + charHTML + "" + project["keywords"] + "
    • ") + counter++ + }) + $jq(document).trigger('source-share:ready') + }) +}) +$jq(document).on('source-share:ready', function () { + $jq.getJSON('//monitoringartist.github.io/zabbix-searcher/sources/zabbix-wiki.json', function (projects) { + var container = $jq('.container') + Object.keys(projects).forEach( function (key) { + var project = projects[key] + var charHTML + charHTML = "" + container.append("
    • " + + charHTML + "" + project["keywords"] + "
    • ") + counter++ + }) + $jq(document).trigger('source-zabbix:ready') + }) +}) +$jq(document).on('source-zabbix:ready', function () { + $jq.getJSON('//monitoringartist.github.io/zabbix-searcher/sources/zabbix-com.json', function (projects) { + var container = $jq('.container') + Object.keys(projects).forEach( function (key) { + var project = projects[key] + var charHTML + charHTML = "" + container.append("
    • " + + charHTML + "" + project["keywords"] + "
    • ") + counter++ + }) + $jq(document).trigger('search:ready') + }) +}) +*/ + +$jq(document).keydown(function (e) { focusOnSearch(e) }) + +$jq(document).on('keydown', '.emoji-wrapper input', function (e) { + $jq(".input-search").blur() + focusOnSearch(e) +}) + +$jq(document).on('click', '.js-clear-search, .mojigroup.active', function () { + location.hash = "" + return false +}) + +$jq(document).on('click', '.js-contribute', function () { + ga('send', 'event', 'contribute', 'click') +}) diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/stylesheets/style.css b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/stylesheets/style.css new file mode 100644 index 0000000..55ef399 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/searcher/stylesheets/style.css @@ -0,0 +1,292 @@ +form { + margin: 0; } + +.pull-right { + float: right; } + +.container, section, header, footer { + width: 100%; + margin: 0 auto; + padding: 0; +} + +header { + position: relative; + line-height: 1; + padding: 0; + *zoom: 1; } + header:before, header:after { + content: " "; + display: table; } + header:after { + clear: both; } + +section { + border: 1px solid #dfe4e7; + background-color: #fff; + padding: 10px; + *zoom: 1; + overflow: hidden; } + section:before, section:after { + content: " "; + display: table; } + section:after { + clear: both; } + +.loading { + background-color: #fff; + padding: 100px 0 120px; + text-align: center; + text-transform: uppercase; + color: #999; + letter-spacing: 2px; + font-weight: bold; } + .loading + .no-results { + display: none; } + +.mojigroup.button { + margin: 0 0 10px 5px; + padding: 3px 4px 1px; } + .mojigroup.button.active { + background-color: #f9f9f9; + border-color: #58b2ee; } + +ul.container a { + text-decoration: none; + cursor: pointer; + color: #0275b8; } + ul.container a:link { + -webkit-transition: color 0.2s ease-out; + -moz-transition: color 0.2s ease-out; + transition: color 0.2s ease-out; } + ul.container a img { + width: 16px; + height: 16px; } + +input:invalid { + visibility: hidden; } + +ul { + text-align: left; + padding: 0; + margin: 0; } + +.plain { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + width: 100%; + appearance: none; + border: 0; + box-shadow: none; + background-color: transparent; } + .plain:focus { + box-shadow: none; + outline: none; } + +.emoji-group { + display: block; + width: 100%; + font-weight: bold; + font-size: 20px; + padding: 10px 0; } + +.emojis-container { + font-size: 0; + line-height: 0; } + +.emoji-wrapper { + display: inline-block; + vertical-align: middle; + zoom: 1; + *display: inline; + *vertical-align: auto; + width: 49%; + margin-left: 3px; + margin-right: 3px; + height: 1.4em; + overflow: hidden; + white-space: nowrap; } + .emoji-wrapper .keywords { + font-size: 0; } + .emoji-wrapper .emoji, + .emoji-wrapper .native-emoji { + position: absolute; + margin-top: -3px; } + .emoji-wrapper input { + margin-left: 5px; } + .emoji-wrapper i.fa { + text-align: center; + width: 1.1em; } + .emoji-wrapper a:hover i.fa { + color: #013e62; } + .emoji-wrapper a { + width: 100%; + display: block; } + .emoji-wrapper a:hover, .emoji-wrapper a:focus{ + text-decoration: underline; + color: #013e62; } + +ul.hide-text .emoji-wrapper { + width: 30px; + height: 40px; } +ul.hide-text input { + display: none; } + +ul, li { + list-style-type: none; } + +.button { + line-height: 5px; + padding: 10px 12px 9px; + margin-left: 5px; + display: inline-block; + vertical-align: baseline; + zoom: 1; + height: 4px; + *display: inline; + *vertical-align: auto; + vertical-align: top; + border-radius: 25px; + font-size: 9px; + color: rgba(255, 255, 255, 0.75); + background-color: #013E62; + text-transform: uppercase; + font-weight: bold; } + .button:hover { + color: white; } + .button.clear-search { + color: #ee9d9d; } + .button.clear-search:hover { + border-color: #ee9d9d; } + +.input-search { + min-height: 32px; + padding: 7px 15px; + outline: none; + color: #333; + background-repeat: no-repeat; + background-position: right center; + border: 1px solid #ddd; + margin: 0; + width: 150px; + border-radius: 15px; + -webkit-transition: all 0.2s ease-in; + -moz-transition: all 0.2s ease-in; + transition: all 0.2s ease-in; + -webkit-appearance: textfield; + -moz-appearance: textfield; + -ms-appearance: textfield; + -o-appearance: textfield; + appearance: textfield; } + .input-search:focus { + border-color: #51a7e8; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.075), 0 0 5px rgba(81, 167, 232, 0.5); } + .input-search::-webkit-search-cancel-button, .input-search::-webkit-search-decoration { + -webkit-appearance: none; } + +.alert { + font-size: 13px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + display: none; + position: fixed; + margin: auto; + left: 50%; + width: 200px; + margin-left: -100px; + top: 10px; + background: rgba(10, 50, 90, 0.7); + color: #fff; + font-weight: bold; + padding: 7px; + text-align: center; + border-radius: 5px; } + +.native-emoji, +.emoji { + display: inline-block; + vertical-align: baseline; + zoom: 1; + *display: inline; + *vertical-align: auto; + cursor: pointer; } + +.native-emoji { + font-size: 19px; + padding: 10px 2px; + font-family: AppleColorEmoji; } + +.emoji { + text-indent: -9999px; + overflow: hidden; + -webkit-transform: scale(0.8); + -moz-transform: scale(0.8); + -ms-transform: scale(0.8); + -o-transform: scale(0.8); + transform: scale(0.8); } + +.no-results { + padding: 50px 30px; + text-align: center; + border-radius: 3px; } + +.call { + font-size: 16px; + margin: 1em 0 1em; } + +.call a:link { + color: #ebeef0 !important;} + +.no-results-text { + font-weight: bold; + color: #555; + border-bottom: 1px solid #aaa; + display: inline-block; + padding-bottom: 2px; + text-transform: uppercase; } + +.contribute-button { + background-color: #013E62; + color: #fff; } + +.tips { + color: #777; } + +.fright { + float: right; + vertical-align: middle; + font-weight: bold; } +.tfright { + padding-top: 10px; + float:left; } +.tfright a:link, .tfright a:hover { + color: transparent !important;} + +@media (min-width: 1010px) { + .emoji-wrapper { + width: 32%; } +} +@media (max-width: 685px) { + .input-search { + width: 65%; } + + .no-results { + padding: 0; } + + input { + font-size: 14px; } + + ul { + padding: 0; } + + .emoji-wrapper { + padding: 0; + width: 100%; } + + .fright { + display: none; + } } +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/updatechecker/updatechecker.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/updatechecker/updatechecker.js new file mode 100644 index 0000000..701469c --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/updatechecker/updatechecker.js @@ -0,0 +1,67 @@ +var xxlUpdateCheck = "xxl_updatechecker"; +var xxlCurrentVersion = ""; +var xxlUpdateUrl = 'https://raw.githubusercontent.com/monitoringartist/dockbix-xxl/master/latest'; + +// check version once per day +function updateCheck() { + var cookieChk = getCookie(xxlUpdateCheck); + if (cookieChk == undefined) { + var jqxhr = jQuery.getJSON(xxlUpdateUrl, function(data) { + if (xxlCurrentVersion != data.version && data.display == 1) { + setCookie(xxlUpdateCheck, data.text, 1); + console.log(data.text); + displayInfo(); + } else { + // version match - off for a day + setCookie(xxlUpdateCheck, "off", 1); + } + }) + .fail(function() { + // unsucesfull json request - off for a day + setCookie(xxlUpdateCheck, "off", 1); + }); + } + if (cookieChk != undefined && cookieChk != "off") { + displayInfo(); + } +} +// display info about new available update +function displayInfo() { + var cookieChk = getCookie(xxlUpdateCheck); + if (cookieChk != undefined && cookieChk != "off") { + var message = '
      '; + message = message + cookieChk; + message = message + '

      Close

      '; + message = message + "
      "; + jQuery('div[role="navigation"]').append(message); + } + return true; +} +// disable update checker for 7 days +function closeInfo() { + jQuery("#info").hide('slow'); + setCookie(xxlUpdateCheck, "off", 7); +} + +function setCookie(c_name, value, exdays) { + var exdate = new Date(); + exdate.setDate(exdate.getDate() + exdays); + var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString() + "; path=/"); + document.cookie = c_name + "=" + c_value; +} + +function getCookie(c_name) { + var i, x, y, ARRcookies = document.cookie.split(";"); + for (i = 0; i < ARRcookies.length; i++) { + x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("=")); + y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1); + x = x.replace(/^\s+|\s+$/g, ""); + if (x == c_name) { + return unescape(y); + } + } +} + +jQuery(document).ready(function() { + updateCheck(); +}); diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix.php b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix.php new file mode 100644 index 0000000..c7e3a64 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix.php @@ -0,0 +1,212 @@ +setTitle(_('Online API tool')) + ->setControls((new CList()) + ->addItem(get_icon('fullscreen', ['fullscreen' => getRequest('fullscreen')])) + ); +$widget->show(); + +?> + + + + + + + + + +
      + + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +
      + + + Doc + + +
      +
      + +
      +
      + + Check & format JSON + Compress JSON + +
      +
      +
      +
      +
      Request:
      +
      +
      +
      + Response: +
      +
      +
      +
      +

      +
      + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.ico b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.ico new file mode 100644 index 0000000..3e6bc50 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.ico differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.png new file mode 100644 index 0000000..9ed55ce Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/assets/favicon.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/LICENSE b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/LICENSE new file mode 100644 index 0000000..1ec0d70 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/LICENSE @@ -0,0 +1,13 @@ +Copyright 2012 Twitter, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/bootstrap.min.css b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/bootstrap.min.css new file mode 100644 index 0000000..49dff62 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/bootstrap/bootstrap.min.css @@ -0,0 +1,632 @@ +.bootstrap-iso article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +.bootstrap-iso audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +.bootstrap-iso audio:not([controls]){display:none;} +.bootstrap-iso html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +.bootstrap-iso a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.bootstrap-iso a:hover,a:active{outline:0;} +.bootstrap-iso sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +.bootstrap-iso sup{top:-0.5em;} +.bootstrap-iso sub{bottom:-0.25em;} +.bootstrap-iso img{max-width:100%;height:auto;border:0;-ms-interpolation-mode:bicubic;} +.bootstrap-iso button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +.bootstrap-iso button,input{*overflow:visible;line-height:normal;} +.bootstrap-iso button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +.bootstrap-iso button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;} +.bootstrap-iso input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;} +.bootstrap-iso input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +.bootstrap-iso textarea{overflow:auto;vertical-align:top;} +.bootstrap-iso .clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";} +.bootstrap-iso .clearfix:after{clear:both;} +.bootstrap-iso body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;color:#333333;background-color:#ffffff;} +.bootstrap-iso a{color:#0088cc;text-decoration:none;} +.bootstrap-iso a:hover{color:#005580;text-decoration:underline;} +.bootstrap-iso .row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";} +.bootstrap-iso .row:after{clear:both;} +.bootstrap-iso [class*="span"]{float:left;margin-left:20px;} +.bootstrap-iso .span1{width:60px;} +.bootstrap-iso .span2{width:140px;} +.bootstrap-iso .span3{width:220px;} +.bootstrap-iso .span4{width:300px;} +.bootstrap-iso .span5{width:380px;} +.bootstrap-iso .span6{width:460px;} +.bootstrap-iso .span7{width:540px;} +.bootstrap-iso .span8{width:620px;} +.bootstrap-iso .span9{width:700px;} +.bootstrap-iso .span10{width:780px;} +.bootstrap-iso .span11{width:860px;} +.bootstrap-iso .span12,.container{width:940px;} +.bootstrap-iso .offset1{margin-left:100px;} +.bootstrap-iso .offset2{margin-left:180px;} +.bootstrap-iso .offset3{margin-left:260px;} +.bootstrap-iso .offset4{margin-left:340px;} +.bootstrap-iso .offset5{margin-left:420px;} +.bootstrap-iso .offset6{margin-left:500px;} +.bootstrap-iso .offset7{margin-left:580px;} +.bootstrap-iso .offset8{margin-left:660px;} +.bootstrap-iso .offset9{margin-left:740px;} +.bootstrap-iso .offset10{margin-left:820px;} +.bootstrap-iso .offset11{margin-left:900px;} +.bootstrap-iso .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";} +.bootstrap-iso .row-fluid:after{clear:both;} +.bootstrap-iso .row-fluid>[class*="span"]{float:left;margin-left:2.127659574%;} +.bootstrap-iso .row-fluid>[class*="span"]:first-child{margin-left:0;} +.bootstrap-iso .row-fluid>.span1{width:6.382978723%;} +.bootstrap-iso .row-fluid>.span2{width:14.89361702%;} +.bootstrap-iso .row-fluid>.span3{width:23.404255317%;} +.bootstrap-iso .row-fluid>.span4{width:31.914893614%;} +.bootstrap-iso .row-fluid>.span5{width:40.425531911%;} +.bootstrap-iso .row-fluid>.span6{width:48.93617020799999%;} +.bootstrap-iso .row-fluid>.span7{width:57.446808505%;} +.bootstrap-iso .row-fluid>.span8{width:65.95744680199999%;} +.bootstrap-iso .row-fluid>.span9{width:74.468085099%;} +.bootstrap-iso .row-fluid>.span10{width:82.97872339599999%;} +.bootstrap-iso .row-fluid>.span11{width:91.489361693%;} +.bootstrap-iso .row-fluid>.span12{width:99.99999998999999%;} +.bootstrap-iso .container{width:940px;margin-left:auto;margin-right:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";} +.bootstrap-iso .container:after{clear:both;} +.bootstrap-iso .container-fluid{padding-left:20px;padding-right:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";} +.bootstrap-iso .container-fluid:after{clear:both;} +.bootstrap-iso p{margin:0 0 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:18px;}p small{font-size:11px;color:#999999;} +.bootstrap-iso .lead{margin-bottom:18px;font-size:20px;font-weight:200;line-height:27px;} +.bootstrap-iso h1,h2,h3,h4,h5,h6{margin:0;font-weight:bold;color:#333333;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;color:#999999;} +.bootstrap-iso h1{font-size:30px;line-height:36px;}h1 small{font-size:18px;} +.bootstrap-iso h2{font-size:24px;line-height:36px;}h2 small{font-size:18px;} +.bootstrap-iso h3{line-height:27px;font-size:18px;}h3 small{font-size:14px;} +.bootstrap-iso h4,h5,h6{line-height:18px;} +.bootstrap-iso h4{font-size:14px;}h4 small{font-size:12px;} +.bootstrap-iso h5{font-size:12px;} +.bootstrap-iso h6{font-size:11px;color:#999999;text-transform:uppercase;} +.bootstrap-iso .page-header{padding-bottom:17px;margin:18px 0;border-bottom:1px solid #eeeeee;} +.bootstrap-iso .page-header h1{line-height:1;} +.bootstrap-iso ul,ol{padding:0;margin:0 0 9px 25px;} +.bootstrap-iso ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +.bootstrap-iso ul{list-style:disc;} +.bootstrap-iso ol{list-style:decimal;} +.bootstrap-iso li{line-height:18px;} +.bootstrap-iso ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} +.bootstrap-iso dl{margin-bottom:18px;} +.bootstrap-iso dt,dd{line-height:18px;} +.bootstrap-iso dt{font-weight:bold;} +.bootstrap-iso dd{margin-left:9px;} +.bootstrap-iso hr{margin:18px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} +.bootstrap-iso strong{font-weight:bold;} +.bootstrap-iso em{font-style:italic;} +.bootstrap-iso .muted{color:#999999;} +.bootstrap-iso abbr{font-size:90%;text-transform:uppercase;border-bottom:1px dotted #ddd;cursor:help;} +.bootstrap-iso blockquote{padding:0 0 0 15px;margin:0 0 18px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:22.5px;} +.bootstrap-iso blockquote small{display:block;line-height:18px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +.bootstrap-iso blockquote.pull-right{float:right;padding-left:0;padding-right:15px;border-left:0;border-right:5px solid #eeeeee;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +.bootstrap-iso q:before,q:after,blockquote:before,blockquote:after{content:"";} +.bootstrap-iso address{display:block;margin-bottom:18px;line-height:18px;font-style:normal;} +.bootstrap-iso small{font-size:100%;} +.bootstrap-iso cite{font-style:normal;} +.bootstrap-iso code,pre{padding:0 3px 2px;font-family:Menlo,Monaco,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.bootstrap-iso code{padding:3px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +.bootstrap-iso pre{display:block;padding:8.5px;margin:0 0 9px;font-size:12px;line-height:18px;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;white-space:pre;white-space:pre-wrap;word-break:break-all;word-wrap:break-word;}pre.prettyprint{margin-bottom:18px;} +.bootstrap-iso pre code{padding:0;color:inherit;background-color:transparent;border:0;} +.bootstrap-iso .pre-scrollable{max-height:340px;overflow-y:scroll;} +.bootstrap-iso form{margin:0 0 18px;} +.bootstrap-iso fieldset{padding:0;margin:0;border:0;} +.bootstrap-iso legend{display:block;width:100%;padding:0;margin-bottom:27px;font-size:19.5px;line-height:36px;color:#333333;border:0;border-bottom:1px solid #eee;}legend small{font-size:13.5px;color:#999999;} +.bootstrap-iso label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:18px;} +.bootstrap-iso input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +.bootstrap-iso label{display:block;margin-bottom:5px;color:#333333;} +.bootstrap-iso input,textarea,select,.uneditable-input{display:inline-block;width:210px;height:18px;padding:4px;margin-bottom:9px;font-size:13px;line-height:18px;color:#555555;border:1px solid #ccc;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.bootstrap-iso .uneditable-textarea{width:auto;height:auto;} +.bootstrap-iso label input,label textarea,label select{display:block;} +.bootstrap-iso input[type="image"],input[type="checkbox"],input[type="radio"]{width:auto;height:auto;padding:0;margin:3px 0;*margin-top:0;line-height:normal;cursor:pointer;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border:0 \9;} +.bootstrap-iso input[type="image"]{border:0;} +.bootstrap-iso input[type="file"]{width:auto;padding:initial;line-height:initial;border:initial;background-color:#ffffff;background-color:initial;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.bootstrap-iso input[type="button"],input[type="reset"],input[type="submit"]{width:auto;height:auto;} +.bootstrap-iso select,input[type="file"]{height:28px;*margin-top:4px;line-height:28px;} +.bootstrap-iso input[type="file"]{line-height:18px \9;} +.bootstrap-iso select{width:220px;background-color:#ffffff;} +.bootstrap-iso select[multiple],select[size]{height:auto;} +.bootstrap-iso input[type="image"]{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.bootstrap-iso textarea{height:auto;} +.bootstrap-iso input[type="hidden"]{display:none;} +.bootstrap-iso .radio,.checkbox{padding-left:18px;} +.bootstrap-iso .radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-18px;} +.bootstrap-iso .controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.bootstrap-iso .radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} +.bootstrap-iso .radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.bootstrap-iso input,textarea{-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear 0.2s,box-shadow linear 0.2s;-moz-transition:border linear 0.2s,box-shadow linear 0.2s;-ms-transition:border linear 0.2s,box-shadow linear 0.2s;-o-transition:border linear 0.2s,box-shadow linear 0.2s;transition:border linear 0.2s,box-shadow linear 0.2s;} +.bootstrap-iso input:focus,textarea:focus{border-color:rgba(82, 168, 236, 0.8);-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 8px rgba(82, 168, 236, 0.6);outline:0;outline:thin dotted \9;} +.bootstrap-iso input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus,select:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.bootstrap-iso .input-mini{width:60px;} +.bootstrap-iso .input-small{width:90px;} +.bootstrap-iso .input-medium{width:150px;} +.bootstrap-iso .input-large{width:210px;} +.bootstrap-iso .input-xlarge{width:270px;} +.bootstrap-iso .input-xxlarge{width:530px;} +.bootstrap-iso input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{float:none;margin-left:0;} +.bootstrap-iso input.span1,textarea.span1,.uneditable-input.span1{width:50px;} +.bootstrap-iso input.span2,textarea.span2,.uneditable-input.span2{width:130px;} +.bootstrap-iso input.span3,textarea.span3,.uneditable-input.span3{width:210px;} +.bootstrap-iso input.span4,textarea.span4,.uneditable-input.span4{width:290px;} +.bootstrap-iso input.span5,textarea.span5,.uneditable-input.span5{width:370px;} +.bootstrap-iso input.span6,textarea.span6,.uneditable-input.span6{width:450px;} +.bootstrap-iso input.span7,textarea.span7,.uneditable-input.span7{width:530px;} +.bootstrap-iso input.span8,textarea.span8,.uneditable-input.span8{width:610px;} +.bootstrap-iso input.span9,textarea.span9,.uneditable-input.span9{width:690px;} +.bootstrap-iso input.span10,textarea.span10,.uneditable-input.span10{width:770px;} +.bootstrap-iso input.span11,textarea.span11,.uneditable-input.span11{width:850px;} +.bootstrap-iso input.span12,textarea.span12,.uneditable-input.span12{width:930px;} +.bootstrap-iso input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{background-color:#f5f5f5;border-color:#ddd;cursor:not-allowed;} +.bootstrap-iso .control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.bootstrap-iso .control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;border-color:#c09853;}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:0 0 6px #dbc59e;-moz-box-shadow:0 0 6px #dbc59e;box-shadow:0 0 6px #dbc59e;} +.bootstrap-iso .control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.bootstrap-iso .control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.bootstrap-iso .control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;border-color:#b94a48;}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:0 0 6px #d59392;-moz-box-shadow:0 0 6px #d59392;box-shadow:0 0 6px #d59392;} +.bootstrap-iso .control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.bootstrap-iso .control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.bootstrap-iso .control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;border-color:#468847;}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:0 0 6px #7aba7b;-moz-box-shadow:0 0 6px #7aba7b;box-shadow:0 0 6px #7aba7b;} +.bootstrap-iso .control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +.bootstrap-iso input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.bootstrap-iso .form-actions{padding:17px 20px 18px;margin-top:18px;margin-bottom:18px;background-color:#f5f5f5;border-top:1px solid #ddd;} +.bootstrap-iso .uneditable-input{display:block;background-color:#ffffff;border-color:#eee;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +.bootstrap-iso :-moz-placeholder{color:#999999;} +.bootstrap-iso ::-webkit-input-placeholder{color:#999999;} +.bootstrap-iso .help-block{display:block;margin-top:5px;margin-bottom:0;color:#999999;} +.bootstrap-iso .help-inline{display:inline-block;*display:inline;*zoom:1;margin-bottom:9px;vertical-align:middle;padding-left:5px;} +.bootstrap-iso .input-prepend,.input-append{margin-bottom:5px;*zoom:1;}.input-prepend:before,.input-append:before,.input-prepend:after,.input-append:after{display:table;content:"";} +.bootstrap-iso .input-prepend:after,.input-append:after{clear:both;} +.bootstrap-iso .input-prepend input,.input-append input,.input-prepend .uneditable-input,.input-append .uneditable-input{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;}.input-prepend input:focus,.input-append input:focus,.input-prepend .uneditable-input:focus,.input-append .uneditable-input:focus{position:relative;z-index:2;} +.bootstrap-iso .input-prepend .uneditable-input,.input-append .uneditable-input{border-left-color:#ccc;} +.bootstrap-iso .input-prepend .add-on,.input-append .add-on{float:left;display:block;width:auto;min-width:16px;height:18px;margin-right:-1px;padding:4px 5px;font-weight:normal;line-height:18px;color:#999999;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#f5f5f5;border:1px solid #ccc;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.bootstrap-iso .input-prepend .active,.input-append .active{background-color:#a9dba9;border-color:#46a546;} +.bootstrap-iso .input-prepend .add-on{*margin-top:1px;} +.bootstrap-iso .input-append input,.input-append .uneditable-input{float:left;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.bootstrap-iso .input-append .uneditable-input{border-left-color:#eee;border-right-color:#ccc;} +.bootstrap-iso .input-append .add-on{margin-right:0;margin-left:-1px;-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.bootstrap-iso .input-append input:first-child{*margin-left:-160px;}.input-append input:first-child+.add-on{*margin-left:-21px;} +.bootstrap-iso .search-query{padding-left:14px;padding-right:14px;margin-bottom:0;-webkit-border-radius:14px;-moz-border-radius:14px;border-radius:14px;} +.bootstrap-iso .form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input{display:inline-block;margin-bottom:0;} +.bootstrap-iso .form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} +.bootstrap-iso .form-search label,.form-inline label,.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{display:inline-block;} +.bootstrap-iso .form-search .input-append .add-on,.form-inline .input-prepend .add-on,.form-search .input-append .add-on,.form-inline .input-prepend .add-on{vertical-align:middle;} +.bootstrap-iso .form-search .radio,.form-inline .radio,.form-search .checkbox,.form-inline .checkbox{margin-bottom:0;vertical-align:middle;} +.bootstrap-iso .control-group{margin-bottom:9px;} +.bootstrap-iso legend+.control-group{margin-top:18px;-webkit-margin-top-collapse:separate;} +.bootstrap-iso .form-horizontal .control-group{margin-bottom:18px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";} +.bootstrap-iso .form-horizontal .control-group:after{clear:both;} +.bootstrap-iso .form-horizontal .control-label{float:left;width:140px;padding-top:5px;text-align:right;} +.bootstrap-iso .form-horizontal .controls{margin-left:160px;} +.bootstrap-iso .form-horizontal .form-actions{padding-left:160px;} +.bootstrap-iso table{max-width:100%;border-collapse:collapse;border-spacing:0;} +.bootstrap-iso .table{width:100%;margin-bottom:18px;}.table th,.table td{padding:8px;line-height:18px;text-align:left;vertical-align:top;border-top:1px solid #ddd;} +.bootstrap-iso .table th{font-weight:bold;} +.bootstrap-iso .table thead th{vertical-align:bottom;} +.bootstrap-iso .table thead:first-child tr th,.table thead:first-child tr td{border-top:0;} +.bootstrap-iso .table tbody+tbody{border-top:2px solid #ddd;} +.bootstrap-iso .table-condensed th,.table-condensed td{padding:4px 5px;} +.bootstrap-iso .table-bordered{border:1px solid #ddd;border-collapse:separate;*border-collapse:collapsed;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th+th,.table-bordered td+td,.table-bordered th+td,.table-bordered td+th{border-left:1px solid #ddd;} +.bootstrap-iso .table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.bootstrap-iso .table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-radius:4px 0 0 0;-moz-border-radius:4px 0 0 0;border-radius:4px 0 0 0;} +.bootstrap-iso .table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-radius:0 4px 0 0;-moz-border-radius:0 4px 0 0;border-radius:0 4px 0 0;} +.bootstrap-iso .table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;} +.bootstrap-iso .table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child{-webkit-border-radius:0 0 4px 0;-moz-border-radius:0 0 4px 0;border-radius:0 0 4px 0;} +.bootstrap-iso .table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +.bootstrap-iso .table tbody tr:hover td,.table tbody tr:hover th{background-color:#f5f5f5;} +.bootstrap-iso table .span1{float:none;width:44px;margin-left:0;} +.bootstrap-iso table .span2{float:none;width:124px;margin-left:0;} +.bootstrap-iso table .span3{float:none;width:204px;margin-left:0;} +.bootstrap-iso table .span4{float:none;width:284px;margin-left:0;} +.bootstrap-iso table .span5{float:none;width:364px;margin-left:0;} +.bootstrap-iso table .span6{float:none;width:444px;margin-left:0;} +.bootstrap-iso table .span7{float:none;width:524px;margin-left:0;} +.bootstrap-iso table .span8{float:none;width:604px;margin-left:0;} +.bootstrap-iso table .span9{float:none;width:684px;margin-left:0;} +.bootstrap-iso table .span10{float:none;width:764px;margin-left:0;} +.bootstrap-iso table .span11{float:none;width:844px;margin-left:0;} +.bootstrap-iso table .span12{float:none;width:924px;margin-left:0;} +.bootstrap-iso [class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;*margin-right:.3em;}[class^="icon-"]:last-child,[class*=" icon-"]:last-child{*margin-left:0;} +.bootstrap-iso .icon-white{background-image:url("../img/glyphicons-halflings-white.png");} +.bootstrap-iso .icon-glass{background-position:0 0;} +.bootstrap-iso .icon-music{background-position:-24px 0;} +.bootstrap-iso .icon-search{background-position:-48px 0;} +.bootstrap-iso .icon-envelope{background-position:-72px 0;} +.bootstrap-iso .icon-heart{background-position:-96px 0;} +.bootstrap-iso .icon-star{background-position:-120px 0;} +.bootstrap-iso .icon-star-empty{background-position:-144px 0;} +.bootstrap-iso .icon-user{background-position:-168px 0;} +.bootstrap-iso .icon-film{background-position:-192px 0;} +.bootstrap-iso .icon-th-large{background-position:-216px 0;} +.bootstrap-iso .icon-th{background-position:-240px 0;} +.bootstrap-iso .icon-th-list{background-position:-264px 0;} +.bootstrap-iso .icon-ok{background-position:-288px 0;} +.bootstrap-iso .icon-remove{background-position:-312px 0;} +.bootstrap-iso .icon-zoom-in{background-position:-336px 0;} +.bootstrap-iso .icon-zoom-out{background-position:-360px 0;} +.bootstrap-iso .icon-off{background-position:-384px 0;} +.bootstrap-iso .icon-signal{background-position:-408px 0;} +.bootstrap-iso .icon-cog{background-position:-432px 0;} +.bootstrap-iso .icon-trash{background-position:-456px 0;} +.bootstrap-iso .icon-home{background-position:0 -24px;} +.bootstrap-iso .icon-file{background-position:-24px -24px;} +.bootstrap-iso .icon-time{background-position:-48px -24px;} +.bootstrap-iso .icon-road{background-position:-72px -24px;} +.bootstrap-iso .icon-download-alt{background-position:-96px -24px;} +.bootstrap-iso .icon-download{background-position:-120px -24px;} +.bootstrap-iso .icon-upload{background-position:-144px -24px;} +.bootstrap-iso .icon-inbox{background-position:-168px -24px;} +.bootstrap-iso .icon-play-circle{background-position:-192px -24px;} +.bootstrap-iso .icon-repeat{background-position:-216px -24px;} +.bootstrap-iso .icon-refresh{background-position:-240px -24px;} +.bootstrap-iso .icon-list-alt{background-position:-264px -24px;} +.bootstrap-iso .icon-lock{background-position:-287px -24px;} +.bootstrap-iso .icon-flag{background-position:-312px -24px;} +.bootstrap-iso .icon-headphones{background-position:-336px -24px;} +.bootstrap-iso .icon-volume-off{background-position:-360px -24px;} +.bootstrap-iso .icon-volume-down{background-position:-384px -24px;} +.bootstrap-iso .icon-volume-up{background-position:-408px -24px;} +.bootstrap-iso .icon-qrcode{background-position:-432px -24px;} +.bootstrap-iso .icon-barcode{background-position:-456px -24px;} +.bootstrap-iso .icon-tag{background-position:0 -48px;} +.bootstrap-iso .icon-tags{background-position:-25px -48px;} +.bootstrap-iso .icon-book{background-position:-48px -48px;} +.bootstrap-iso .icon-bookmark{background-position:-72px -48px;} +.bootstrap-iso .icon-print{background-position:-96px -48px;} +.bootstrap-iso .icon-camera{background-position:-120px -48px;} +.bootstrap-iso .icon-font{background-position:-144px -48px;} +.bootstrap-iso .icon-bold{background-position:-167px -48px;} +.bootstrap-iso .icon-italic{background-position:-192px -48px;} +.bootstrap-iso .icon-text-height{background-position:-216px -48px;} +.bootstrap-iso .icon-text-width{background-position:-240px -48px;} +.bootstrap-iso .icon-align-left{background-position:-264px -48px;} +.bootstrap-iso .icon-align-center{background-position:-288px -48px;} +.bootstrap-iso .icon-align-right{background-position:-312px -48px;} +.bootstrap-iso .icon-align-justify{background-position:-336px -48px;} +.bootstrap-iso .icon-list{background-position:-360px -48px;} +.bootstrap-iso .icon-indent-left{background-position:-384px -48px;} +.bootstrap-iso .icon-indent-right{background-position:-408px -48px;} +.bootstrap-iso .icon-facetime-video{background-position:-432px -48px;} +.bootstrap-iso .icon-picture{background-position:-456px -48px;} +.bootstrap-iso .icon-pencil{background-position:0 -72px;} +.bootstrap-iso .icon-map-marker{background-position:-24px -72px;} +.bootstrap-iso .icon-adjust{background-position:-48px -72px;} +.bootstrap-iso .icon-tint{background-position:-72px -72px;} +.bootstrap-iso .icon-edit{background-position:-96px -72px;} +.bootstrap-iso .icon-share{background-position:-120px -72px;} +.bootstrap-iso .icon-check{background-position:-144px -72px;} +.bootstrap-iso .icon-move{background-position:-168px -72px;} +.bootstrap-iso .icon-step-backward{background-position:-192px -72px;} +.bootstrap-iso .icon-fast-backward{background-position:-216px -72px;} +.bootstrap-iso .icon-backward{background-position:-240px -72px;} +.bootstrap-iso .icon-play{background-position:-264px -72px;} +.bootstrap-iso .icon-pause{background-position:-288px -72px;} +.bootstrap-iso .icon-stop{background-position:-312px -72px;} +.bootstrap-iso .icon-forward{background-position:-336px -72px;} +.bootstrap-iso .icon-fast-forward{background-position:-360px -72px;} +.bootstrap-iso .icon-step-forward{background-position:-384px -72px;} +.bootstrap-iso .icon-eject{background-position:-408px -72px;} +.bootstrap-iso .icon-chevron-left{background-position:-432px -72px;} +.bootstrap-iso .icon-chevron-right{background-position:-456px -72px;} +.bootstrap-iso .icon-plus-sign{background-position:0 -96px;} +.bootstrap-iso .icon-minus-sign{background-position:-24px -96px;} +.bootstrap-iso .icon-remove-sign{background-position:-48px -96px;} +.bootstrap-iso .icon-ok-sign{background-position:-72px -96px;} +.bootstrap-iso .icon-question-sign{background-position:-96px -96px;} +.bootstrap-iso .icon-info-sign{background-position:-120px -96px;} +.bootstrap-iso .icon-screenshot{background-position:-144px -96px;} +.bootstrap-iso .icon-remove-circle{background-position:-168px -96px;} +.bootstrap-iso .icon-ok-circle{background-position:-192px -96px;} +.bootstrap-iso .icon-ban-circle{background-position:-216px -96px;} +.bootstrap-iso .icon-arrow-left{background-position:-240px -96px;} +.bootstrap-iso .icon-arrow-right{background-position:-264px -96px;} +.bootstrap-iso .icon-arrow-up{background-position:-289px -96px;} +.bootstrap-iso .icon-arrow-down{background-position:-312px -96px;} +.bootstrap-iso .icon-share-alt{background-position:-336px -96px;} +.bootstrap-iso .icon-resize-full{background-position:-360px -96px;} +.bootstrap-iso .icon-resize-small{background-position:-384px -96px;} +.bootstrap-iso .icon-plus{background-position:-408px -96px;} +.bootstrap-iso .icon-minus{background-position:-433px -96px;} +.bootstrap-iso .icon-asterisk{background-position:-456px -96px;} +.bootstrap-iso .icon-exclamation-sign{background-position:0 -120px;} +.bootstrap-iso .icon-gift{background-position:-24px -120px;} +.bootstrap-iso .icon-leaf{background-position:-48px -120px;} +.bootstrap-iso .icon-fire{background-position:-72px -120px;} +.bootstrap-iso .icon-eye-open{background-position:-96px -120px;} +.bootstrap-iso .icon-eye-close{background-position:-120px -120px;} +.bootstrap-iso .icon-warning-sign{background-position:-144px -120px;} +.bootstrap-iso .icon-plane{background-position:-168px -120px;} +.bootstrap-iso .icon-calendar{background-position:-192px -120px;} +.bootstrap-iso .icon-random{background-position:-216px -120px;} +.bootstrap-iso .icon-comment{background-position:-240px -120px;} +.bootstrap-iso .icon-magnet{background-position:-264px -120px;} +.bootstrap-iso .icon-chevron-up{background-position:-288px -120px;} +.bootstrap-iso .icon-chevron-down{background-position:-313px -119px;} +.bootstrap-iso .icon-retweet{background-position:-336px -120px;} +.bootstrap-iso .icon-shopping-cart{background-position:-360px -120px;} +.bootstrap-iso .icon-folder-close{background-position:-384px -120px;} +.bootstrap-iso .icon-folder-open{background-position:-408px -120px;} +.bootstrap-iso .icon-resize-vertical{background-position:-432px -119px;} +.bootstrap-iso .icon-resize-horizontal{background-position:-456px -118px;} +.bootstrap-iso .dropdown{position:relative;} +.bootstrap-iso .dropdown-toggle{*margin-bottom:-3px;} +.bootstrap-iso .dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.bootstrap-iso .caret{display:inline-block;width:0;height:0;text-indent:-99999px;*text-indent:0;vertical-align:top;border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid #000000;opacity:0.3;filter:alpha(opacity=30);content:"\2193";} +.bootstrap-iso .dropdown .caret{margin-top:8px;margin-left:2px;} +.bootstrap-iso .dropdown:hover .caret,.open.dropdown .caret{opacity:1;filter:alpha(opacity=100);} +.bootstrap-iso .dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;float:left;display:none;min-width:160px;_width:160px;padding:4px 0;margin:0;list-style:none;background-color:#ffffff;border-color:#ccc;border-color:rgba(0, 0, 0, 0.2);border-style:solid;border-width:1px;-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;*border-right-width:2px;*border-bottom-width:2px;}.dropdown-menu.bottom-up{top:auto;bottom:100%;margin-bottom:2px;} +.bootstrap-iso .dropdown-menu .divider{height:1px;margin:5px 1px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;*width:100%;*margin:-5px 0 5px;} +.bootstrap-iso .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:normal;line-height:18px;color:#555555;white-space:nowrap;} +.bootstrap-iso .dropdown-menu li>a:hover,.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#ffffff;text-decoration:none;background-color:#0088cc;} +.bootstrap-iso .dropdown.open{*z-index:1000;}.dropdown.open .dropdown-toggle{color:#ffffff;background:#ccc;background:rgba(0, 0, 0, 0.3);} +.bootstrap-iso .dropdown.open .dropdown-menu{display:block;} +.bootstrap-iso .typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #eee;border:1px solid rgba(0, 0, 0, 0.05);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.bootstrap-iso .fade{-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-ms-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;opacity:0;}.fade.in{opacity:1;} +.bootstrap-iso .collapse{-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-ms-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;position:relative;overflow:hidden;height:0;}.collapse.in{height:auto;} +.bootstrap-iso .close{float:right;font-size:20px;font-weight:bold;line-height:18px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;opacity:0.4;filter:alpha(opacity=40);cursor:pointer;} +.bootstrap-iso .btn{display:inline-block;padding:4px 10px 4px;margin-bottom:0;font-size:13px;line-height:18px;color:#333333;text-align:center;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);vertical-align:middle;background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-ms-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(top, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #ccc;border-bottom-color:#bbb;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);cursor:pointer;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);*margin-left:.3em;}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{background-color:#e6e6e6;} +.bootstrap-iso .btn:active,.btn.active{background-color:#cccccc \9;} +.bootstrap-iso .btn:first-child{*margin-left:0;} +.bootstrap-iso .btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-ms-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.bootstrap-iso .btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.bootstrap-iso .btn.active,.btn:active{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e6e6e6;background-color:#d9d9d9 \9;outline:0;} +.bootstrap-iso .btn.disabled,.btn[disabled]{cursor:default;background-image:none;background-color:#e6e6e6;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.bootstrap-iso .btn-large{padding:9px 14px;font-size:15px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.bootstrap-iso .btn-large [class^="icon-"]{margin-top:1px;} +.bootstrap-iso .btn-small{padding:5px 9px;font-size:11px;line-height:16px;} +.bootstrap-iso .btn-small [class^="icon-"]{margin-top:-1px;} +.bootstrap-iso .btn-mini{padding:2px 6px;font-size:11px;line-height:14px;} +.bootstrap-iso .btn-primary,.btn-primary:hover,.btn-warning,.btn-warning:hover,.btn-danger,.btn-danger:hover,.btn-success,.btn-success:hover,.btn-info,.btn-info:hover,.btn-inverse,.btn-inverse:hover{text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);color:#ffffff;} +.bootstrap-iso .btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-dark.active{color:rgba(255, 255, 255, 0.75);} +.bootstrap-iso .btn-primary{background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-ms-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(top, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{background-color:#0044cc;} +.bootstrap-iso .btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.bootstrap-iso .btn-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-ms-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(top, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{background-color:#f89406;} +.bootstrap-iso .btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.bootstrap-iso .btn-danger{background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-ms-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(top, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{background-color:#bd362f;} +.bootstrap-iso .btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.bootstrap-iso .btn-success{background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-ms-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(top, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{background-color:#51a351;} +.bootstrap-iso .btn-success:active,.btn-success.active{background-color:#408140 \9;} +.bootstrap-iso .btn-info{background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-ms-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(top, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{background-color:#2f96b4;} +.bootstrap-iso .btn-info:active,.btn-info.active{background-color:#24748c \9;} +.bootstrap-iso .btn-inverse{background-color:#393939;background-image:-moz-linear-gradient(top, #454545, #262626);background-image:-ms-linear-gradient(top, #454545, #262626);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#454545), to(#262626));background-image:-webkit-linear-gradient(top, #454545, #262626);background-image:-o-linear-gradient(top, #454545, #262626);background-image:linear-gradient(top, #454545, #262626);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#454545', endColorstr='#262626', GradientType=0);border-color:#262626 #262626 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{background-color:#262626;} +.bootstrap-iso .btn-inverse:active,.btn-inverse.active{background-color:#0c0c0c \9;} +.bootstrap-iso button.btn,input[type="submit"].btn{*padding-top:2px;*padding-bottom:2px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +.bootstrap-iso button.btn.large,input[type="submit"].btn.large{*padding-top:7px;*padding-bottom:7px;} +.bootstrap-iso button.btn.small,input[type="submit"].btn.small{*padding-top:3px;*padding-bottom:3px;} +.bootstrap-iso .btn-group{position:relative;*zoom:1;*margin-left:.3em;}.btn-group:before,.btn-group:after{display:table;content:"";} +.bootstrap-iso .btn-group:after{clear:both;} +.bootstrap-iso .btn-group:first-child{*margin-left:0;} +.bootstrap-iso .btn-group+.btn-group{margin-left:5px;} +.bootstrap-iso .btn-toolbar{margin-top:9px;margin-bottom:9px;}.btn-toolbar .btn-group{display:inline-block;*display:inline;*zoom:1;} +.bootstrap-iso .btn-group .btn{position:relative;float:left;margin-left:-1px;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.bootstrap-iso .btn-group .btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.bootstrap-iso .btn-group .btn:last-child,.btn-group .dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.bootstrap-iso .btn-group .btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.bootstrap-iso .btn-group .btn.large:last-child,.btn-group .large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.bootstrap-iso .btn-group .btn:hover,.btn-group .btn:focus,.btn-group .btn:active,.btn-group .btn.active{z-index:2;} +.bootstrap-iso .btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.bootstrap-iso .btn-group .dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 1px 0 0 rgba(255, 255, 255, 0.125),inset 0 1px 0 rgba(255, 255, 255, 0.2),0 1px 2px rgba(0, 0, 0, 0.05);*padding-top:5px;*padding-bottom:5px;} +.bootstrap-iso .btn-group.open{*z-index:1000;}.btn-group.open .dropdown-menu{display:block;margin-top:1px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.bootstrap-iso .btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 6px rgba(0, 0, 0, 0.15),0 1px 2px rgba(0, 0, 0, 0.05);} +.bootstrap-iso .btn .caret{margin-top:7px;margin-left:0;} +.bootstrap-iso .btn:hover .caret,.open.btn-group .caret{opacity:1;filter:alpha(opacity=100);} +.bootstrap-iso .btn-primary .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;opacity:0.75;filter:alpha(opacity=75);} +.bootstrap-iso .btn-small .caret{margin-top:4px;} +.bootstrap-iso .alert{padding:8px 35px 8px 14px;margin-bottom:18px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .alert,.alert-heading{color:#c09853;} +.bootstrap-iso .alert .close{position:relative;top:-2px;right:-21px;line-height:18px;} +.bootstrap-iso .alert-success{background-color:#dff0d8;border-color:#d6e9c6;} +.bootstrap-iso .alert-success,.alert-success .alert-heading{color:#468847;} +.bootstrap-iso .alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;} +.bootstrap-iso .alert-danger,.alert-error,.alert-danger .alert-heading,.alert-error .alert-heading{color:#b94a48;} +.bootstrap-iso .alert-info{background-color:#d9edf7;border-color:#bce8f1;} +.bootstrap-iso .alert-info,.alert-info .alert-heading{color:#3a87ad;} +.bootstrap-iso .alert-block{padding-top:14px;padding-bottom:14px;} +.bootstrap-iso .alert-block>p,.alert-block>ul{margin-bottom:0;} +.bootstrap-iso .alert-block p+p{margin-top:5px;} +.bootstrap-iso .nav{margin-left:0;margin-bottom:18px;list-style:none;} +.bootstrap-iso .nav>li>a{display:block;} +.bootstrap-iso .nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.bootstrap-iso .nav .nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:18px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} +.bootstrap-iso .nav li+.nav-header{margin-top:9px;} +.bootstrap-iso .nav-list{padding-left:14px;padding-right:14px;margin-bottom:0;} +.bootstrap-iso .nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.bootstrap-iso .nav-list>li>a{padding:3px 15px;} +.bootstrap-iso .nav-list .active>a,.nav-list .active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.bootstrap-iso .nav-list [class^="icon-"]{margin-right:2px;} +.bootstrap-iso .nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";} +.bootstrap-iso .nav-tabs:after,.nav-pills:after{clear:both;} +.bootstrap-iso .nav-tabs>li,.nav-pills>li{float:left;} +.bootstrap-iso .nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.bootstrap-iso .nav-tabs{border-bottom:1px solid #ddd;} +.bootstrap-iso .nav-tabs>li{margin-bottom:-1px;} +.bootstrap-iso .nav-tabs>li>a{padding-top:9px;padding-bottom:9px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.bootstrap-iso .nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.bootstrap-iso .nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.bootstrap-iso .nav-pills .active>a,.nav-pills .active>a:hover{color:#ffffff;background-color:#0088cc;} +.bootstrap-iso .nav-stacked>li{float:none;} +.bootstrap-iso .nav-stacked>li>a{margin-right:0;} +.bootstrap-iso .nav-tabs.nav-stacked{border-bottom:0;} +.bootstrap-iso .nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.bootstrap-iso .nav-tabs.nav-stacked>li:first-child>a{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.bootstrap-iso .nav-tabs.nav-stacked>li:last-child>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.bootstrap-iso .nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.bootstrap-iso .nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.bootstrap-iso .nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.bootstrap-iso .nav-tabs .dropdown-menu,.nav-pills .dropdown-menu{margin-top:1px;border-width:1px;} +.bootstrap-iso .nav-pills .dropdown-menu{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .nav-tabs .dropdown-toggle .caret,.nav-pills .dropdown-toggle .caret{border-top-color:#0088cc;margin-top:6px;} +.bootstrap-iso .nav-tabs .dropdown-toggle:hover .caret,.nav-pills .dropdown-toggle:hover .caret{border-top-color:#005580;} +.bootstrap-iso .nav-tabs .active .dropdown-toggle .caret,.nav-pills .active .dropdown-toggle .caret{border-top-color:#333333;} +.bootstrap-iso .nav>.dropdown.active>a:hover{color:#000000;cursor:pointer;} +.bootstrap-iso .nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.bootstrap-iso .nav .open .caret,.nav .open.active .caret,.nav .open a:hover .caret{border-top-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.bootstrap-iso .tabs-stacked .open>a:hover{border-color:#999999;} +.bootstrap-iso .tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";} +.bootstrap-iso .tabbable:after{clear:both;} +.bootstrap-iso .tab-content{overflow:hidden;} +.bootstrap-iso .tabs-below .nav-tabs,.tabs-right .nav-tabs,.tabs-left .nav-tabs{border-bottom:0;} +.bootstrap-iso .tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.bootstrap-iso .tab-content>.active,.pill-content>.active{display:block;} +.bootstrap-iso .tabs-below .nav-tabs{border-top:1px solid #ddd;} +.bootstrap-iso .tabs-below .nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.bootstrap-iso .tabs-below .nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below .nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.bootstrap-iso .tabs-below .nav-tabs .active>a,.tabs-below .nav-tabs .active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.bootstrap-iso .tabs-left .nav-tabs>li,.tabs-right .nav-tabs>li{float:none;} +.bootstrap-iso .tabs-left .nav-tabs>li>a,.tabs-right .nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.bootstrap-iso .tabs-left .nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.bootstrap-iso .tabs-left .nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.bootstrap-iso .tabs-left .nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.bootstrap-iso .tabs-left .nav-tabs .active>a,.tabs-left .nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.bootstrap-iso .tabs-right .nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.bootstrap-iso .tabs-right .nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.bootstrap-iso .tabs-right .nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.bootstrap-iso .tabs-right .nav-tabs .active>a,.tabs-right .nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.bootstrap-iso .navbar{overflow:visible;margin-bottom:18px;} +.bootstrap-iso .navbar-inner{padding-left:20px;padding-right:20px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.25),inset 0 -1px 0 rgba(0, 0, 0, 0.1);} +.bootstrap-iso .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;background-color:#2c2c2c;background-image:-moz-linear-gradient(top, #333333, #222222);background-image:-ms-linear-gradient(top, #333333, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));background-image:-webkit-linear-gradient(top, #333333, #222222);background-image:-o-linear-gradient(top, #333333, #222222);background-image:linear-gradient(top, #333333, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.1),0 1px 0 rgba(255, 255, 255, 0.075);}.btn-navbar:hover,.btn-navbar:active,.btn-navbar.active,.btn-navbar.disabled,.btn-navbar[disabled]{background-color:#222222;} +.bootstrap-iso .btn-navbar:active,.btn-navbar.active{background-color:#080808 \9;} +.bootstrap-iso .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.bootstrap-iso .btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.bootstrap-iso .nav-collapse.collapse{height:auto;} +.bootstrap-iso .navbar .brand:hover{text-decoration:none;} +.bootstrap-iso .navbar .brand{float:left;display:block;padding:8px 20px 12px;margin-left:-20px;font-size:20px;font-weight:200;line-height:1;color:#ffffff;} +.bootstrap-iso .navbar .navbar-text{margin-bottom:0;line-height:40px;color:#999999;}.navbar .navbar-text a:hover{color:#ffffff;background-color:transparent;} +.bootstrap-iso .navbar .btn,.navbar .btn-group{margin-top:5px;} +.bootstrap-iso .navbar .btn-group .btn{margin-top:0;} +.bootstrap-iso .navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";} +.bootstrap-iso .navbar-form:after{clear:both;} +.bootstrap-iso .navbar-form input,.navbar-form select{display:inline-block;margin-top:5px;margin-bottom:0;} +.bootstrap-iso .navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.bootstrap-iso .navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.bootstrap-iso .navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} +.bootstrap-iso .navbar-search{position:relative;float:left;margin-top:6px;margin-bottom:0;}.navbar-search .search-query{padding:4px 9px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;color:#ffffff;color:rgba(255, 255, 255, 0.75);background:#666;background:rgba(255, 255, 255, 0.3);border:1px solid #111;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1),0 1px 0px rgba(255, 255, 255, 0.15);-webkit-transition:none;-moz-transition:none;-ms-transition:none;-o-transition:none;transition:none;}.navbar-search .search-query :-moz-placeholder{color:#eeeeee;} +.bootstrap-iso .navbar-search .search-query::-webkit-input-placeholder{color:#eeeeee;} +.bootstrap-iso .navbar-search .search-query:hover{color:#ffffff;background-color:#999999;background-color:rgba(255, 255, 255, 0.5);} +.bootstrap-iso .navbar-search .search-query:focus,.navbar-search .search-query.focused{padding:5px 10px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.bootstrap-iso .navbar-fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030;} +.bootstrap-iso .navbar-fixed-top .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.bootstrap-iso .navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.bootstrap-iso .navbar .nav.pull-right{float:right;} +.bootstrap-iso .navbar .nav>li{display:block;float:left;} +.bootstrap-iso .navbar .nav>li>a{float:none;padding:10px 10px 11px;line-height:19px;color:#999999;text-decoration:none;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);} +.bootstrap-iso .navbar .nav>li>a:hover{background-color:transparent;color:#ffffff;text-decoration:none;} +.bootstrap-iso .navbar .nav .active>a,.navbar .nav .active>a:hover{color:#ffffff;text-decoration:none;background-color:#222222;} +.bootstrap-iso .navbar .divider-vertical{height:40px;width:1px;margin:0 9px;overflow:hidden;background-color:#222222;border-right:1px solid #333333;} +.bootstrap-iso .navbar .nav.pull-right{margin-left:10px;margin-right:0;} +.bootstrap-iso .navbar .dropdown-menu{margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.navbar .dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.bootstrap-iso .navbar .dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.bootstrap-iso .navbar .nav .dropdown-toggle .caret,.navbar .nav .open.dropdown .caret{border-top-color:#ffffff;} +.bootstrap-iso .navbar .nav .active .caret{opacity:1;filter:alpha(opacity=100);} +.bootstrap-iso .navbar .nav .open>.dropdown-toggle,.navbar .nav .active>.dropdown-toggle,.navbar .nav .open.active>.dropdown-toggle{background-color:transparent;} +.bootstrap-iso .navbar .nav .active>.dropdown-toggle:hover{color:#ffffff;} +.bootstrap-iso .navbar .nav.pull-right .dropdown-menu{left:auto;right:0;}.navbar .nav.pull-right .dropdown-menu:before{left:auto;right:12px;} +.bootstrap-iso .navbar .nav.pull-right .dropdown-menu:after{left:auto;right:13px;} +.bootstrap-iso .breadcrumb{padding:7px 14px;margin:0 0 18px;background-color:#fbfbfb;background-image:-moz-linear-gradient(top, #ffffff, #f5f5f5);background-image:-ms-linear-gradient(top, #ffffff, #f5f5f5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));background-image:-webkit-linear-gradient(top, #ffffff, #f5f5f5);background-image:-o-linear-gradient(top, #ffffff, #f5f5f5);background-image:linear-gradient(top, #ffffff, #f5f5f5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);border:1px solid #ddd;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;}.breadcrumb li{display:inline-block;text-shadow:0 1px 0 #ffffff;} +.bootstrap-iso .breadcrumb .divider{padding:0 5px;color:#999999;} +.bootstrap-iso .breadcrumb .active a{color:#333333;} +.bootstrap-iso .pagination{height:36px;margin:18px 0;} +.bootstrap-iso .pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.bootstrap-iso .pagination li{display:inline;} +.bootstrap-iso .pagination a{float:left;padding:0 14px;line-height:34px;text-decoration:none;border:1px solid #ddd;border-left-width:0;} +.bootstrap-iso .pagination a:hover,.pagination .active a{background-color:#f5f5f5;} +.bootstrap-iso .pagination .active a{color:#999999;cursor:default;} +.bootstrap-iso .pagination .disabled a,.pagination .disabled a:hover{color:#999999;background-color:transparent;cursor:default;} +.bootstrap-iso .pagination li:first-child a{border-left-width:1px;-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;} +.bootstrap-iso .pagination li:last-child a{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0;} +.bootstrap-iso .pagination-centered{text-align:center;} +.bootstrap-iso .pagination-right{text-align:right;} +.bootstrap-iso .pager{margin-left:0;margin-bottom:18px;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";} +.bootstrap-iso .pager:after{clear:both;} +.bootstrap-iso .pager li{display:inline;} +.bootstrap-iso .pager a{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.bootstrap-iso .pager a:hover{text-decoration:none;background-color:#f5f5f5;} +.bootstrap-iso .pager .next a{float:right;} +.bootstrap-iso .pager .previous a{float:left;} +.bootstrap-iso .modal-open .dropdown-menu{z-index:2050;} +.bootstrap-iso .modal-open .dropdown.open{*z-index:2050;} +.bootstrap-iso .modal-open .popover{z-index:2060;} +.bootstrap-iso .modal-open .tooltip{z-index:2070;} +.bootstrap-iso .modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.bootstrap-iso .modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.bootstrap-iso .modal{position:fixed;top:50%;left:50%;z-index:1050;max-height:500px;overflow:auto;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-ms-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.bootstrap-iso .modal.fade.in{top:50%;} +.bootstrap-iso .modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.bootstrap-iso .modal-body{padding:15px;} +.bootstrap-iso .modal-body .modal-form{margin-bottom:0;} +.bootstrap-iso .modal-footer{padding:14px 15px 15px;margin-bottom:0;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";} +.bootstrap-iso .modal-footer:after{clear:both;} +.bootstrap-iso .modal-footer .btn{float:right;margin-left:5px;margin-bottom:0;} +.bootstrap-iso .tooltip{position:absolute;z-index:1020;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.bootstrap-iso .tooltip.top{margin-top:-2px;} +.bootstrap-iso .tooltip.right{margin-left:2px;} +.bootstrap-iso .tooltip.bottom{margin-top:2px;} +.bootstrap-iso .tooltip.left{margin-left:-2px;} +.bootstrap-iso .tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.bootstrap-iso .tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.bootstrap-iso .tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.bootstrap-iso .tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.bootstrap-iso .tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .tooltip-arrow{position:absolute;width:0;height:0;} +.bootstrap-iso .popover{position:absolute;top:0;left:0;z-index:1010;display:none;padding:5px;}.popover.top{margin-top:-5px;} +.bootstrap-iso .popover.right{margin-left:5px;} +.bootstrap-iso .popover.bottom{margin-top:5px;} +.bootstrap-iso .popover.left{margin-left:-5px;} +.bootstrap-iso .popover.top .arrow{bottom:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-top:5px solid #000000;} +.bootstrap-iso .popover.right .arrow{top:50%;left:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-right:5px solid #000000;} +.bootstrap-iso .popover.bottom .arrow{top:0;left:50%;margin-left:-5px;border-left:5px solid transparent;border-right:5px solid transparent;border-bottom:5px solid #000000;} +.bootstrap-iso .popover.left .arrow{top:50%;right:0;margin-top:-5px;border-top:5px solid transparent;border-bottom:5px solid transparent;border-left:5px solid #000000;} +.bootstrap-iso .popover .arrow{position:absolute;width:0;height:0;} +.bootstrap-iso .popover-inner{padding:3px;width:280px;overflow:hidden;background:#000000;background:rgba(0, 0, 0, 0.8);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);} +.bootstrap-iso .popover-title{padding:9px 15px;line-height:1;background-color:#f5f5f5;border-bottom:1px solid #eee;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0;} +.bootstrap-iso .popover-content{padding:14px;background-color:#ffffff;-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px;-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.bootstrap-iso .thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";} +.bootstrap-iso .thumbnails:after{clear:both;} +.bootstrap-iso .thumbnails>li{float:left;margin:0 0 18px 20px;} +.bootstrap-iso .thumbnail{display:block;padding:4px;line-height:1;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:0 1px 1px rgba(0, 0, 0, 0.075);} +.bootstrap-iso a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.bootstrap-iso .thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.bootstrap-iso .thumbnail .caption{padding:9px;} +.bootstrap-iso .label{padding:2px 4px 3px;font-size:11.049999999999999px;font-weight:bold;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.bootstrap-iso .label:hover{color:#ffffff;text-decoration:none;} +.bootstrap-iso .label-important{background-color:#b94a48;} +.bootstrap-iso .label-important:hover{background-color:#953b39;} +.bootstrap-iso .label-warning{background-color:#f89406;} +.bootstrap-iso .label-warning:hover{background-color:#c67605;} +.bootstrap-iso .label-success{background-color:#468847;} +.bootstrap-iso .label-success:hover{background-color:#356635;} +.bootstrap-iso .label-info{background-color:#3a87ad;} +.bootstrap-iso .label-info:hover{background-color:#2d6987;} +.bootstrap-iso @-webkit-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-ms-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(top, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .progress .bar{width:0%;height:18px;color:#ffffff;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-ms-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(top, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-ms-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.bootstrap-iso .progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.bootstrap-iso .progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.bootstrap-iso .progress-danger .bar{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-ms-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(top, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);} +.bootstrap-iso .progress-danger.progress-striped .bar{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.bootstrap-iso .progress-success .bar{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-ms-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(top, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);} +.bootstrap-iso .progress-success.progress-striped .bar{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.bootstrap-iso .progress-info .bar{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-ms-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(top, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);} +.bootstrap-iso .progress-info.progress-striped .bar{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.bootstrap-iso .accordion{margin-bottom:18px;} +.bootstrap-iso .accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.bootstrap-iso .accordion-heading{border-bottom:0;} +.bootstrap-iso .accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.bootstrap-iso .accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.bootstrap-iso .carousel{position:relative;margin-bottom:18px;line-height:1;} +.bootstrap-iso .carousel-inner{overflow:hidden;width:100%;position:relative;} +.bootstrap-iso .carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-ms-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.bootstrap-iso .carousel .item>img{display:block;line-height:1;} +.bootstrap-iso .carousel .active,.carousel .next,.carousel .prev{display:block;} +.bootstrap-iso .carousel .active{left:0;} +.bootstrap-iso .carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.bootstrap-iso .carousel .next{left:100%;} +.bootstrap-iso .carousel .prev{left:-100%;} +.bootstrap-iso .carousel .next.left,.carousel .prev.right{left:0;} +.bootstrap-iso .carousel .active.left{left:-100%;} +.bootstrap-iso .carousel .active.right{left:100%;} +.bootstrap-iso .carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.bootstrap-iso .carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.bootstrap-iso .carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:10px 15px 5px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.bootstrap-iso .carousel-caption h4,.carousel-caption p{color:#ffffff;} +.bootstrap-iso .hero-unit{padding:60px;margin-bottom:30px;background-color:#f5f5f5;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;letter-spacing:-1px;} +.bootstrap-iso .hero-unit p{font-size:18px;font-weight:200;line-height:27px;} +.bootstrap-iso .pull-right{float:right;} +.bootstrap-iso .pull-left{float:left;} +.bootstrap-iso .hide{display:none;} +.bootstrap-iso .show{display:block;} +.bootstrap-iso .invisible{visibility:hidden;} \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings-white.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings-white.png new file mode 100644 index 0000000..a20760b Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings-white.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings.png b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings.png new file mode 100644 index 0000000..92d4445 Binary files /dev/null and b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/img/glyphicons-halflings.png differ diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/style.css b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/style.css new file mode 100644 index 0000000..d9bcef2 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/css/style.css @@ -0,0 +1,96 @@ +.pseudoLink{ + color: #00008b; + border-bottom: 1px dotted #00008b; + cursor: pointer; +} + +.pseudoLink:hover{ + color: #4b0082; + border-bottom: 1px dotted #4b0082; +} + +#apiparams { + width: 100%; + height: 200px; +} + +#saveRequestParams { + width: 350px; + height: 200px; +} + +.tt-menu { +background-color: #fff; +border-bottom: 1px solid #ccc; +border-left: 1px solid #ccc; +border-right: 1px solid #ccc; +border-radius: 4px; +margin-top: 3px; +min-width: 180px; +} + +.tt-selectable { +cursor: pointer; +padding: 2px 8px 2px 8px; +} + +.tt-selectable:hover { +background-color: #0088CC; +color: #fff; +} +.btn-mini { +margin-top: 8px; +padding: 5px 8px; +} +#testResult { +margin-top: 0.5em; +} +#rsp { +margin-top: 12px; +margin-bottom: 14px; +} +#load { + position: absolute; + left: 10px; + top: 170px; + width: 98%; + height: 95%; + display:none; + background-color: #fff; + z-index: 1000; +} +.spinner { + display: inline-block; + opacity: 0; + width: 0; + + -webkit-transition: opacity 0s, width 0s; + -moz-transition: opacity 0s, width 0s; + -o-transition: opacity 0s, width 0s; + transition: opacity 0s, width 0s; +} +.has-spinner.active { + cursor:progress; +} + +.has-spinner.active .spinner { + opacity: 1; + width: auto; /* This doesn't work, just fix for unkown width elements */ +} + +.has-spinner.active .play { + opacity: 0; + width: 0; + display: none; +} +.has-spinner .play { + display: inline-block; + width: 10px; +} + +.has-spinner.btn.active .spinner { + width: 14px; +} +#apimethod { +background-color: white; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/js.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/js.js new file mode 100644 index 0000000..c7f7ad8 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/js.js @@ -0,0 +1,506 @@ +function CConfig(){ + this.init(); +} +var methods = ["action.create", + "action.delete", + "action.get", + "action.update", + "alert.get", + "apiinfo.version", + "application.create", + "application.delete", + "application.get", + "application.massadd", + "application.update", + "configuration.export", + "configuration.import", + "correlation.create", + "correlation.delete", + "correlation.get", + "correlation.update", + "dashboard.create", + "dashboard.delete", + "dashboard.get", + "dashboard.update", + "dhost.get", + "dservice.get", + "dcheck.get", + "drule.create", + "drule.delete", + "drule.get", + "drule.update", + "event.acknowledge", + "event.get", + "graph.create", + "graph.delete", + "graph.get", + "graph.update", + "graphitem.get", + "graphprototype.create", + "graphprototype.delete", + "graphprototype.get", + "graphprototype.update", + "history.get", + "host.create", + "host.delete", + "host.get", + "host.massadd", + "host.massremove", + "host.massupdate", + "host.update", + "hostgroup.create", + "hostgroup.delete", + "hostgroup.get", + "hostgroup.massadd", + "hostgroup.massremove", + "hostgroup.massupdate", + "hostgroup.update", + "hostinterface.create", + "hostinterface.delete", + "hostinterface.get", + "hostinterface.massadd", + "hostinterface.massremove", + "hostinterface.replacehostinterfaces", + "hostinterface.update", + "hostprototype.create", + "hostprototype.delete", + "hostprototype.get", + "hostprototype.update", + "iconmap.create", + "iconmap.delete", + "iconmap.get", + "iconmap.update", + "image.create", + "image.delete", + "image.get", + "image.update", + "item.create", + "item.delete", + "item.get", + "item.update", + "itemprototype.create", + "itemprototype.delete", + "itemprototype.get", + "itemprototype.update", + "service.adddependencies", + "service.addtimes", + "service.create", + "service.delete", + "service.deletedependencies", + "service.deletetimes", + "service.get", + "service.getsla", + "service.update", + "discoveryrule.copy", + "discoveryrule.create", + "discoveryrule.delete", + "discoveryrule.get", + "discoveryrule.update", + "maintenance.create", + "maintenance.delete", + "maintenance.get", + "maintenance.update", + "map.create", + "map.delete", + "map.get", + "map.update", + "usermedia.get", + "mediatype.create", + "mediatype.delete", + "mediatype.get", + "mediatype.update", + "problem.get", + "proxy.create", + "proxy.delete", + "proxy.get", + "proxy.update", + "screen.create", + "screen.delete", + "screen.get", + "screen.update", + "screenitem.create", + "screenitem.delete", + "screenitem.get", + "screenitem.update", + "screenitem.updatebyposition", + "script.create", + "script.delete", + "script.execute", + "script.get", + "script.getscriptsbyhosts", + "script.update", + "template.create", + "template.delete", + "template.get", + "template.massadd", + "template.massremove", + "template.massupdate", + "template.update", + "templatescreen.copy", + "templatescreen.create", + "templatescreen.delete", + "templatescreen.get", + "templatescreen.update", + "templatescreenitem.get", + "trend.get", + "trigger.adddependencies", + "trigger.deletedependencies", + "trigger.create", + "trigger.delete", + "trigger.get", + "trigger.update", + "triggerprototype.create", + "triggerprototype.delete", + "triggerprototype.get", + "triggerprototype.update", + "user.addmedia", + "user.create", + "user.delete", + "user.deletemedia", + "user.get", + "user.login", + "user.logout", + "user.update", + "user.updatemedia", + "user.updateprofile", + "usergroup.create", + "usergroup.delete", + "usergroup.get", + "usergroup.massadd", + "usergroup.massupdate", + "usergroup.update", + "usermacro.create", + "usermacro.createglobal", + "usermacro.delete", + "usermacro.deleteglobal", + "usermacro.get", + "usermacro.update", + "usermacro.updateglobal", + "valuemap.create", + "valuemap.delete", + "valuemap.get", + "valuemap.update", + "httptest.create", + "httptest.delete", + "httptest.get", + "httptest.update" +]; + +CConfig.prototype = { + connections: {}, + host: '', + login: '', + password: '', + auth: '', + + init: function(){ + this.connections = JSON.parse(localStorage.getItem('connections')) || {}; + + var that = this; + $jq('#host').change(function(){ + that.host = this.value; + }); + $jq('#login').change(function(){ + that.login = this.value; + }); + $jq('#password').change(function(){ + that.password = this.value; + }); + $jq('#connAdd').click(function(){ + that.addConnection(); + }); + $jq('#connList').change(function(){ + that.loadConnection($jq('#connList').val()); + }); + $jq('#connRemove').click(function(){ + that.removeConnection(); + }); + this.syncConnectionsList(); + }, + + addConnection: function(){ + this.connections[this.host] = { + host: this.host, + login: this.login, + password: this.password + }; + localStorage.setItem('connections', JSON.stringify(this.connections)); + + this.syncConnectionsList(); + }, + removeConnection: function(){ + delete this.connections[$jq('#connList').val()]; + + localStorage.setItem('connections', JSON.stringify(this.connections)); + + this.syncConnectionsList(); + }, + loadConnection: function(host){ + this.host = this.connections[host].host; + this.login = this.connections[host].login; + this.password = this.connections[host].password; + + this.syncConnectionsConfig(); + }, + + syncConnectionsList: function(){ + $jq('#connList').empty(); + for(var key in this.connections){ + $jq('#connList').append(new Option(this.connections[key].host, this.connections[key].host)); + } + }, + syncConnectionsConfig: function(){ + $jq('#host').val(this.host); + $jq('#login').val(this.login); + $jq('#password').val(this.password); + } +}; + +$jq(document).ready(function() { + $jq('#loadMe').click(function (e) { + if ($jq('#load').css('display') == 'none') { + var docUrl = "https://www.zabbix.com/documentation/3.0/manual/api/reference/" + $jq('#apimethod').val().replace('.','/') + if ($jq("#load").attr("src") != docUrl) { + $jq("#load").attr("src", docUrl); + } + $jq('#load').show(); + } else { + $jq('#load').hide(); + } + }); + + config = new CConfig(); + + $jq('#saveRequest').click(function() { + $jq('#saveRequestMethod').val($jq('#apimethod').val()); + $jq('#saveRequestParams').val($jq('#apiparams').val()); + }); + + $jq('#saveRequestOk').click(function() { + var request = { + name: $jq('#saveRequestName').val(), + method: $jq('#saveRequestMethod').val(), + params: $jq('#saveRequestParams').val() + }, + requests = JSON.parse(localStorage.getItem('requests')) || {}; + + requests[request.name] = request; + + localStorage.setItem('requests', JSON.stringify(requests)); + + $jq('#saveRequestModal').modal('hide'); + }); + + + $jq('#loadRequest').click(function() { + var requests = JSON.parse(localStorage.getItem('requests')) || {}; + $jq('#savedRequests').empty(); + for (var name in requests) { + $jq('#savedRequests').append(new Option(name, name)); + } + }); + + $jq('#loadRequestOk').click(function() { + var request, + requests = JSON.parse(localStorage.getItem('requests')) || {}; + + if ($jq('#savedRequests').val()) { + request = requests[$jq('#savedRequests').val()]; + $jq('#apimethod').val(request.method); + $jq('#apiparams').val(request.params); + } + + $jq('#loadRequestModal').modal('hide'); + }); + + $jq('#removeSavedRequest').click(function() { + var requests = JSON.parse(localStorage.getItem('requests')) || {}; + + delete requests[$jq('#savedRequests').val()]; + localStorage.setItem('requests', JSON.stringify(requests)); + + $jq('#savedRequests').empty(); + for(var name in requests){ + $jq('#savedRequests').append(new Option(name, name)); + } + }); + + + $jq('#loginButton').click(function() { + jsonRpc.connect(config.host, config.login, config.password); + }); + + $jq('#execute').click(function() { + testOnly(); + paramsUpdate(); + var params; + try { + params = $jq('#apiparams').val(); + if (params !== '') { + params = JSON.parse($jq('#apiparams').val()); + } + jsonRpc.call($jq('#apimethod').val(), params); + } + catch(e) { + //alert(e); + } + }); + + function testOnly(){ + if ($jq('#apiparams').val() == '') { + $jq('#apiparams').parent().removeClass('error'); + $jq('#testResult').hide(); + return true; + } + lint = window.JSONLint( $jq('#apiparams').val(), { comments: false } ); + + if ( ! lint.error ) { + $jq('#apiparams').parent().removeClass('error'); + $jq('#testResult').hide(); + } + else { + $jq('#apiparams').parent().addClass('error'); + $jq('#response, #request').empty(); + $jq('#responsetime').text(""); + $jq('#testResult').show(); + $jq('#testResult').html([ + lint.error + "
      " + + "Evidence: " + lint.evidence + "
      " + + "Line: " + lint.line + "
      " + + "Character: " + lint.character + ].join('')); + } + } + + function paramsUpdate() { + location.hash = 'apimethod=' + encodeURIComponent($jq('#apimethod').val()) + '&apiparams=' + encodeURIComponent($jq('#apiparams').val()); + } + + $jq('#compressJSON').click(function(){ + var params; + params = JSON.parse($jq('#apiparams').val()); + $jq('#apiparams').val(JSON.stringify(params, null, null)); + paramsUpdate(); + }); + + $jq('#formatJSON').click(function(){ + var params; + if ($jq('#apiparams').val() == '') { + $jq('#apiparams').parent().removeClass('error'); + $jq('#testResult').hide(); + return true; + } + lint = window.JSONLint( $jq('#apiparams').val(), { comments: false } ); + + if ( ! lint.error ) { + $jq('#apiparams').parent().removeClass('error'); + $jq('#response, #request').empty(); + $jq('#responsetime').text(""); + $jq('#testResult').hide(); + try { + params = JSON.parse($jq('#apiparams').val()); + $jq('#apiparams').val(JSON.stringify(params, null, 4)); + paramsUpdate(); + } + catch(e) { + alert(e); + } + } + else { + $jq('#apiparams').parent().addClass('error'); + $jq('#testResult').show(); + $jq('#testResult').html([ + lint.error + "
      " + + "Evidence: " + lint.evidence + "
      " + + "Line: " + lint.line + "
      " + + "Character: " + lint.character + ].join('')); + } + }); + + var substringMatcher = function(strs) { + return function findMatches(q, cb) { + var matches, substringRegex; + + // an array that will be populated with substring matches + matches = []; + + // regex used to determine if a string contains the substring `q` + substrRegex = new RegExp(q, 'i'); + + // iterate through the pool of strings and for any string that + // contains the substring `q`, add it to the `matches` array + $jq.each(strs, function(i, str) { + if (substrRegex.test(str)) { + matches.push(str); + } + }); + + cb(matches); + }; + }; + + $jq('#apimethod').typeahead({ + hint: true, + highlight: true, + minLength: 1 + }, + { + name: 'apimethods', + limit: 14, + source: substringMatcher(methods), + }); + + if (location.hash.length) { + var prms = getHashParams(); + if ('apimethod' in prms) { + $jq('#apimethod').val(prms['apimethod']); + } + if ('apiparams' in prms) { + $jq('#apiparams').val(prms['apiparams']); + } + } + + if (methods.indexOf($jq('#apimethod').val()) > -1 ) { + $jq('#loadMe').removeClass('disabled'); + } else { + $jq('#loadMe').addClass('disabled'); + } +}); + +$jq(document).on('search keyup change typeahead:selected typeahead:autocompleted', '#apimethod', function () { + var prms = getHashParams(); + var hash = ''; + delete prms['apimethod']; + $jq.each( prms, function( key, value ) { + hash = key + "=" + encodeURIComponent(value) + '&'; + }); + location.hash = 'apimethod=' + encodeURIComponent($jq(this).val()) + '&' + hash; + if (methods.indexOf($jq(this).val()) > -1 ) { + $jq('#loadMe').removeClass('disabled'); + } else { + $jq('#loadMe').addClass('disabled'); + } +}) + +$jq(document).on('search keyup change', '#apiparams', function () { + var prms = getHashParams(); + var hash = ''; + delete prms['apiparams']; + $jq.each( prms, function( key, value ) { + hash = key + "=" + encodeURIComponent(value) + '&'; + }); + location.hash = hash + 'apiparams=' + encodeURIComponent($jq(this).val()); +}) + +function getHashParams() { + var hashParams = {}; + var e, + a = /\+/g, //Regex for replacing addition symbol with a space + r = /([^&;=]+)=?([^&;]*)/g, + d = function (s) { return decodeURIComponent(s.replace(a, " ")); }, + q = window.location.hash.substring(1); + while (e = r.exec(q)) + hashParams[d(e[1])] = d(e[2]); + return hashParams; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonlint.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonlint.js new file mode 100644 index 0000000..4fa3cb4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonlint.js @@ -0,0 +1,504 @@ +(function( glob, undefined ) { + +var rnumber = /[0-9]/, + rnewline = /(\r\n|\r|\n)/, + revidence = /\r\n|\r|\n/, + rwhitespace = /(\s|\t)/, + rvalidsolidus = /\\("|\\|\/|b|f|n|r|t|u[0-9]{4})/, + rE = /^(\-|\+)?[0-9]/; + + +// Leeeeeeerrrrroooyy Jennkkkiiinnnss +function JSONLint( json, options ) { + var self = this; + + if ( ! ( self instanceof JSONLint ) ) { + return new JSONLint( json, options ); + } + + // Argument handling + self.json = json || ''; + self.options = options || {}; + self.lower = self.json.toLowerCase(); + + // Allow comments by default + if ( ! self.options.hasOwnProperty( 'comments' ) ) { + self.options.comments = true; + } + + // Internals + self.c = ''; + self.i = -1; + self.length = self.json.length; + self.line = 1; + self.character = 0; + self._evidence = self.json.split( revidence ); + self.endblock = ''; + self.commabreak = false; + + try { + self.render(); + } catch ( e ) { + if ( typeof e != 'string' ) { + throw e; + } + self.error = e; + self.setEvidence(); + } +} + + +// Meta (Please change contact info for republishing with changes) +JSONLint.contact = "Corey Hart (corey@codenothing.com)"; +JSONLint.version = '0.1.1'; + + +// Methods +JSONLint.prototype = { + + // Rendering Start + render: function(){ + var self = this, peek = '', content = false; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.options.comments && self.c == '/' ) { + peek = self.json[ self.i + 1 ]; + if ( peek == '*' ) { + self.multicomment(); + } + else if ( peek == '/' ) { + self.comment(); + } + else { + throw "Unknown character '/', maybe a comment?"; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( rwhitespace.exec( self.c ) ) { + continue; + } + else if ( content ) { + throw "Unknown character '" + self.c + "', expecting end of file."; + } + else if ( self.c == '[' ) { + content = true; + self.array(); + } + else if ( self.c == '{' ) { + content = true; + self.object(); + } + else { + throw "Unknown character '" + self.c + "', expecting opening block '{' or '[', or maybe a comment"; + } + } + + // Check for pure whitespace + if ( ! content ) { + throw "Invalid JSON, no content."; + } + }, + + // Multi line comment + multicomment: function(){ + var self = this; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.c == "*" && self.json[ self.i + 1 ] == "/" ) { + self.i++; + self.character++; + break; + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + } + }, + + // Single line comment + comment: function(){ + var self = this; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + break; + } + } + }, + + // Array Block + array: function(){ + // Keep reference of current endblock + var self = this, + _endblock = self.endblock, + _commabreak = self.commabreak, + ended = false; + + self.endblock = ']'; + self.commabreak = false; + while ( ( ended = self.value() ) !== true && self.i < self.length ) { + // Do nothing, just wait for array values to finish + } + + if ( ! ended ) { + throw "EOF Error. Expecting closing ']'"; + } + + // Reset previous endblock + self.endblock = _endblock; + self.commabreak = _commabreak; + }, + + // Object Block + object: function(){ + // Keep reference of current endblock + var self = this, + _endblock = self.endblock, + _commabreak = self.commabreak, + found = false, peek = '', empty = true; + + self.endblock = '}'; + self.commabreak = false; + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.options.comments && self.c == '/' ) { + peek = self.json[ self.i + 1 ]; + if ( peek == '*' ) { + self.multicomment(); + } + else if ( peek == '/' ) { + self.comment(); + } + else { + throw "Unknown character '/', maybe a comment?"; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( rwhitespace.exec( self.c ) ) { + continue; + } + else if ( self.c == '"' ) { + empty = false; + if ( self.key() === true ) { + // Reset old endblock + self.endblock = _endblock; + self.commabreak = _commabreak; + found = true; + break; + } + } + else if ( empty && self.c == '}' ) { + self.endblock = _endblock; + self.commabreak = _commabreak; + found = true; + break; + } + else { + throw "Unknown Character '" + self.c + "', expecting a string for key statement."; + } + } + + if ( ! found ) { + throw "EOF Error, expecting closing '}'."; + } + }, + + // Key Statement + key: function(){ + var self = this; + self.string(); + + for ( var peek = ''; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.options.comments && self.c == '/' ) { + peek = self.json[ self.i + 1 ]; + if ( peek == '*' ) { + self.multicomment(); + } + else if ( peek == '/' ) { + self.comment(); + } + else { + throw "Unknown character '/', maybe a comment?"; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( rwhitespace.exec( self.c ) ) { + continue; + } + else if ( self.c == ":" ) { + return self.value(); + } + else { + throw "Unknown Character '" + self.c + "', expecting a semicolon."; + } + } + }, + + // Value statement + value: function(){ + var self = this, peek = ''; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.options.comments && self.c == '/' ) { + peek = self.json[ self.i + 1 ]; + if ( peek == '*' ) { + self.multicomment(); + } + else if ( peek == '/' ) { + self.comment(); + } + else { + throw "Unknown character '/', maybe a comment?"; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( rwhitespace.exec( self.c ) ) { + continue; + } + else if ( self.c == '{' ) { + self.object(); + return self.endval(); + } + else if ( self.c == '[' ) { + self.array(); + return self.endval(); + } + else if ( self.c == '"' ) { + self.string(); + return self.endval(); + } + else if ( self.json.indexOf( 'true', self.i ) === self.i ) { + self.i += 3; + self.character += 3; + return self.endval(); + } + else if ( self.json.indexOf( 'false', self.i ) === self.i ) { + self.i += 4; + self.character += 4; + return self.endval(); + } + else if ( self.json.indexOf( 'null', self.i ) === self.i ) { + self.i += 3; + self.character += 3; + return self.endval(); + } + else if ( self.c == '-' || rnumber.exec( self.c ) ) { + return self.numeric(); + } + else if ( self.c == ']' && self.endblock == ']' ) { + if ( self.commabreak ) { + throw "Unexpected End Of Array Error. Expecting a value statement."; + } + return true; + } + else { + throw "Unknown Character '" + self.c + "', expecting a value."; + } + } + }, + + // String statement + string: function(){ + var self = this, found = false, m; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.c == "\\" ) { + if ( ( m = rvalidsolidus.exec( self.json.substr( self.i ) ) ) && m.index === 0 ) { + self.i += m[ 1 ].length; + self.character += m[ 1 ].length; + } + else { + throw "Invalid Reverse Solidus '\\' declaration."; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( self.c == '"' ) { + found = true; + break; + } + } + + // Make sure close string is found + if ( ! found ) { + throw "EOF: No close string '\"' found."; + } + }, + + // Numeric Value + numeric: function(){ + var self = this, + negative = true, + decimal = null, + e = null, + peek = ''; + + // We need to jump back a character to catch the whole number + self.i--; + self.character--; + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + // Handle initial negative sign + if ( negative ) { + negative = false; + if ( self.c == '-' ) { + if ( ! rnumber.exec( self.json[ self.i + 1 ] ) ) { + throw "Unknown Character '" + self.c + "' following a negative, expecting a numeric value."; + } + continue; + } + } + + // Only a single decimal is allowed in a numeric value + if ( decimal && self.c == '.' ) { + decimal = false; + e = true; + continue; + } + // Only a single e notation is allowed in a numeric value + else if ( e && self.c.toLowerCase() == 'e' ) { + e = false; + negative = true; + if ( rE.exec( self.json.substr( self.i + 1, 2 ) ) ) { + self.character++; + self.i++; + } + else { + self.character++; + throw "Unknown Character '" + self.json[ self.i + 1 ] + "' following e notation, expecting a numeric value."; + } + } + // Normal Digit + else if ( rnumber.exec( self.c ) ) { + if ( decimal === null ) { + decimal = true; + } + } + // Assume end of number, and allow endval to handle it + else { + // Jump back a character to include the current one + self.i--; + self.character--; + return self.endval(); + } + } + }, + + // Ending a value statement + endval: function(){ + var self = this, peek = ''; + self.commabreak = false; + + for ( ; ++self.i < self.length; ) { + self.c = self.json[ self.i ]; + self.character++; + + if ( self.options.comments && self.c == '/' ) { + peek = self.json[ self.i + 1 ]; + if ( peek == '*' ) { + self.multicomment(); + } + else if ( peek == '/' ) { + self.comment(); + } + else { + throw "Unknown character '/', maybe a comment?"; + } + } + else if ( rnewline.exec( self.c ) ) { + self.line++; + self.character = 0; + } + else if ( rwhitespace.exec( self.c ) ) { + continue; + } + else if ( self.c == ',' ) { + self.commabreak = true; + break; + } + else if ( self.c == self.endblock ) { + return true; + } + else { + throw "Unknown Character '" + self.c + "', expecting a comma or a closing '" + self.endblock + "'"; + } + } + }, + + // Expose line of the error + setEvidence: function(){ + var self = this, start = self.line - 5, end = start + 8, evidence = ''; + + // Min start + if ( start < 0 ) { + start = 0; + end = 8; + } + + // Max end + if ( end >= self._evidence.length ) { + end = self._evidence.length; + } + + // Evidence display + for ( ; start < end; start++ ) { + evidence += ( start === ( self.line - 1 ) ? "-> " : " " ) + + ( start + 1 ) + '| ' + + self._evidence[ start ] + "\n"; + } + + // Set the evidence display + self.evidence = evidence; + } +}; + + +// Check for nodejs module system +if ( typeof exports == 'object' && typeof module == 'object' ) { + module.exports = JSONLint; +} +// In a browser +else { + glob.JSONLint = JSONLint; +} + +})( this ); diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonrpc.js b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonrpc.js new file mode 100644 index 0000000..421b3d1 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-dockbix-xxl/usr/local/src/zabbix/frontends/php/zapix/js/jsonrpc.js @@ -0,0 +1,103 @@ +"use strict"; + +function getCookie(cname) { + var name = cname + "="; + var ca = document.cookie.split(';'); + for(var i = 0; i /usr/local/etc/zabbix_server.conf + # enable default one java poller for Java gateway + if $ZJ_enabled; then + if [ -z ${ZS_StartJavaPollers+x} ]; then + export ZS_StartJavaPollers=1 + fi + fi + for i in $( printenv | grep ^ZS_ | grep -v '^ZS_enabled' | awk -F'=' '{print $1}' | sort -rn ); do + reg=$(echo ${i} | sed 's|^ZS_||' | sed -E "s/_[0-9]+$//") + val=$(echo ${!i}) + echo "${reg}=${val}" >> /usr/local/etc/zabbix_server.conf + sed -i "s#ZS_${reg}#${val}#g" /usr/local/src/zabbix/frontends/php/conf/zabbix.conf.php + done + + # ^ZA_: /usr/local/etc/zabbix_agentd.conf + export ZA_Hostname_e=$(echo ${ZA_Hostname} | sed -e 's/ /\\\ /g') + sed -i "s#ZA_Hostname#${ZA_Hostname_e}#g" /usr/local/etc/zabbix_agentd.conf + unset ZA_Hostname_e + > /usr/local/etc/zabbix_agentd.conf + for i in $( printenv | grep ^ZA_ | grep -v '^ZA_enabled' | awk -F'=' '{print $1}' | sort -rn ); do + reg=$(echo ${i} | sed 's|^ZA_||' | sed -E "s/_[0-9]+$//") + val=$(echo ${!i}) + echo "${reg}=${val}" >> /usr/local/etc/zabbix_agentd.conf + done + + # ^ZW_: /usr/local/src/zabbix/frontends/php/conf/zabbix.conf.php + export ZW_ZBX_SERVER_NAME_e=$(echo ${ZW_ZBX_SERVER_NAME} | sed -e 's/ /\\\ /g') + sed -i "s#ZW_ZBX_SERVER_NAME#${ZW_ZBX_SERVER_NAME_e}#g" /usr/local/src/zabbix/frontends/php/conf/zabbix.conf.php + unset ZW_ZBX_SERVER_NAME_e + for i in $( printenv | grep ^ZW_ | grep -v '^ZW_ZBX_SERVER_NAME' | awk -F'=' '{print $1}' | sort -rn ); do + reg=$(echo ${i} | sed 's|^ZW_||') + val=$(echo ${!i}) + sed -i "s#ZW_${reg}#${val}#g" /usr/local/src/zabbix/frontends/php/conf/zabbix.conf.php + done + + # ^PHP_: /etc/php.d/zz-zabbix.ini + for i in $( printenv | grep ^PHP_ | sort -rn ); do + reg=$(echo ${i} | awk -F'=' '{print $1}') + val=$(echo ${i} | awk -F'=' '{print $2}') + sed -i "s#${reg}\$#${val}#g" /etc/php.d/zz-zabbix.ini + done + + ZBX_GRAPH_FONT_NAME=${ZBX_GRAPH_FONT_NAME:-DejaVuSans} + if [ $ZBX_GRAPH_FONT_NAME == "ipagp" ]; then + sed -i "/ZBX_GRAPH_FONT_NAME/c\define('ZBX_GRAPH_FONT_NAME','ipagp');" /usr/local/src/zabbix/frontends/php/include/defines.inc.php + fi + + if [ -f /etc/custom-config/php-zabbix.ini ]; then + cp -f /etc/custom-config/php-zabbix.ini /etc/php.d/zz-zabbix.ini + fi + if [ -f /etc/custom-config/zabbix_server.conf ]; then + cp -f /etc/custom-config/zabbix_server.conf /usr/local/etc/zabbix_server.conf + fi +} +####################### End of default settings ####################### +# Zabbix default sql files +ZABBIX_SQL_DIR="/usr/local/src/zabbix/database/mysql" +# load DB config from custom config file if exist +if [ -f /etc/custom-config/zabbix_server.conf ]; then + FZS_DBPassword=$(grep ^DBPassword= /etc/custom-config/zabbix_server.conf | awk -F= '{print $2}') + if [ ! -z "$FZS_DBPassword" ]; then + export ZS_DBPassword=$FZS_DBPassword + fi + FZS_DBUser=$(grep ^DBUser= /etc/custom-config/zabbix_server.conf | awk -F= '{print $2}') + if [ ! -z "$FZS_DBUser" ]; then + export ZS_DBUser=$FZS_DBUser + fi + FZS_DBHost=$(grep ^DBHost= /etc/custom-config/zabbix_server.conf | awk -F= '{print $2}') + if [ ! -z "$FZS_DBHost" ]; then + export ZS_DBHost=$FZS_DBHost + fi + FZS_DBPort=$(grep ^DBPort= /etc/custom-config/zabbix_server.conf | awk -F= '{print $2}') + if [ ! -z "$FZS_DBPort" ]; then + export ZS_DBPort=$FZS_DBPort + fi + FZS_DBName=$(grep ^DBName= /etc/custom-config/zabbix_server.conf | awk -F= '{print $2}') + if [ ! -z "$FZS_DBName" ]; then + export ZS_DBName=$FZS_DBName + fi +fi +log "Preparing server configuration" +update_config +log "Config updated." +log "Enabling logging and pid management" +logging +system_pids +fix_permissions +log "Done" + +if $ZS_enabled; then + # wait 120sec for DB server initialization + retry=24 + log "Waiting for database server" + until mysql -u ${ZS_DBUser} -p${ZS_DBPassword} -h ${ZS_DBHost} -P ${ZS_DBPort} -e "exit" &>/dev/null + do + log "Waiting for database server, it's still not available" + retry=`expr $retry - 1` + if [ $retry -eq 0 ]; then + error "Database server is not available!" + exit 1 + fi + sleep 5 + done + log "Database server is available" + + log "Checking if database exists or SQL import is required" + if ! mysql -u ${ZS_DBUser} -p${ZS_DBPassword} -h ${ZS_DBHost} -P ${ZS_DBPort} -e "use ${ZS_DBName};" &>/dev/null; then + warning "Zabbix database doesn't exist. Installing and importing default settings" + log `create_db` + log "Database and user created, importing default SQL" + log `import_zabbix_db` + log "Import finished, starting" + else + log "Zabbix database exists, starting server" + fi +else + # Zabbix server is disabled + rm -rf /etc/supervisor.d/zabbix-server.conf +fi + +if ! $ZA_enabled; then + # Zabbix agent is disabled + rm -rf /etc/supervisor.d/zabbix-agent.conf +fi + +if ! $ZW_enabled; then + # Zabbix web UI is disabled + rm -rf /etc/supervisor.d/nginx.conf + rm -rf /etc/supervisor.d/php-fpm.conf +fi + +if ! $ZJ_enabled; then + # Zabbix Java Gateway disabled + rm -rf /etc/supervisor.d/zabbix-java-gateway.conf +else + rm -rf /usr/local/sbin/zabbix_java/lib/logback.xml + cp /usr/local/etc/logback.xml /usr/local/sbin/zabbix_java/lib/ + if [ -f /etc/custom-config/logback.xml ]; then + rm -rf /usr/local/sbin/zabbix_java/lib/logback.xml + cp /etc/custom-config/logback.xml /usr/local/sbin/zabbix_java/lib/ + else + sed -i "s###g" /usr/local/sbin/zabbix_java/lib/logback.xml + fi + export ZJ_JarFile=$(find /usr/local/sbin/zabbix_java/ -name 'zabbix-java-gateway*.jar' | awk -F'zabbix_java/bin/' '{print $2}') + export ZJ_JarFile_android_json=$(find /usr/local/sbin/zabbix_java/ -name 'android-json*.jar' | awk -F'zabbix_java/lib/' '{print $2}') + export ZJ_JarFile_logback_classic=$(find /usr/local/sbin/zabbix_java/ -name 'logback-classic*.jar' | awk -F'zabbix_java/lib/' '{print $2}') + export ZJ_JarFile_logback_core=$(find /usr/local/sbin/zabbix_java/ -name 'logback-core*.jar' | awk -F'zabbix_java/lib/' '{print $2}') + export ZJ_JarFile_slf4j_api=$(find /usr/local/sbin/zabbix_java/ -name 'slf4j-api*.jar' | awk -F'zabbix_java/lib/' '{print $2}') +fi + +if ! $ZP_enabled; then + # Zabbix proxy disabled + rm -rf /etc/supervisor.d/zabbix-proxy.conf +else + # Zabbix proxy configuration + if [ -f /etc/custom-config/zabbix_proxy.conf ]; then + rm -rf /usr/local/etc/zabbix_proxy.conf + cp /etc/custom-config/zabbix_proxy.conf /usr/local/etc/ + FZP_DBPassword=$(grep ^DBPassword= /etc/custom-config/zabbix_proxy.conf | awk -F= '{print $2}') + if [ ! -z "$FZP_DBPassword" ]; then + export ZP_DBPassword=$FZP_DBPassword + fi + FZP_DBUser=$(grep ^DBUser= /etc/custom-config/zabbix_proxy.conf | awk -F= '{print $2}') + if [ ! -z "$FZP_DBUser" ]; then + export ZP_DBUser=$FZP_DBUser + fi + FZP_DBHost=$(grep ^DBHost= /etc/custom-config/zabbix_proxy.conf | awk -F= '{print $2}') + if [ ! -z "$FZP_DBHost" ]; then + export ZP_DBHost=$FZP_DBHost + fi + FZP_DBPort=$(grep ^DBPort= /etc/custom-config/zabbix_proxy.conf | awk -F= '{print $2}') + if [ ! -z "$FZP_DBPort" ]; then + export ZP_DBPort=$FZP_DBPort + fi + FZP_DBName=$(grep ^DBName= /etc/custom-config/zabbix_proxy.conf | awk -F= '{print $2}') + if [ ! -z "$FZP_DBName" ]; then + export ZP_DBName=$FZP_DBName + fi + else + > /usr/local/etc/zabbix_proxy.conf + for i in $( printenv | grep ^ZP_ | grep -v '^ZP_enabled' | awk -F'=' '{print $1}' | sort -rn ); do + reg=$(echo ${i} | sed 's|^ZP_||' | sed -E "s/_[0-9]+$//") + val=$(echo ${!i}) + echo "${reg}=${val}" >> /usr/local/etc/zabbix_proxy.conf + done + fi + # wait 120sec for DB server initialization + retry=24 + log "Waiting for database server" + until mysql -u ${ZP_DBUser} -p${ZP_DBPassword} -h ${ZP_DBHost} -P ${ZP_DBPort} -e "exit" &>/dev/null + do + log "Waiting for database server, it's still not available" + retry=`expr $retry - 1` + if [ $retry -eq 0 ]; then + error "Database server is not available!" + exit 1 + fi + sleep 5 + done + log "Database server is available" + log "Checking if proxy database exists or SQL import is required" + if ! mysql -u ${ZP_DBUser} -p${ZP_DBPassword} -h ${ZP_DBHost} -P ${ZP_DBPort} -e "use ${ZP_DBName};" &>/dev/null; then + warning "Zabbix proxy database doesn't exist. Installing and importing default settings" + log `create_proxy_db` + log "Proxy database and user created, importing default SQL" + log `import_zabbix_proxy_db` + log "Import finished, starting" + else + log "Zabbix proxy database exists, starting proxy" + fi +fi + +if ! $SNMPTRAP_enabled; then + # SNMP trap process is disabled + rm -rf /etc/supervisor.d/snmptrapd.conf + rm -rf /etc/logrotate.d/zabbix-traps +fi + +# Zabbix version detection +export ZABBIX_VERSION_FULL=$(zabbix_server -V | grep "(Zabbix)" | awk '{print $3" "$4}') + +log "Starting Zabbix version $ZABBIX_VERSION_FULL" diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/config/pyzabbix.py b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/config/pyzabbix.py new file mode 100644 index 0000000..e97fbb4 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/config/pyzabbix.py @@ -0,0 +1,6 @@ +from zabbix.api import ZabbixAPI +zapi = ZabbixAPI(url='http://localhost/', user='Admin', password='zabbix') +hosts = zapi.host.getobjects(status=1) +for host in hosts: + print 'Enabling host: %s' % host['name'] + zapi.host.update(hostid=host['hostid'],status=0) diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/default.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/default.conf new file mode 100644 index 0000000..84cf63d --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/default.conf @@ -0,0 +1,12 @@ +server { + listen 80 default; + root /usr/local/src/zabbix/frontends/php; + index index.php index.html; + + include /etc/nginx/conf.d/default-*.conf; + include /data/conf/nginx/conf.d/default-*.conf; + + # PHP backend is not in the default-*.conf file set, + # as some vhost might not want to include it. + include /etc/nginx/conf.d/php-location.conf; +} \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/ssl-nginx.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/ssl-nginx.conf new file mode 100644 index 0000000..c3d14f9 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/nginx/hosts.d/ssl-nginx.conf @@ -0,0 +1,41 @@ +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + + # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate + ssl_certificate /etc/nginx/ssl/dummy.crt; + ssl_certificate_key /etc/nginx/ssl/dummy.key; + ssl_session_timeout 1d; + ssl_session_cache shared:SSL:50m; + ssl_session_tickets off; + + + # modern configuration. tweak to your needs. + ssl_protocols TLSv1.2; + ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; + ssl_prefer_server_ciphers on; + + # HSTS caching header + #add_header Strict-Transport-Security "max-age=31536000;"; + + # OCSP Stapling --- + # fetch OCSP records from URL in ssl_certificate and cache them + ssl_stapling on; + ssl_stapling_verify on; + + ## verify chain of trust of OCSP response using Root CA and Intermediate certs + #ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates; + + #resolver ; + + # Zabbix/PHP config + root /usr/local/src/zabbix/frontends/php; + index index.php index.html; + + include /etc/nginx/conf.d/default-*.conf; + include /data/conf/nginx/conf.d/default-*.conf; + + # PHP backend is not in the default-*.conf file set, + # as some vhost might not want to include it. + include /etc/nginx/conf.d/php-location.conf; +} diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/php.d/zz-zabbix.ini b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/php.d/zz-zabbix.ini new file mode 100644 index 0000000..8e8cd27 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/php.d/zz-zabbix.ini @@ -0,0 +1,5 @@ +date.timezone = PHP_date_timezone +max_execution_time = PHP_max_execution_time +max_input_time = PHP_max_input_time +memory_limit = PHP_memory_limit +error_reporting = PHP_error_reporting diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptrapd.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptrapd.conf new file mode 100644 index 0000000..813b2c8 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptrapd.conf @@ -0,0 +1,16 @@ +# Ref: ZBXNEXT-747 +authCommunity execute public +# snmptt as standalone app - estimated performance 5 traps/second +traphandle default snmptt + +# TODO log traps directly to zabbix_traps file +#logoption f /tmp/zabbix_traps2.tmp +#format1 %H:%M:%S %Y/%m/%d %N %W %W %B - ZBXTRAP %A %A +#format2 %H:%M:%S %Y/%m/%d %N %W %W %B - ZBXTRAP %A %A + +# TODO +#perl do "/usr/share/snmptt/snmptthandler-embedded"; + +# TODO +# perl do "/usr/local/src/zabbix/misc/snmptrap/zabbix_trap_receiver.pl"; + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.conf new file mode 100644 index 0000000..0974cb3 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.conf @@ -0,0 +1,67 @@ +# Default config for Zabbix +EVENT general .* "General event" Normal +FORMAT ZBXTRAP $aA $ar +# +# +# +#EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal +#FORMAT Device reinitialized (coldStart) +#EXEC qpage -f TRAP notifygroup1 "Device reinitialized (coldStart)" +#SDESC +#A coldStart trap signifies that the SNMPv2 entity, acting +#in an agent role, is reinitializing itself and that its +#configuration may have been altered. +#EDESC +# +# +# +#EVENT warmStart .1.3.6.1.6.3.1.1.5.2 "Status Events" Normal +#FORMAT Device reinitialized (warmStart) +#EXEC qpage -f TRAP notifygroup1 "Device reinitialized (warmStart)" +#SDESC +#A warmStart trap signifies that the SNMPv2 entity, acting +#in an agent role, is reinitializing itself such that its +#configuration is unaltered. +#EDESC +# +# +# +#EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal +#FORMAT Link down on interface $1. Admin state: $2. Operational state: $3 +#EXEC qpage -f TRAP notifygroup1 "Link down on interface $1. Admin state: $2. Operational state: $3" +#SDESC +#A linkDown trap signifies that the SNMP entity, acting in +#an agent role, has detected that the ifOperStatus object for +#one of its communication links is about to enter the down +#state from some other state (but not from the notPresent +#state). This other state is indicated by the included value +#of ifOperStatus. +#EDESC +# +# +# +#EVENT linkUp .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal +#FORMAT Link up on interface $1. Admin state: $2. Operational state: $3 +#EXEC qpage -f TRAP notifygroup1 "Link up on interface $1. Admin state: $2. Operational state: $3" +#SDESC +#A linkUp trap signifies that the SNMP entity, acting in an +#agent role, has detected that the ifOperStatus object for +#one of its communication links left the down state and +#transitioned into some other state (but not into the +#notPresent state). This other state is indicated by the +#included value of ifOperStatus. +#EDESC +# +# +# +#EVENT authenticationFailure .1.3.6.1.6.3.1.1.5.5 "Status Events" Normal +#FORMAT SNMP athentication failure +#EXEC qpage -f TRAP notifygroup1 "SNMP authentication failure" +#SDESC +#An authenticationFailure trap signifies that the SNMPv2 +#entity, acting in an agent role, has received a protocol +#message that is not properly authenticated. While all +#implementations of the SNMPv2 must be capable of generating +#this trap, the snmpEnableAuthenTraps object indicates +#whether this trap will be generated. +#EDESC diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.ini b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.ini new file mode 100644 index 0000000..9dd556c --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/etc/snmp/snmptt.ini @@ -0,0 +1,626 @@ +# +# SNMPTT v1.4beta2 Configuration File +# +# Linux / Unix +# + +[General] +# Name of this system for $H variable. If blank, system name will be the computer's +# hostname via Sys::Hostname. +snmptt_system_name = + +# Set to either 'standalone' or 'daemon' +# standalone: snmptt called from snmptrapd.conf +# daemon: snmptrapd.conf calls snmptthandler +# Ignored by Windows. See documentation +mode = standalone + +# Set to 1 to allow multiple trap definitions to be executed for the same trap. +# Set to 0 to have it stop after the first match. +# This option should normally be set to 1. See the section 'SNMPTT.CONF Configuration +# file Notes' in the SNMPTT documentation for more information. +# Note: Wildcard matches are only matched if there are NO exact matches. This takes +# into consideration the NODES list. Therefore, if there is a matching trap, but +# the NODES list prevents it from being considered a match, the wildcard entry will +# only be used if there are no other exact matches. +multiple_event = 1 + +# SNMPTRAPD passes the IP address of device sending the trap, and the IP address of the +# actual SNMP agent. These addresses could differ if the trap was sent on behalf of another +# device (relay, proxy etc). +# If DNS is enabled, the agent IP address is converted to a host name using a DNS lookup +# (which includes the local hosts file, depending on how the OS is configured). This name +# will be used for: NODES entry matches, hostname field in logged traps (file / database), +# and the $A variable. Host names on the NODES line will be resolved and the IP address +# will then be used for comparing. +# Set to 0 to disable DNS resolution +# Set to 1 to enable DNS resolution +dns_enable = 0 + +# Set to 0 to enable the use of FQDN (Fully Qualified Domain Names). If a host name is +# passed to SNMPTT that contains a domain name, it will not be altered in any way by +# SNMPTT. This also affects resolve_value_ip_addresses. +# Set to 1 to have SNMPTT strip the domain name from the host name passed to it. For +# example, server01.domain.com would be changed to server01 +# Set to 2 to have SNMPTT strip the domain name from the host name passed to it +# based on the list of domains in strip_domain_list +strip_domain = 0 + +# List of domain names that should be stripped when strip_domain is set to 2. +# List can contain one or more domains. For example, if the FQDN of a host is +# server01.city.domain.com and the list contains domain.com, the 'host' will be +# set as server01.city. +strip_domain_list = < diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/logback.xml b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/logback.xml new file mode 100644 index 0000000..87e3ddc --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/logback.xml @@ -0,0 +1,11 @@ + + + System.err + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/web/zabbix.conf.php b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/web/zabbix.conf.php new file mode 100644 index 0000000..18833ea --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/web/zabbix.conf.php @@ -0,0 +1,20 @@ + diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_agentd.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_agentd.conf new file mode 100644 index 0000000..64b0625 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_agentd.conf @@ -0,0 +1,8 @@ +# This is a configuration file for Zabbix agent daemon (Unix) +# To get more information about Zabbix, visit http://www.zabbix.com + +# Specify value by using environment variables with prefix ZA_ +# For example: ZA_AllowRoot=1 means AllowRoot=1 for zabbix-agent +# If you don't specify envirotnment variable, then default value from Dockerfile +# will be used, or default Zabbix setting value will be used. See: +# https://www.zabbix.com/documentation/3.0/manual/appendix/config/zabbix_agentd diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_java_gateway.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_java_gateway.conf new file mode 100644 index 0000000..99b2153 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_java_gateway.conf @@ -0,0 +1,2 @@ +LISTEN_IP="0.0.0.0" +PID_FILE="/var/run/zabbix_java.pid" diff --git a/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_server.conf b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_server.conf new file mode 100644 index 0000000..0b76a94 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/container-files-zabbix/usr/local/etc/zabbix_server.conf @@ -0,0 +1,9 @@ +# This is a configuration file for Zabbix Server process +# To get more information about Zabbix, +# visit http://www.zabbix.com + +# Specify value by using environment variables with prefix ZS_ +# For example: ZS_AllowRoot=1 means AllowRoot=1 for zabbix-server +# If you don't specify envirotnment variable, then default value from Dockerfile +# will be used, or default Zabbix setting value will be used. See: +# https://www.zabbix.com/documentation/3.0/manual/appendix/config/zabbix_server \ No newline at end of file diff --git a/Dockerfile/dockbix-xxl-4.2/docker-compose-v2.yml b/Dockerfile/dockbix-xxl-4.2/docker-compose-v2.yml new file mode 100644 index 0000000..f712b1b --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/docker-compose-v2.yml @@ -0,0 +1,31 @@ +version: '2' +services: + zabbix-db: + image: monitoringartist/zabbix-db-mariadb + volumes: + - zabbix-db-storage:/var/lib/mysql + - backups:/backups + - /etc/localtime:/etc/localtime:ro + environment: + - MARIADB_USER=zabbix + - MARIADB_PASS=my_password + zabbix-server: + image: monitoringartist/dockbix-xxl:latest + depends_on: + - zabbix-db + ports: + - "80:80" + - "10051:10051" + volumes: + - /etc/localtime:/etc/localtime:ro + links: + - zabbix-db:zabbix.db + environment: + - ZS_DBHost=zabbix.db + - ZS_DBUser=zabbix + - ZS_DBPassword=my_password +volumes: + zabbix-db-storage: + driver: local + backups: + driver: local diff --git a/Dockerfile/dockbix-xxl-4.2/docker-compose.yml b/Dockerfile/dockbix-xxl-4.2/docker-compose.yml new file mode 100644 index 0000000..245f774 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/docker-compose.yml @@ -0,0 +1,29 @@ +zabbix-db-storage: + image: busybox:latest + volumes: + - /var/lib/mysql + +zabbix-db: + image: monitoringartist/zabbix-db-mariadb + volumes: + - /backups:/backups + - /etc/localtime:/etc/localtime:ro + volumes_from: + - zabbix-db-storage + environment: + - MARIADB_USER=zabbix + - MARIADB_PASS=my_password + +zabbix-server: + image: monitoringartist/dockbix-xxl:latest + ports: + - "80:80" + - "10051:10051" + volumes: + - /etc/localtime:/etc/localtime:ro + links: + - zabbix-db:zabbix.db + environment: + - ZS_DBHost=zabbix.db + - ZS_DBUser=zabbix + - ZS_DBPassword=my_password diff --git a/Dockerfile/dockbix-xxl-4.2/retag.sh b/Dockerfile/dockbix-xxl-4.2/retag.sh new file mode 100755 index 0000000..0aedb82 --- /dev/null +++ b/Dockerfile/dockbix-xxl-4.2/retag.sh @@ -0,0 +1,46 @@ +#!/bin/bash +# use on master branch and retag also older tags + +# delete all current tags +git fetch --tags --force +tags=() +for t in `git tag` +do + if [[ "$t" != 4.0* ]]; then + continue + fi + echo "Deleting tag $t" + git tag -d $t + git push origin :refs/tags/$t + tags=("${tags[@]}" "$t") +done +git push origin master +git push origin --tags + +# create tags from the list +tags=('4.0.0' '4.0.1' '4.0.2' '4.0.3' '4.0.4' '4.0.5' '4.0.6'); +for t in "${tags[@]}" +do + echo "Creating tag $t" + git checkout master + sed -i -e "s#^[[:space:]]*ZABBIX_VERSION=.*# ZABBIX_VERSION=tags/$t \\\#" Dockerfile + sleep 5 + git add Dockerfile + sleep 5 + git commit -m "Tag $t" + sleep 5 + git tag -a $t -m "Tag $t" + sleep 5 + last=$t +done +git push origin master +git push origin --tags + +# master is the latest stable tag +git checkout master +sed -i -e "s#^[[:space:]]*ZABBIX_VERSION=.*# ZABBIX_VERSION=tags/4.0.6 \\\#" Dockerfile +sleep 5 +git add Dockerfile +sleep 5 +git commit -m "Master = the latest stable tag" +git push origin master