ip.sh 7.2 KB

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