ip.sh 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. #!/bin/bash
  2. #===========================================================================#
  3. # #
  4. # Hestia Control Panel - IP/Network Function Library #
  5. # #
  6. #===========================================================================#
  7. # Global definitions
  8. REGEX_IPV4="^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}$"
  9. # Check ip ownership
  10. is_ip_owner() {
  11. owner=$(grep 'OWNER=' $HESTIA/data/ips/$ip | cut -f 2 -d \')
  12. if [ "$owner" != "$user" ]; then
  13. check_result "$E_FORBIDEN" "$ip is not owned by $user"
  14. fi
  15. }
  16. # Check if ip address is free
  17. is_ip_free() {
  18. if [ -e "$HESTIA/data/ips/$ip" ]; then
  19. check_result "$E_EXISTS" "$ip is already exists"
  20. fi
  21. }
  22. # Check ip address specific value
  23. is_ip_key_empty() {
  24. key="$1"
  25. string=$(cat $HESTIA/data/ips/$ip)
  26. eval $string
  27. eval value="$key"
  28. if [ -n "$value" ] && [ "$value" != '0' ]; then
  29. key="$(echo $key | sed -e "s/\$U_//")"
  30. check_result "$E_EXISTS" "IP is in use / $key = $value"
  31. fi
  32. }
  33. is_ip_rdns_valid() {
  34. local ip="$1"
  35. local network_ip=$(echo $ip | cut -d"." -f1-3)
  36. local awk_ip=$(echo $network_ip | sed 's|\.|/\&\&/|g')
  37. local rev_awk_ip=$(echo $awk_ip | rev)
  38. if [ -z "$rdns" ]; then
  39. local rdns=$(dig +short -x "$ip" | head -n 1 | sed 's/.$//') || unset rdns
  40. fi
  41. if [ -n "$rdns" ] && [ ! $(echo $rdns | awk "/$awk_ip/ || /$rev_awk_ip/") ]; then
  42. echo $rdns
  43. return 0 # True
  44. fi
  45. return 1 # False
  46. }
  47. # Update ip address value
  48. update_ip_value() {
  49. key="$1"
  50. value="$2"
  51. conf="$HESTIA/data/ips/$ip"
  52. str=$(cat $conf)
  53. eval $str
  54. c_key=$(echo "${key//$/}")
  55. eval old="${key}"
  56. old=$(echo "$old" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
  57. new=$(echo "$value" | sed -e 's/\\/\\\\/g' -e 's/&/\\&/g' -e 's/\//\\\//g')
  58. sed -i "$str_number s/$c_key='${old//\*/\\*}'/$c_key='${new//\*/\\*}'/g" \
  59. $conf
  60. }
  61. # New method that is improved on a later date we need to check if we can improve it for other locations
  62. update_ip_value_new() {
  63. key="$1"
  64. value="$2"
  65. conf="$HESTIA/data/ips/$ip"
  66. check_ckey=$(grep "^$key='" $conf)
  67. if [ -z "$check_ckey" ]; then
  68. echo "$key='$value'" >> $conf
  69. else
  70. sed -i "s|^$key=.*|$key='$value'|g" $conf
  71. fi
  72. }
  73. # Get ip name
  74. get_ip_alias() {
  75. ip_name=$(grep "NAME=" $HESTIA/data/ips/$local_ip | cut -f 2 -d \')
  76. if [ -n "$ip_name" ]; then
  77. echo "${1//./-}.$ip_name"
  78. fi
  79. }
  80. # Increase ip value
  81. increase_ip_value() {
  82. sip=${1-ip}
  83. USER=${2-$user}
  84. web_key='U_WEB_DOMAINS'
  85. usr_key='U_SYS_USERS'
  86. current_web=$(grep "$web_key=" $HESTIA/data/ips/$sip | cut -f 2 -d \')
  87. current_usr=$(grep "$usr_key=" $HESTIA/data/ips/$sip | cut -f 2 -d \')
  88. if [ -z "$current_web" ]; then
  89. echo "Error: Parsing error"
  90. log_event "$E_PARSING" "$ARGUMENTS"
  91. exit "$E_PARSING"
  92. fi
  93. new_web=$((current_web + 1))
  94. if [ -z "$current_usr" ]; then
  95. new_usr="$USER"
  96. else
  97. check_usr=$(echo -e "${current_usr//,/\\n}" | grep -x "$USER")
  98. if [ -z "$check_usr" ]; then
  99. new_usr="$current_usr,$USER"
  100. else
  101. new_usr="$current_usr"
  102. fi
  103. fi
  104. # Make sure users list does not contain duplicates
  105. new_usr=$(echo "$new_usr" \
  106. | sed "s/,/\n/g" \
  107. | sort -u \
  108. | sed ':a;N;$!ba;s/\n/,/g')
  109. sed -i "s/$web_key='$current_web'/$web_key='$new_web'/g" \
  110. $HESTIA/data/ips/$sip
  111. sed -i "s/$usr_key='$current_usr'/$usr_key='$new_usr'/g" \
  112. $HESTIA/data/ips/$sip
  113. }
  114. # Decrease ip value
  115. decrease_ip_value() {
  116. sip=${1-ip}
  117. local user=${2-$user}
  118. web_key='U_WEB_DOMAINS'
  119. usr_key='U_SYS_USERS'
  120. current_web=$(grep "$web_key=" $HESTIA/data/ips/$sip | cut -f 2 -d \')
  121. current_usr=$(grep "$usr_key=" $HESTIA/data/ips/$sip | cut -f 2 -d \')
  122. if [ -z "$current_web" ]; then
  123. check_result $E_PARSING "Parsing error"
  124. fi
  125. new_web=$((current_web - 1))
  126. check_ip=$(grep $sip $USER_DATA/web.conf | wc -l)
  127. if [[ $check_ip = 0 ]]; then
  128. new_usr=$(echo "$current_usr" \
  129. | sed "s/,/\n/g" \
  130. | sed "s/^$user$//g" \
  131. | sed "/^$/d" \
  132. | sort -u \
  133. | sed ':a;N;$!ba;s/\n/,/g')
  134. else
  135. new_usr="$current_usr"
  136. fi
  137. sed -i "s/$web_key='$current_web'/$web_key='$new_web'/g" \
  138. $HESTIA/data/ips/$sip
  139. sed -i "s/$usr_key='$current_usr'/$usr_key='$new_usr'/g" \
  140. $HESTIA/data/ips/$sip
  141. }
  142. # Get ip address value
  143. get_ip_value() {
  144. key="$1"
  145. string=$(cat $HESTIA/data/ips/$ip)
  146. eval $string
  147. eval value="$key"
  148. echo "$value"
  149. }
  150. # Get real ip address
  151. get_real_ip() {
  152. if [ -e "$HESTIA/data/ips/$1" ]; then
  153. echo "$1"
  154. else
  155. nat=$(grep -H "^NAT='$1'" $HESTIA/data/ips/* | head -n1)
  156. if [ -n "$nat" ]; then
  157. echo "$nat" | cut -f 1 -d : | cut -f 7 -d /
  158. fi
  159. fi
  160. }
  161. # Convert CIDR to netmask
  162. convert_cidr() {
  163. set -- $((5 - ($1 / 8))) 255 255 255 255 \
  164. $(((255 << (8 - ($1 % 8))) & 255)) 0 0 0
  165. if [[ $1 -gt 1 ]]; then
  166. shift $1
  167. else
  168. shift
  169. fi
  170. echo ${1-0}.${2-0}.${3-0}.${4-0}
  171. }
  172. # Convert netmask to CIDR
  173. convert_netmask() {
  174. nbits=0
  175. IFS=.
  176. for dec in $1; do
  177. case $dec in
  178. 255) let nbits+=8 ;;
  179. 254) let nbits+=7 ;;
  180. 252) let nbits+=6 ;;
  181. 248) let nbits+=5 ;;
  182. 240) let nbits+=4 ;;
  183. 224) let nbits+=3 ;;
  184. 192) let nbits+=2 ;;
  185. 128) let nbits+=1 ;;
  186. 0) ;;
  187. esac
  188. done
  189. echo "$nbits"
  190. }
  191. # Calculate broadcast address
  192. get_broadcast() {
  193. OLD_IFS=$IFS
  194. IFS=.
  195. typeset -a I=($1)
  196. typeset -a N=($2)
  197. IFS=$OLD_IFS
  198. echo "$((${I[0]} | (255 ^ ${N[0]}))).$((${I[1]} | (255 ^ ${N[1]}))).$((${I[2]} | (255 ^ ${N[2]}))).$((${I[3]} | (255 ^ ${N[3]})))"
  199. }
  200. # Get user ips
  201. get_user_ips() {
  202. dedicated=$(grep -H "OWNER='$user'" $HESTIA/data/ips/*)
  203. dedicated=$(echo "$dedicated" | cut -f 1 -d : | sed 's=.*/==' | grep -E ${REGEX_IPV4})
  204. shared=$(grep -H -A1 "OWNER='$ROOT_USER'" $HESTIA/data/ips/* | grep shared)
  205. shared=$(echo "$shared" | cut -f 1 -d : | sed 's=.*/==' | cut -f 1 -d \- | grep -E ${REGEX_IPV4})
  206. for dedicated_ip in $dedicated; do
  207. shared=$(echo "$shared" | grep -v $dedicated_ip)
  208. done
  209. echo -e "$dedicated\n$shared" | sed "/^$/d"
  210. }
  211. # Get user ip
  212. get_user_ip() {
  213. ip=$(get_user_ips | head -n1)
  214. if [ -z "$ip" ]; then
  215. check_result $E_NOTEXIST "no IP is available"
  216. fi
  217. local_ip=$ip
  218. nat=$(grep "^NAT" $HESTIA/data/ips/$ip | cut -f 2 -d \')
  219. if [ -n "$nat" ]; then
  220. ip=$nat
  221. fi
  222. }
  223. # Validate ip address
  224. is_ip_valid() {
  225. local_ip="$1"
  226. if [ ! -e "$HESTIA/data/ips/$1" ]; then
  227. nat=$(grep -H "^NAT='$1'" $HESTIA/data/ips/*)
  228. if [ -z "$nat" ]; then
  229. check_result "$E_NOTEXIST" "IP $1 doesn't exist"
  230. else
  231. nat=$(echo "$nat" | cut -f1 -d: | cut -f7 -d/)
  232. local_ip=$nat
  233. fi
  234. fi
  235. if [ -n "$2" ]; then
  236. if [ -z "$nat" ]; then
  237. ip_data=$(cat $HESTIA/data/ips/$1)
  238. else
  239. ip_data=$(cat $HESTIA/data/ips/$nat)
  240. fi
  241. ip_owner=$(echo "$ip_data" | grep OWNER= | cut -f2 -d \')
  242. ip_status=$(echo "$ip_data" | grep STATUS= | cut -f2 -d \')
  243. if [ "$ip_owner" != "$user" ] && [ "$ip_status" = 'dedicated' ]; then
  244. check_result "$E_FORBIDEN" "$user user can't use IP $1"
  245. fi
  246. get_user_owner
  247. if [ "$ip_owner" != "$user" ] && [ "$ip_owner" != "$owner" ]; then
  248. check_result "$E_FORBIDEN" "$user user can't use IP $1"
  249. fi
  250. fi
  251. }