| #!/usr/bin/perl |
| |
| # |
| ## Licensed to the Apache Software Foundation (ASF) under one |
| ## or more contributor license agreements. See the NOTICE file |
| ## distributed with this work for additional information |
| ## regarding copyright ownership. The ASF licenses this file |
| ## to you under the Apache License, Version 2.0 (the |
| ## "License"); you may not use this file except in compliance |
| ## with the License. You may obtain a copy of the License at |
| ## |
| ## http://www.apache.org/licenses/LICENSE-2.0 |
| ## |
| ## Unless required by applicable law or agreed to in writing, software |
| ## distributed under the License is distributed on an "AS IS" BASIS, |
| ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ## See the License for the specific language governing permissions and |
| ## limitations under the License. |
| |
| # This script will compare two files containing record configs and metrics. |
| # It provides a list of common configs/metrics and their default value changes. |
| # It also lists configs/metrics difference between the files. |
| |
| # By default, it compares only configs. To compare metrics, you can pass -m command |
| # line argument. The files should be generated with e.g. |
| # |
| # $ traffic_ctl config match . |
| # |
| # You can compare configs between the files: |
| # $ compare_records.pl -f <filename1> -f <filenam2> |
| # |
| # You can compare metrics between the files use -m command line argument: |
| # $ compare_records.pl -m -f <filename1> -f <filenam2> |
| # |
| # @ File compare_records.pl |
| # |
| use strict; |
| use warnings; |
| use Getopt::Long; |
| |
| my ($file1, $file2, $in_files, $help); |
| my %file1_settings; |
| my %file2_settings; |
| my $diff_metrics; |
| |
| usage() |
| if ( |
| @ARGV < 1 |
| or !GetOptions( |
| 'f=s@' => \$in_files, |
| 'm' => \$diff_metrics, |
| 'help|?' => \$help |
| ) |
| or defined $help |
| ); |
| |
| # Input file is mandatory |
| die "\nTwo input files must be specified to compare\n" |
| unless defined $in_files; |
| |
| # Print the usage |
| sub usage |
| { |
| print "Unknown option: @_\n" if (@_); |
| print "Provide 2 files to compare configs or metrics.\n"; |
| print "By default this tool will diff only configs,\n"; |
| print "to get diff of metrics pass -m flag\n\n"; |
| print "Usage: compare_records.pl -m -f <filename1> -f <filename2>\n"; |
| print " -m to diff the metrics\n"; |
| print " -h for help\n\n"; |
| print "where the files are generated with e.g.\n\n"; |
| print " \$ traffic_ctl config match .\n"; |
| exit; |
| } |
| |
| my @file_list = @$in_files; |
| die "\nProvide only two files to compare\n" if (scalar(@file_list) != 2); |
| my $in_file1 = $file_list[0]; |
| my $in_file2 = $file_list[1]; |
| |
| # Open input files |
| if (defined $in_file1) { |
| open $file1, $in_file1 or die "Could not open $in_file1: $!"; |
| } |
| if (defined $in_file2) { |
| open $file2, $in_file2 or die "Could not open $in_file2: $!"; |
| } |
| |
| # Read input files |
| while (my $setting = <$file1>) { |
| chomp $setting; |
| my ($record, $value) = split(/:/, $setting); |
| if (defined $diff_metrics) { |
| # Obtain only metrics, excluding configs |
| if ($record !~ /proxy.config/) { |
| $file1_settings{$record} = $value; |
| } |
| } else { |
| # Obtain only configs |
| if ($record =~ /proxy.config/) { |
| $file1_settings{$record} = $value; |
| } |
| } |
| } |
| close $file1; |
| |
| while (my $setting = <$file2>) { |
| chomp $setting; |
| my ($record, $value) = split(/:/, $setting); |
| if (defined $diff_metrics) { |
| # Obtain only metrics, excluding configs |
| if ($record !~ /proxy.config/) { |
| $file2_settings{$record} = $value; |
| } |
| } else { |
| # Obtain only configs |
| if ($record =~ /proxy.config/) { |
| $file2_settings{$record} = $value; |
| } |
| } |
| } |
| close $file2; |
| |
| # Subroutine to compare configs/metrics and obtain common and difference between them |
| sub compare_configs_or_metrics |
| { |
| my ($records1, $records2, $file) = @_; |
| my %common_settings; |
| my %diff_settings; |
| my %settings1 = %$records1; |
| my %settings2 = %$records2; |
| |
| foreach my $record (sort keys %settings1) { |
| if ($settings2{$record}) { |
| $common_settings{$record} = $settings1{$record}; |
| } else { |
| $diff_settings{$record} = $settings1{$record}; |
| } |
| } |
| |
| print "####################################################################################\n"; |
| print "Configs/metrics found only in $file\n"; |
| print "####################################################################################\n"; |
| foreach my $key (sort keys %diff_settings) { |
| print "$key\n"; |
| } |
| return (\%common_settings); |
| } |
| |
| # Subroutine to obtain changes in default values among common configs/metrics |
| sub compare_default_values |
| { |
| my ($records1, $records2) = @_; |
| my %settings1 = %$records1; |
| my %settings2 = %$records2; |
| |
| foreach my $record (sort keys %settings1) { |
| if (defined $settings1{$record} && $settings2{$record}) { |
| if ($settings1{$record} ne $settings2{$record}) { |
| # Values doesn't match |
| print "$record default value changed from $settings1{$record} -> $settings2{$record}\n"; |
| } |
| } |
| } |
| } |
| |
| # Obtain common configs/metrics between two files |
| my $common2 = compare_configs_or_metrics(\%file2_settings, \%file1_settings, $in_file2); |
| my %common2_settings = %$common2; |
| |
| my $common1 = compare_configs_or_metrics(\%file1_settings, \%file2_settings, $in_file1); |
| my %common1_settings = %$common1; |
| |
| print "####################################################################################\n"; |
| print "Common configs/metrics between $in_file1 and $in_file2\n"; |
| print "####################################################################################\n"; |
| foreach my $key (sort keys %common2_settings) { |
| print "$key\n"; |
| } |
| |
| # Compare common configs/metrics and obtain changes in default values |
| print "####################################################################################\n"; |
| print "Default value changes in common configs/metrics between $in_file1 and $in_file2\n"; |
| print "####################################################################################\n"; |
| compare_default_values(\%common1_settings, \%common2_settings); |