check_connections.sh 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #!/usr/bin/env bash
  2. # Author: Jon Schipp <jonschipp@gmail.com, jschipp@illinois.edu>
  3. # Nagios Exit Codes
  4. OK=0
  5. WARNING=1
  6. CRITICAL=2
  7. UNKNOWN=3
  8. usage()
  9. {
  10. cat <<EOF
  11. Check the number of connections/sockets in a given state.
  12. Uses iproute2's ss tool to retrieve connections.
  13. Options:
  14. -s State of connection (def: all)
  15. (established, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait,
  16. closed, close-wait, last-ack, listen, and closing)
  17. -f Apply quoted ss expression filter e.g. '( dst 192.168.1/24 and dport >= :1024 )'
  18. -p <type> Set protocol or family type (udp/tcp/inet/inet6)
  19. -c Critical threshold as an integer
  20. -w Warning threshold as an integer
  21. Usage: $0 -s established '( sport = :443 )' -w 800 -c 1000
  22. EOF
  23. }
  24. argcheck() {
  25. # if less than n argument
  26. if [ $ARGC -lt $1 ]; then
  27. echo "Missing arguments! Use \`\`-h'' for help."
  28. exit 1
  29. fi
  30. }
  31. if ! command -v ss >/dev/null 2>&1; then
  32. echo -e "ERROR: ss is not installed or not found in \$PATH!"
  33. exit 1
  34. fi
  35. # Define now to prevent expected number errors
  36. STATE=all
  37. CRIT=0
  38. WARN=0
  39. COUNT=0
  40. ARGC=$#
  41. CHECK=0
  42. argcheck 1
  43. while getopts "hc:s:f:p:w:" OPTION
  44. do
  45. case $OPTION in
  46. h)
  47. usage
  48. ;;
  49. s)
  50. STATE="$OPTARG"
  51. CHECK=1
  52. ;;
  53. f)
  54. FILTER="$OPTARG"
  55. CHECK=1
  56. ;;
  57. p)
  58. if [[ $OPTARG == tcp ]]; then
  59. PROTOCOL="-t"
  60. elif [[ $OPTARG == udp ]]; then
  61. PROTOCOL="-u"
  62. elif [[ $OPTARG == inet ]]; then
  63. PROTOCOL="-4"
  64. elif [[ $OPTARG == inet6 ]]; then
  65. PROTOCOL="-6"
  66. else
  67. echo "Error: Protocol or family type no valid!"
  68. exit 1
  69. fi
  70. CHECK=1
  71. ;;
  72. c)
  73. CRIT="$OPTARG"
  74. CHECK=1
  75. ;;
  76. w)
  77. WARN="$OPTARG"
  78. CHECK=1
  79. ;;
  80. \?)
  81. exit 1
  82. ;;
  83. esac
  84. done
  85. COUNT=$(ss -n state $STATE $PROTOCOL $FILTER | grep -v 'State\|-Q' | wc -l)
  86. if [ $COUNT -gt $CRIT ]; then
  87. echo "$COUNT sockets in $STATE state!"
  88. exit $CRITICAL
  89. elif [ $COUNT -gt $WARN ]; then
  90. echo "$COUNT sockets in $STATE state!"
  91. exit $WARNING
  92. else
  93. echo "$COUNT sockets in $STATE state."
  94. exit $OK
  95. fi