(defun zone-mode-update-serial ()
"Update the serial number in a zone."
(interactive)
(save-excursion
(goto-char (point-min))
(while (re-search-forward "\\b\\([0-9]+\\)\\([0-9][0-9]\\)\\([ \t]+;[ \t]+[Ss]erial\\)" (point-max) t)
(let* ((old-date (match-string 1))
(old-seq (match-string 2))
(old-seq-num (string-to-number (match-string 2)))
(old-flag (match-string 3))
(cur-date (format-time-string "%Y%m%d"))
(new-seq
(cond
((not (string= old-date cur-date))
"00") ((>= old-seq-num 99)
(error "Serial number's sequenece cannot increment beyond 99."))
(t
(format "%02d" (1+ old-seq-num)))))
(old-serial (concat old-date old-seq))
(new-serial (concat cur-date new-seq)))
(if (string-lessp new-serial old-serial)
(error (format "Serial numbers want to move backwards from %s to %s!" old-serial new-serial))
(replace-match (concat cur-date new-seq old-flag) t t))))))
(defun zone-mode-update-serial-hook ()
"Update the serial number in a zone if the file was modified"
(interactive)
(if (buffer-modified-p (current-buffer))
(zone-mode-update-serial))
nil )
(defvar zone-mode-syntax-table nil
"Zone-mode's syntax table.")
(defun zone-mode-load-time-setup ()
"init zone-mode stuff"
(setq zone-mode-syntax-table (make-syntax-table))
(modify-syntax-entry ?\ (modify-syntax-entry ?\n ">" zone-mode-syntax-table))
(define-derived-mode zone-mode fundamental-mode "zone"
"A mode for editing DNS zone files.
Zone-mode does two things:
- automatically update the serial number for a zone
when saving the file
- fontification"
(make-local-hook 'write-file-hooks)
(add-hook 'write-file-hooks 'zone-mode-update-serial-hook)
(if (null zone-mode-syntax-table)
(zone-mode-load-time-setup))
(set-syntax-table zone-mode-syntax-table)
(make-local-variable 'comment-start)
(setq comment-start ";")
(make-local-variable 'comment-start-skip)
(setq comment-start-skip "\\(\\(^\\|[^\\\\\n]\\)\\(\\\\\\\\\\)*\\);+[ \t]*")
(make-local-variable 'comment-column)
(setq comment-column 40)
(make-local-variable 'font-lock-defaults)
(setq font-lock-defaults
'(nil nil nil nil beginning-of-line)))
(zone-mode-load-time-setup)
(provide 'zone-mode)