Skip to main content

Serial Incrementer für DNS SOA per Tastendruck

Ein praktisches Tool für alle, die öfters mal DNS-Zonen editieren müssen (Autor Folke Ashberg).

Einfach den Code von unten in einer Datei im plugin-Verzeichnis vom VIM ablegen. Beim nächsten Start kann die Serial in der SOA mit dem neuen Kommando :DNSserial hochgesetzt werden. Die vorhandene Konvention wird dabei beibehalten, z.B. YYYYMMDDNN (NN=fortlaufende Nummer). Dieses Kommando kann man noch einfach einer Taste zuweisen, mein Beispiel legt den Befehl auf F6.

"DNSserial auf F6 legen
nmap <F6> :DNSserial<cr>

und hier noch der Code des Plugins (kann auch vom Autor direkt runtergeladen werden):

" DNS Serial Incrementer
" Author: Folke Ashberg <folke@ashberg.de>
" Copyright: 2001 by Folke Ashberg
" LAST MODIFICATION: Fre Sep 14 19:05:32 CEST 2001
" CVS: $Id: dnstools.vim,v 1.4 2002/08/15 11:08:15 folke Exp $
" Usage:
"         Serial Updater:
"         Just execute the command DNSserial and this tiny script
"         will increment the serial number, preserving that style you use :)
 
 
 
function DNS_getnum(oldnum)
    let oldnum = a:oldnum
    if oldnum < 19700101
	" 1, 2, 3 style
	let retval = oldnum + 1
    elseif oldnum < 1970010100
	" YYYYMMDD style
	let dateser = strftime("%Y%m%d")
	if dateser > oldnum
	    let retval = dateser
	else
	    let retval = oldnum + 1
	endif
    else
	" YYYYMMDDNN style
	let dateser = strftime("%Y%m%d00")
	if dateser > oldnum
	    let retval = dateser
	else
	    let retval = oldnum + 1
	endif
    endif
    return retval
endfun
 
function DNSserial()
    let restore_position_excmd = line('.').'normal! '.virtcol('.').'|'
    let oldignorecase = &ignorecase
    set ignorecase
    " substitute now ( there's a bug in VIM's vi Syntax :(   )
    " silent
    %s/\(soa[[:space:]]\+[a-z0-9.-]\+[[:space:]]\+[a-z0-9.-]\+[[:space:]]*(\?[\n\t ]*\)\([0-9]\+\)/\=submatch(1) . DNS_getnum( submatch(2) )/
    " restore position 
    exe restore_position_excmd
    " disable hls
    if 1 == &hls
	noh
    else
	set hls
    endif
    " restore old case behave
    let &ignorecase=oldignorecase
endfun
 
command DNSserial :call DNSserial()
 
 
 
 
function DNSzone()
    let zone = input("Name der Zone: ")
    let ip   = input("IP: " , "62.26.219.121")
    let ins=""
    let ins = ins . "$INCLUDE /var/named/ttl-file\n"
    let ins = ins . ";       File: \"" . zone . ".dom\"\n"
    let ins = ins . ";       FQDN: \"" . zone . "\"\n"
    let ins = ins . "@       IN SOA ns1.dns-zone.net. hostmaster.dns-zone.net. (\n"
    let ins = ins . "                " . strftime("%Y%m%d00") . "; serial number\n"
    let ins = ins . "                3H              ; refresh\n"
    let ins = ins . "                1H              ; retry\n"
    let ins = ins . "                1W              ; expiry\n"
    let ins = ins . "                1D )            ; minimum\n"
    let ins = ins . "\n"
    let ins = ins . ";        Zone NS records\n"
    let ins = ins . "\n"
    let ins = ins . "@                               IN      NS      ns1.dns-zone.net.\n"
    let ins = ins . "@                               IN      NS      ns2.dns-zone.net.\n"
    let ins = ins . "\n"
    let ins = ins . ";        Zone MX records\n"
    let ins = ins . "\n"
    let ins = ins . "@                               IN      MX      30      mail\n"
    let ins = ins . "@                               IN      MX      60      mail3.iok.net.\n"
    let ins = ins . "@                               IN      MX      90      mail3.csl-gmbh.net.\n"
    let ins = ins . "\n"
    let ins = ins . ";        Zone records\n"
    let ins = ins . "\n"
    let ins = ins . "                                IN      A       " . ip ."\n"
    let ins = ins . "www                             IN      CNAME   " . zone . ".\n"
    let ins = ins . "ftp                             IN      CNAME   " . zone . ".\n"
    let ins = ins . "smtp                            IN      CNAME   " . zone . ".\n"
    let ins = ins . "\n"
    put!=ins
endfun