2014-09-22 24 views
0

У меня есть файл, который был экспортирован из BIND, содержащего значения TSIG, для примерно 500 доменных имен. Мне нужно перепрофилировать данные в JSON для запроса API REST. Данные BIND отформатированы следующим образом:Извлечение параметров BIND для построения запроса JSON

  // 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=" 
         } 
        } 
        } 
       } 
      } 

У меня возникли трудности с составлением регулярного выражения, соответствующего сценарию. Я ищу конструкцию JSON в сценарии python и отправлю запрос через Postman.

+0

Вы хотите один шаблон регулярных выражений, чтобы извлечь ключ, зону и секрет? Или один шаблон для переменной, например 'key '. *?" ',' Zone ". *?" ',' Secret'. *? "'? –

+0

@Rawing, спасибо за ответ. Я понял это. Я отправлю свое решение в качестве ответа. –

ответ

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]