Regex для смены источника и назначения в списке доступа IP - PullRequest
2 голосов
/ 07 июля 2019

Я пытаюсь поменять местами адреса и префиксы источника и назначения / префиксы IP-списков доступа, которые я беру с существующей записью ACL и создаю запись в обратном направлении, как указано ниже:

Введите:

разрешить ip любому хосту 10.22.122.161

разрешить ip host 10.11.198.18 любой

allow ip host 10.22.122.161 192.168.150.16 0.0.0.7

allow ip host 10.22.122.161 host 10.22.122.255

разрешить ip любому хосту 10.22.122.255

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.255

разрешить ip любой 192.168.150.16 0.0.0.7

IP-адрес разрешения 192.168.150.16 0.0.0.7 любой

разрешить ip любой 172.16.150.208 0.0.0.15

allow tcp any 172.16.150.208 0.0.0.15

allow tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7

Ожидаемый результат:

разрешить ip host 10.22.122.161 любой

разрешить ip любому хосту 10.11.198.18

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.161

allow ip host 10.22.122.255 host 10.22.122.161

разрешить ip host 10.22.122.255 любой

allow ip host 10.22.122.255 192.168.150.16 0.0.0.7

IP-адрес разрешения 192.168.150.16 0.0.0.7 любой

разрешить ip любой 192.168.150.16 0.0.0.7

IP-адрес разрешения 172.16.150.208 0.0.0.15 любой

разрешение tcp 172.16.150.208 0.0.0.15 любая

allow tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7

allow tcp 192.168.150.16 0.0.0.7 172.16.150.208 0.0.0.15

но в некоторых случаях моя функция не может поменять местами источник и пункт назначения

Мои коды не пройдены в следующих тестовых случаях:

allow ip host 10.22.122.161 192.168.150.16 0.0.0.7

Следующее регулярное выражение не соответствует 192.168.150.16 0.0.0.7 с (. *)

p = re.sub (r '(. ) (\ bany \ b | \ bhost \ b \ d {1,3}. \ D {1,3}. \ D {1,3} . \ d {1,3}) (. ) ', r' \ 1 \ 3 \ 2 ', ACELine)

#!/usr/bin/python3
import re

