提取BIND参数以构建JSON查询

时间:2014-09-22 20:15:14

标签: python regex json rest postman

我有一个从BIND导出的文件,其中包含大约500个域名的TSIG值。我需要将数据重新用于JSON以进行REST API查询。 BIND数据的格式如下:

            //  secondary-example.com.
            key "2000000000000.key." {
                algorithm hmac-md5;
                secret "ahashedvalue=";
            };

            zone "secondary-example.com." {
                type slave;
                file "sec/secondary-example.com.";
                allow-transfer { 1.1.1.1;
                                  1.1.2.2;
                                };
                 also-notify    { 1.1.1.1;
                                  2.2.2.2;
                                };
                 masters {
                   1.2.3.4 key 2000000000000.key.;
                 };
            };

由此我需要提取密钥,区域和秘密。这是一个示例API请求。

            {  
               "properties":{  
                  "name":"secondary-example.com.",
                  "accountName":"example",
                  "type":"SECONDARY"
               },
               "secondaryCreateInfo":{  
                  "primaryNameServers":{  
                     "nameServerIpList":{  
                        "nameServerIp1":{  
                           "ip":"1.2.3.4",
                           "tsigKey":"2000000000000.key.",
                           "tsigKeyValue":"ahashedvalue="
                        }
                     }
                  }
               }
            }

我在制作适合该场景的正则表达式时遇到了困难。我正在寻找在python脚本中构造JSON并通过Postman发送请求。

1 个答案:

答案 0 :(得分:0)

我花了几天时间阅读正则表达式并找到了解决方案。所以,每个“区域”都以评论开头......例如“secondary-example.com”......每组BIND信息都是17行。这个解决方案是hackey,并始终假设数据是正确的,但它设法工作。

  1. 将区域分隔成文本块。

    zones = []
    cur_zone = ''
    f = open(bind_file).readlines()
    for line in f:
        if line[0:2] == '//':
            zones.append(cur_zone)
            cur_zone = ''
        else:
            cur_zone = cur_zone + line
    zones.pop(0) # Drop the first list item, it's empty
    
  2. 迭代这些块并匹配所需的参数。

    for z in zones:
        z_lines = z.splitlines()
        # Regex patterns to make the required parameters
        key = re.findall('\"(.*)\"', z_lines[0])[0]
        secret = re.findall('\"(.*)\"', z_lines[2])[0]
        name = re.findall('\"(.*)\"', z_lines[5])[0]
        master = re.findall('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}', z_lines[15])[0]