snf-network-dnshook 4.38 KB
Newer Older
1
#!/bin/bash
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#
# Copyright 2014 GRNET S.A. All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
#   1. Redistributions of source code must retain the above
#      copyright notice, this list of conditions and the following
#      disclaimer.
#
#   2. Redistributions in binary form must reproduce the above
#      copyright notice, this list of conditions and the following
#      disclaimer in the documentation and/or other materials
#      provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# The views and conclusions contained in the software and
# documentation are those of the authors and should not be
# interpreted as representing official policies, either expressed
# or implied, of GRNET S.A.
35

36
# Configuration Fallbacks. All can(must for some of them) be overwritten by /etc/default/snf-network
37
TTL=300
38
# the bind server IP/FQDN
39
SERVER=""
40 41 42 43 44
# this is the .vm.synnefo.live.
# Leave empty if only reverse dns management is needed.
# TODO: make this zone to be instance specific!!!
FZONE=""
# the file with dns authorization keys
45 46
KEYFILE=""

47 48 49 50 51 52 53
# kerberos authentication settings
# Will be used with kstart and ktutil
KERBEROS_PRINCIPAL=
KERBEROS_KEYTAB=/etc/krb5.keytab
KERBEROS_KSTART_ARGS="-H 1 -l 1h"
KERBEROS_TICKET=/var/lib/snf-network/snf-network-kerberos.tkt

54 55 56
# Default authentication method
AUTHENTICATION_METHOD=bind9

57
source /etc/default/snf-network
58
source /usr/lib/snf-network/common.sh
59

60 61 62 63 64
if [ -z "$SERVER" -o -z "$FZONE" ]; then
  log "SERVER and FZONE not defined! Aborting.."
  exit 0
fi

65 66 67 68 69 70
if [ "$AUTHENTICATION_METHOD" == "bind9" -a -e "$KEYFILE" ]; then
  log "Will use $KEYFILE keyfile for nsupdate (bind9 method)."
elif [ "$AUTHENTICATION_METHOD" == "kerberos" -a -n "$KERBEROS_PRINCIPAL" ]; then
  log "Will use $KERBEROS_PRINCIPAL principal for nsupdate (kerberos method)."
elif [ "$AUTHENTICATION_METHOD" == "plain" ]; then
  log "Will use no authentication (plain method)"
71
else
72
  log "No AUTHENTICATION_METHOD defined! Aborting.."
73
  exit 0
74 75
fi

76

77 78
# Main starts here

79
INSTANCE=$GANETI_INSTANCE_NAME
80
hostname=$(hostname -f)
81

82 83
# Exit if we do not have instance name.
# It should be exported to hooks for instance related opcodes.
84
if [ -z "$INSTANCE" ]; then
85
  exit 0
86 87
fi

88
# Run only in primary node of instance
89
if [ "$GANETI_INSTANCE_PRIMARY" != "$hostname" ]; then
90 91 92
  exit 0
fi

93
# This runs only for instance modification
94 95 96 97
if [ "x$GANETI_OP_CODE" = "xOP_INSTANCE_SET_PARAMS" ]; then
  query_dns
  reset_dns
fi
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113

# If GANETI_INSTANCE_NIC_COUNT is not set then nothing happens
FIRST=0
LAST=$((GANETI_INSTANCE_NIC_COUNT - 1))
for idx in $(seq $FIRST $LAST); do
  ip=GANETI_INSTANCE_NIC${idx}_IP
  mac=GANETI_INSTANCE_NIC${idx}_MAC
  mode=GANETI_INSTANCE_NIC${idx}_MODE
  link=GANETI_INSTANCE_NIC${idx}_LINK
  subnet=GANETI_INSTANCE_NIC${idx}_NETWORK_SUBNET
  subnet6=GANETI_INSTANCE_NIC${idx}_NETWORK_SUBNET6
  tags=GANETI_INSTANCE_NIC${idx}_NETWORK_TAGS
  eval IP=\$$ip
  eval MAC=\$$mac
  eval MODE=\$$mode
  eval LINK=\$$link
Dimitris Aragiorgis's avatar
Dimitris Aragiorgis committed
114 115
  eval NETWORK_SUBNET=\$$subnet
  eval NETWORK_SUBNET6=\$$subnet6
116
  eval NETWORK_TAGS=\$$tags
117

118
  for tag in $NETWORK_TAGS; do
119 120 121
    case $tag in
    $DNS_TAG)

122
      get_info
123 124 125 126 127 128 129 130 131 132 133 134 135

      if [ "x$GANETI_OP_CODE" = "xOP_INSTANCE_CREATE" ]; then
        update_dns add
      elif [ "x$GANETI_OP_CODE" = "xOP_INSTANCE_REMOVE" ]; then
        update_dns delete
      elif [ "x$GANETI_OP_CODE" = "xOP_INSTANCE_RENAME" ]; then
        update_dns delete
        # Let's override a variable and add ourselves
        INSTANCE=$GANETI_INSTANCE_NEW_NAME
        update_dns add
      elif [ "x$GANETI_OP_CODE" = "xOP_INSTANCE_SET_PARAMS" ]; then
        update_dns add
      fi
136 137 138 139 140 141 142

      ;;
    esac

  done

done