check_connections.sh 2.2 KB

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