# Configure the powerdns backend

# Enable with:
# DESIGNATE_BACKEND_DRIVER=powerdns

# Dependencies:
# ``functions`` file
# ``designate`` configuration

# install_designate_backend - install any external requirements
# configure_designate_backend - make configuration changes, including those to other services
# init_designate_backend - initialize databases, etc.
# start_designate_backend - start any external services
# stop_designate_backend - stop any external services
# cleanup_designate_backend - remove transient data and cache

# Save trace setting
DP_PDNS_XTRACE=$(set +o | grep xtrace)
set +o xtrace

# Defaults
# --------
if is_fedora; then
    POWERDNS_CFG_DIR=/etc/pdns
else
    POWERDNS_CFG_DIR=/etc/powerdns
fi

# Entry Points
# ------------

# install_designate_backend - install any external requirements
function install_designate_backend {
    if is_ubuntu; then
        PDNS=pdns-server
    else
        die $LINENO "PDNS4 Backend plugin backend only supports Ubuntu"
    fi

    if is_service_enabled mysql; then
        PDNS+=" pdns-backend-mysql"
    elif is_service_enabled postgresql; then
        PDNS+=" pdns-backend-pgsql"
    else
        die $LINENO "PDNS4 backend only supports MySQL / pgSQL"
    fi

    install_package $PDNS

    # We need to wait for the configuration and database to be in place
    # before we can start up pdns4. Otherwise it will just crash in a loop.
    stop_designate_backend
}

# configure_designate_backend - make configuration changes, including those to other services
function configure_designate_backend {
    # Generate Designate pool.yaml file
    sudo tee $DESIGNATE_CONF_DIR/pools.yaml > /dev/null <<EOF
---
- name: default
  description: DevStack PowerDNS Pool
  attributes: {}

  ns_records:
    - hostname: $DESIGNATE_DEFAULT_NS_RECORD
      priority: 1

  nameservers:
    - host: $(ipv6_unquote $DESIGNATE_SERVICE_HOST)
      port: $DESIGNATE_SERVICE_PORT_DNS

  targets:
    - type: pdns4
      description: PowerDNS Database Cluster

      masters:
        - host: $(ipv6_unquote $DESIGNATE_SERVICE_HOST)
          port: $DESIGNATE_SERVICE_PORT_MDNS

      options:
        host: $(ipv6_unquote $DESIGNATE_SERVICE_HOST)
        port: $DESIGNATE_SERVICE_PORT_DNS
        api_endpoint: http://$DESIGNATE_SERVICE_HOST:8081
        api_token: changeme
        api_ca_cert: changeme
EOF

    # Generate PowerDNS pdns.conf file
    sudo tee $POWERDNS_CFG_DIR/pdns.conf > /dev/null <<EOF
# General Config
setgid=pdns
setuid=pdns
config-dir=$POWERDNS_CFG_DIR
guardian=yes
daemon=yes
disable-axfr=no
# local-address should always be set, we temporarily
# commented it out due to compatibility issues with pdns 4.3.
# local-address=$HOST_IP $HOST_IPV6
local-port=$DESIGNATE_SERVICE_PORT_DNS
master=no
slave=yes
cache-ttl=0
query-cache-ttl=0
negquery-cache-ttl=0
webserver=yes
webserver-address=$(ipv6_unquote $DESIGNATE_SERVICE_HOST)
webserver-allow-from=$(ipv6_unquote $DESIGNATE_SERVICE_HOST),127.0.0.1,::1
api=yes
api-key=changeme
EOF

    if is_service_enabled mysql; then
        sudo tee -a $POWERDNS_CFG_DIR/pdns.conf > /dev/null <<EOF
# Launch gmysql backend
launch=gmysql

# gmysql parameters
gmysql-host=$MYSQL_HOST
gmysql-user=$DATABASE_USER
gmysql-password=$DATABASE_PASSWORD
gmysql-dbname=designate_pdns
gmysql-dnssec=yes
EOF
    elif is_service_enabled postgresql; then
        sudo tee -a $POWERDNS_CFG_DIR/pdns.conf > /dev/null <<EOF
# Launch gpgsql backend
launch=gpgsql

# gpgsql parameters
gpgsql-host=$DATABASE_HOST
gpgsql-user=$DATABASE_USER
gpgsql-password=$DATABASE_PASSWORD
gpgsql-dbname=designate_pdns
gpgsql-dnssec=yes
EOF
    else
        die $LINENO "PDNS4 backend only supports MySQL / pgSQL"
    fi
}

# init_designate_backend - initialize databases, etc.
function init_designate_backend {
    # (Re)create designate_pdns database
    recreate_database designate_pdns utf8
    if is_service_enabled mysql; then
            sudo mysql -u$DATABASE_USER -p$DATABASE_PASSWORD -h$MYSQL_HOST designate_pdns < $DESIGNATE_PLUGINS/backend-pdns4-mysql-db.sql
    elif is_service_enabled postgresql; then
            sudo psql -U root -d designate_pdns -f $DESIGNATE_PLUGINS/backend-pdns4-pgsql-db.sql
    else
        die $LINENO "PDNS4 backend only supports MySQL"
    fi

    restart_service pdns
}

# create_designate_pool_configuration_backend - Perform post-pool config tasks
function create_designate_pool_configuration_backend {
    # Init and migrate designate_pdns database
    :
}

# start_designate_backend - start any external services
function start_designate_backend {
    start_service pdns
}


# stop_designate_backend - stop any external services
function stop_designate_backend {
    stop_service pdns
}

# cleanup_designate_backend - remove transient data and cache
function cleanup_designate_backend {
    :
}

# Restore xtrace
$DP_PDNS_XTRACE
