#!name = HTTPCONTENT_PROBE ######################################################################################## # # Description : # Script sends a http 1.0 GET request to a webserver to test if the server return # page is certain content-type. Probe success only if server returns the Content-type # header with a configured value. # # CSM version : # 3.1+ # # Parameters : # [debugFlag] # regquestHeader - HTTP request to send e.g "GET /yahoo.html HTTP/1.0" # expectFileType - file type expected e.g text # debugFlag - default 0. Do NOT turn on while multiple probes are configured # # Example config : # probe httpProbe script # script HTTPCONTENT_PROBE "GET /index.html HTTP/1.0" text [0] # ######################################################################################## #------------------------------------------- # debug procedure # set the EXIT_MSG environment varaible to help debug # also print the debug message when debug flag is on #------------------------------------------- proc csm_debug { msg } { global debug ip port EXIT_MSG set EXIT_MSG $msg if { [ info exists ip ] && [ info exists port ] } { set EXIT_MSG "[ info script ]:$ip:$port: $EXIT_MSG " } if { [ info exists debug ] && $debug } { puts $EXIT_MSG } } #------------------------------------------- # main #------------------------------------------- # parse cmd line args and initialize variables csm_debug "initializing varaible" if { $argc < 2 } { set EXIT_MSG "ERR config: script HTTPCONTENT_PROBE HTTP request to send e.g "GET /yahoo.html HTTP/1.0" # file type expected e.g text # [debug] optional debug flag # # Example config : # probe httpProbe script # script HTTP_PROBE_SCRIPT "GET /index.html HTTP/1.0" html 0 # ##################################################################### #------------------------------------------- # debug procedure # set the EXIT_MSG environment varaible to help debug # also print the debug message when debug flag is on #------------------------------------------- proc set_exit_msg { msg } { global debug ip port EXIT_MSG set EXIT_MSG $msg if { [ info exists ip ] && [ info exists port ] } { set EXIT_MSG "[ info script ]:$ip:$port: $EXIT_MSG " } if { [ info exists debug ] && $debug } { puts $EXIT_MSG } } #------------------------------------------- # main #------------------------------------------- # parse cmd line args and initialize variables set_exit_msg "initializing varaible" if { $argc != 3 } { set_exit_msg "[ info script ] paramaters : " exit 5001 } set ip $csm_env(realIP) set port $csm_env(realPort) # if port is zero the use well known http port 80 if { $port == 0} { set port 80 } set requestHeader [ lindex $argv 0 ] set expectFileType [ lindex $argv 1 ] set debug [ lindex $argv 2 ] # open connection set_exit_msg "opening socket" set sock [ socket $ip $port ] # send http requeset to server set_exit_msg "sending request : $requestHeader" puts -nonewline $sock "$requestHeader\n\n" flush $sock # read string back from server set_exit_msg "receiving response" set lines [ read $sock ] # close connection set_exit_msg "closing socket" close $sock # parsing http response to decide if probe success or failed # all the following condition casing probe faile. should return exit 5001 if { ![ regexp -nocase "^HTTP/1\.\[0-9\] (\[0-9\]\[0-9\]\[0-9\])" $lines match statuscode ] } { set_exit_msg "probe fail : can't find status code" exit 5001 } if { $statuscode != "200" } { set_exit_msg "probe fail : status code is $statuscode" exit 5001 } if { ![ regexp -nocase "Content-Type *:(.*)\n" $lines match foundContentType] } { set_exit_msg "probe fail : does not found \'Content-Type\' header" exit 5001 } if { ![ regexp "$expectFileType" $foundContentType] } { set_exit_msg "probe fail : expect content-type \'$expectFileType\', but got \'$foundContentType\'" exit 5001 } # Everything went fine. probe exit with success exit_code 5000 set_exit_msg "probe success" exit 5000