ip.sh 8.0 KB

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