| OLD | NEW | 
|    1 # Copyright (c) 2006,2007 Mitch Garnaat http://garnaat.org/ |    1 # Copyright (c) 2006-2011 Mitch Garnaat http://garnaat.org/ | 
 |    2 # Copyright (c) 2011, Eucalyptus Systems, Inc. | 
|    2 # |    3 # | 
|    3 # Permission is hereby granted, free of charge, to any person obtaining a |    4 # Permission is hereby granted, free of charge, to any person obtaining a | 
|    4 # copy of this software and associated documentation files (the |    5 # copy of this software and associated documentation files (the | 
|    5 # "Software"), to deal in the Software without restriction, including |    6 # "Software"), to deal in the Software without restriction, including | 
|    6 # without limitation the rights to use, copy, modify, merge, publish, dis- |    7 # without limitation the rights to use, copy, modify, merge, publish, dis- | 
|    7 # tribute, sublicense, and/or sell copies of the Software, and to permit |    8 # tribute, sublicense, and/or sell copies of the Software, and to permit | 
|    8 # persons to whom the Software is furnished to do so, subject to the fol- |    9 # persons to whom the Software is furnished to do so, subject to the fol- | 
|    9 # lowing conditions: |   10 # lowing conditions: | 
|   10 # |   11 # | 
|   11 # The above copyright notice and this permission notice shall be included |   12 # The above copyright notice and this permission notice shall be included | 
|   12 # in all copies or substantial portions of the Software. |   13 # in all copies or substantial portions of the Software. | 
|   13 # |   14 # | 
|   14 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |   15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | 
|   15 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |   16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | 
|   16 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |   17 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | 
|   17 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,  |   18 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,  | 
|   18 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |   19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
|   19 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |   20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | 
|   20 # IN THE SOFTWARE. |   21 # IN THE SOFTWARE. | 
|   21  |   22  | 
|   22 """ |   23 """ | 
|   23 Represents an EC2 Security Group |   24 Represents an EC2 Security Group | 
|   24 """ |   25 """ | 
|   25 from boto.ec2.ec2object import EC2Object |   26 from boto.ec2.ec2object import TaggedEC2Object | 
|   26 from boto.exception import BotoClientError |   27 from boto.exception import BotoClientError | 
|   27  |   28  | 
|   28 class SecurityGroup(EC2Object): |   29 class SecurityGroup(TaggedEC2Object): | 
|   29      |   30      | 
|   30     def __init__(self, connection=None, owner_id=None, |   31     def __init__(self, connection=None, owner_id=None, | 
|   31                  name=None, description=None): |   32                  name=None, description=None, id=None): | 
|   32         EC2Object.__init__(self, connection) |   33         TaggedEC2Object.__init__(self, connection) | 
 |   34         self.id = id | 
|   33         self.owner_id = owner_id |   35         self.owner_id = owner_id | 
|   34         self.name = name |   36         self.name = name | 
|   35         self.description = description |   37         self.description = description | 
|   36         self.rules = [] |   38         self.vpc_id = None | 
 |   39         self.rules = IPPermissionsList() | 
 |   40         self.rules_egress = IPPermissionsList() | 
|   37  |   41  | 
|   38     def __repr__(self): |   42     def __repr__(self): | 
|   39         return 'SecurityGroup:%s' % self.name |   43         return 'SecurityGroup:%s' % self.name | 
|   40  |   44  | 
|   41     def startElement(self, name, attrs, connection): |   45     def startElement(self, name, attrs, connection): | 
|   42         if name == 'item': |   46         retval = TaggedEC2Object.startElement(self, name, attrs, connection) | 
|   43             self.rules.append(IPPermissions(self)) |   47         if retval is not None: | 
|   44             return self.rules[-1] |   48             return retval | 
 |   49         if name == 'ipPermissions': | 
 |   50             return self.rules | 
 |   51         elif name == 'ipPermissionsEgress': | 
 |   52             return self.rules_egress | 
|   45         else: |   53         else: | 
|   46             return None |   54             return None | 
|   47  |   55  | 
|   48     def endElement(self, name, value, connection): |   56     def endElement(self, name, value, connection): | 
|   49         if name == 'ownerId': |   57         if name == 'ownerId': | 
|   50             self.owner_id = value |   58             self.owner_id = value | 
 |   59         elif name == 'groupId': | 
 |   60             self.id = value | 
|   51         elif name == 'groupName': |   61         elif name == 'groupName': | 
|   52             self.name = value |   62             self.name = value | 
 |   63         elif name == 'vpcId': | 
 |   64             self.vpc_id = value | 
