keepalive配置文件转化JSON

无论在管理LVS配置中,对keepalive的配置文件管理是必不可少的,解析配置文件也是核心功能之一,现在把自己写的一些思路分享给大家~

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use JSON;
use re ‘eval‘;
#将keepalived.conf 格式化为json数据

my $file = "/Users/machenlong/Downloads/keepalived.conf";
open FH, $file or die "$!";
#一次行读取整个文件
my $str = do { local $/; <FH> };
#定义树形中的键值对
my $treeKey = {
    vrrpKey => {
        state             => 1,
        interface         => 1,
        virtual_router_id => 1,
        priority          => 1,
        advert_int        => 1,
    },
    virtualKey => {
        delay_loop => 1,
        lb_algo    => 1,
        lb_kind    => 1,
        protocol   => 1
    },
    realKey => {
        realKey0 => { weight => 1, },
        realKey1 => {

            TCP_CHECK => 1,
            HTTP_GET  => 1

        },
        realKey2 => {
            connect_timeout    => 1,
            nb_get_retry       => 1,
            delay_before_retry => 1,
            connect_port       => 1,

        },
        realKey3 => {
            url         => 1,
            path        => 1,
            status_code => 1
        }
    }
};
my $hash;
my $re
    = qr/(.*)s+{(?{local $a=0})(?>(?:([^{}]+)(?{push @{$hash->{$1}},$2;})|
#将匹配到得内容push到$hash
#固化分组,减少回朔。
{(?{$a++})|
#遇到开括号$a+1
}(?(?{$a!=0})(?{$a--})|
#如果$a不等于0则遇到闭括号$a-1
(?!)))*)(?(?{$a!=0})(?!))}/x;

# 否则继续匹配,如果继续遇到$a不等于0 继续匹配到行尾

#处理注释
$str =~ s/
#.*$//mg;

1 while ( $str =~ /$re/g );
my ( $formatHash, $vrrpFormat );
for my $key ( keys %$hash ) {
    for ( @{ $hash->{$key} } ) {
        vrrp_format( $key, $_, $treeKey );
    }
}

my $confFormat = real_format( $vrrpFormat, $treeKey );

print encode_json $confFormat;

sub vrrp_format {
    my ( $varrKey, $varrParam, $treeKey ) = @_;
    my ( $realIp, $realPort, $key3, @unParams );
    if ( $varrKey =~ /(global_defs)/ ) {
        my @params = split ‘ ‘, $varrParam;
        $vrrpFormat->{$1}->{ $params[0] } = $params[1];
    }

#vvrp 分解
    elsif ( $varrKey =~ /(vrrp.*?)s+(w+)/ ) {
        my ( $key, $value ) = ( $1, $2 );
        my @params = split ‘ ‘, $varrParam;
        my $ips;
        for ( 0 .. $
#params ) {
            my @v = splice @params, 0, 2;
            if (@v) {
                if ( $treeKey->{vrrpKey}->{ $v[0] } ) {
                    $vrrpFormat->{$key}->{$value}->{ $v[0] } = $v[1];
                }
                else {

                    for (@v) {

#IP处理
                        if (/(d+.){3}d+/) {
                            push @{ $vrrpFormat->{$key}->{$value}
                                    ->{virtual_ipaddress} }, $_;
                        }

#auth字段处理
                        elsif (/auth_/) {
                            $vrrpFormat->{$key}->{$value}->{authentication}
                                ->{ $v[0] } = $v[1];
                        }

                    }
                }

            }
        }

    }

#virtual_server处理
    elsif ( $varrKey =~ /(virtual_server)s+((?:d+.){3}d+)s+(d+)/ ) {

#键值名,IP,端口
        my ( $key, $ip, $port ) = ( $1, $2, $3 );
        my @params = split ‘ ‘, $varrParam;
        for ( 0 .. $
#params ) {

#切分数组前两个元素
            my @v = splice @params, 0, 2;
            if (@v) {
                if ( $treeKey->{virtualKey}->{ $v[0] } ) {
                    $vrrpFormat->{$key}->{$ip}->{$port}->{ $v[0] } = $v[1];
                }
                else {

#不匹配定义的检测,重新写回@params
                    unshift @params, @v;
                }
            }
        }

        if (@params) {

#将剩余的params写回总hash,real_serverArr临时数组
            push @{ $vrrpFormat->{$key}->{$ip}->{$port}->{real_serverArr} },
                @params;
        }
    }

}

