#!/bin/bash # info: add dns domain # options: USER DOMAIN IP [NS1] [NS2] [NS3] [NS4] [NS5] [NS6] [NS7] [NS8] [RESTART] # # example: v-add-dns-domain admin example.com ns1.example.com ns2.example.com '' '' '' '' '' '' yes # # This 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. #----------------------------------------------------------# # Variables & Functions # #----------------------------------------------------------# # Argument definition user=$1 domain=$2 ip=$3 ns1=$4 ns2=$5 ns3=$6 ns4=$7 ns5=$8 ns6=$9 ns7=${10} ns8=${11} restart=${12} dnssec=${13} # Includes # shellcheck source=/etc/hestiacp/hestia.conf source /etc/hestiacp/hestia.conf # shellcheck source=/usr/local/hestia/func/main.sh source $HESTIA/func/main.sh # shellcheck source=/usr/local/hestia/func/domain.sh source $HESTIA/func/domain.sh # shellcheck source=/usr/local/hestia/func/rebuild.sh source $HESTIA/func/rebuild.sh # load config file source_conf "$HESTIA/conf/hestia.conf" # Additional argument formatting format_domain format_domain_idn domain_utf=$(idn2 --quiet -d "$domain_idn") #----------------------------------------------------------# # Verifications # #----------------------------------------------------------# check_args '3' "$#" 'USER DOMAIN IP [NS1] [NS2] [NS3] [..] [NS8] [RESTART]' is_format_valid 'user' 'domain' 'ip' is_system_enabled "$DNS_SYSTEM" 'DNS_SYSTEM' is_object_valid 'user' 'USER' "$user" is_object_unsuspended 'user' 'USER' "$user" if [ "$($BIN/v-list-dns-domain $user $domain_utf plain | cut -f 1) " != "$domain" ]; then is_domain_new 'dns' "$domain_utf" fi if [ "$($BIN/v-list-dns-domain $user $domain_idn plain | cut -f 1) " != "$domain" ]; then is_domain_new 'dns' "$domain_idn" else is_domain_new 'dns' "$domain" fi if [ -z "$(is_ip_format_valid $domain)" ]; then echo "Error: Invalid domain format. IP address detected as input." exit 1 fi if [ -n "$restart" ]; then is_format_valid 'restart' fi if [ -n "$dnssec" ]; then is_boolean_format_valid "$dnssec" 'dnssec' fi is_package_full 'DNS_DOMAINS' template=$(get_user_value '$DNS_TEMPLATE') is_dns_template_valid "$template" is_base_domain_owner "$domain" if [ -n "$ns1" ]; then ns1=$(echo $4 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns1' fi if [ -n "$ns2" ]; then ns2=$(echo $5 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns2' fi if [ -n "$ns3" ]; then ns3=$(echo $6 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns3' fi if [ -n "$ns4" ]; then ns4=$(echo $7 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns4' fi if [ -n "$ns5" ]; then ns5=$(echo $8 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns5' fi if [ -n "$ns6" ]; then ns6=$(echo $9 | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns6' fi if [ -n "$ns7" ]; then ns7=$(echo ${10} | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns7' fi if [ -n "$ns8" ]; then ns8=$(echo ${11} | sed -e 's/\.*$//g' -e 's/^\.*//g') is_format_valid 'ns8' fi # Perform verification if read-only mode is enabled check_hestia_demo_mode #----------------------------------------------------------# # 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") serial=$(date +'%Y%m%d01') 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 if [ -z "$ns5" ]; then template_data=$(echo "$template_data" | grep -v %ns5%) fi if [ -z "$ns6" ]; then template_data=$(echo "$template_data" | grep -v %ns6%) fi if [ -z "$ns7" ]; then template_data=$(echo "$template_data" | grep -v %ns7%) fi if [ -z "$ns8" ]; then template_data=$(echo "$template_data" | grep -v %ns8%) fi if [ -z "$dnssec" ]; then dnssec="no" fi # Generating timestamp time_n_date=$(date +'%T %F') time=$(echo "$time_n_date" | cut -f 1 -d \ ) date=$(echo "$time_n_date" | cut -f 2 -d \ ) # Adding 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/%ns5%/$ns5/g" \ -e "s/%ns6%/$ns6/g" \ -e "s/%ns7%/$ns7/g" \ -e "s/%ns8%/$ns8/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' SERIAL='$serial' SRC='' RECORDS='$records'" dns_rec="$dns_rec DNSSEC='$dnssec' KEY='' SLAVE='no' MASTER='' SUSPENDED='no' TIME='$time' DATE='$date'" echo "$dns_rec" >> $USER_DATA/dns.conf chmod 660 $USER_DATA/dns.conf rebuild_dns_domain_conf # Updating dns-cluster queue if [ "$DNS_CLUSTER" = "yes" ]; then cmd="$BIN/v-add-remote-dns-domain $user $domain yes" echo "$cmd" >> $HESTIA/data/queue/dns-cluster.pipe fi #----------------------------------------------------------# # Hestia # #----------------------------------------------------------# # Increasing domain value increase_user_value "$user" '$U_DNS_DOMAINS' increase_user_value "$user" '$U_DNS_RECORDS' "$records" # Restart named $BIN/v-restart-dns $restart check_result $? "DNS restart failed" # Logging $BIN/v-log-action "$user" "Info" "DNS" "Added new DNS domain (Name: $domain)." log_event "$OK" "$ARGUMENTS" exit