convert output to list(and nested dictionary)

max scalf oracle.blog3 at gmail.com
Wed Jul 22 13:04:10 EDT 2015


I was able to solve the above problem i listed with the following...please
let me know if that is the correct way of doing this...or i am way off?

>>> for sg in sgs:
    for rule in sg.rules:
        st = sg, sg.id, "inbound:", rule, " source:", rule.grants
        s = str(st).replace(","," ")
        #print s
        get_data(s)


{'cidr': 'sg-e632d982-995635159130', 'port': 'None', 'proto': '1'}
{'cidr': '67.184.225.222/32', 'port': '22', 'proto': 'tcp'}
{'cidr': '10.0.2.10/32', 'port': '1024', 'proto': 'tcp'}
{'cidr': '24.12.30.198/32', 'port': '80', 'proto': 'tcp'}
{'cidr': '10.0.2.10/32', 'port': '138', 'proto': 'udp'}
{'cidr': '24.12.30.198/32', 'port': '53', 'proto': 'udp'}
{'cidr': '0.0.0.0/0', 'port': '30015', 'proto': 'tcp'}
{'cidr': '10.0.2.10/32', 'port': '', 'proto': 'icmp'}
>>>

On Wed, Jul 22, 2015 at 11:01 AM, max scalf <oracle.blog3 at gmail.com> wrote:

