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 function check_pg_hba ()
38 #### SETUP ACCESS to this user and database
39 mkdir -p $PGDATA/pg_hba.conf.d
40 ZABCONF=$PGDATA/pg_hba.conf.d/zabbix.conf
41 if [ ! -f $ZABCONF ] ; then
42 echo "host $ZABBIX_DB_NAME $ZABBIX_DB_USER 127.0.0.1/32 password" > $ZABCONF
43 echo "host $ZABBIX_DB_NAME $ZABBIX_DB_USER $PLC_MONITOR_IP/32 password" >> $ZABCONF
45 # NOTE: restart db to enable access by users granted above.
46 service plc restart posgresql
50 function check_user_and_db()
53 # confirm user is present or create it
54 user_present=$( psql -U postgres -c "select * from pg_user;" -d template1 | grep $ZABBIX_DB_USER )
55 if [ -z $user_present ] ; then
56 createuser --no-superuser --no-createdb --no-createrole --login --unencrypted --echo $ZABBIX_DB_USER -U postgres
60 # confirm database is present or create it
61 db_present=$( psql -U postgres -c "select * from pg_database;" -d template1 | grep $ZABBIX_DB_NAME )
62 if [ -z $db_present ] ; then
63 createdb --owner=$ZABBIX_DB_USER $ZABBIX_DB_NAME -U postgres
67 # Create/update the unprivileged database user and password
68 if [ -z "$PLC_MONITOR_DBPASSWORD" ] ; then
69 # Zabbix doesn't like plain uuidgen passwords
70 PLC_MONITOR_DBPASSWORD=$( uuidgen | md5sum - | awk '{print $1}' )
71 plc-config --category=plc_monitor --variable=dbpassword --value="$PLC_MONITOR_DBPASSWORD" --save=$local_config $local_config
75 if [ -n "$CREATED" ] ; then
76 psql -d template1 -U postgres -c "ALTER USER $ZABBIX_DB_USER WITH PASSWORD '$PLC_MONITOR_DBPASSWORD';"
80 function if_present_load ()
83 if [ -f $file ] ; then
84 psql -d $ZABBIX_DB_NAME -U $ZABBIX_DB_USER < $file
88 function check_schema_and_data()
90 schema_present=$( psql -U $ZABBIX_DB_USER $ZABBIX_DB_NAME -c "\d;" < /dev/null | grep hosts )
91 if [ -z $schema_present ] ; then
92 echo "... initial import can take SEVERAL minutes. please wait ..."
93 if_present_load "/usr/local/zabbix/misc/create/schema/postgresql.sql"
94 if_present_load "/usr/local/zabbix/misc/create/data/data.sql"
95 if_present_load "/usr/local/zabbix/misc/create/data/images_pgsql.sql"
96 ## TODO: update ZABBIX Server entry, "update hosts set status=0, host='MyPLC Server' where hostid=10017"
100 function check_templates_and_import ()
103 COOKIE_FILE=/tmp/cookiejar.txt
105 TEMPLATES_DIR=${MONITORPATH}/zabbix/templates
106 curl -s --cookie $COOKIE_FILE --cookie-jar $COOKIE_FILE \
107 --form "enter=Enter" \
108 --form "name=Admin" \
109 --form "password=zabbix" \
110 "http://${PLC_MONITOR_HOST}/zabbix/index.php?login=1"
112 deleted=$( grep 'deleted' $COOKIE_FILE )
113 if [ -n "$deleted" ] ; then
114 echo "Login to the zabbix web server failed!!!"
118 for file in ${TEMPLATES_DIR}/*.xml ; do
119 # 0 - update , 1 - skip, 0 - add
120 echo "############### IMPORTING $file" >> /var/log/monitor.log
121 curl -s --cookie $COOKIE_FILE --cookie-jar $COOKIE_FILE \
123 --form "import_file=@${file}" \
124 --form "rules[host][exist]=0" \
125 --form "rules[host][missed]=0" \
126 --form "rules[template][exist]=0" \
127 --form "rules[template][missed]=1" \
128 --form "rules[item][exist]=0" \
129 --form "rules[item][missed]=0" \
130 --form "rules[trigger][exist]=0" \
131 --form "rules[trigger][missed]=0" \
132 --form "rules[graph][exist]=0" \
133 --form "rules[graph][missed]=0" \
134 --form "import=Import" \
135 "http://${PLC_MONITOR_HOST}/zabbix/exp_imp.php" >> /var/log/monitor.log
140 function check_monitor_conf ()
142 MONITOR_CONFIG=/etc/monitor.conf
144 if [ -z "$PLC_MONITOR_IP" ] ; then
145 PLC_MONITOR_IP=$( gethostbyname $PLC_MONITOR_HOST )
148 # Using plcsh add default, monitor user
149 plcsh <<EOF &>/dev/null
150 AddPerson({'first_name' : 'Monitor', 'last_name' : 'Server', 'password' : '${PLC_MONITOR_DBPASSWORD}', 'email' : '${PLC_MONITOR_EMAIL}'})
151 AddRoleToPerson('admin', '${PLC_MONITOR_EMAIL}')
152 AddPersonToSite('${PLC_MONITOR_EMAIL}', '${PLC_SLICE_PREFIX}')
153 UpdatePerson('${PLC_MONITOR_EMAIL}', { 'enabled' : True, 'password' : '${PLC_MONITOR_DBPASSWORD}' })
156 if [ ! -f ${MONITOR_CONFIG} ] ; then
157 cat <<EOF > ${MONITOR_CONFIG}
159 RT_DB_HOST=rt.planet-lab.org
164 # RT Web user account
165 RT_WEB_SERVER=https://rt.planet-lab.org/
173 API_SERVER=https://${PLC_BOOT_HOST}/PLCAPI/
174 API_AUTH_USER=${PLC_MONITOR_EMAIL}
175 API_AUTH_PASSWORD=${PLC_MONITOR_DBPASSWORD}
178 MONITOR_SCRIPT_ROOT=${MONITORPATH}
179 MONITOR_DATA_ROOT=/var/lib/monitor
180 MONITOR_ARCHIVE_ROOT=/var/lib/monitor/archive-pdb
182 MONITOR_HOSTNAME=${PLC_MONITOR_HOST}
183 MONITOR_IP=${PLC_MONITOR_IP}
185 # used for debug mode
188 # all messages will appear to be from this address
189 from_email=${PLC_MONITOR_EMAIL}
191 # a separate address for support messages
192 support_email=${PLC_MAIL_SUPPORT_ADDRESS}
194 # mailing list copied on all out-going messages
198 monitor_dburi=postgres://monitoruser:${PLC_MONITOR_DBPASSWORD}@localhost:5432/monitor
199 zabbix_dburi=postgres://zabbixuser:${PLC_MONITOR_DBPASSWORD}@localhost:5432/zabbix
217 function check_zab_server ()
219 ZABBIXCFG=/etc/zabbix
220 TMP_FILE=`mktemp /tmp/zbxtmpXXXXXX`
222 if [ -f ${ZABBIXCFG}/zabbix_server.conf ] ; then
223 sed -e "s/#DBHost=.*/DBHost=$PLC_MONITOR_HOST/g" \
224 -e "s#DBName=.*#DBName=$ZABBIX_DB_NAME#g" \
225 -e "s#DBUser=.*#DBUser=$ZABBIX_DB_USER#g" \
226 -e "s#DBPassword=.*#DBPassword=$PLC_MONITOR_DBPASSWORD#g" \
227 ${ZABBIXCFG}/zabbix_server.conf > $TMP_FILE
228 cat $TMP_FILE > ${ZABBIXCFG}/zabbix_server.conf
230 service zabbix_server start
234 function check_zab_agentd ()
236 ZABBIXCFG=/etc/zabbix
237 TMP_FILE=`mktemp /tmp/zbxtmpXXXXXX`
238 if [ -f ${ZABBIXCFG}/zabbix_agentd.conf ] ; then
240 sed -e "s#Server=.*#Server=$PLC_MONITOR_HOST#g" \
241 -e "s#Hostname=.*#Hostname=$HOST#g" \
242 ${ZABBIXCFG}/zabbix_agentd.conf > $TMP_FILE
243 cat $TMP_FILE > ${ZABBIXCFG}/zabbix_agentd.conf
245 service zabbix_agentd start
248 function check_zab_webconfig()
250 # SETUP zabbix gui configuration
251 ZABBIX_WEB_CFG=/var/www/html/zabbix/conf/zabbix.conf.php
252 if [ ! -f $ZABBIX_WEB_CFG ] ; then
253 touch $ZABBIX_WEB_CFG
254 cat <<EOF > $ZABBIX_WEB_CFG
258 \$DB["TYPE"] = "POSTGRESQL";
259 \$DB["SERVER"] = "localhost";
261 \$DB["DATABASE"] = "$ZABBIX_DB_NAME";
262 \$DB["USER"] = "$ZABBIX_DB_USER";
263 \$DB["PASSWORD"] = "$PLC_MONITOR_DBPASSWORD";
264 \$ZBX_SERVER = "$PLC_MONITOR_HOST";
265 \$ZBX_SERVER_PORT = "10051";
266 \$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;
269 chmod 644 $ZABBIX_WEB_CFG
273 if [ "$PLC_MONITOR_ENABLED" != "1" ] ; then
279 MESSAGE=$"Bootstrap Monitoring"
282 # DATABASE acces, creation, and data loading
285 check_schema_and_data
286 check_templates_and_import
288 # WRITE default /etc/monitor.conf
291 # START zabbix services. SETUP default config files.
301 MESSAGE=$"Syncing PLC db with Zabbix DB"
304 # turn off zabbix server, etc. before writing to the db.
305 service plc stop monitor
307 $MONITORPATH/zabbix/zabbixsync.py --setupglobal &> /var/log/monitor-server
308 # import any templates
309 check_templates_and_import
311 service plc start monitor
317 MESSAGE=$"Stopping Monitor"
320 service zabbix_server stop
321 service zabbix_agentd stop
322 # TODO: is there anything to stop?