reload-instance-list.sh 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. #!/bin/bash
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
  3. ZONE="private.os.mephi.ru"
  4. ZONE_PUBLIC="public.os.mephi.ru"
  5. MY_IP=85.143.112.100
  6. DOMAIN_ID=$(mysql --defaults-file=/etc/mysql/debian.cnf pdns -Ne "SELECT id FROM domains WHERE name='$ZONE'")
  7. cd ~/reload-instance-list-workdir
  8. CURRENT_INSTANCES=($(~/go/bin/openstack-instance-list | sort))
  9. OLD_HASH="$(cat /run/reload-instance-list.sh.hash)"
  10. CURRENT_HASH="$(echo "$CURRENT_INSTANCES" | md5sum | awk '{print $1}')"
  11. if [ "$CURRENT_HASH" = "$OLD_HASH" ]; then
  12. exit
  13. fi
  14. echo "$CURRENT_HASH" > /run/reload-instance-list.sh.hash
  15. timeout 600 lockfile-create /run/reload-instance-list.sh.lock
  16. trap 'lockfile-remove /run/reload-instance-list.sh.lock' SIGINT SIGTERM SIGHUP SIGQUIT SIGALRM SIGILL SIGABRT SIGPIPE EXIT
  17. oldIFS="$IFS"
  18. # updating the domain zone
  19. declare -A OLD_IDS_IP
  20. declare -A OLD_IDS_ID
  21. for LINE in $(pdnsutil list-zone "$ZONE" 2>/dev/null | sed -e "s/\\.$ZONE//g" | tr "\t" "@"); do
  22. IFS="@"; WORDS=($LINE); IFS="$oldIFS"
  23. ID="${WORDS[0]}"
  24. IP="${WORDS[4]}"
  25. if [ "$IP" = '' ]; then
  26. continue
  27. fi
  28. if [ "$ID" = "$ZONE" ]; then
  29. continue
  30. fi
  31. OLD_IDS_IP[$ID]="$IP"
  32. OLD_IDS_ID[$ID]="$ID"
  33. done
  34. for LINE in ${CURRENT_INSTANCES[@]}; do
  35. IFS=","; WORDS=($LINE); IFS="$oldIFS"
  36. ID="${WORDS[0]}"
  37. IP="${WORDS[1]}"
  38. if [ "${OLD_IDS_IP[$ID]}" = '' ]; then
  39. pdnsutil add-record "$ZONE" "$ID" A "$IP"
  40. continue
  41. fi
  42. if [ "${OLD_IDS_IP[$ID]}" != "$IP" ]; then
  43. mysql --defaults-file=/etc/mysql/debian.cnf pdns -Ne "DELETE FROM records WHERE domain_id='$DOMAIN_ID' AND name='$ID.$ZONE'"
  44. pdnsutil add-record "$ZONE" "$ID" A "$IP"
  45. fi
  46. OLD_IDS_IP[$ID]=""
  47. OLD_IDS_ID[$ID]=""
  48. done
  49. for OLD_ID in ${OLD_IDS_ID[@]}; do
  50. if [ "$OLD_ID" = '' ]; then
  51. continue
  52. fi
  53. mysql --defaults-file=/etc/mysql/debian.cnf pdns -Ne "DELETE FROM records WHERE domain_id='$DOMAIN_ID' AND name='$OLD_ID.$ZONE'"
  54. done
  55. # generating the certificate
  56. GENCERT_ARGS=()
  57. for LINE in ${CURRENT_INSTANCES[@]}; do
  58. IFS=","; WORDS=($LINE); IFS="$oldIFS"
  59. ID="${WORDS[0]}"
  60. GENCERT_ARGS+=" -d ${ID}.${ZONE_PUBLIC} "
  61. done
  62. for LINE in $(cat /etc/webaliases); do
  63. IFS=":"; WORDS=($LINE); IFS="$oldIFS"
  64. HOST="${WORDS[0]}"
  65. GENCERT_ARGS+=" -d ${HOST} "
  66. done
  67. /root/bin/generate-certificate.sh ${GENCERT_ARGS[@]}
  68. # generating haproxy config
  69. cat > /etc/haproxy/gen-conf.d/050-frontends.conf <<EOF
  70. # Automatically generated frontend configuration:
  71. EOF
  72. cat > /etc/haproxy/gen-conf.d/060-backends.conf <<EOF
  73. # Automatically generated backends configuration:
  74. EOF
  75. for LINE in ${CURRENT_INSTANCES[@]}; do
  76. IFS=","; WORDS=($LINE); IFS="$oldIFS"
  77. ID="${WORDS[0]}"
  78. IP="${WORDS[1]}"
  79. cat >> /etc/haproxy/gen-conf.d/050-frontends.conf <<EOF
  80. acl host_${ID} hdr(host) -i ${ID}.${ZONE}
  81. acl host_${ID} hdr(host) -i ${ID}.${ZONE_PUBLIC}
  82. use_backend backend_${ID} if host_${ID}
  83. EOF
  84. cat >> /etc/haproxy/gen-conf.d/060-backends.conf <<EOF
  85. backend backend_${ID}
  86. mode http
  87. server primary ${IP}:80
  88. EOF
  89. #option httpchk GET / "HTTP/1.0\r\nX-Forwarded-Proto: https"
  90. #option redispatch
  91. #http-send-name-header Host
  92. #http-check expect rstatus ((2|3)[0-9][0-9]|40[13])
  93. #server primary 192.168.3.132:80 check inter 25s
  94. #server backup0 192.168.0.132:80 check backup inter 25s
  95. #server backup1 192.168.1.132:80 check backup inter 25s
  96. done
  97. for LINE in $(cat /etc/webaliases); do
  98. IFS=":"; WORDS=($LINE); IFS="$oldIFS"
  99. HOST="${WORDS[0]}"
  100. ID="${WORDS[1]}"
  101. IP="$(host "$HOST" | awk '{if($2=="has" && $3=="address"){print $4}}')"
  102. if [ "$IP" != "$MY_IP" ]; then
  103. continue
  104. fi
  105. cat >> /etc/haproxy/gen-conf.d/050-frontends.conf <<EOF
  106. acl host_${ID} hdr(host) -i ${HOST}
  107. EOF
  108. done
  109. cat /etc/haproxy/gen-conf.d/* > /etc/haproxy/haproxy.cfg