Firewall-Policy-Designer

 view release on metacpan or  search on metacpan

lib/Firewall/Policy/Designer/Netscreen.pm  view on Meta::CPAN

package Firewall::Policy::Designer::Netscreen;

#------------------------------------------------------------------------------
# 加载项目模块
#------------------------------------------------------------------------------
use Moose;
use namespace::autoclean;

#------------------------------------------------------------------------------
# 加载项目模块
#------------------------------------------------------------------------------
use Firewall::Utils::Ip;
use Firewall::Policy::Searcher::Report::FwInfo;

has dbi => ( is => 'ro', does => 'Firewall::DBI::Role', required => 1, );

has searcherReportFwInfo => ( is => 'ro', isa => 'Firewall::Policy::Searcher::Report::FwInfo', required => 1, );

has commandText => ( is => 'ro', isa => 'ArrayRef[Str]', default => sub { [] }, );

sub addToCommandText {
  my ( $self, @commands ) = @_;
  push @{$self->commandText}, @commands;
}

sub design {
  my $self = shift;

  #delete $self->searcherReportFwInfo->{parser};
  #say dumper $self->searcherReportFwInfo;exit;
  if ( $self->searcherReportFwInfo->type eq 'new' ) {
    $self->createRule;
  }
  elsif ( $self->searcherReportFwInfo->type eq 'modify' ) {
    $self->modifyRule;
  }
  elsif ( $self->searcherReportFwInfo->type eq 'ignore' ) {
    if ( defined $self->searcherReportFwInfo->action ) {
      my $param = $self->searcherReportFwInfo->action->{'new'};
      for my $type ( keys %{$param} ) {
        if ( $type eq 'natDst' or $type eq 'natSrc' ) {
          $self->createNat( $param->{$type}, $type );
        }
      }
    }
  }
  else {
    confess( "ERROR: searcherReportFwInfo->type(" . $self->searcherReportFwInfo->type . ") must be 'new' or 'modify'" );
  }
  if ( @{$self->commandText} > 0 ) {
    push @{$self->commandText}, 'save';
  }
  return join( '', map {"$_\n"} @{$self->commandText} );
} ## end sub design

sub createRule {
  my $self = shift;

  #先检查涉及到的 addr or srv 在防火墙上有没有已经存在的名字,没有就需要创建
  my $action       = $self->searcherReportFwInfo->action->{'new'};
  my $schedule     = $self->searcherReportFwInfo->{schedule};
  my $scheduleStr  = '';
  my $scheduleName = $self->createSchedule($schedule) if $schedule->{enddate} ne 'always';
  $scheduleStr = " schedule \"$scheduleName\"" if defined $scheduleName;
  my $nameMap   = $self->checkAndCreateAddrOrSrvOrNat($action);
  my $natString = '';

  #实际可能有多组NAT,先考虑只有一组的情况
  $natString .= $nameMap->{natSrc}->[0]->{natStr} if defined $nameMap->{natSrc};
  $natString .= $nameMap->{natDst}->[0]->{natStr} if defined $nameMap->{natDst};

  #say dumper $nameMap;exit;

=example
set policy top from "V1-Untrust" to "V1-Trust"  "Host_10.31.180.11" "Host_10.31.92.22" "TCP_43477" permit log
set policy id XXX
set src-address "Host_10.8.37.27"
set src-address "Host_10.8.37.28"
set dst-address "Host_10.31.103.203"



( run in 0.641 second using v1.01-cache-2.11-cpan-39bf76dae61 )