| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | #!/usr/bin/bash | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | IFS=$'\n' \ | 
					
						
							|  |  |  | 	SITES=("$@") | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | TIMEOUT=${TIMEOUT:=10} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | HTTP_TRIES=${HTTP_TRIES:=2} | 
					
						
							|  |  |  | HTTP_SAFE=${HTTP_SAFE:=no} | 
					
						
							|  |  |  | HTTP_OK_STATUS=${HTTP_OK_STATUS:='2[0-9][0-9]|30[1-9]|401|501'} | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-02 23:31:03 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # Help... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | case $1 in | 
					
						
							|  |  |  | 	-h|--help) | 
					
						
							|  |  |  | 		echo "Do a status check on URL(s)." | 
					
						
							|  |  |  | 		echo | 
					
						
							|  |  |  | 		echo "Suage:" | 
					
						
							|  |  |  | 		echo "    `basename $0` URL ..." | 
					
						
							|  |  |  | 		echo | 
					
						
							|  |  |  | 		echo "Supported URL formats and schemes:" | 
					
						
							|  |  |  | 		echo "    http://<url>" | 
					
						
							|  |  |  | 		echo "    https://<url>" | 
					
						
							|  |  |  | 		echo "        Check if <url> is reachable via http/https." | 
					
						
							|  |  |  | 		echo "    ssh://<url>[:<port>]" | 
					
						
							|  |  |  | 		echo "        Check if <url> has an open port with a listening ssh server." | 
					
						
							|  |  |  | 		echo "    git://<url>[:<port>]" | 
					
						
							|  |  |  | 		echo "        The same as ssh://..." | 
					
						
							|  |  |  | 		echo "    ovpn://<url>[:<port>]" | 
					
						
							|  |  |  | 		echo "        Check if an OpenVPN server is listening on <url>." | 
					
						
							|  |  |  | 		echo "        NOTE: this will not work if 'tls-auth' is enabled but the thing was" | 
					
						
							|  |  |  | 		echo "            already implemented when I found out about this." | 
					
						
							|  |  |  | 		echo "    lxc://<ct-id>:<comman>:<args>" | 
					
						
							|  |  |  | 		echo "        Proxmox-specific set of checks." | 
					
						
							|  |  |  | 		exit | 
					
						
							|  |  |  | 		;; | 
					
						
							|  |  |  | 	*) | 
					
						
							|  |  |  | 		;; | 
					
						
							|  |  |  | esac | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | source .pct-helpers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # Handlers... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare -A HANDLERS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
					
						
							|  |  |  | # Proxmox lxc | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	lxc://<id>:<cmd>:<value> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # supported commands: | 
					
						
							|  |  |  | #	status:<status> | 
					
						
							|  |  |  | #	ip:<dev>=<ip> | 
					
						
							|  |  |  | #	service:<name>=<status> | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HANDLERS[lxc]=check-lxc | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | declare -A LXC_HANDLERS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LXC_HANDLERS[status]=check-lxc-status | 
					
						
							|  |  |  | check-lxc-status(){ | 
					
						
							|  |  |  | 	local status=`pct status $1` | 
					
						
							|  |  |  | 	status=${status/status: /} | 
					
						
							|  |  |  | 	[ "$status" = "$2" ] \ | 
					
						
							|  |  |  | 		&& echo "OK" \ | 
					
						
							|  |  |  | 		|| echo "ERROR" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LXC_HANDLERS[ip]=check-lxc-ip | 
					
						
							|  |  |  | check-lxc-ip(){ | 
					
						
							|  |  |  | 	local dev=${2/=*/} | 
					
						
							|  |  |  | 	local ip=${2/*=/} | 
					
						
							|  |  |  | 	local res=$(\ | 
					
						
							|  |  |  | 		lxc-attach $1 ip a show dev $dev \ | 
					
						
							|  |  |  | 			| awk '/inet / {print $2}') | 
					
						
							|  |  |  | 	[ "$ip" = "$res" ] \ | 
					
						
							|  |  |  | 		&& echo "OK" \ | 
					
						
							|  |  |  | 		|| echo "ERROR" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | LXC_HANDLERS[service]=check-lxc-service | 
					
						
							|  |  |  | check-lxc-service(){ | 
					
						
							|  |  |  | 	local service=${2/=*/} | 
					
						
							|  |  |  | 	local status=${2/*=/} | 
					
						
							|  |  |  | 	local res=$(\ | 
					
						
							|  |  |  | 		lxc-attach $1 systemctl status $service \ | 
					
						
							|  |  |  | 			| awk '/Active: / {print $2}') | 
					
						
							|  |  |  | 	[ "$status" = "$res" ] \ | 
					
						
							|  |  |  | 		&& echo "OK" \ | 
					
						
							|  |  |  | 		|| echo "ERROR" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | check-lxc(){ | 
					
						
							|  |  |  | 	local target=`sed \ | 
					
						
							|  |  |  | 			-e 's/^.*\s*lxc:\/\///' \ | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	local cmd=`sed 's/^[^:]*://' <<<$target` | 
					
						
							|  |  |  | 	target=${target/:*/} | 
					
						
							|  |  |  | 	local value=`sed 's/^[^:]*://' <<<$cmd` | 
					
						
							|  |  |  | 	cmd=${cmd/:*/} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if [ -z ${LXC_HANDLERS[$cmd]} ] ; then | 
					
						
							|  |  |  | 			echo "ERROR (unknown command: $cmd)" | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	${LXC_HANDLERS[$cmd]} "$target" "$value" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
					
						
							|  |  |  | # OpenVPN  | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # NOTE: this will not work if 'tls-auth' is enabled... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HANDLERS[ovpn]=check-ovpn | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | check-ovpn(){ | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 	local target=`sed \ | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 			-e 's/^.*\s*ovpn:\/\///' \ | 
					
						
							|  |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							|  |  |  | 	local port=`cut -sd ':' -f 2 <<<$target` | 
					
						
							|  |  |  | 	port=${port:=1194} | 
					
						
							|  |  |  | 	target=`cut -d ':' -f 1 <<<$target` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	local res=$(echo -e "\x38\x01\x00\x00\x00\x00\x00\x00\x00" \ | 
					
						
							|  |  |  | 		| timeout $TIMEOUT nc -u 46.138.244.248 5555 \ | 
					
						
							|  |  |  | 		| cat -v) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if [ -z $res ] ; then | 
					
						
							|  |  |  | 		echo ERROR | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		echo OK | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
					
						
							|  |  |  | # SSH | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HANDLERS[ssh]=check-ssh | 
					
						
							|  |  |  | HANDLERS[git]=check-ssh | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | check-ssh(){ | 
					
						
							|  |  |  | 	local target=`sed \ | 
					
						
							|  |  |  | 			-e 's/^.*\s*\(ssh\|git\):\/\///' \ | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	local port=`cut -sd ':' -f 2 <<<$target` | 
					
						
							|  |  |  | 	port=${port:=22} | 
					
						
							|  |  |  | 	target=`cut -d ':' -f 1 <<<$target` | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# open port... | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	response=$(\ | 
					
						
							|  |  |  | 		[ $(sleep $TIMEOUT \ | 
					
						
							|  |  |  | 				| telnet $target $port 2> /dev/null \ | 
					
						
							|  |  |  | 				| grep SSH) ] \ | 
					
						
							|  |  |  | 			&& echo "OK" \ | 
					
						
							|  |  |  | 			|| echo "ERROR" ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	echo $response | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
					
						
							|  |  |  | # HTTP/HTTPS | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | HANDLERS[http]=check-http | 
					
						
							|  |  |  | HANDLERS[https]=check-http | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | status_pattern="\(${HTTP_OK_STATUS//|/\\|}\)" | 
					
						
							|  |  |  | check-http(){ | 
					
						
							|  |  |  | 	local target=`sed \ | 
					
						
							|  |  |  | 			-e 's/^.*\s*\(https\?:\/\/\)/\1/' \ | 
					
						
							|  |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# http/https | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	if [ "$HTTP_SAFE" = "no" ] ; then | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 		local safe=--no-check-certificate | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		local safe | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 	local response=$(\ | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 		wget -S --spider -T $TIMEOUT --tries=$HTTP_TRIES $safe $target 2>&1 \ | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 			| awk '/HTTP\// {print $2}' ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	if [ "$(grep "$status_pattern" <<<$response)" ] ; then | 
					
						
							|  |  |  | 		response=OK | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		response="ERROR ($response)" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	echo $response | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PROTOCOLS=$(printf "\\|%s" "${!HANDLERS[@]}") | 
					
						
							|  |  |  | PROTOCOLS=${PROTOCOLS:2} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | check(){ | 
					
						
							|  |  |  | 	local comment=`sed \ | 
					
						
							|  |  |  | 			-e 's/^\(.*\)\('"$PROTOCOLS"'\):\/\/.*$/\1/' \ | 
					
						
							|  |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							|  |  |  | 	local target=`sed \ | 
					
						
							|  |  |  | 			-e 's/^.*\s*\(\('"$PROTOCOLS"'\):\/\/\)/\1/' \ | 
					
						
							|  |  |  | 			-e 's/^\s*//;s/\s*$//' \ | 
					
						
							|  |  |  | 		<<<$1` | 
					
						
							|  |  |  | 	local scheme=`sed 's/\('"$PROTOCOLS"'\):\/\/.*/\1/' \ | 
					
						
							|  |  |  | 		<<<$target` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 	echo "COMMENT=$comment" | 
					
						
							|  |  |  | 	echo "URL=$target" | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	# call the checker... | 
					
						
							|  |  |  | 	echo "RESPONSE=$(${HANDLERS[$scheme]} "$target")" | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | problems= | 
					
						
							|  |  |  | for site in ${SITES[@]} ; do | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	# skip things we do not recognize... | 
					
						
							|  |  |  | 	if ! [ "$(grep "$PROTOCOLS://" <<<$site)" ] ; then | 
					
						
							|  |  |  | 		echo $site | 
					
						
							|  |  |  | 		continue | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 	IFS=$'\n' \ | 
					
						
							|  |  |  | 		res=($(check "$site")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	comment=${res[0]/COMMENT=/} | 
					
						
							|  |  |  | 	site=${res[1]/URL=/} | 
					
						
							|  |  |  | 	res=${res[2]/RESPONSE=/} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:54:21 +03:00
										 |  |  | 	if [ -z $res ] ; then | 
					
						
							|  |  |  | 		res='Timeout?' | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | 	! [ -z $comment ] \ | 
					
						
							|  |  |  | 		&& comment="$comment " | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 	echo "${comment}${site} : ${res}" | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [ $problems ] ; then | 
					
						
							|  |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-06-26 21:53:39 +03:00
										 |  |  | # vim:set ts=4 sw=4 : |