|   53         elif name == 'groupDescription': |   65         elif name == 'groupDescription': | 
|   54             self.description = value |   66             self.description = value | 
|   55         elif name == 'ipRanges': |   67         elif name == 'ipRanges': | 
|   56             pass |   68             pass | 
|   57         elif name == 'return': |   69         elif name == 'return': | 
|   58             if value == 'false': |   70             if value == 'false': | 
|   59                 self.status = False |   71                 self.status = False | 
|   60             elif value == 'true': |   72             elif value == 'true': | 
|   61                 self.status = True |   73                 self.status = True | 
|   62             else: |   74             else: | 
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  121          |  133          | 
|  122         :type ip_protocol: string |  134         :type ip_protocol: string | 
|  123         :param ip_protocol: Either tcp | udp | icmp |  135         :param ip_protocol: Either tcp | udp | icmp | 
|  124  |  136  | 
|  125         :type from_port: int |  137         :type from_port: int | 
|  126         :param from_port: The beginning port number you are enabling |  138         :param from_port: The beginning port number you are enabling | 
|  127  |  139  | 
|  128         :type to_port: int |  140         :type to_port: int | 
|  129         :param to_port: The ending port number you are enabling |  141         :param to_port: The ending port number you are enabling | 
|  130  |  142  | 
|  131         :type to_port: string |  143         :type cidr_ip: string | 
|  132         :param to_port: The CIDR block you are providing access to. |  144         :param cidr_ip: The CIDR block you are providing access to. | 
|  133                         See http://en.wikipedia.org/wiki/Classless_Inter-Domain_
     Routing |  145                         See http://en.wikipedia.org/wiki/Classless_Inter-Domain_
     Routing | 
|  134  |  146  | 
|  135         :type src_group: :class:`boto.ec2.securitygroup.SecurityGroup` or |  147         :type src_group: :class:`boto.ec2.securitygroup.SecurityGroup` or | 
|  136                          :class:`boto.ec2.securitygroup.GroupOrCIDR` |  148                          :class:`boto.ec2.securitygroup.GroupOrCIDR` | 
 |  149         :param src_group: The Security Group you are granting access to. | 
|  137                           |  150                           | 
|  138         :rtype: bool |  151         :rtype: bool | 
|  139         :return: True if successful. |  152         :return: True if successful. | 
|  140         """ |  153         """ | 
|  141         if src_group: |  154         if src_group: | 
|  142             cidr_ip = None |  155             cidr_ip = None | 
|  143             src_group_name = src_group.name |  156             src_group_name = src_group.name | 
|  144             src_group_owner_id = src_group.owner_id |  157             src_group_owner_id = src_group.owner_id | 
|  145         else: |  158         else: | 
|  146             src_group_name = None |  159             src_group_name = None | 
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  196         :return: The new security group. |  209         :return: The new security group. | 
|  197         """ |  210         """ | 
|  198         if region.name == self.region: |  211         if region.name == self.region: | 
|  199             raise BotoClientError('Unable to copy to the same Region') |  212             raise BotoClientError('Unable to copy to the same Region') | 
|  200         conn_params = self.connection.get_params() |  213         conn_params = self.connection.get_params() | 
|  201         rconn = region.connect(**conn_params) |  214         rconn = region.connect(**conn_params) | 
|  202         sg = rconn.create_security_group(name or self.name, self.description) |  215         sg = rconn.create_security_group(name or self.name, self.description) | 
|  203         source_groups = [] |  216         source_groups = [] | 
|  204         for rule in self.rules: |  217         for rule in self.rules: | 
|  205             grant = rule.grants[0] |  218             grant = rule.grants[0] | 
|  206             if grant.name: |  219             for grant in rule.grants: | 
|  207                 if grant.name not in source_groups: |  220                 if grant.name: | 
|  208                     source_groups.append(grant.name) |  221                     if grant.name not in source_groups: | 
|  209                     sg.authorize(None, None, None, None, grant) |  222                         source_groups.append(grant.name) | 
|  210             else: |  223                         sg.authorize(None, None, None, None, grant) | 
|  211                 sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port, |  224                 else: | 
|  212                              grant.cidr_ip) |  225                     sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port, | 
 |  226                                  grant.cidr_ip) | 
|  213         return sg |  227         return sg | 
|  214  |  228  | 
|  215     def instances(self): |  229     def instances(self): | 
 |  230         """ | 
 |  231         Find all of the current instances that are running within this | 
 |  232         security group. | 
 |  233  | 
 |  234         :rtype: list of :class:`boto.ec2.instance.Instance` | 
 |  235         :return: A list of Instance objects | 
 |  236         """ | 
 |  237         # It would be more efficient to do this with filters now | 
 |  238         # but not all services that implement EC2 API support filters. | 
