ban_client.sh 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/bin/bash
  2. set -o errexit
  3. set -o nounset
  4. set -o pipefail
  5. log() {
  6. logger -t "openvpn-ban" -p user.info "$1"
  7. echo "$1" # Также выводим в консоль для обратной связи
  8. }
  9. show_usage() {
  10. echo "Usage: $0 <ccd_file> <ban|unban>"
  11. echo "Example: $0 /etc/openvpn/server/server/ccd/login ban"
  12. exit 1
  13. }
  14. # Проверка прав
  15. check_permissions() {
  16. if [[ $EUID -ne 0 ]]; then
  17. log "Error: This script must be run as root" >&2
  18. exit 1
  19. fi
  20. }
  21. # Проверка что CCD файл находится в правильном пути
  22. check_ccd_path() {
  23. local ccd_file=$1
  24. local expected_path="/etc/openvpn/server"
  25. # Проверяем что путь начинается с /etc/openvpn/server/
  26. if [[ ! "$ccd_file" =~ ^$expected_path/ ]]; then
  27. log "Error: CCD file must be located under $expected_path/"
  28. log "Provided path: $ccd_file"
  29. exit 1
  30. fi
  31. # Дополнительная проверка: файл должен существовать
  32. if [[ ! -f "$ccd_file" ]]; then
  33. log "Error: CCD file does not exist: $ccd_file"
  34. exit 1
  35. fi
  36. # Проверка прав на запись
  37. if [[ ! -w "$ccd_file" ]]; then
  38. log "Error: No write permission for CCD file: $ccd_file"
  39. exit 1
  40. fi
  41. }
  42. main() {
  43. # Проверка прав
  44. check_permissions
  45. # Обработка аргументов
  46. [[ $# -lt 2 ]] && show_usage
  47. local ccd_file=$1
  48. local action=$2
  49. # Проверка пути CCD файла
  50. check_ccd_path "$ccd_file"
  51. local username=$(basename "${ccd_file}")
  52. touch "${ccd_file}"
  53. chmod 640 "${ccd_file}"
  54. chown nobody:nogroup "${ccd_file}"
  55. if grep -q "^disable$" "$ccd_file"; then
  56. is_banned="disable"
  57. else
  58. is_banned=""
  59. fi
  60. case "$action" in
  61. ban)
  62. if [[ -z "$is_banned" ]]; then
  63. log "Ban user: ${username}"
  64. sed -i '1i\disable' "${ccd_file}"
  65. log "User ${username} banned successfully"
  66. else
  67. log "User ${username} is already banned"
  68. fi
  69. ;;
  70. unban)
  71. if [[ -n "$is_banned" ]]; then
  72. log "UnBan user: ${username}"
  73. sed -i '/^disable$/d' "${ccd_file}"
  74. log "User ${username} unbanned successfully"
  75. else
  76. log "User ${username} is not banned"
  77. fi
  78. ;;
  79. *)
  80. log "Error: Invalid action. Use 'ban' or 'unban'" >&2
  81. show_usage
  82. ;;
  83. esac
  84. }
  85. main "$@"