check_connections.sh 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. -e Exact count mode (raise CRITICAL if connection != critical, warn is ignored)
  22. Usage: $0 -s established '( sport = :443 )' -w 800 -c 1000
  23. EOF
  24. }
  25. argcheck() {
  26. # if less than n argument
  27. if [ $ARGC -lt $1 ]; then
  28. echo "Missing arguments! Use \`\`-h'' for help."
  29. exit 1
  30. fi
  31. }
  32. if ! command -v ss >/dev/null 2>&1; then
  33. echo -e "ERROR: ss is not installed or not found in \$PATH!"
  34. exit 1
  35. fi
  36. # Define now to prevent expected number errors
  37. STATE=all
  38. CRIT=100
  39. WARN=50
  40. COUNT=0
  41. ARGC=$#
  42. CHECK=0
  43. EXACT=0
  44. argcheck 1
  45. while getopts "hc:s:f:p:w:e" OPTION
  46. do
  47. case $OPTION in
  48. h)
  49. usage
  50. ;;
  51. s)
  52. STATE="$OPTARG"
  53. CHECK=1
  54. ;;
  55. f)
  56. FILTER="$OPTARG"
  57. CHECK=1
  58. ;;
  59. p)
  60. if [[ $OPTARG == tcp ]]; then
  61. PROTOCOL="-t"
  62. elif [[ $OPTARG == udp ]]; then
  63. PROTOCOL="-u"
  64. elif [[ $OPTARG == inet ]]; then
  65. PROTOCOL="-4"
  66. elif [[ $OPTARG == inet6 ]]; then
  67. PROTOCOL="-6"
  68. else
  69. echo "Error: Protocol or family type no valid!"
  70. exit 1
  71. fi
  72. CHECK=1
  73. ;;
  74. c)
  75. CRIT="$OPTARG"
  76. CHECK=1
  77. ;;
  78. w)
  79. WARN="$OPTARG"
  80. CHECK=1
  81. ;;
  82. e)
  83. EXACT=1
  84. ;;
  85. \?)
  86. exit 1
  87. ;;
  88. esac
  89. done
  90. COUNT=$(ss -n state $STATE $PROTOCOL $FILTER | grep -v 'State\|-Q' | wc -l)
  91. if [ $EXACT -eq 1 ]; then
  92. echo "$COUNT sockets in $STATE state"
  93. if [ $COUNT -ne $CRIT ]; then
  94. exit $CRITICAL
  95. else
  96. exit $OK
  97. fi
  98. elif [ $COUNT -gt $CRIT ]; then
  99. echo "CRITICAL - $COUNT sockets in $STATE state! | connections=$COUNT;$WARN;$CRIT"
  100. exit $CRITICAL
  101. elif [ $COUNT -gt $WARN ]; then
  102. echo "WARNING - $COUNT sockets in $STATE state! | connections=$COUNT;$WARN;$CRIT"
  103. exit $WARNING
  104. else
  105. echo "OK - $COUNT sockets in $STATE state. | connections=$COUNT;$WARN;$CRIT"
  106. exit $OK
  107. fi