[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> 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


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"

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.

mysql crashes…

So, what do you do when you get this from your logs?

I/O error reading the header from the binary log

Obviously the binary logs are broken, or at least the last one is. They are usually located in /var/logs/mysql/ and you should not start copying over some old logs with the new name because that would just not make it right, so the solution is,

  1. read your logs and see which *.bin file is corrupted
  2. delete it
  3. open /var/log/mysql/mysql-bin.index and delete the line with the bin file on it.
  4. Restart mysql

et voila 🙂