def ChangeACESrcDst(ACELine):
  ReversedACE = str()
  protocols_list = [
    'ip',
    'tcp',
    'udp',
    'gre',
    'icmp'
  ]
  if (bool(re.search(r'(\bpermit\b|\bdeny\b)',ACELine))):
    ACE_ITEMS = ACELine.split()
    if  ACE_ITEMS[1] in protocols_list:
      if len(ACE_ITEMS) == 5:
        if ACE_ITEMS[2] == 'host' or ACE_ITEMS[2] == 'any':
          p = re.sub(r'(.*)(\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' or ACE_ITEMS[4] == 'any':  
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      elif len(ACE_ITEMS) == 6: 
        if ACE_ITEMS[2] == 'host' and ACE_ITEMS[4] == 'host':
          p = re.sub(r'(.*) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
        else:
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      else:
        print(f'ERROR: ACE items length must be either 5 or 6 : {ACELine}')
    else:
      print(f'ERROR: Protocols not supported : {ACE_ITEMS[1]}') 
      exit() 
    print('\n')

  return ReversedACE


if __name__ == "__main__":
 aces = [
 'permit ip any host 10.22.122.161',
 'permit ip host 10.11.198.18 any',
 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7',
 'permit ip host 10.22.122.161 host 10.22.122.255',
 'permit ip any host 10.22.122.255',
 'permit ip 192.168.150.16 0.0.0.7 host 10.22.122.255',
 'permit ip any 192.168.150.16 0.0.0.7',
 'permit ip 192.168.150.16 0.0.0.7 any',
 'permit ip any 172.16.150.208 0.0.0.15',
 'permit tcp any 172.16.150.208 0.0.0.15',
 'permit tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7'
 ]
 for ace in aces:
   ace = (ChangeACESrcDst(ace))

Введите:

allow ip host 10.22.122.161 192.168.150.16 0.0.0.7

Ожидаемый результат:

allow ip 192.168.150.16 0.0.0.7 host 10.22.122.161

Ответы [ 4 ]

0 голосов
/ 08 июля 2019

Фактическая проблема была с моей логикой if / else, решая которую, я получаю ожидаемый результат, я ищу более эффективный способ реализации моей функции

#!/usr/bin/python3.7
import re

def ChangeACESrcDst(ACELine):
  ReversedACE = str()
  protocols_list = [
    'ip',
    'tcp',
    'udp',
    'gre',
    'icmp'
  ]
  if (bool(re.search(r'(\bpermit\b|\bdeny\b)',ACELine))):
    ACE_ITEMS = ACELine.split()
    if  ACE_ITEMS[1] in protocols_list:
      if len(ACE_ITEMS) == 5:
        if ACE_ITEMS[2] == 'host' or ACE_ITEMS[2] == 'any':
          p = re.sub(r'(.*)(\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' or ACE_ITEMS[4] == 'any':  
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bany\b|\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      elif len(ACE_ITEMS) == 6: 
        if ACE_ITEMS[2] == 'host' and ACE_ITEMS[4] == 'host':
          p = re.sub(r'(.*) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (host \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[2] == 'host' and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[4])) and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[5])):
          p = re.sub(r'(.*)(\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (.*)',r'\1\3 \2',ACELine)
          print(ACELine)
          print(p)
        elif ACE_ITEMS[4] == 'host' and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[2])) and bool(re.search(r'(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',ACE_ITEMS[3])):
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\bhost \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)          
          print(ACELine)
          print(p)
        else:
          p = re.sub(r'(.*) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) (\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})',r'\1 \3 \2',ACELine)
          print(ACELine)
          print(p)
      else:
        print(f'ERROR: ACE items length must be either 5 or 6 : {ACELine}')
    else:
      print(f'ERROR: Protocols not supported : {ACE_ITEMS[1]}') 
      exit()

  return ReversedACE


if __name__ == "__main__":
 aces = [
 'permit ip any host 10.22.122.161',
 'permit ip host 10.11.198.18 any',
 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7',
 'permit ip host 10.22.122.161 host 10.22.122.255',
 'permit ip any host 10.22.122.255',
 'permit ip 192.168.150.16 0.0.0.7 host 10.22.122.255',
 'permit ip any 192.168.150.16 0.0.0.7',
 'permit ip 192.168.150.16 0.0.0.7 any',
 'permit ip any 172.16.150.208 0.0.0.15',
 'permit tcp any 172.16.150.208 0.0.0.15',
 'permit tcp 172.16.150.208 0.0.0.15 192.168.150.16 0.0.0.7'
 ]
 for ace in aces:
   ChangeACESrcDst(ace)

0 голосов
/ 07 июля 2019

Вы можете попробовать использовать регулярные выражения и f-строки следующим образом:

import re

def swap_ips(text: str) -> str:
    ip = r'\d+\.\d+.\d+.\d+'
    ip_pattern = f'(host {ip}) ({ip}) ({ip})'
    match = re.search(ip_pattern, text)
    host, mid, dest = match.groups()

    new_order = f'{mid} {dest} {host}'
    return text[:match.start()] + new_order + text[match.end():]

if __name__ == "__main__":
    text = 'permit ip host 10.22.122.161 192.168.150.16 0.0.0.7'
    print(swap_ips(text))

output:

permit ip 192.168.150.16 0.0.0.7 host 10.22.122.161
0 голосов
/ 07 июля 2019

Есть ли более эффективная реализация, чтобы я мог поменять источник и назначение из всех вариантов списка ввода?

0 голосов
/ 07 июля 2019

вы можете попробовать вот так

import re
host_ip_pos = re.search(r'host\s\d*.\d*.\d*.\d*', str1).span()
print(host_ip_pos)
(10, 28)

new_str = str1[:host_ip_pos[0]] + str1[host_ip_pos[1]+1:] + ' ' + str1[host_ip_pos[0]: host_ip_pos[1]]
print(new_str)
permit ip 192.168.150.16 0.0.0.7 host 10.22.122.161
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...