[Bps-public-commit] app-aws-cloudwatch-monitor-check-fail2ban branch add-check-module created. a114f541c1b7d50923dcf2994c19116a02b0035a

BPS Git Server git at git.bestpractical.com
Thu Nov 25 00:32:33 UTC 2021


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "app-aws-cloudwatch-monitor-check-fail2ban".

The branch, add-check-module has been created
        at  a114f541c1b7d50923dcf2994c19116a02b0035a (commit)

- Log -----------------------------------------------------------------
commit a114f541c1b7d50923dcf2994c19116a02b0035a
Author: Blaine Motsinger <blaine at bestpractical.com>
Date:   Wed Nov 24 18:32:04 2021 -0600

    WIP - Add initial check module and tests
    
    saving the work in the branch.
    needs to be broken into commits.

diff --git a/README b/README
index a5064e7..45399a1 100644
--- a/README
+++ b/README
@@ -1,3 +1,40 @@
 NAME
     App::AWS::CloudWatch::Monitor::Check::Fail2Ban - gather fail2ban jail
     metrics
+
+SYNOPSIS
+     my $plugin  = App::AWS::CloudWatch::Monitor::Check::Fail2Ban->new();
+     my $metrics = $plugin->check();
+
+     perl bin/aws-cloudwatch-monitor --check Fail2Ban
+
+DESCRIPTION
+    "App::AWS::CloudWatch::Monitor::Check::Fail2Ban" is a
+    "App::AWS::CloudWatch::Monitor::Check" module which gathers fail2ban
+    jail metrics.
+
+METRICS
+    The following metrics are gathered and returned.
+
+    fail2ban-CurrentlyBanned
+        The cumulative currently banned for all active jails.
+
+    fail2ban-TotalBanned
+        The cumulative total banned for all active jails.
+
+METHODS
+    check
+        Gathers the metric data and returns an arrayref of hashrefs with
+        keys "MetricName", "Unit", "RawValue".
+
+DEPENDENCIES
+    <App::AWS::CloudWatch::Monitor::Check::Fail2Ban> depends on the external
+    program, "fail2ban-client".
+
+KNOWN ISSUES
+    "fail2ban-client" requires root privileges to read the logfiles. This
+    check must also be run with root privileges because of its dependency on
+    "fail2ban-client".
+
+     Permission denied to socket: /var/run/fail2ban/fail2ban.sock, (you must be root)
+
diff --git a/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban.pm b/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban.pm
new file mode 100644
index 0000000..939942f
--- /dev/null
+++ b/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban.pm
@@ -0,0 +1,132 @@
+package App::AWS::CloudWatch::Monitor::Check::Fail2Ban;
+
+use strict;
+use warnings;
+
+use parent 'App::AWS::CloudWatch::Monitor::Check';
+
+our $VERSION = '0.01';
+
+sub check {
+    my $self = shift;
+
+    my @fail2ban_jails_command = ( '/usr/bin/fail2ban-client', 'status' );
+    my ( $exit, $stdout, $stderr ) = $self->run_command( \@fail2ban_jails_command );
+
+    if ($exit) {
+        die "$stderr\n";
+    }
+
+    return unless $stdout;
+
+    my @jails;
+    foreach my $line ( @{$stdout} ) {
+        next unless $line =~ qr/Jail list/;
+
+        # `- Jail list: http-one, http-two, http-three
+        $line =~ s/^`-\s+Jail\s+list:\s+//g;
+
+        # http-one, http-two, http-three
+        push @jails, split /,\s+/, $line;
+    }
+
+    my $currently_banned = 0;
+    my $total_banned     = 0;
+    foreach my $jail (@jails) {
+        ( $exit, $stdout, $stderr ) = $self->run_command( [ @fail2ban_jails_command, $jail ] );
+
+        if ($exit) {
+            die "$stderr\n";
+        }
+
+        return unless $stdout;
+
+        foreach my $line ( @{$stdout} ) {
+            if ( $line =~ qr/Currently banned/ ) {
+
+                #    |- Currently banned:   1485
+                if ( $line =~ /(\d+)$/ ) {
+                    $currently_banned += $1;
+                }
+            }
+
+            if ( $line =~ qr/Total banned/ ) {
+
+                #    |- Total banned:   3326
+                if ( $line =~ /(\d+)$/ ) {
+                    $total_banned += $1;
+                }
+            }
+        }
+    }
+
+    return [
+        {   MetricName => 'fail2ban-CurrentlyBanned',
+            Unit       => 'Count',
+            RawValue   => $currently_banned,
+        },
+        {   MetricName => 'fail2ban-TotalBanned',
+            Unit       => 'Count',
+            RawValue   => $total_banned,
+        },
+    ];
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+App::AWS::CloudWatch::Monitor::Check::Fail2Ban - gather fail2ban jail metrics
+
+=head1 SYNOPSIS
+
+ my $plugin  = App::AWS::CloudWatch::Monitor::Check::Fail2Ban->new();
+ my $metrics = $plugin->check();
+
+ perl bin/aws-cloudwatch-monitor --check Fail2Ban
+
+=head1 DESCRIPTION
+
+C<App::AWS::CloudWatch::Monitor::Check::Fail2Ban> is a C<App::AWS::CloudWatch::Monitor::Check> module which gathers fail2ban jail metrics.
+
+=head1 METRICS
+
+The following metrics are gathered and returned.
+
+=over
+
+=item fail2ban-CurrentlyBanned
+
+The cumulative currently banned for all active jails.
+
+=item fail2ban-TotalBanned
+
+The cumulative total banned for all active jails.
+
+=back
+
+=head1 METHODS
+
+=over
+
+=item check
+
+Gathers the metric data and returns an arrayref of hashrefs with keys C<MetricName>, C<Unit>, C<RawValue>.
+
+=back
+
+=head1 DEPENDENCIES
+
+<App::AWS::CloudWatch::Monitor::Check::Fail2Ban> depends on the external program, C<fail2ban-client>.
+
+=head1 KNOWN ISSUES
+
+C<fail2ban-client> requires root privileges to read the logfiles.  This check must also be run with root privileges because of its dependency on C<fail2ban-client>.
+
+ Permission denied to socket: /var/run/fail2ban/fail2ban.sock, (you must be root)
+
+=cut
diff --git a/t/00_load.t b/t/00_load.t
new file mode 100644
index 0000000..4f512d3
--- /dev/null
+++ b/t/00_load.t
@@ -0,0 +1,38 @@
+use strict;
+use warnings;
+
+use FindBin;
+use lib "$FindBin::RealBin/../lib", "$FindBin::RealBin/lib";
+use App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test;
+
+use File::Find ();
+use File::Spec ();
+
+foreach my $module (find_all_perl_modules()) {
+    use_ok($module) or BAIL_OUT;
+}
+
+done_testing();
+
+sub find_all_perl_modules {
+    my $base = "$FindBin::RealBin/../";
+
+    my @modules;
+    File::Find::find(
+        sub {
+            my $file = $File::Find::name;
+            return unless $file =~ /\.pm$/;
+            return if $file =~ /Test\.pm$/;
+
+            my $rel_path = File::Spec->abs2rel( $file, $base );
+            $rel_path =~ s/^[t\/]*lib\///;
+            $rel_path =~ s/\//::/g;
+            $rel_path =~ s/\.pm$//;
+
+            push( @modules, $rel_path );
+        },
+        $base,
+    );
+
+    return @modules;
+}
diff --git a/t/996_perl-tidy.t b/t/996_perl-tidy.t
new file mode 100644
index 0000000..d4a8a51
--- /dev/null
+++ b/t/996_perl-tidy.t
@@ -0,0 +1,22 @@
+use strict;
+use warnings;
+
+use FindBin;
+use Test::More;
+
+unless ( $ENV{TEST_AUTHOR} ) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan( skip_all => $msg );
+}
+
+eval { require Test::PerlTidy; };
+
+if ($@) {
+    my $msg = 'Test::PerlTidy required to criticise code';
+    plan( skip_all => $msg );
+}
+
+Test::PerlTidy::run_tests(
+    path       => "$FindBin::RealBin/../lib",
+    perltidyrc => "$FindBin::RealBin/perltidyrc",
+);
diff --git a/t/997_perl-critic.t b/t/997_perl-critic.t
new file mode 100644
index 0000000..40637c2
--- /dev/null
+++ b/t/997_perl-critic.t
@@ -0,0 +1,23 @@
+use strict;
+use warnings;
+
+use FindBin;
+use File::Spec;
+use Test::More;
+
+unless ( $ENV{TEST_AUTHOR} ) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan( skip_all => $msg );
+}
+
+eval { require Test::Perl::Critic; };
+
+if ($@) {
+    my $msg = 'Test::Perl::Critic required to criticise code';
+    plan( skip_all => $msg );
+}
+
+my $rcfile = File::Spec->catfile( 't', 'perlcriticrc' );
+Test::Perl::Critic->import( -profile => $rcfile );
+
+all_critic_ok("$FindBin::RealBin/../lib");
diff --git a/t/998_pod-checker.t b/t/998_pod-checker.t
new file mode 100644
index 0000000..503ec4d
--- /dev/null
+++ b/t/998_pod-checker.t
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+
+use FindBin;
+use Test::More;
+
+unless ( $ENV{TEST_AUTHOR} ) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan( skip_all => $msg );
+}
+
+eval { require Test::Pod; };
+
+if ($@) {
+    my $msg = 'Test::Pod required to criticise code';
+    plan( skip_all => $msg );
+}
+
+Test::Pod::all_pod_files_ok( Test::Pod::all_pod_files("$FindBin::RealBin/../lib") );
diff --git a/t/999_pod-coverage.t b/t/999_pod-coverage.t
new file mode 100644
index 0000000..5bc38e5
--- /dev/null
+++ b/t/999_pod-coverage.t
@@ -0,0 +1,21 @@
+use strict;
+use warnings;
+
+use FindBin ();
+use lib "$FindBin::RealBin/lib";
+
+use Test::More;
+
+unless ( $ENV{TEST_AUTHOR} ) {
+    my $msg = 'Author test. Set $ENV{TEST_AUTHOR} to a true value to run.';
+    plan( skip_all => $msg );
+}
+
+eval { require Test::Pod::Coverage; };
+
+if ($@) {
+    my $msg = 'Test::Pod::Coverage required to criticise code';
+    plan( skip_all => $msg );
+}
+
+Test::Pod::Coverage::all_pod_coverage_ok();
diff --git a/t/check.t b/t/check.t
new file mode 100644
index 0000000..8ec637b
--- /dev/null
+++ b/t/check.t
@@ -0,0 +1,52 @@
+use strict;
+use warnings;
+
+use FindBin ();
+use lib "$FindBin::RealBin/../lib", "$FindBin::RealBin/lib";
+use App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test;
+
+my $class = 'App::AWS::CloudWatch::Monitor::Check::Fail2Ban';
+use_ok($class);
+
+my $test_data = App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test::load_test_data( 'success.txt' );
+
+HAPPY_PATH: {
+    note( 'happy path' );
+
+    no warnings 'once';
+    $App::AWS::CloudWatch::Monitor::Check::stdout = $test_data;
+
+    my $obj     = $class->new();
+    my $metrics = $obj->check();
+
+    ok( $metrics, 'return is truthy' );
+    ok( ref $metrics eq 'ARRAY' && scalar @{$metrics}, 'return is an ARRAYREF containing members' );
+
+    my $found_metric_names = 0;
+    foreach my $metric ( @{$metrics} ) {
+        $found_metric_names += 1 if grep { $metric->{MetricName} eq "fail2ban-$_" } (qw{ CurrentlyBanned TotalBanned });
+        my $found_metric_keys = grep { defined $metric->{$_} } (qw{ MetricName Unit RawValue });
+        ok( $found_metric_keys == 3, $metric->{MetricName} . ' metric contains the required keys' );
+    }
+
+    is( $found_metric_names, 2, 'return contains the expected metric names' );
+    is( @{$metrics}, 2, 'return contains the expected number of metrics' ); 
+    is( $metrics->[0]{RawValue}, 3, 'fail2ban-CurrentlyBanned metric contains the expected RawValue' );
+    is( $metrics->[1]{RawValue}, 16, 'fail2ban-TotalBanned metric contains the expected RawValue' );
+}
+
+FAILURES: {
+    note( 'run_command failure' );
+
+    no warnings 'once';
+    $App::AWS::CloudWatch::Monitor::Check::exit = 1;
+    my $expected_error = 'more olives on the pizza';
+    $App::AWS::CloudWatch::Monitor::Check::stderr = $expected_error;
+
+    my $obj  = $class->new();
+
+    dies_ok { $obj->check() } 'dies if run_command returns exit code';
+    like( $@, qr/$expected_error/, 'response propagates stderr from run_command' );
+}
+
+done_testing();
diff --git a/t/data/success.txt b/t/data/success.txt
new file mode 100644
index 0000000..c0351cc
--- /dev/null
+++ b/t/data/success.txt
@@ -0,0 +1,12 @@
+Status
+|- Number of jail:      1
+`- Jail list:   http-get-dos
+Status for the jail: http-get-dos
+|- Filter
+|  |- Currently failed: 6
+|  |- Total failed:     101
+|  `- File list:        /var/log/apache2/other_vhosts_access.log
+`- Actions
+   |- Currently banned: 3
+   |- Total banned:     16
+   `- Banned IP list:   1.1.1.1 2.2.2.2 3.3.3.3
diff --git a/t/lib/App/AWS/CloudWatch/Monitor/Check.pm b/t/lib/App/AWS/CloudWatch/Monitor/Check.pm
new file mode 100644
index 0000000..7341927
--- /dev/null
+++ b/t/lib/App/AWS/CloudWatch/Monitor/Check.pm
@@ -0,0 +1,80 @@
+package App::AWS::CloudWatch::Monitor::Check;
+
+use strict;
+use warnings;
+
+our $VERSION = '0.01';
+
+our $exit   = 0;
+our $stdout = [];
+our $stderr = '';
+
+sub new {
+    my $class = shift;
+    my $self  = {};
+
+    return bless $self, $class;
+}
+
+sub run_command {
+    my $self    = shift;
+    my $command = shift;
+
+    return ( $exit, $stdout, $stderr );
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+App::AWS::CloudWatch::Monitor::Check - mock parent for Check modules
+
+=head1 SYNOPSIS
+
+ use parent 'App::AWS::CloudWatch::Monitor::Check';
+
+=head1 DESCRIPTION
+
+C<App::AWS::CloudWatch::Monitor::Check> provides a contructor and methods for child modules in tests.
+
+This module is only to allow testing check modules, and not meant to be initialized directly, but through child modules in tests.
+
+=head1 CONSTRUCTOR
+
+=over
+
+=item new
+
+Returns the C<App::AWS::CloudWatch::Monitor::Check> object.
+
+=back
+
+=head1 METHODS
+
+=over
+
+=item run_command
+
+Method to mock C<run_command> output for tests.  Returns a list with three members consisting of:
+
+=over
+
+=item C<exit code>
+
+The C<exit code> can be set in the package variable, C<App::AWS::CloudWatch::Monitor::Check::exit>.
+
+=item output from C<STDOUT>
+
+The C<STDOUT> can be set in the package variable, C<App::AWS::CloudWatch::Monitor::Check::stdout>.
+
+=item output from C<STDERR>
+
+The C<STDERR> can be set in the package variable, C<App::AWS::CloudWatch::Monitor::Check::stderr>.
+
+=back
+
+=cut
diff --git a/t/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban/Test.pm b/t/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban/Test.pm
new file mode 100644
index 0000000..9e4ea01
--- /dev/null
+++ b/t/lib/App/AWS/CloudWatch/Monitor/Check/Fail2Ban/Test.pm
@@ -0,0 +1,84 @@
+package App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test;
+
+use strict;
+use warnings;
+
+use parent 'Test::More';
+
+our $VERSION = '0.01';
+
+sub import {
+    my $class = shift;
+    my %args  = @_;
+
+    if ( $args{tests} ) {
+        $class->builder->plan( tests => $args{tests} )
+            unless $args{tests} eq 'no_declare';
+    }
+    elsif ( $args{skip_all} ) {
+        $class->builder->plan( skip_all => $args{skip_all} );
+    }
+
+    Test::More->export_to_level(1);
+
+    require Test::Exception;
+    Test::Exception->export_to_level(1);
+
+    return;
+}
+
+sub load_test_data {
+    my $filename       = shift;
+    my $test_data_file = "$FindBin::RealBin/data/$filename";
+
+    die "filename argument is required\n"
+        unless $filename;
+
+    open( my $test_data_file_fh, '<', $test_data_file )
+        or die "$test_data_file does not exist or cannot be read";
+
+    my $test_data = [];
+    while ( my $line = <$test_data_file_fh> ) {
+        chomp $line;
+        push @{$test_data}, $line;
+    }
+    close($test_data_file_fh);
+
+    return $test_data;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test - testing module for App::AWS::CloudWatch::Monitor::Check::Fail2Ban
+
+=head1 SYNOPSIS
+
+ use App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test;
+
+ ok($got eq $expected, $test_name);
+
+=head1 DESCRIPTION
+
+C<App::AWS::CloudWatch::Monitor::Check::Fail2Ban::Test> sets up the testing environment and modules needed to test the Fail2Ban check module in isolation.
+
+Methods from C<Test::More> and C<Test::Exception> are exported and available for the tests.
+
+=head1 SUBROUTINES
+
+=over
+
+=item load_test_data
+
+Reads and returns output from files in C<t/data/>.
+
+Takes C<filename> as an argument for which file to read.
+
+=back
+
+=cut
diff --git a/t/perlcriticrc b/t/perlcriticrc
new file mode 100644
index 0000000..f065624
--- /dev/null
+++ b/t/perlcriticrc
@@ -0,0 +1,200 @@
+### PERLCRITIC OPTIONS
+color = 1
+verbose = %m at %f line %l [%p]\n
+severity = 2
+force = 1
+
+
+### POLICY SETTINGS
+# we don't unpack @_ right away as we mostly use named vars with defaults
+[-Subroutines::RequireArgUnpacking]
+
+# errstr for DBI is okay, and probably others since I like that convention.
+[-Variables::ProhibitPackageVars]
+#packages = DBI
+
+# HEREDOC doesn't adhere to my tidy eye
+[-ValuesAndExpressions::ProhibitImplicitNewlines]
+
+# don't require extended format for shortish regex
+# keeping this in here for documentation purposes
+[-RegularExpressions::RequireExtendedFormatting]
+#minimum_regex_length_to_complain_about = 60
+
+# don't require Carp
+[-ErrorHandling::RequireCarping]
+
+# postfix is okay, unless it's really weird
+[-ControlStructures::ProhibitPostfixControls]
+
+# needless ruleset for modern Perl versions
+[-ValuesAndExpressions::ProhibitInterpolationOfLiterals]
+
+# don't use backticks
+[InputOutput::ProhibitBacktickOperators]
+only_in_void_context = 1
+
+# 3 arg open is modern Perl
+[InputOutput::ProhibitTwoArgOpen]
+
+# close filehandles as soon as possible after opening them.
+[InputOutput::RequireBriefOpen]
+lines = 17
+
+# forbid a bare `## no critic'
+# shouldn't be turning off critic anyway
+[Miscellanea::ProhibitUnrestrictedNoCritic]
+
+# Minimize complexity in code that is outside of subroutines.
+[-Modules::ProhibitExcessMainComplexity]
+max_mccabe = 28
+
+# write `require Module' instead of `require 'Module.pm''.
+[Modules::RequireBarewordIncludes]
+
+# end each module with an explicitly `1;' instead of some funky expression.
+# sorry Charles ;)
+[Modules::RequireEndWithOne]
+
+# always make the 'package' explicit.
+[Modules::RequireExplicitPackage]
+
+# package declaration must match filename.
+[Modules::RequireFilenameMatchesPackage]
+
+# Give every module a `$VERSION' number.
+[Modules::RequireVersionVar]
+
+# don't use vague variable or subroutine names like 'last' or 'record'.
+[NamingConventions::ProhibitAmbiguousNames]
+forbid = last left right no abstract contract record second close
+
+# write `@{ $array_ref }' instead of `@$array_ref'.
+# consistency mostly.  I don't really care either way, but should be consistent.
+[References::ProhibitDoubleSigils]
+
+## REGEX
+[RegularExpressions::ProhibitUnusedCapture]
+[RegularExpressions::ProhibitUnusualDelimiters]
+[-RegularExpressions::RequireDotMatchAnything]
+[-RegularExpressions::RequireLineBoundaryMatching]
+[-RegularExpressions::ProhibitEnumeratedClasses]
+[-RegularExpressions::ProhibitFixedStringMatches]
+
+# don't name things the same as other things
+[Subroutines::ProhibitBuiltinHomonyms]
+
+# too many arguments
+[Subroutines::ProhibitManyArgs]
+
+# don't write `sub my_function (@@) {}'.
+[Subroutines::ProhibitSubroutinePrototypes]
+
+# prevent unused private subroutines.
+[Subroutines::ProhibitUnusedPrivateSubroutines]
+
+# prevent access to private subs in other packages.
+[Subroutines::ProtectPrivateSubs]
+
+# end every path through a subroutine with an explicit `return' statement.
+[Subroutines::RequireFinalReturn]
+
+# shouldn't be turning these off or not defining these
+[TestingAndDebugging::ProhibitNoStrict]
+[TestingAndDebugging::ProhibitNoWarnings]
+[TestingAndDebugging::RequireUseStrict]
+[TestingAndDebugging::RequireUseWarnings]
+
+# unless is okay sometimes
+[-ControlStructures::ProhibitUnlessBlocks]
+
+# don't require constants inplace of magic variables
+# I'm still on the fence about this
+[-ValuesAndExpressions::ProhibitMagicNumbers]
+
+# don't prohibit constant pragma
+[-ValuesAndExpressions::ProhibitConstantPragma]
+
+# don't prohibit long numbers
+[-ValuesAndExpressions::RequireNumberSeparators]
+
+# don't require check of close
+[-InputOutput::RequireCheckedClose]
+
+# allow error strings from syscalls
+[Variables::ProhibitPunctuationVars]
+allow = $! $0
+
+# don't care about noisy quotes
+[-ValuesAndExpressions::ProhibitNoisyQuotes]
+
+# don't care about empty quotes
+[-ValuesAndExpressions::ProhibitEmptyQuotes]
+
+# set sub complexity to 30
+[Subroutines::ProhibitExcessComplexity]
+max_mccabe = 30
+
+# dont prohibit C style for loops
+[-ControlStructures::ProhibitCStyleForLoops]
+
+
+## TODO: re-evaluate these
+# when working on old modules, export is okay
+[-Modules::ProhibitAutomaticExportation]
+
+# Write ` !$foo && $bar || $baz ' instead of ` not $foo && $bar or $baz'.
+[ValuesAndExpressions::ProhibitMixedBooleanOperators]
+
+# Use `my' instead of `local', except when you have to.
+[Variables::ProhibitLocalVars]
+
+# Don't ask for storage you don't need.
+[Variables::ProhibitUnusedVariables]
+
+# don't use 'grep' in void contexts.
+[BuiltinFunctions::ProhibitVoidGrep]
+
+# don't use 'map' in void contexts.
+[BuiltinFunctions::ProhibitVoidMap]
+
+# don't use 'grep' in boolean context
+[BuiltinFunctions::ProhibitBooleanGrep]
+
+# Write `bless {}, $class;' instead of just `bless {};'.
+[ClassHierarchies::ProhibitOneArgBless]
+
+# Use spaces instead of tabs.
+[CodeLayout::ProhibitHardTabs]
+
+# Don't use whitespace at the end of lines.
+[CodeLayout::ProhibitTrailingWhitespace]
+
+# Use the same newline through the source.
+[CodeLayout::RequireConsistentNewlines]
+
+# Must run code through perltidy.
+[CodeLayout::RequireTidyCode]
+
+# Put a comma at the end of every multi-line list declaration, including the last one.
+[CodeLayout::RequireTrailingCommas]
+
+# Don't write long "if-elsif-elsif-elsif-elsif...else" chains.
+[ControlStructures::ProhibitCascadingIfElse]
+
+# Don't use operators like `not', `!~', and `le' within `until' and `unless'.
+[ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions]
+
+# Don't write code after an unconditional `die, exit, or next'.
+[ControlStructures::ProhibitUnreachableCode]
+
+
+## POD
+# The `=head1 NAME' section should match the package.
+# [Documentation::RequirePackageMatchesPodName]
+
+# All POD should be after `__END__'.
+# [Documentation::RequirePodAtEnd]
+
+# Organize your POD into the customary sections.
+[-Documentation::RequirePodSections]
diff --git a/t/perltidyrc b/t/perltidyrc
new file mode 100644
index 0000000..4348b2a
--- /dev/null
+++ b/t/perltidyrc
@@ -0,0 +1,34 @@
+-l=140   # Max line width is 140 cols
+-i=4     # Indent level is 4 cols
+-ci=4    # Continuation indent is 4 cols
+-vt=4    # Maximal vertical tightness
+-cti=0   # No extra indentation for closing brackets
+-pt=1    # Medium parenthesis tightness
+-sbt=1   # Medium square bracket tightness
+-bt=1    # Medium brace tightness (for non-code blocks)
+-bbt=1   # Medium block brace tightness (for code blocks)
+--nospace-for-semicolon
+-nolq    # Don't outdent long quoted strings
+         # Break before all operators:
+-wbb="% + - * / x != == >= <= =~ < > | & **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
+
+-fpsc=0  # Don't try to line up all comments to a fixed column
+-hsc     # Align hanging side comments
+-bbs     # Ensure a blank line before every sub definition (except one-liners)
+-bbb     # Ensure a blank line before code blocks (for, while, if, ....)
+
+-bar     # K&R style code braces
+-nolc    # Long comments indented, even when this make the total line length "too long"
+-noll    # Long lines indented, even when this make the total line length "too long"
+-nola    # Don't treat labels as special cases when indenting
+
+-nst     # Do NOT output to STDOUT (since we want to use -b)
+-b       # Backup the input file to .bak and perform all tidying in the original file
+-se      # Write errors to STDERR
+
+-it=4    # iterations
+--block-brace-vertical-tightness=1
+--nospace-terminal-semicolon
+--noadd-semicolons
+-nbl     # --noopening-brace-on-new-line
+--backup-file-extension=/    # delete bak file
-----------------------------------------------------------------------


hooks/post-receive
-- 
app-aws-cloudwatch-monitor-check-fail2ban


More information about the Bps-public-commit mailing list