#!/bin/bash
# info: add dns domain
# options: USER DOMAIN IP [NS1] [NS2] [NS3] [NS4] [RESTART]
#
# The function adds DNS zone with records defined in the template. If the exp
# argument isn't stated, the expiration date value will be set to next year.
# The soa argument is responsible for the relevant record. By default the first
# user's NS server is used. TTL is set as common for the zone and for all of
# its records with a default value of 14400 seconds.


#----------------------------------------------------------#
#                    Variable&Function                     #
#----------------------------------------------------------#

# Argument defenition
user=$1
domain=$(idn -t --quiet -u "$2" )
domain=$(echo $domain | sed -e 's/\.*$//g' -e 's/^\.*//g')
domain=$(echo $domain | tr '[:upper:]' '[:lower:]')
domain_idn=$(idn -t --quiet -a "$domain")
ip=$3
ns1=$4
ns2=$5
ns3=$6
ns4=$7
restart=$8

# Includes
source $VESTA/conf/vesta.conf
source $VESTA/func/main.sh
source $VESTA/func/domain.sh


#----------------------------------------------------------#
#                    Verifications                         #
#----------------------------------------------------------#

check_args '3' "$#" 'USER DOMAIN IP [NS1] [NS2] [NS3] [NS4]'
validate_format 'user' 'domain' 'ip'
is_system_enabled "$DNS_SYSTEM" 'DNS_SYSTEM'
is_object_valid 'user' 'USER' "$user"
is_object_unsuspended 'user' 'USER' "$user"
is_domain_new 'dns'
is_package_full 'DNS_DOMAINS'

template=$(get_user_value '$DNS_TEMPLATE')
is_dns_template_valid

if [ ! -z "$ns1" ]; then
    ns1=$(echo $4 | sed -e 's/\.*$//g' -e 's/^\.*//g')
    validate_format 'ns1'
fi
if [ ! -z "$ns2" ]; then
    ns2=$(echo $5 | sed -e 's/\.*$//g' -e 's/^\.*//g')
    validate_format 'ns2'
fi

if [ ! -z "$ns3" ]; then
    ns3=$(echo $6 | sed -e 's/\.*$//g' -e 's/^\.*//g')
    validate_format 'ns3'
fi
if [ ! -z "$ns4" ]; then
    ns4=$(echo $7 | sed -e 's/\.*$//g' -e 's/^\.*//g')
    validate_format 'ns4'
fi


#----------------------------------------------------------#
#                       Action                             #
#----------------------------------------------------------#

# Defining NS variables
if [ -z $ns2 ]; then
    i=1
    ns=$(get_user_value '$NS')
    for nameserver in ${ns//,/ };do
        eval ns$i=$nameserver
        (( ++i))
    done
fi
soa="$ns1"
exp=$(date +%F -d "+ 1 year")
ttl=14400

# Reading template
template_data=$(cat $DNSTPL/$template.tpl)

# Deleting unused nameservers
if [ -z "$ns3" ]; then
    template_data=$(echo "$template_data" | grep -v %ns3%)
fi
if [ -z "$ns4" ]; then
    template_data=$(echo "$template_data" | grep -v %ns4%)
fi

# Add dns zone to the user config
echo "$template_data" |\
    sed -e "s/%ip%/$ip/g" \
        -e "s/%domain_idn%/$domain_idn/g" \
        -e "s/%domain%/$domain/g" \
        -e "s/%ns1%/$ns1/g" \
        -e "s/%ns2%/$ns2/g" \
        -e "s/%ns3%/$ns3/g" \
        -e "s/%ns4%/$ns4/g" \
        -e "s/%time%/$TIME/g" \
        -e "s/%date%/$DATE/g" > $USER_DATA/dns/$domain.conf

chmod 660 $USER_DATA/dns/$domain.conf
records="$(wc -l $USER_DATA/dns/$domain.conf |cut -f 1 -d ' ')"

# Adding dns.conf record
dns_rec="DOMAIN='$domain' IP='$ip' TPL='$template' TTL='$ttl' EXP='$exp'"
dns_rec="$dns_rec SOA='$soa' RECORDS='$records' SUSPENDED='no' TIME='$TIME'"
dns_rec="$dns_rec DATE='$DATE'"

echo "$dns_rec" >> $USER_DATA/dns.conf
chmod 660 $USER_DATA/dns.conf

# Get dns config path
if [ -e '/etc/named.conf' ]; then
    dns_conf='/etc/named.conf'
fi

if [ -e '/etc/bind/named.conf' ]; then
    dns_conf='/etc/bind/named.conf'
fi

# Adding zone in named.conf
named="zone \"$domain_idn\" {type master; file"
named="$named \"$HOMEDIR/$user/conf/dns/$domain.db\";};"
echo "$named" >> $dns_conf

# Updating domain dns zone
update_domain_zone

# Set permissions
if [ "$DNS_SYSTEM" = 'named' ]; then
    dns_group='named'
else
    dns_group='bind'
fi

chmod 640 $conf
chown root:$dns_group $conf

# dns-cluster
if [ ! -z "$DNS_CLUSTER" ]; then
    cmd="$BIN/v-add-remote-dns-domain $user $domain"
    echo "$cmd" >> $VESTA/data/queue/dns-cluster.pipe
fi


#----------------------------------------------------------#
#                       Vesta                              #
#----------------------------------------------------------#

# Increasing domain value
increase_user_value "$user" '$U_DNS_DOMAINS'
increase_user_value "$user" '$U_DNS_RECORDS' "$records"

# Restart named
if [ "$restart" != 'no' ]; then
    $BIN/v-restart-dns
fi

# Logging
log_history "added dns domain $domain"
log_event "$OK" "$EVENT"

exit
