5 # Manage settings for the Zabbix installtion and
6 # other monitor-related things
8 # Stephen Soltesz <soltesz@cs.princeton.edu>
9 # Copyright (C) 2008 The Trustees of Princeton University
14 # Source function library and configuration
15 . /etc/plc.d/functions
16 . /etc/planetlab/plc_config
17 local_config=/etc/planetlab/configs/site.xml
19 MONITORPATH=/usr/share/monitor
25 PGDATA=/var/lib/pgsql/data
26 postgresql_conf=$PGDATA/postgresql.conf
27 pghba_conf=$PGDATA/pg_hba.conf
29 # Export so that we do not have to specify -p to psql invocations
30 export PGPORT=$PLC_DB_PORT
33 ZABBIX_DB_USER="zabbixuser"
34 ZABBIX_DB_NAME="zabbix"
36 MONITOR_DB_USER="monitoruser"
37 MONITOR_DB_NAME="monitor"
41 if [ -z "$PLC_MONITOR_IP" ] ; then
42 PLC_MONITOR_IP=$( gethostbyname $PLC_MONITOR_HOST )
45 function check_pg_hba ()
49 #### SETUP ACCESS to this user and database
50 mkdir -p $PGDATA/pg_hba.conf.d
51 CONF=$PGDATA/pg_hba.conf.d/${NAME}.conf
52 if [ ! -f $CONF ] ; then
53 echo "host $NAME $USER 127.0.0.1/32 password" > $CONF
54 echo "host $NAME $USER $PLC_MONITOR_IP/32 password" >> $CONF
56 WROTE_PG_CONFIG="true"
60 function check_user_and_db()
65 # confirm user is present or create it
66 user_present=$( psql -U postgres -c "select * from pg_user;" -d template1 | grep $USER )
67 if [ -z $user_present ] ; then
68 createuser --no-superuser --no-createdb --no-createrole --login --unencrypted --echo $USER -U postgres
72 # confirm database is present or create it
73 db_present=$( psql -U postgres -c "select * from pg_database;" -d template1 | grep $NAME )
74 if [ -z $db_present ] ; then
75 createdb --owner=$USER $NAME -U postgres
79 # Create/update the unprivileged database user and password
80 if [ -z "$PLC_MONITOR_DBPASSWORD" ] ; then
81 # Zabbix doesn't like plain uuidgen passwords
82 PLC_MONITOR_DBPASSWORD=$( uuidgen | md5sum - | awk '{print $1}' )
83 plc-config --category=plc_monitor --variable=dbpassword --value="$PLC_MONITOR_DBPASSWORD" --save=$local_config $local_config
87 if [ -n "$CREATED" ] ; then
88 psql -d template1 -U postgres -c "ALTER USER $USER WITH PASSWORD '$PLC_MONITOR_DBPASSWORD';"
92 function if_present_load ()
95 if [ -f $file ] ; then
96 psql -d $ZABBIX_DB_NAME -U $ZABBIX_DB_USER < $file
99 function check_monitor_schema_and_data()
101 # NOTE: call create_all() to setup the database from the info model.
102 python -c "from monitor.database.info.model import *; from elixir import create_all; create_all()"
105 function check_zabbix_schema_and_data()
107 schema_present=$( psql -U $ZABBIX_DB_USER $ZABBIX_DB_NAME -c "\d;" < /dev/null | grep hosts )
108 if [ -z $schema_present ] ; then
109 echo "... initial import can take SEVERAL minutes. please wait ..."
110 if_present_load "/usr/local/zabbix/misc/create/schema/postgresql.sql"
111 if_present_load "/usr/local/zabbix/misc/create/data/data.sql"
112 if_present_load "/usr/local/zabbix/misc/create/data/images_pgsql.sql"
113 ## TODO: update ZABBIX Server entry, "update hosts set status=0, host='MyPLC Server' where hostid=10017"
117 function check_zabbix_templates_and_import ()
120 COOKIE_FILE=/tmp/cookiejar.txt
122 TEMPLATES_DIR=${MONITORPATH}/zabbix/templates
123 curl -s --cookie $COOKIE_FILE --cookie-jar $COOKIE_FILE \
124 --form "enter=Enter" \
125 --form "name=Admin" \
126 --form "password=zabbix" \
127 "http://${PLC_MONITOR_HOST}/zabbix/index.php?login=1"
129 deleted=$( grep 'deleted' $COOKIE_FILE )
130 if [ -n "$deleted" ] ; then
131 echo "Login to the zabbix web server failed!!!"
135 for file in ${TEMPLATES_DIR}/*.xml ; do
136 # 0 - update , 1 - skip, 0 - add
137 echo "############### IMPORTING $file" >> /var/log/monitor.log
138 curl -s --cookie $COOKIE_FILE --cookie-jar $COOKIE_FILE \
140 --form "import_file=@${file}" \
141 --form "rules[host][exist]=0" \
142 --form "rules[host][missed]=0" \
143 --form "rules[template][exist]=0" \
144 --form "rules[template][missed]=1" \
145 --form "rules[item][exist]=0" \
146 --form "rules[item][missed]=0" \
147 --form "rules[trigger][exist]=0" \
148 --form "rules[trigger][missed]=0" \
149 --form "rules[graph][exist]=0" \
150 --form "rules[graph][missed]=0" \
151 --form "import=Import" \
152 "http://${PLC_MONITOR_HOST}/zabbix/exp_imp.php" >> /var/log/monitor.log
157 function check_monitor_conf ()
159 MONITOR_CONFIG=/etc/monitor.conf
162 # Using plcsh add default, monitor user
163 plcsh <<EOF &>/dev/null
164 AddPerson({'first_name' : 'Monitor', 'last_name' : 'Server', 'password' : '${PLC_MONITOR_DBPASSWORD}', 'email' : '${PLC_MONITOR_EMAIL}'})
165 AddRoleToPerson('admin', '${PLC_MONITOR_EMAIL}')
166 AddPersonToSite('${PLC_MONITOR_EMAIL}', '${PLC_SLICE_PREFIX}')
167 UpdatePerson('${PLC_MONITOR_EMAIL}', { 'enabled' : True, 'password' : '${PLC_MONITOR_DBPASSWORD}' })
170 if [ ! -f ${MONITOR_CONFIG} ] ; then
171 cat <<EOF > ${MONITOR_CONFIG}
173 RT_DB_HOST=rt.planet-lab.org
178 # RT Web user account
179 RT_WEB_SERVER=https://rt.planet-lab.org/
187 API_SERVER=https://${PLC_BOOT_HOST}/PLCAPI/
188 API_AUTH_USER=${PLC_MONITOR_EMAIL}
189 API_AUTH_PASSWORD=${PLC_MONITOR_DBPASSWORD}
192 MONITOR_SCRIPT_ROOT=${MONITORPATH}
193 MONITOR_DATA_ROOT=/var/lib/monitor
194 MONITOR_ARCHIVE_ROOT=/var/lib/monitor/archive-pdb
196 MONITOR_HOSTNAME=${PLC_MONITOR_HOST}
197 MONITOR_IP=${PLC_MONITOR_IP}
199 # used for debug mode
202 # all messages will appear to be from this address
203 from_email=${PLC_MONITOR_EMAIL}
205 # a separate address for support messages
206 support_email=${PLC_MAIL_SUPPORT_ADDRESS}
208 # mailing list copied on all out-going messages
212 monitor_dburi=postgres://${MONITOR_DB_NAME}:${PLC_MONITOR_DBPASSWORD}@localhost:5432/${MONITOR_DB_NAME}
213 zabbix_dburi=postgres://${ZABBIX_DB_USER}:${PLC_MONITOR_DBPASSWORD}@localhost:5432/${ZABBIX_DB_NAME}
217 # Evaluated as true or false
234 function create_httpd_conf ()
236 MONITOR_HTTP_CONF=/etc/httpd/conf.d/monitorweb.conf
238 if [ ! -f ${MONITOR_HTTP_CONF} ] ; then
239 # note: we need to either start this script before httpd, or always
240 # restart httpd, since there's no way to know beyond file's existence
241 # whether the values have changed or not.
242 WROTE_HTTP_CONFIG="true"
245 # TODO: make http port configurable.
246 # TODO: make proxy port configurable.
248 cat <<EOF > ${MONITOR_HTTP_CONF}
252 ServerName ${PLC_MONITOR_HOST}
253 ServerAdmin ${PLC_MONITOR_EMAIL}
257 # NOTE: this appears to alter the global document root, for port 80...
258 # not sure if it's possible to serve two different 'virtualhosts' from
259 # the same port and same hostname with different document roots...
260 #DocumentRoot ${MONITORPATH}/web/MonitorWeb/monitorweb
262 #<Directory "${MONITORPATH}/web/MonitorWeb/monitorweb">
263 # Options Indexes FollowSymLinks
270 Errorlog /var/log/httpd/monitorwebapp-error_log
271 Customlog /var/log/httpd/monitorwebapp-access_log common
273 AddDefaultCharset utf-8
275 #NOTE: This doesn't work as expected.
276 # Load everything out of the DocumentRoot that is static
277 # ProxyPass /monitor/static !
279 ProxyPass /tg_js http://127.0.0.1:8080/tg_js
280 ProxyPassReverse /tg_js http://127.0.0.1:8080/tg_js
282 ProxyPass /monitor http://127.0.0.1:8080
283 ProxyPassReverse /monitor http://127.0.0.1:8080
292 function start_tg_server ()
294 pushd ${MONITORPATH}/web/MonitorWeb/
295 ./start-monitorweb.py ${MONITORPATH}/web/MonitorWeb/prod.cfg &> /var/log/monitorweb.log
299 function check_zab_server ()
301 ZABBIXCFG=/etc/zabbix
302 TMP_FILE=`mktemp /tmp/zbxtmpXXXXXX`
304 if [ -f ${ZABBIXCFG}/zabbix_server.conf ] ; then
305 sed -e "s/#DBHost=.*/DBHost=$PLC_MONITOR_HOST/g" \
306 -e "s#DBName=.*#DBName=$ZABBIX_DB_NAME#g" \
307 -e "s#DBUser=.*#DBUser=$ZABBIX_DB_USER#g" \
308 -e "s#DBPassword=.*#DBPassword=$PLC_MONITOR_DBPASSWORD#g" \
309 -e "s/.*ExternalScripts=.*/ExternalScripts=${MONITORPATH}\/zabbix/g" \
310 ${ZABBIXCFG}/zabbix_server.conf > $TMP_FILE
311 cat $TMP_FILE > ${ZABBIXCFG}/zabbix_server.conf
313 service zabbix_server start
317 function check_zab_agentd ()
319 ZABBIXCFG=/etc/zabbix
320 TMP_FILE=`mktemp /tmp/zbxtmpXXXXXX`
321 if [ -f ${ZABBIXCFG}/zabbix_agentd.conf ] ; then
323 sed -e "s#Server=.*#Server=$PLC_MONITOR_HOST#g" \
324 -e "s#Hostname=.*#Hostname=$HOST#g" \
325 ${ZABBIXCFG}/zabbix_agentd.conf > $TMP_FILE
326 cat $TMP_FILE > ${ZABBIXCFG}/zabbix_agentd.conf
328 service zabbix_agentd start
331 function check_zab_webconfig()
333 # SETUP zabbix gui configuration
334 ZABBIX_WEB_CFG=/var/www/html/zabbix/conf/zabbix.conf.php
335 if [ ! -f $ZABBIX_WEB_CFG ] ; then
336 touch $ZABBIX_WEB_CFG
337 cat <<EOF > $ZABBIX_WEB_CFG
341 \$DB["TYPE"] = "POSTGRESQL";
342 \$DB["SERVER"] = "localhost";
344 \$DB["DATABASE"] = "$ZABBIX_DB_NAME";
345 \$DB["USER"] = "$ZABBIX_DB_USER";
346 \$DB["PASSWORD"] = "$PLC_MONITOR_DBPASSWORD";
347 \$ZBX_SERVER = "$PLC_MONITOR_HOST";
348 \$ZBX_SERVER_PORT = "10051";
349 \$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
352 chmod 644 $ZABBIX_WEB_CFG
356 if [ "$PLC_MONITOR_ENABLED" != "1" ] ; then
362 MESSAGE=$"Bootstrap Monitoring"
365 # DATABASE acces, creation, and data loading
366 check_pg_hba $MONITOR_DB_NAME $MONITOR_DB_USER
367 check_user_and_db $MONITOR_DB_NAME $MONITOR_DB_USER
368 check_monitor_schema_and_data
370 check_pg_hba $ZABBIX_DB_NAME $ZABBIX_DB_USER
371 check_user_and_db $ZABBIX_DB_NAME $ZABBIX_DB_USER
373 if [ -n "$WROTE_PG_CONFIG" ] ; then
374 # NOTE: restart db to enable access by users granted above.
375 service plc restart postgresql
376 service plc restart httpd
379 check_zabbix_schema_and_data
380 check_zabbix_templates_and_import
382 # WRITE default /etc/monitor.conf
385 # create /etc/httpd/conf.d/monitorweb.conf
387 if [ -n "$WROTE_HTTP_CONFIG" ] ; then
388 # NOTE: restart web server to enable access web cfg
389 service plc restart httpd
393 # START zabbix services. SETUP default config files.
402 MESSAGE=$"Syncing PLC db with Zabbix DB"
405 # turn off zabbix server, etc. before writing to the db.
406 service plc stop monitor
408 $MONITORPATH/zabbix/zabbixsync.py --setupglobal &> /var/log/monitor-server
409 # import any templates
410 check_zabbix_templates_and_import
412 service plc start monitor
418 MESSAGE=$"Stopping Monitor"
421 service zabbix_server stop
422 service zabbix_agentd stop
423 # TODO: is there anything to stop?