sub real_format {
    my ( $vrrpFormat, $treeKey ) = @_;

    for my $sIp ( keys %{ $vrrpFormat->{virtual_server} } ) {
        my $portHash = $vrrpFormat->{virtual_server}->{$sIp};
        for my $port ( keys %$portHash ) {

            my @realArr = @{ $portHash->{$port}->{real_serverArr} };

#realserver  IP、port  位置
            my ($realIp, $realPort, @pos);

#3级 4级 键值类型,数值
            my ( $key3, $key4, $value4, $key5 );

#查找IP的POS未知
            for ( 0 .. $
#realArr ) {
                if ( $realArr[$_] =~ /(?:d+.){3}d+/ ) {
                    push @pos, $_;

                }
            }
            my ( @realIp, @realPort );
            my $cPos = 0;

#根据位置,将IP端口放入数组
            for (@pos) {
                push @realIp,   splice @realArr, $_ - $cPos, 1;
                push @realPort, splice @realArr, $_ - $cPos, 1;
                $cPos += 2;
            }

            for my $realParam ( @realArr) {

#根据real_server未知确定IP、端口未知
                if ( $realParam eq "real_server" ) {
                    $realIp   = shift @realIp;
                    $realPort = shift @realPort;
                    next;
                }

#遇到TCP_CHECK HTTP_GET url作为分支,存入key3
                if ( $realParam =~ /(TCP_CHECK)/ ) {
                    $key3 = $1;

                }
                elsif ( $realParam =~ /(HTTP_GET)/ ) {
                    $key3 = $1;
                }
                elsif ( $realParam =~ /(url)/ ) {
                    $key5 = $1;

                }
                if ( !$key4 and $realParam !~ /HTTP_GET|TCP_CHECK/ ) {
                    $key4 = $realParam;
                }

#匹配为键值对逻辑
                if ( $key4 and !$value4 ) {

#必须为数字
                    if ( $realParam =~ /^d+$/ ) {
                        $value4 = $realParam;
                    }

#或者为url
                    elsif ( $realParam =~ /https?:/// ) {
                        $value4 = $realParam;
                    }
                }

                if ( $key4 and $value4 and $key3 ) {

# print "$realIp,$key3,$key4,$value4n";

#判断键值对是否在定义中存在
                    if ( $treeKey->{realKey}->{realKey0}->{$key4} ) {

                        $portHash->{$port}->{real_server}->{$realIp}
                            ->{$realPort}->{$key4} = $value4;

                    }
                    elsif ( $treeKey->{realKey}->{realKey2}->{$key4} ) {
                        $portHash->{$port}->{real_server}->{$realIp}
                            ->{$realPort}->{$key3}->{$key4} = $value4;
                    }

#url判断
                    elsif ($key5) {
                        $portHash->{$port}->{real_server}->{$realIp}
                            ->{$realPort}->{$key3}->{$key5}->{$key4}
                            = $value4;
                    }
                    undef $key4;
                    undef $value4;
                }

#删除临时存储数组
                delete $portHash->{$port}->{real_serverArr};
            }
        }
    }
    return $vrrpFormat;
}
时间: 2024-10-06 23:07:00

keepalive配置文件转化JSON的相关文章

JAVA对象转化JSON出现死循环问题

主要是解决JSON因Hibernate映射生成的集合的转化出现的死循环问题. 这个方法很重要 1 public String ajaxJsonByObjectDirecdt(Object obj, String[] filterNames){ 2 JsonConfig jsonConfig = new JsonConfig(); 3 jsonConfig.setIgnoreDefaultExcludes(false); 4 jsonConfig.setCycleDetectionStrategy

nwjs 配置文件package.json 转载

配置文件package.json nw在启动应用程序时,首先要读取package.json文件,初始化基本属性,下面我们看看package.json的完整参数.每个参数配置都标有注释. [plain] view plain copy { /**指定程序的起始页面.*/ "main": "index.html", /**字符串必须是小写字母或者数字,可以包含.或者_或者-不允许带空格.name必须全局唯一.*/ "name": "demo

XML字符串转化json

public static String XMLTOJSON(String XMLContent,String tag) {  XMLSerializer xmlSerializer = new XMLSerializer();    JSON json = xmlSerializer.read(XMLContent);   JSONObject obj = JSONObject.fromObject(json);  JSONObject jobj = obj.getJSONObject(tag

form表单转化json对象

利用 $.fn 可以让每一个jquery 对象都能直接使用这个方法. //form表单转化json对象$.fn.serializeObject = function () { var o = {}; var a = this.serializeArray(); $.each(a, function () { if (o[this.name]) { if (!o[this.name].push) { o[this.name] = [o[this.name]]; } o[this.name].pus

第2坑:全局配置文件 app.json 常见错误汇总

[我是坑]:全局配置文件 app.json 容易出现错误如下: 文件路径出错. 没有在 pages 上配置页面. 代码注释. 使用单引号. [解决]: 1.文件路径出错文件路径写错,比如单词写错或少了目录名,这个比较容易发现.另外,文件名不需要写文件后缀,因为框架会自动去寻找路径下 .json, .js, .wxml, .wxss 四个文件进行整合. 2.没有在 pages 上配置页面这个错误也比较容易发现,毕竟 pages 配置项没有配置页面,跳转页面时也会有提示. 3.代码注释给代码写注释是

Js:消息弹出框、获取时间区间、时间格式、easyui datebox 自定义校验、表单数据转化json、控制两个日期不能只填一个

(function ($) { $.messageBox = function (message) { $.messager.show({ title:'消息框提示', msg:message, showType:'show' }); }; /** * 获取时间区间 * @param type 1:当年的一月一日到现在:type 2:获取当月的第一天和最后一天 * return {startTime:xxxx,endTime:xxxx} */ $.getTimeInterval = functi

怎样通过已经使用过webpack+vue+vueRouter+vuecli的配置文件package.json创建一个项目

首先,我们自己得手动创建一个webpack+vue+vueRouter+vuecli工程,执行下面:如:新建一个vue项目,创建一个基于"webpack"的项目,项目名为vuedemo: $ vue init webpack vuedemo 安装完成后进入工程名称再根据原来项目的配置文件初始化 $ cd vuedemo $ npm install 但是由于在新建的时候对eslint的选择中选择了Yes,所以后面根据配置package.json的时候,发现没有eslint-friendl

转化json key的命名的一个小东西。js代码,,c_name_id &lt;==&gt; cNameId

发现新公司新老接口返回值的命名规则竟然不一样,瞬间瞎了. 无奈写一个转化的. 程序还有很大的扩展性可以做,有时间继续. function changeName(json,type){ var out={}; if(type == 1){ for( var key in json){ var arr=[]; arr = key.split('_'); for (var i=1;i<arr.length;i++){ var prev = arr[i].substring(0,1).toUpperCa

.NET Core在类库中读取配置文件appsettings.json

在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别用 System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配置 System.Configuration.ConfigurationManager.ConnectionStrin