[TUTORIAL] Parallels Plesk update all domain zones at once

I had to change all SPF records for a client today from the Parallels Plesk default : “v=spf1 +a +mx -all” to something like “v=spf1 a mx a:server.name.tld -all” and the fun part was that the customer had something like 50+ domains on his server.

Since the Parallels Plesk Panel holds 99.99% of it’s data in the psa database, DNS settings are stored there as well, in two tables.

  • dns_recs_t which holds the DNS template information, and
  • dns_recs which holds the actual domain information.

I started with changing the template, then the domains info:

-bash-3.2# mysql -u admin -p`cat /etc/psa/.psa.shadow`
mysql>


mysql> use psa;
mysql> update dns_recs_t set val = 'v=spf1 a mx a:server.name.tld -all' where val = 'v=spf1 +a +mx -all';
mysql> update dns_recs_t set displayVal = 'v=spf1 a mx a:server.name.tld -all' where displayVal = 'v=spf1 +a +mx -all';
mysql> update dns_recs set val = 'v=spf1 a mx a:server.name.tld -all' where val = 'v=spf1 +a +mx -all';
mysql> update dns_recs set displayVal = 'v=spf1 a mx a:server.name.tld -all' where displayVal = 'v=spf1 +a +mx -all';

you can now check the records if they match:

mysql> select from dns_recs where val like '%spf%';
mysql> select from dns_recs_t where val like '%spf%';

If you got what you were looking for, now you need to change the actual DNS zone files using the dnsmng utility provided by Parallels Plesk Panel. I used the following script:


-bash-3.2# vi dns_update.sh


#!/bin/sh

ADMIN_PASS=`cat /etc/psa/.psa.shadow`
MYSQL_BIN_D=`grep MYSQL_BIN_D /etc/psa/psa.conf | awk '{print $2}'`
mysql="${MYSQL_BIN_D}/mysql -N -uadmin -p${ADMIN_PASS} psa"

query="select name from domains;"
domains=`echo $query | $mysql `

for i in ${domains}; do
echo "found $i"
/usr/local/psa/admin/sbin/dnsmng update $i
echo "zone for $i updated"
done

Then just run the script:
-bash-3.2# sh dns_update.sh

Now all you have to do is a final check in the zones directory, I did something like:

-bash-3.2# cd /var/named/run-root/var
-bash-3.2# grep -i spf *

Have fun, and use the above at your own risk.