 e133b69068
			
		
	
	e133b69068
	
	
	
		
			
			run zabbix-server process in the haproxy namespace Change-Id: Ifaf2b91b67e7d5bc86868049b22f9b3346f6d6d5
		
			
				
	
	
		
			274 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			274 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/sh
 | |
| #
 | |
| #    Copyright 2015 Mirantis, 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.
 | |
| #
 | |
| # Zabbix server OCF script
 | |
| #
 | |
| # Description:  Manages Zabbix server process as a HA resource
 | |
| #
 | |
| # Authors:      Mirantis inc.
 | |
| #
 | |
| # Support:      openstack@lists.launchpad.net
 | |
| #
 | |
| # See usage() function below for more details ...
 | |
| #
 | |
| # OCF instance parameters:
 | |
| #   OCF_RESKEY_binary
 | |
| #   OCF_RESKEY_config
 | |
| #   OCF_RESKEY_user
 | |
| #   OCF_RESKEY_pid
 | |
| #   OCF_RESKEY_additional_parameters
 | |
| #   OCF_RESKEY_namespace
 | |
| #######################################################################
 | |
| # Initialization:
 | |
| 
 | |
| : ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
 | |
| . ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
 | |
| 
 | |
| #######################################################################
 | |
| 
 | |
| # Fill in some defaults if no values are specified
 | |
| 
 | |
| SERVICE_NAME="Zabbix-server"
 | |
| 
 | |
| OCF_RESKEY_binary_default="/usr/sbin/zabbix_server"
 | |
| OCF_RESKEY_pid_default="/var/run/zabbix/zabbix_server.pid"
 | |
| OCF_RESKEY_namespace_default="haproxy"
 | |
| 
 | |
| : ${OCF_RESKEY_binary=${OCF_RESKEY_binary_default}}
 | |
| : ${OCF_RESKEY_pid=${OCF_RESKEY_pid_default}}
 | |
| : ${OCF_RESKEY_namespace=${OCF_RESKEY_namespace_default}}
 | |
| 
 | |
| #######################################################################
 | |
| 
 | |
| usage() {
 | |
|     cat <<UEND
 | |
|         usage: $0 (start|stop|validate-all|meta-data|status|monitor)
 | |
| 
 | |
|         $0 manages the ${SERVICE_NAME} process as an HA resource
 | |
| 
 | |
|         The 'start' operation starts the ${SERVICE_NAME}
 | |
|         The 'stop' operation stops the ${SERVICE_NAME}
 | |
|         The 'validate-all' operation reports whether the parameters are valid
 | |
|         The 'meta-data' operation reports this RA's meta-data information
 | |
|         The 'status' operation reports whether the ${SERVICE_NAME} is running
 | |
|         The 'monitor' operation reports whether the ${SERVICE_NAME} is running
 | |
| 
 | |
| UEND
 | |
| }
 | |
| 
 | |
| meta_data() {
 | |
|     cat <<END
 | |
| <?xml version="1.0"?>
 | |
| <!DOCTYPE resource-agent SYSTEM "ra-api-1.dtd">
 | |
| <resource-agent name="zabbix-server">
 | |
| <version>1.0</version>
 | |
| 
 | |
| <longdesc lang="en">
 | |
| Manages Zabbix server daemon as a Pacemaker Resource.
 | |
| </longdesc>
 | |
| <shortdesc lang="en">Manages Zabbix server</shortdesc>
 | |
| <parameters>
 | |
| 
 | |
| <parameter name="binary" unique="0" required="0">
 | |
| <longdesc lang="en">
 | |
| Name of zabbix-server file that will be run.
 | |
| </longdesc>
 | |
| <shortdesc lang="en">zabbix-server binary file</shortdesc>
 | |
| <content type="string" default="${OCF_RESKEY_binary_default}" />
 | |
| </parameter>
 | |
| 
 | |
| <parameter name="pid" unique="0" required="0">
 | |
| <longdesc lang="en">
 | |
| The pid file to use for this process
 | |
| </longdesc>
 | |
| <shortdesc lang="en">zabbix-server pid file</shortdesc>
 | |
| <content type="string" default="${OCF_RESKEY_pid_default}" />
 | |
| </parameter>
 | |
| 
 | |
| <parameter name="namespace" unique="0" required="0">
 | |
| <longdesc lang="en">
 | |
| The namespace in which this process should be run
 | |
| </longdesc>
 | |
| <shortdesc lang="en">zabbix-server namespace</shortdesc>
 | |
| <content type="string" default="${OCF_RESKEY_namespace_default}" />
 | |
| </parameter>
 | |
| 
 | |
| </parameters>
 | |
| 
 | |
| <actions>
 | |
| <action name="start" timeout="20" />
 | |
| <action name="stop" timeout="20" />
 | |
| <action name="status" timeout="20" />
 | |
| <action name="monitor" timeout="30" interval="20" />
 | |
| <action name="validate-all" timeout="5" />
 | |
| <action name="meta-data" timeout="5" />
 | |
| </actions>
 | |
| </resource-agent>
 | |
| END
 | |
| }
 | |
| 
 | |
| #######################################################################
 | |
| # Functions invoked by resource manager actions
 | |
| 
 | |
| service_validate() {
 | |
|     local rc
 | |
| 
 | |
|     check_binary $OCF_RESKEY_binary
 | |
| 
 | |
|     # A config file on shared storage that is not available
 | |
|     # during probes is OK.
 | |
|     #if [ ! -f $OCF_RESKEY_config ]; then
 | |
|     #    if ! ocf_is_probe; then
 | |
|     #        ocf_log err "Config $OCF_RESKEY_config doesn't exist"
 | |
|     #        return $OCF_ERR_INSTALLED
 | |
|     #    fi
 | |
|     #    ocf_log_warn "Config $OCF_RESKEY_config not available during a probe"
 | |
|     #fi
 | |
| 
 | |
|     true
 | |
| }
 | |
