0

我有一个从 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 发送请求。

4

1 回答 1

0

我花了几天时间阅读正则表达式并找到了解决方案。因此,这些“区域”中的每一个都以注释开头……例如“secondary-example.com”……每组 BIND 信息正好有 17 行长。这个解决方案很老套,总是假设数据是正确的,但它成功了。

  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]
    
于 2014-09-28T16:15:53.150 回答