Auto increment the serial number of a zone file after each edit with vim
Emacs functionality with Vim
Long story short,
I was missing a functionality which i have with Emacs when editing BIND zone files.
By adding the following lines to the zone file header, Emacs will take care of changing the serial number for you.
;; -*- zone -*- ;; ;; Zone file for example.org ;; example.org 86400 IN SOA example.org. hostmaster.example.org. ( 2006033100 ; Serial YYYYMMDDXX 10800 ; Refresh 3600 ; Retry 3600000 ; Expire 86400 ) ; minimum IN NS ns1.example.org. IN NS ns2.example.org. ...
The “Auto Increment” Function
"~/.vim/plugin/soa.vim "--- .../plugins/named.vim ---- function! UPDSERIAL(date, num) if (strftime("%Y%m%d") == a:date) return a:date . a:num+1 endif return strftime("%Y%m%d") . '01' endfunction command Soa :%s/\(2[0-9]\{7}\)\([0-9]\{2}\)\(\s*;\s*Serial\)/\=UPDSERIAL(submatch(1), submatch(2)) . submatch(3)/gc "---- eof ---------------------
Testing
A example zone file, Open a zone file and type “Soa”
$TTL 86400 @ IN SOA localhost. root.localhost. ( 201408022 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 86400 ) ; Negative Cache TTL ; @ IN NS localhost.
Please not that you MUST have the serial number in the format of:
YYYYMMDD## ; Serial
The auto-increment function will look for this specific pattern.
The autocmd part
Open you vimrc file and add the following line to it,
"~/.vimrc autocmd BufWritePre /var/named/chroot/var/named/*.zone,/var/named/chroot/var/named/*.revzone Soa
- This command will run a autocmd (which calls to the Soa function) each time before (BufWritePre) we write the file to the disk.
- Also the command with work only on *.zone and *.revzone files under the path “/var/named/chroot/var/named”
Resources
- http://www.debian-administration.org/article/381/Updating_bind_serial_numbers_automaticallySupported%20pause%20frame
- http://vimdoc.sourceforge.net/htmldoc/autocmd.html