on 12-Mar-2015 14:57
Problem this snippet solves:
External HTTP monitor script that sends a POST request to the pool member to which it is applied, marking it up if the expected response is received. URI, POST data, and response string are user-configurable. cURL by default uses HTTP/1.1 and, since no hostname is specified in the cURL command, inserts the IP address in the Host header.
NOTE: Use external monitors only when a built-in monitor won't do the trick. This monitor is intended as an example of using cURL (which offers a large number of other useful options) to perform a POST. More basic HTTP monitors are much more efficiently configured using the built-in HTTP monitor template instead.
UPDATE: The script below had a logic error in it where by it was using the NODE and PORT variables to create a PID file before the variables were defined. This meant that if your monitor took long enough to run the PID running monitor was killed before it finished and a new process ran in its place. This gave the appearence of the monitor not functioning correctly. I have corrected this below.
How to use this snippet:
Create a monitor profile of type "External" with the following values:
Adjust the interval and timeout as appropriate for your application
Jan 3 00:00:00 local/bigip err logger: EAV exceeded runtime needed to kill 10.0.0.10:80
If the interval and timeout is smaller then the execution time of the script, the monitor marks the element down and logs a message in /var/log/ltm. This is a false negative. To fix this, please increase the interval and timeout accordingly.
Code :
#!/bin/sh # # (c) Copyright 1996-2007 F5 Networks, Inc. # # This software is confidential and may contain trade secrets that are the # property of F5 Networks, Inc. No part of the software may be disclosed # to other parties without the express written consent of F5 Networks, Inc. # It is against the law to copy the software. No part of the software may # be reproduced, transmitted, or distributed in any form or by any means, # electronic or mechanical, including photocopying, recording, or information # storage and retrieval systems, for any purpose without the express written # permission of F5 Networks, Inc. Our services are only available for legal # users of the program, for instance in the event that we extend our services # by offering the updating of files via the Internet. # # @(#) $Id: http_monitor_cURL+POST,v 1.0 2007/06/28 16:36:11 deb Exp $ # (based on sample_monitor,v 1.3 2005/02/04 18:47:17 saxon) # # # these arguments supplied automatically for all external monitors: # $1 = IP (nnn.nnn.nnn.nnn notation) # $2 = port (decimal, host byte order) # # additional command line arguments ($3 and higher) may be specified in the monitor template # This example does not expect any additional command line arguments # # Name/Value pairs may also be specified in the monitor template # This example expects the following Name/Value pairs: # URI = the URI to which the POST will be sent # DATA = the POST data to send to the server # RECV = the expected response (not case sensitive) # # remove IPv6/IPv4 compatibility prefix (LTM passes addresses in IPv6 format) NODE=`echo ${1} | sed 's/::ffff://'` PORT=${2} PIDFILE="/var/run/`basename ${0}`.${NODE}_${PORT}.pid" # kill of the last instance of this monitor if hung and log current pid if [ -f $PIDFILE ] then echo "EAV exceeded runtime needed to kill ${IP}:${PORT}" | logger -p local0.error kill -9 `cat $PIDFILE` > /dev/null 2>&1 fi echo "$$" > $PIDFILE # send request & check for expected response curl -fNs http://${NODE}:${PORT}${URI} -d "${DATA}" | grep -i "${RECV}" 2>&1 > /dev/null # mark node UP if expected response was received if [ $? -eq 0 ] then # Remove the PID file rm -f $PIDFILE echo "UP" else # Remove the PID file rm -f $PIDFILE fi exit
lol, and still no example of the actual command use....Dev Central notorious for lack of command examples
The above steps might not exactly work, but are good enough to point you in the right directions.
STEPS:
STEP #7 in an important step. If STEP 7 is skipped then you can see the following errors in /var/log/monitors/<name> (if monitor logging is enabled)
l_up=0 immed=0 next_ping=[1564634525.155247][2019-08-01 12:42:05] last_ping=[1564634520.236345][2019-08-01 12:42:00] deadline=[1564634523.946757][2019-08-01 12:42:03] on_service_list=True snd_cnt=12 rcv_cnt=0 ]
[0][6419] 2019-08-01 12:42:00.237862: ID 79 :(spawn_external_pinger): EAV execve: No such file or directory
[0][6419] 2019-08-01 12:42:00.238338: ID 79 :(_main_loop): Service ready for read, now=[1564634520.238304][2019-08-01 12:42:00] [ addr=::ffff:10.200.143.252:80 srcaddr=::%0:0 fd=13 pend=0 #conn=0 ]
[0][6419] 2019-08-01 12:42:00.238374: ID 79 :(_recv_external_node_ping): reading [ addr=::ffff:x.x.x.x:80 ]
[0][6419] 2019-08-01 12:42:00.238397: ID 79 :(recv_external_node_ping): EAV failed [ addr=::ffff:x.x.x.x:80 ]
[0][6419] 2019-08-01 12:42:00.238421: ID 79 :(_kill_external_pinger): killing pid=2642 [ addr=::ffff:x.x.x.x:80 fd=13 ]