1*00b67f09SDavid van Moolenbroek#!/usr/bin/perl 2*00b67f09SDavid van Moolenbroek# 3*00b67f09SDavid van Moolenbroek# Copyright (C) 2004, 2007, 2012, 2013 Internet Systems Consortium, Inc. ("ISC") 4*00b67f09SDavid van Moolenbroek# Copyright (C) 2000, 2001 Internet Software Consortium. 5*00b67f09SDavid van Moolenbroek# 6*00b67f09SDavid van Moolenbroek# Permission to use, copy, modify, and/or distribute this software for any 7*00b67f09SDavid van Moolenbroek# purpose with or without fee is hereby granted, provided that the above 8*00b67f09SDavid van Moolenbroek# copyright notice and this permission notice appear in all copies. 9*00b67f09SDavid van Moolenbroek# 10*00b67f09SDavid van Moolenbroek# THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 11*00b67f09SDavid van Moolenbroek# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 12*00b67f09SDavid van Moolenbroek# AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 13*00b67f09SDavid van Moolenbroek# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 14*00b67f09SDavid van Moolenbroek# LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15*00b67f09SDavid van Moolenbroek# OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16*00b67f09SDavid van Moolenbroek# PERFORMANCE OF THIS SOFTWARE. 17*00b67f09SDavid van Moolenbroek 18*00b67f09SDavid van Moolenbroek# Id: digcomp.pl,v 1.14 2007/06/19 23:47:00 tbox Exp 19*00b67f09SDavid van Moolenbroek 20*00b67f09SDavid van Moolenbroek# Compare two files, each with the output from dig, for differences. 21*00b67f09SDavid van Moolenbroek# Ignore "unimportant" differences, like ordering of NS lines, TTL's, 22*00b67f09SDavid van Moolenbroek# etc... 23*00b67f09SDavid van Moolenbroek 24*00b67f09SDavid van Moolenbroek$lc = 0; 25*00b67f09SDavid van Moolenbroekif ($ARGV[0] eq "--lc") { 26*00b67f09SDavid van Moolenbroek $lc = 1; 27*00b67f09SDavid van Moolenbroek shift; 28*00b67f09SDavid van Moolenbroek} 29*00b67f09SDavid van Moolenbroek$file1 = $ARGV[0]; 30*00b67f09SDavid van Moolenbroek$file2 = $ARGV[1]; 31*00b67f09SDavid van Moolenbroek 32*00b67f09SDavid van Moolenbroek$count = 0; 33*00b67f09SDavid van Moolenbroek$firstname = ""; 34*00b67f09SDavid van Moolenbroek$status = 0; 35*00b67f09SDavid van Moolenbroek$rcode1 = "none"; 36*00b67f09SDavid van Moolenbroek$rcode2 = "none"; 37*00b67f09SDavid van Moolenbroek 38*00b67f09SDavid van Moolenbroekopen(FILE1, $file1) || die("open: $file1: $!\n"); 39*00b67f09SDavid van Moolenbroekwhile (<FILE1>) { 40*00b67f09SDavid van Moolenbroek chomp; 41*00b67f09SDavid van Moolenbroek if (/^;.+status:\s+(\S+).+$/) { 42*00b67f09SDavid van Moolenbroek $rcode1 = $1; 43*00b67f09SDavid van Moolenbroek } 44*00b67f09SDavid van Moolenbroek next if (/^;/); 45*00b67f09SDavid van Moolenbroek if (/^(\S+)\s+\S+\s+(\S+)\s+(\S+)\s+(.+)$/) { 46*00b67f09SDavid van Moolenbroek $name = $1; 47*00b67f09SDavid van Moolenbroek $class = $2; 48*00b67f09SDavid van Moolenbroek $type = $3; 49*00b67f09SDavid van Moolenbroek $value = $4; 50*00b67f09SDavid van Moolenbroek if ($lc) { 51*00b67f09SDavid van Moolenbroek $name = lc($name); 52*00b67f09SDavid van Moolenbroek $value = lc($value); 53*00b67f09SDavid van Moolenbroek } 54*00b67f09SDavid van Moolenbroek if ($type eq "SOA") { 55*00b67f09SDavid van Moolenbroek $firstname = $name if ($firstname eq ""); 56*00b67f09SDavid van Moolenbroek if ($name eq $firstname) { 57*00b67f09SDavid van Moolenbroek $name = "$name$count"; 58*00b67f09SDavid van Moolenbroek $count++; 59*00b67f09SDavid van Moolenbroek } 60*00b67f09SDavid van Moolenbroek } 61*00b67f09SDavid van Moolenbroek if ($entry{"$name ; $class.$type ; $value"} ne "") { 62*00b67f09SDavid van Moolenbroek $line = $entry{"$name ; $class.$type ; $value"}; 63*00b67f09SDavid van Moolenbroek print("Duplicate entry in $file1:\n> $_\n< $line\n"); 64*00b67f09SDavid van Moolenbroek } else { 65*00b67f09SDavid van Moolenbroek $entry{"$name ; $class.$type ; $value"} = $_; 66*00b67f09SDavid van Moolenbroek } 67*00b67f09SDavid van Moolenbroek } 68*00b67f09SDavid van Moolenbroek} 69*00b67f09SDavid van Moolenbroekclose(FILE1); 70*00b67f09SDavid van Moolenbroek 71*00b67f09SDavid van Moolenbroek$printed = 0; 72*00b67f09SDavid van Moolenbroek 73*00b67f09SDavid van Moolenbroekopen(FILE2, $file2) || die("open: $file2: $!\n"); 74*00b67f09SDavid van Moolenbroekwhile (<FILE2>) { 75*00b67f09SDavid van Moolenbroek chomp; 76*00b67f09SDavid van Moolenbroek if (/^;.+status:\s+(\S+).+$/) { 77*00b67f09SDavid van Moolenbroek $rcode2 = $1; 78*00b67f09SDavid van Moolenbroek } 79*00b67f09SDavid van Moolenbroek next if (/^;/); 80*00b67f09SDavid van Moolenbroek if (/^(\S+)\s+\S+\s+(\S+)\s+(\S+)\s+(.+)$/) { 81*00b67f09SDavid van Moolenbroek $name = $1; 82*00b67f09SDavid van Moolenbroek $class = $2; 83*00b67f09SDavid van Moolenbroek $type = $3; 84*00b67f09SDavid van Moolenbroek $value = $4; 85*00b67f09SDavid van Moolenbroek if ($lc) { 86*00b67f09SDavid van Moolenbroek $name = lc($name); 87*00b67f09SDavid van Moolenbroek $value = lc($value); 88*00b67f09SDavid van Moolenbroek } 89*00b67f09SDavid van Moolenbroek if (($name eq $firstname) && ($type eq "SOA")) { 90*00b67f09SDavid van Moolenbroek $count--; 91*00b67f09SDavid van Moolenbroek $name = "$name$count"; 92*00b67f09SDavid van Moolenbroek } 93*00b67f09SDavid van Moolenbroek if ($entry{"$name ; $class.$type ; $value"} ne "") { 94*00b67f09SDavid van Moolenbroek $entry{"$name ; $class.$type ; $value"} = ""; 95*00b67f09SDavid van Moolenbroek } else { 96*00b67f09SDavid van Moolenbroek print("Only in $file2 (missing from $file1):\n") 97*00b67f09SDavid van Moolenbroek if ($printed == 0); 98*00b67f09SDavid van Moolenbroek print("> $_\n"); 99*00b67f09SDavid van Moolenbroek $printed++; 100*00b67f09SDavid van Moolenbroek $status = 1; 101*00b67f09SDavid van Moolenbroek } 102*00b67f09SDavid van Moolenbroek } 103*00b67f09SDavid van Moolenbroek} 104*00b67f09SDavid van Moolenbroekclose(FILE2); 105*00b67f09SDavid van Moolenbroek 106*00b67f09SDavid van Moolenbroek$printed = 0; 107*00b67f09SDavid van Moolenbroek 108*00b67f09SDavid van Moolenbroekforeach $key (keys(%entry)) { 109*00b67f09SDavid van Moolenbroek if ($entry{$key} ne "") { 110*00b67f09SDavid van Moolenbroek print("Only in $file1 (missing from $file2):\n") 111*00b67f09SDavid van Moolenbroek if ($printed == 0); 112*00b67f09SDavid van Moolenbroek print("< $entry{$key}\n"); 113*00b67f09SDavid van Moolenbroek $status = 1; 114*00b67f09SDavid van Moolenbroek $printed++; 115*00b67f09SDavid van Moolenbroek } 116*00b67f09SDavid van Moolenbroek} 117*00b67f09SDavid van Moolenbroek 118*00b67f09SDavid van Moolenbroekif ($rcode1 ne $rcode2) { 119*00b67f09SDavid van Moolenbroek print("< status: $rcode1\n"); 120*00b67f09SDavid van Moolenbroek print("> status: $rcode2\n"); 121*00b67f09SDavid van Moolenbroek $status = 1; 122*00b67f09SDavid van Moolenbroek} 123*00b67f09SDavid van Moolenbroek 124*00b67f09SDavid van Moolenbroekexit($status); 125