#!/bin/bash # # priority: 850 # # Manage settings for the Zabbix installtion and # other monitor-related things # # Stephen Soltesz # Copyright (C) 2008 The Trustees of Princeton University # # $Id$ # # Source function library and configuration . /etc/plc.d/functions . /etc/plc.d/monitor.functions . /etc/planetlab/plc_config local_config=/etc/planetlab/configs/site.xml MONITORPATH=/usr/share/monitor WEB_ROOT_PATH=web/MonitorWeb/monitorweb WEB_XML_PATH=static/xml # Be verbose set -x # Default locations PGDATA=/var/lib/pgsql/data postgresql_conf=$PGDATA/postgresql.conf pghba_conf=$PGDATA/pg_hba.conf # Export so that we do not have to specify -p to psql invocations export PGPORT=$PLC_DB_PORT MONITOR_DB_USER=$PLC_MONITOR_DBUSER MONITOR_DB_NAME=$PLC_MONITOR_DBNAME WROTE_PG_CONFIG= if [ -z "$PLC_MONITOR_IP" ] ; then PLC_MONITOR_IP=$( gethostbyname $PLC_MONITOR_HOST ) fi function update_config () { pattern=$1 with=$2 file=$3 sed -i -e "s/$pattern/$with/g" $file } function apply_template () { TEMPLATE=$1 DESTFILE=$2 tmp_file=$(mktemp) cp $TEMPLATE $tmp_file update_config PLC_NAME "$PLC_NAME" $tmp_file update_config PLC_WWW_HOSTNAME $PLC_WWW_HOST $tmp_file update_config MONITOR_HOSTNAME $PLC_MONITOR_HOST $tmp_file cp $tmp_file $DESTFILE rm -f $tmp_file } function check_gadget_config () { for input_file in $MONITORPATH/$WEB_ROOT_PATH/$WEB_XML_PATH/*.in ; do output_file=$MONITORPATH/$WEB_ROOT_PATH/$WEB_XML_PATH/`basename $input_file | sed -e 's/.in\$//'` if [ $input_file -nt $output_file ] ; then apply_template $input_file $output_file fi done } function check_monitor_schema_and_data_init() { # from monitor.functions check_monitor_schema_and_data $MONITORPATH/config.d/init-bootman-sequence.py } function check_monitor_conf () { MONITOR_CONFIG=/etc/monitor.conf # Using plcsh add default, monitor user plcsh </dev/null AddPerson({'first_name' : 'Monitor', 'last_name' : 'Server', 'password' : '${PLC_MONITOR_DBPASSWORD}', 'email' : '${PLC_MONITOR_EMAIL}'}) AddRoleToPerson('admin', '${PLC_MONITOR_EMAIL}') AddPersonToSite('${PLC_MONITOR_EMAIL}', '${PLC_SLICE_PREFIX}') UpdatePerson('${PLC_MONITOR_EMAIL}', { 'enabled' : True, 'password' : '${PLC_MONITOR_DBPASSWORD}' }) EOF if [ ! -f ${MONITOR_CONFIG} ] ; then cat < ${MONITOR_CONFIG} [monitorconfig] # RT Web user account RT_WEB_SERVER=http://${PLC_RT_HOST}/ RT_WEB_TOOLS_PATH=/usr/bin/ RT_WEB_USER=${PLC_RT_WEB_USER} RT_WEB_PASSWORD=${PLC_RT_WEB_PASSWORD} RT_WEB_DEBUG=0 RT_QUEUE=${PLC_MONITOR_RT_QUEUE} # PLC admin account API_SERVER=https://${PLC_API_HOST}:${PLC_API_PORT}/PLCAPI/ API_AUTH_USER=${PLC_MONITOR_EMAIL} API_AUTH_PASSWORD=${PLC_MONITOR_DBPASSWORD} # SERVER PATHS MONITOR_SCRIPT_ROOT=${MONITORPATH} MONITOR_DATA_ROOT=/var/lib/monitor MONITOR_ARCHIVE_ROOT=/var/lib/monitor/archive-pdb MONITOR_BOOTMANAGER_LOG=/var/www/html/monitorlog MONITOR_HOSTNAME=${PLC_MONITOR_HOST} MONITOR_IP=${PLC_MONITOR_IP} PLC_WWW_HOSTNAME=${PLC_WWW_HOST} PLC_NAME=${PLC_NAME} email=${PLC_MONITOR_EMAIL} # all messages will appear to be from this address from_email=${PLC_MONITOR_EMAIL} # a separate address for support messages support_email=${PLC_MAIL_SUPPORT_ADDRESS} # mailing list copied on all out-going messages cc_email=${PLC_MONITOR_CC_EMAIL} exception_email=${PLC_MONITOR_CC_EMAIL} # these are reserved values RT_DB_HOST=${PLC_RT_HOST} RT_DB_USER= RT_DB_PASSWORD= RT_DB_NAME= [monitordatabase] monitor_dburi=postgres://${MONITOR_DB_USER}:${PLC_MONITOR_DBPASSWORD}@${PLC_MONITOR_DBHOST}:5432/${MONITOR_DB_NAME} cachetime=60 # Evaluated as true or false [commandline] cachecalls=True embedded=False zabbix_enabled=False echo=False debug=False mail=True bcc=False run=False checkopt=False squeeze=True policysavedb=True EOF fi } function create_httpd_conf () { MONITOR_HTTP_CONF=/etc/httpd/conf.d/monitorweb.conf if [ ! -f ${MONITOR_HTTP_CONF} ] ; then # note: we need to either start this script before httpd, or always # restart httpd, since there's no way to know beyond file's existence # whether the values have changed or not. WROTE_HTTP_CONFIG="true" fi # TODO: support HTTPS as well as port 80. currently not specifying port # 80 breaks https for other content on the myplc. # TODO: make proxy port configurable. cat < ${MONITOR_HTTP_CONF} # NOTE: I've tried other means of redirection, including mod_rewrite, but did # not have any success. The means below is not idea, b/c it does not keep # non-ssl session as non-ssl. But it works. # NOTE: redirect path without trailing '/' to path with. Favor SSL. Redirect /monitor https://${PLC_MONITOR_HOST}:${PLC_WWW_SSL_PORT}/monitor/ #RedirectMatch ^/$ https://${PLC_MONITOR_HOST}:${PLC_WWW_SSL_PORT}/monitor # NOTE: this directive strips '/monitor/' from the requested path and pastes # the remaining part to the end of the ProxyPass url below. All TG urls # should be relative to their current position, or the absolute path # that includes /monitor/ at the beginning. # TODO: make location configurable. #LogLevel debug #Errorlog /var/log/httpd/monitorwebapp-error_log #Customlog /var/log/httpd/monitorwebapp-access_log common ProxyPass http://127.0.0.1:8082/ ProxyPassReverse http://127.0.0.1:8082/ EOF } function start_tg_server () { stop_tg_server pushd ${MONITORPATH}/web/MonitorWeb/ mkdir -p /var/lib/monitor/monitorweb/ cp /var/log/monitorweb.log /var/lib/monitor/monitorweb/`date +%Y-%m-%d-%H-%M`-monitorweb.log ./start-monitorweb.py ${MONITORPATH}/web/MonitorWeb/prod.cfg &> /var/log/monitorweb.log & popd } function stop_tg_server () { pid=$( cat /var/run/monitorweb.pid ) if [ -n "$pid" ] ; then kill $pid fi } if [ "$PLC_MONITOR_ENABLED" != "1" ] ; then exit 0 fi case "$1" in start) MESSAGE=$"Bootstrap Monitoring (please wait...)" dialog "$MESSAGE" # DATABASE acces, creation, and data loading check_pg_hba $MONITOR_DB_NAME $MONITOR_DB_USER check_user_and_db $MONITOR_DB_NAME $MONITOR_DB_USER # WRITE default /etc/monitor.conf check_monitor_conf check_gadget_config if [ -n "$WROTE_PG_CONFIG" ] ; then # NOTE: restart db to enable access by users granted above. service plc restart postgresql service plc restart httpd MESSAGE=$"Bootstrap Monitoring 2 (please wait...)" dialog "$MESSAGE" fi check_monitor_schema_and_data_init # create /etc/httpd/conf.d/monitorweb.conf create_httpd_conf if [ -n "$WROTE_HTTP_CONFIG" ] ; then # NOTE: restart web server to enable access web cfg service plc restart httpd MESSAGE=$"Bootstrap Monitoring 3 (please wait...)" dialog "$MESSAGE" fi start_tg_server result "$MESSAGE" ;; restartweb) MESSAGE=$"Restarting monitor web app..." dialog "$MESSAGE" stop_tg_server start_tg_server result "$MESSAGE" ;; delete) MESSAGE=$"Deleting databases..." dialog "$MESSAGE" dropdb -U postgres $MONITOR_DB_NAME dropuser -U postgres $MONITOR_DB_USER result "$MESSAGE" ;; stop) MESSAGE=$"Stopping Monitor" dialog "$MESSAGE" stop_tg_server # todo: disable cron entry? result "$MESSAGE" ;; esac exit $ERRORS