Firewall-Config-Parser

 view release on metacpan or  search on metacpan

lib/Firewall/Config/Parser/Asa.pm  view on Meta::CPAN

package Firewall::Config::Parser::Asa;

#------------------------------------------------------------------------------
# 加载扩展模块
#------------------------------------------------------------------------------
use Moose;
use namespace::autoclean;
use experimental qw( smartmatch );

#------------------------------------------------------------------------------
# 加载 Firewall::Config::Parser::Role 觉得,直接使用其属性和方法
#------------------------------------------------------------------------------
with 'Firewall::Config::Parser::Role';

#------------------------------------------------------------------------------
# 加载 Firewall::Config::Element 具体元素规范
#------------------------------------------------------------------------------
use Firewall::Config::Element::AddressGroup::Asa;
use Firewall::Config::Element::ServiceGroup::Asa;
use Firewall::Config::Element::ProtocolGroup::Asa;
use Firewall::Config::Element::Schedule::Asa;
use Firewall::Config::Element::Rule::Asa;
use Firewall::Config::Element::Route::Asa;
use Firewall::Config::Element::Zone::Asa;
use Firewall::Config::Element::Interface::Asa;
use Firewall::Config::Element::StaticNat::Asa;
use Firewall::Config::Element::NatPool::Asa;
use Firewall::Config::Element::DynamicNat::Asa;
use Firewall::Utils::Ip;

#------------------------------------------------------------------------------
# Firewall::Config::Parser::Asa 通用属性
#------------------------------------------------------------------------------
has aclLineNumbers => ( is => 'ro', isa => 'HashRef[Int]', default => sub { {} }, );

#------------------------------------------------------------------------------
# 定义 Firewall::Config::Parser::Asa 配置解析入口函数
# parse 为 Firewall::Config::Parser::Role 角色必须实现的方法
#------------------------------------------------------------------------------
sub parse {
  my $self = shift;
  while ( my $string = $self->nextUnParsedLine ) {
    if    ( $self->isRoute($string) ) { $self->parseRoute($string) }
    elsif ( $self->isInterfaceZone($string) ) {$self->parseInterfaceZone($string)}
    elsif ( $self->isAclGroup($string) ) {$self->parseAclGroup($string)}
    elsif ( $self->isAddressGroup($string) ) {$self->parseAddressGroup($string)}
    elsif ( $self->isServiceGroup($string) ) {$self->parseServiceGroup($string)}
    elsif ( $self->isProtocolGroup($string) ) {$self->parseProtocolGroup($string)}
    elsif ( $self->isSchedule($string) ) {$self->parseSchedule($string)}
    else {$self->ignoreLine}
  }
  $self->goToHeadLine;
  while ( my $string = $self->nextUnParsedLine ) {
    if    ( $self->isStaticNat($string) ) { $self->parseStaticNat($string) }
    elsif ( $self->isRule($string) )      { $self->parseRule($string) }
    elsif ( $self->isNatPool($string) )   { $self->parseNatPool($string) }
    elsif ( $self->isDynamicNat($string) ) {$self->parseDynamicNat($string)}
    elsif ( $self->isNewNat($string) ) {$self->parseNewNat($string)}
    else {$self->ignoreLine}
  }
} ## end sub parse

sub isNewNat {
  my ( $self, $string ) = @_;
  if ( $string =~ /nat\s+\((?<realZone>\S+),(?<natZone>\S+)\)(\s+after-auto)?\s+source/ ) {
    return 1;
  }
  else {
    return;
  }
}

sub parseNewNat {
  my ( $self, $string ) = @_;
  $self->{version} = '8.3';
  my $ippat = '\d+\.\d+\.\d+\.\d+';
  if (
    $string =~ /nat\s+\((?<realZone>\S+),(?<natZone>\S+)\)(\s+after-auto)?\s+source\s+(?<snatType>dynamic|static)\s+
        (?<src>\S+)\s+(?:(?<int1>interface)|(pat-pool\s+(?<spatObj>\S+))|(?<snatObj>\S+))(\s+(?<int2>interface))?
        (?:\s+destination\s+static\s+(?<dstnat>\S+)\s+(?<dst>\S+))?
        (?:\s+service\s+(?<natSrv>\S+)\s+(?<srv>\S+))?/oxi
    )
  {
    my $realZone = $+{realZone};
    my $natZone  = $+{natZone};
    my $snatType = $+{snatType};
    my $src      = $+{src};
    my $natInt   = $+{int1};
    my $spatObj  = $+{spatObj};
    my $snatObj  = $+{snatObj};
    my $dstnat   = $+{dstnat};
    my $dst      = $+{dst};
    my $natSrv   = $+{natSrv};
    my $srv      = $+{srv};



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