ip.sh 7.6 KB

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