> Hi Pablo,
>
> While playing around with the function you gave me(get_data)...i was
> thinking to do something like below.  For each line create a dictionary
> then append that dictionary to a list...but before i even get to that part
> i get the below error and while researching it i am unable to figure out
> what is going on... could you point me in the right direction ?
>
> >>> for sg in sgs:
>     for rule in sg.rules:
>         pt = sg, sg.id, "inbound:", rule, " source:", rule.grants
>         print pt #this is just for my own purpose
>         get_data(pt)
>
>
> (SecurityGroup:wordpress-app-SG, u'sg-99c4befc', 'inbound:',
> IPPermissions:-1(None-None), ' source:', [sg-e632d982-995635159130])
>
> Traceback (most recent call last):
>   File "<pyshell#157>", line 5, in <module>
>     get_data(pt)
>   File "<pyshell#152>", line 5, in get_data
>     _, proto_port, cidr = data.rsplit(":", 2)
> AttributeError: 'tuple' object has no attribute 'rsplit'
> >>> get_data("SecurityGroup:wordpress-app-SG, u'sg-99c4befc', 'inbound:',
> IPPermissions:-1(None-None), ' source:', [sg-e632d982-995635159130]")
> {'cidr': 'sg-e632d982-995635159130', 'port': 'None', 'proto': '1'}
> >>>
>
> On Tue, Jul 21, 2015 at 8:03 PM, Pablo Lucena <plucena24 at gmail.com> wrote:
>
>> ​str.split and re are a nice quick way to do it:
>>
>> >>> def get_data(data):
>> import re
>> port_re = re.compile(r'(\w+)\((\S+-\S+)\)')
>> cidr_re = re.compile(r'\[(.*?)\]')
>> _, proto_port, cidr = data.rsplit(":", 2)
>> port_match = port_re.search(proto_port)
>> proto, port = port_match.group(1), port_match.group(2)
>> port = port.split("-")[0]
>> cidr_match = cidr_re.search(cidr)
>> cidr = cidr_match.group(1)
>> return dict(port=port, proto=proto, cidr=cidr)
>>
>> >>> get_data("SecurityGroup:default sg-e1304484 inbound:
>> IPPermissions:tcp(80-80)  source: [67.184.225.222/32]")
>> {'cidr': '67.184.225.222/32', 'proto': 'tcp', 'port': '80'}
>> >>> get_data("SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>> IPPermissions:-1(None-None)  source: [sg-e632d982-995635159130]")
>> {'cidr': 'sg-e632d982-995635159130', 'proto': '1', 'port': 'None'}
>>
>>
>> ​You can alter this and add whatever extra checks you need as Chris A
>> mentioned (when proto is -1 and port is None-None, or the icmp case). This
>> is just a very crude example, but hopefully you get the drift.
>>
>> Most text parsing problems can easily be solved with these simple tools.
>> Fire up your shell and test it - this is really the best way to learn how
>> to do something like this.
>>
>>
>> On Tue, Jul 21, 2015 at 5:12 PM, max scalf <oracle.blog3 at gmail.com>
>> wrote:
>>
>>> Hello all,
>>>
>>> For Each SecurityGroup, how can i convert that into a List that in turn
>>> will have a dictionary of the cidr block, protocol type and the port...so
>>> from output below, the SecurityGroup called "default" had 2
>>> rules...allowing TCP port from 80 and 5500 to the source IP and then
>>> SecurityGroup called "Pub_HDP_SG" had only one rule...so on and so
>>> forth....here is the output that i am trying to get out in the form of a
>>> list....
>>>
>>> what I am planning to do is, take the list(and nested dictionary) and
>>> pass that to a function that will in turn spitout a cloudformation template
>>> using troposphere (something like "
>>> http://imil.net/wp/2015/06/04/rock-your-cloudformation-with-troposphere-and-boto/
>>> ")
>>>
>>>
>>> For Better Readablity (http://pastebin.com/rT6Aswwz)
>>>
>>> import boto.ec2
>>>
>>> sgs = boto.ec2.connect_to_region('us-east-1').get_all_security_groups()
>>>
>>> for sg in sgs:
>>>
>>>     for rule in sg.rules:
>>>
>>>         print sg, sg.id, "inbound:", rule, " source:", rule.grants
>>>
>>>
>>> SecurityGroup:default sg-e1304484 inbound: IPPermissions:tcp(80-80)
>>>  source: [67.184.225.222/32]
>>>
>>> SecurityGroup:default sg-e1304484 inbound: IPPermissions:tcp(5500-5500)
>>>  source: [67.184.225.222/32]
>>>
>>> SecurityGroup:Pub_HDP_SG sg-e632d982 inbound: IPPermissions:tcp(80-80)
>>>  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:sg3-MySecurityGroup-LB0QF9UQAOEF sg-4fe73728 inbound:
>>> IPPermissions:tcp(22-22)  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:sg3-MySecurityGroup-LB0QF9UQAOEF sg-4fe73728 inbound:
>>> IPPermissions:tcp(80-80)  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:RDP Rule - open everyone  sg-42d58d27 inbound:
>>> IPPermissions:-1(None-None)  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:us-east-open-all sg-97ffa7f2 inbound:
>>> IPPermissions:tcp(22-22)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:us-east-open-all sg-97ffa7f2 inbound:
>>> IPPermissions:tcp(53-53)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:-1(None-None)  source: [sg-e632d982-995635159130]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:tcp(22-22)  source: [67.184.225.222/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:tcp(1024-65535)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:tcp(80-80)  source: [24.12.30.198/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:udp(138-138)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:udp(53-53)  source: [24.12.30.198/32]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:tcp(30015-30015)  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:wordpress-app-SG sg-99c4befc inbound:
>>> IPPermissions:icmp(-1--1)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:default sg-c65a20a3 inbound: IPPermissions:-1(None-None)
>>>  source: [sg-c65a20a3-995635159130]
>>>
>>> SecurityGroup:default sg-c65a20a3 inbound: IPPermissions:-1(None-None)
>>>  source: [sg-99c4befc-995635159130]
>>>
>>> SecurityGroup:sg3-MySecurityGroup2-1HGPN4UF57XN6 sg-4ee73729 inbound:
>>> IPPermissions:tcp(22-22)  source: [192.168.1.12/32]
>>>
>>> SecurityGroup:AWS-AMI-SG sg-35568d51 inbound: IPPermissions:tcp(22-22)
>>>  source: [0.0.0.0/0]
>>>
>>> SecurityGroup:launch-wizard-2 sg-932255f6 inbound:
>>> IPPermissions:tcp(22-22)  source: [10.0.20.100/32]
>>>
>>> SecurityGroup:launch-wizard-2 sg-932255f6 inbound:
>>> IPPermissions:tcp(443-443)  source: [0.0.0.0/0]
>>>
>>> >>>
>>>
>>>
>>> Here is the output i am looking for....
>>>
>>>
>>> rule1 = [{
>>>
>>>     'cidr': '67.184.225.222/32',
>>>
>>>     'proto': 'tcp',
>>>
>>>     'port': 80
>>>
>>> },{
>>>
>>>     'cidr': '67.184.225.222/32',
>>>
>>>     'proto': 'tcp',
>>>
>>>     'port': 5500
>>>
>>> }]
>>>
>>>
>>> rule2 = [{
>>>
>>>     'cidr': '[0.0.0.0/0',
>>>
>>>     'proto': 'tcp',
>>>
>>>     'port': 80
>>>
>>> }]
>>>
>>>
>>> rule3 = [{
>>>
>>>     'cidr': '0.0.0.0/0',
>>>
>>>     'proto': 'tcp',
>>>
>>>     'port': 22
>>>
>>> },{
>>>
>>>     'cidr': '0.0.0.0/0',
>>>
>>>     'proto': 'tcp',
>>>
>>>     'port': 80
>>>
>>> }]
>>>
>>>
>>>
>>> --
>>> https://mail.python.org/mailman/listinfo/python-list
>>>
>>>
>>
>>
>> --
>> *Pablo Lucena*
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20150722/50137b73/attachment.html>


More information about the Python-list mailing list