| 
 | |
| service_status() {
 | |
|     local pid
 | |
|     local rc
 | |
| 
 | |
|     if [ ! -f $OCF_RESKEY_pid ]; then
 | |
|         ocf_log info "${SERVICE_NAME} is not running"
 | |
|         return $OCF_NOT_RUNNING
 | |
|     else
 | |
|     pid=`cat $OCF_RESKEY_pid`
 | |
|     fi
 | |
| 
 | |
|     ocf_run -warn kill -s 0 $pid
 | |
|     rc=$?
 | |
|     if [ $rc -eq 0 ]; then
 | |
|         return $OCF_SUCCESS
 | |
|     else
 | |
|         ocf_log info "Old PID file found, but ${SERVICE_NAME} is not running"
 | |
|         return $OCF_NOT_RUNNING
 | |
|     fi
 | |
| }
 | |
| 
 | |
| service_monitor() {
 | |
|   service_status
 | |
| }
 | |
| 
 | |
| service_start() {
 | |
|     local rc
 | |
| 
 | |
|     service_status
 | |
|     rc=$?
 | |
|     if [ $rc -eq $OCF_SUCCESS ]; then
 | |
|         ocf_log info "${SERVICE_NAME} is already running"
 | |
|         return $OCF_SUCCESS
 | |
|     fi
 | |
| 
 | |
|     ip netns exec ${OCF_RESKEY_namespace} ${OCF_RESKEY_binary}
 | |
| 
 | |
|     # Spin waiting for the server to come up.
 | |
|     # Let the CRM/LRM time us out if required
 | |
|     while true; do
 | |
|     service_monitor
 | |
|     rc=$?
 | |
|     [ $rc -eq $OCF_SUCCESS ] && break
 | |
|     if [ $rc -ne $OCF_NOT_RUNNING ]; then
 | |
|         ocf_log err "${SERVICE_NAME} start failed"
 | |
|         exit $OCF_ERR_GENERIC
 | |
|     fi
 | |
|     sleep 1
 | |
|     done
 | |
| 
 | |
|     ocf_log info "${SERVICE_NAME} started"
 | |
|     return $OCF_SUCCESS
 | |
| }
 | |
| 
 | |
| service_stop() {
 | |
|     local rc
 | |
|     local pid
 | |
| 
 | |
|     service_status
 | |
|     rc=$?
 | |
|     if [ $rc -eq $OCF_NOT_RUNNING ]; then
 | |
|         ocf_log info "${SERVICE_NAME} is already stopped"
 | |
|         return $OCF_SUCCESS
 | |
|     fi
 | |
| 
 | |
|     # Try SIGTERM
 | |
|     pid=`cat $OCF_RESKEY_pid`
 | |
|     ocf_run kill -s TERM $pid
 | |
|     rc=$?
 | |
|     if [ $rc -ne 0 ]; then
 | |
|         ocf_log err "${SERVICE_NAME} couldn't be stopped"
 | |
|         exit $OCF_ERR_GENERIC
 | |
|     fi
 | |
| 
 | |
|     # stop waiting
 | |
|     shutdown_timeout=15
 | |
|     if [ -n "$OCF_RESKEY_CRM_meta_timeout" ]; then
 | |
|         shutdown_timeout=$((($OCF_RESKEY_CRM_meta_timeout/1000)-5))
 | |
|     fi
 | |
|     count=0
 | |
|     while [ $count -lt $shutdown_timeout ]; do
 | |
|         service_status
 | |
|         rc=$?
 | |
|         if [ $rc -eq $OCF_NOT_RUNNING ]; then
 | |
|             break
 | |
|         fi
 | |
|         count=`expr $count + 1`
 | |
|         sleep 1
 | |
|         ocf_log debug "${SERVICE_NAME} still hasn't stopped yet. Waiting ..."
 | |
|     done
 | |
| 
 | |
|     service_status
 | |
|     rc=$?
 | |
|     if [ "${rc}" -ne "${OCF_NOT_RUNNING}" ]; then
 | |
|         # SIGTERM didn't help either, try SIGKILL
 | |
|         ocf_log info "${SERVICE_NAME} failed to stop after ${shutdown_timeout}s using SIGTERM. Trying SIGKILL ..."
 | |
|         ocf_run kill -s KILL "${pid}"
 | |
|     fi
 | |
| 
 | |
|     ocf_log info "${SERVICE_NAME} stopped"
 | |
| 
 | |
|     rm -f "${OCF_RESKEY_pid}"
 | |
| 
 | |
|     return "${OCF_SUCCESS}"
 | |
| }
 | |
| 
 | |
| #######################################################################
 | |
| 
 | |
| case "$1" in
 | |
|   meta-data)    meta_data
 | |
|                 exit $OCF_SUCCESS;;
 | |
|   usage|help)   usage
 | |
|                 exit $OCF_SUCCESS;;
 | |
| esac
 | |
| 
 | |
| # Anything except meta-data and help must pass validation
 | |
| service_validate || exit $?
 | |
| 
 | |
| # What kind of method was invoked?
 | |
| case "$1" in
 | |
|   start)        service_start;;
 | |
|   stop)         service_stop;;
 | |
|   status)       service_status;;
 | |
|   monitor)      service_monitor;;
 | |
|   validate-all) ;;
 | |
|   *)            usage
 | |
|                 exit $OCF_ERR_UNIMPLEMENTED;;
 | |
| esac
 | |
| 
 | |
| 
 |