Firewall-Config-Dao

 view release on metacpan or  search on metacpan

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

    # config
    push @addr, $addr->{config};

    # address_set
    push @addr, encode_json {mins => $addr->range->mins, maxs => $addr->range->maxs};

    # address_range
    my @address_range;
    for ( my $i = 0; $i < $addr->range->mins->@*; $i++ ) {
      push @address_range, "[" . $addr->range->mins->[$i] . "," . $addr->range->maxs->[$i] . "]";
    }
    push @addr, \@address_range;

    # other
    push @addr, encode_json {zone => $addr->{zone}};

    # 压入数据到 $params
    push $params->@*, \@addr;
  }

  # 遍历地址组对象
  for my $addrG ( values $self->{parser}{elements}{addressGroup}->%* ) {

    # 构造 SQL VALUES
    my @addr;

    # fw_id
    push @addr, $self->fwId;

    # addr_name
    push @addr, $addrG->{addrGroupName};

    # ref_num
    push @addr, $addrG->{refnum};

    # config
    push @addr, $addrG->{config};

    # address_set
    push @addr, encode_json {mins => $addrG->range->mins, maxs => $addrG->range->maxs};

    # address_range
    my @address_range;
    for ( my $i = 0; $i < $addrG->range->mins->@*; $i++ ) {
      push @address_range, "[" . $addrG->range->mins->[$i] . "," . $addrG->range->maxs->[$i] . "]";
    }
    push @addr, \@address_range;

    # other
    push @addr, encode_json {zone => $addrG->{zone}};

    # 将数据压入 $params
    push $params->@*, \@addr;
  }
  $self->batchExecute( $params, $sql );
}

#------------------------------------------------------------------------------
# updateNetwork 抽象批量更新大网、私网接口
#------------------------------------------------------------------------------
sub updateNetwork {
  my ( $self, $zones, @tables ) = @_;

  # 如果传入的非哈希引用则自动修正
  confess "网络区域必须是哈希引用"  if not ref $zones eq 'HASH' || not defined $zones;
  confess "必须提供至少一个表单数据" if scalar @tables == 0;

  # 遍历表单批量更新数据
  foreach my $table (@tables) {

    # 异常拦截
    confess "数据表不匹配,请整体填写" if $table !~ /fw_network_main|fw_network_private/i;

    # 定义 SQL 语句
    my $sql = "insert into $table (fw_id,zone,addr_range,addr_min,addr_max) values(?,?,?,?,?)";

    # 初始化变量
    my $params;

    # 插入数据之前删除历史数据
    $self->delete( where => {fw_id => $self->fwId}, table => $table );

    # 遍历防火墙网络区域
    foreach my $zone ( keys $zones->%* ) {

      # 这里的变量基于 Set 顺序一致
      my $addrIprange = $zones->{$zone}->addrIpRange;
      my $mins        = $zones->{$zone}->mins;
      my $maxs        = $zones->{$zone}->maxs;

      # COPY 复刻副本
      my $copy_addrIprange = dclone $addrIprange;
      my $copy_mins        = dclone $mins;
      my $copy_maxs        = dclone $maxs;

      # 遍历 addrIprange 数组
      while ( $copy_addrIprange->@* ) {

        # 初始化变量 @zone
        my @zone;

        # fw_id
        push @zone, $self->fwId;

        # zone
        push @zone, $zone;

        # addr_range
        push @zone, pop $copy_addrIprange->@*;

        # addr_min
        push @zone, pop $copy_mins->@*;

        # addr_max
        push @zone, pop $copy_maxs->@*;

        # 将数据压入 params
        push $params->@*, \@zone;
      }
    }

    # 插入快照数据
    $self->batchExecute( $params, $sql );
  }
}

#------------------------------------------------------------------------------
# updateStaticNatToNetwork 抽象自动绑定 NAT 网段到大网数据表单
#------------------------------------------------------------------------------
sub updateStaticNatToNetwork {
  my $self = shift;

  # 初始化变量
  my $params;
  my $table = 'fw_network_main';

  # 定义 SQL 语句
  my $sql = "insert into $table (fw_id,zone,addr_range,addr_min,addr_max) values(?,?,?,?,?)";

  # 查询防火墙快照中的静态地址转换
  for my $staticNat ( values $self->{parser}{elements}{staticNat}->%* ) {

    # 这里的变量基于 Set 顺序一致
    my $mins = $staticNat->natIpRange->mins;
    my $maxs = $staticNat->natIpRange->maxs;

    # COPY 复刻副本 | 深度复刻、互不影响
    my $copy_mins = dclone $mins;
    my $copy_maxs = dclone $maxs;

    # 遍历 $mins 数组
    while ( $copy_mins->@* ) {

      # 初始化变量 @network
      my @network;

      # 转换为 ipSet 集合 | 数据准备
      my $min        = pop $copy_mins->@*;
      my $max        = pop $copy_maxs->@*;
      my $ipMin      = Firewall::Utils::Ip->new->changeIntToIp($min);
      my $ipMax      = Firewall::Utils::Ip->new->changeIntToIp($max);
      my $addr_range = $ipMin . "-" . $ipMax;

      # fw_id | 数据填充阶段
      push @network, $self->fwId;

      # zone
      push @network, $staticNat->{realZone};

      # å¡«å…… addr_range
      push @network, $addr_range;

      # addr_min
      push @network, $min;

      # addr_max
      push @network, $max;

      # 将数据压入 params
      push $params->@*, \@network;
    }
    $self->batchExecute( $params, $sql );
  }
}

#------------------------------------------------------------------------------
# saveFwNetworkPrivate 保存 parser 解析到的大网、私网对象
#------------------------------------------------------------------------------
sub saveFwNetworkPrivate {
  my $self = shift;



( run in 0.717 second using v1.01-cache-2.11-cpan-9581c071862 )