|  216         instances = [] |  239         instances = [] | 
|  217         rs = self.connection.get_all_instances() |  240         rs = self.connection.get_all_instances() | 
|  218         for reservation in rs: |  241         for reservation in rs: | 
|  219             uses_group = [g.id for g in reservation.groups if g.id == self.name] |  242             uses_group = [g.name for g in reservation.groups if g.name == self.n
     ame] | 
|  220             if uses_group: |  243             if uses_group: | 
|  221                 instances.extend(reservation.instances) |  244                 instances.extend(reservation.instances) | 
|  222         return instances |  245         return instances | 
|  223  |  246  | 
|  224 class IPPermissions: |  247 class IPPermissionsList(list): | 
 |  248      | 
 |  249     def startElement(self, name, attrs, connection): | 
 |  250         if name == 'item': | 
 |  251             self.append(IPPermissions(self)) | 
 |  252             return self[-1] | 
 |  253         return None | 
 |  254  | 
 |  255     def endElement(self, name, value, connection): | 
 |  256         pass | 
 |  257              | 
 |  258 class IPPermissions(object): | 
|  225  |  259  | 
|  226     def __init__(self, parent=None): |  260     def __init__(self, parent=None): | 
|  227         self.parent = parent |  261         self.parent = parent | 
|  228         self.ip_protocol = None |  262         self.ip_protocol = None | 
|  229         self.from_port = None |  263         self.from_port = None | 
|  230         self.to_port = None |  264         self.to_port = None | 
|  231         self.grants = [] |  265         self.grants = [] | 
|  232  |  266  | 
|  233     def __repr__(self): |  267     def __repr__(self): | 
|  234         return 'IPPermissions:%s(%s-%s)' % (self.ip_protocol, |  268         return 'IPPermissions:%s(%s-%s)' % (self.ip_protocol, | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
|  251             setattr(self, name, value) |  285             setattr(self, name, value) | 
|  252  |  286  | 
|  253     def add_grant(self, name=None, owner_id=None, cidr_ip=None): |  287     def add_grant(self, name=None, owner_id=None, cidr_ip=None): | 
|  254         grant = GroupOrCIDR(self) |  288         grant = GroupOrCIDR(self) | 
|  255         grant.owner_id = owner_id |  289         grant.owner_id = owner_id | 
|  256         grant.name = name |  290         grant.name = name | 
|  257         grant.cidr_ip = cidr_ip |  291         grant.cidr_ip = cidr_ip | 
|  258         self.grants.append(grant) |  292         self.grants.append(grant) | 
|  259         return grant |  293         return grant | 
|  260  |  294  | 
|  261 class GroupOrCIDR: |  295 class GroupOrCIDR(object): | 
|  262  |  296  | 
|  263     def __init__(self, parent=None): |  297     def __init__(self, parent=None): | 
|  264         self.owner_id = None |  298         self.owner_id = None | 
|  265         self.name = None |  299         self.name = None | 
|  266         self.cidr_ip = None |  300         self.cidr_ip = None | 
|  267  |  301  | 
|  268     def __repr__(self): |  302     def __repr__(self): | 
|  269         if self.cidr_ip: |  303         if self.cidr_ip: | 
|  270             return '%s' % self.cidr_ip |  304             return '%s' % self.cidr_ip | 
|  271         else: |  305         else: | 
|  272             return '%s-%s' % (self.name, self.owner_id) |  306             return '%s-%s' % (self.name, self.owner_id) | 
|  273  |  307  | 
|  274     def startElement(self, name, attrs, connection): |  308     def startElement(self, name, attrs, connection): | 
|  275         return None |  309         return None | 
|  276  |  310  | 
|  277     def endElement(self, name, value, connection): |  311     def endElement(self, name, value, connection): | 
|  278         if name == 'userId': |  312         if name == 'userId': | 
|  279             self.owner_id = value |  313             self.owner_id = value | 
|  280         elif name == 'groupName': |  314         elif name == 'groupName': | 
|  281             self.name = value |  315             self.name = value | 
|  282         if name == 'cidrIp': |  316         if name == 'cidrIp': | 
|  283             self.cidr_ip = value |  317             self.cidr_ip = value | 
|  284         else: |  318         else: | 
|  285             setattr(self, name, value) |  319             setattr(self, name, value) | 
|  286  |  320  | 
| OLD | NEW |