Mercurial > repos > shellac > guppy_basecaller
comparison env/lib/python3.7/site-packages/boto/ec2/securitygroup.py @ 0:26e78fe6e8c4 draft
"planemo upload commit c699937486c35866861690329de38ec1a5d9f783"
author | shellac |
---|---|
date | Sat, 02 May 2020 07:14:21 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:26e78fe6e8c4 |
---|---|
1 # Copyright (c) 2006-2011 Mitch Garnaat http://garnaat.org/ | |
2 # Copyright (c) 2011, Eucalyptus Systems, Inc. | |
3 # | |
4 # Permission is hereby granted, free of charge, to any person obtaining a | |
5 # copy of this software and associated documentation files (the | |
6 # "Software"), to deal in the Software without restriction, including | |
7 # without limitation the rights to use, copy, modify, merge, publish, dis- | |
8 # tribute, sublicense, and/or sell copies of the Software, and to permit | |
9 # persons to whom the Software is furnished to do so, subject to the fol- | |
10 # lowing conditions: | |
11 # | |
12 # The above copyright notice and this permission notice shall be included | |
13 # in all copies or substantial portions of the Software. | |
14 # | |
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS | |
16 # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- | |
17 # ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT | |
18 # SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
19 # WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |
21 # IN THE SOFTWARE. | |
22 | |
23 """ | |
24 Represents an EC2 Security Group | |
25 """ | |
26 from boto.ec2.ec2object import TaggedEC2Object | |
27 from boto.exception import BotoClientError | |
28 | |
29 | |
30 class SecurityGroup(TaggedEC2Object): | |
31 | |
32 def __init__(self, connection=None, owner_id=None, | |
33 name=None, description=None, id=None): | |
34 super(SecurityGroup, self).__init__(connection) | |
35 self.id = id | |
36 self.owner_id = owner_id | |
37 self.name = name | |
38 self.description = description | |
39 self.vpc_id = None | |
40 self.rules = IPPermissionsList() | |
41 self.rules_egress = IPPermissionsList() | |
42 | |
43 def __repr__(self): | |
44 return 'SecurityGroup:%s' % self.name | |
45 | |
46 def startElement(self, name, attrs, connection): | |
47 retval = super(SecurityGroup, self).startElement(name, attrs, connection) | |
48 if retval is not None: | |
49 return retval | |
50 if name == 'ipPermissions': | |
51 return self.rules | |
52 elif name == 'ipPermissionsEgress': | |
53 return self.rules_egress | |
54 else: | |
55 return None | |
56 | |
57 def endElement(self, name, value, connection): | |
58 if name == 'ownerId': | |
59 self.owner_id = value | |
60 elif name == 'groupId': | |
61 self.id = value | |
62 elif name == 'groupName': | |
63 self.name = value | |
64 elif name == 'vpcId': | |
65 self.vpc_id = value | |
66 elif name == 'groupDescription': | |
67 self.description = value | |
68 elif name == 'ipRanges': | |
69 pass | |
70 elif name == 'return': | |
71 if value == 'false': | |
72 self.status = False | |
73 elif value == 'true': | |
74 self.status = True | |
75 else: | |
76 raise Exception( | |
77 'Unexpected value of status %s for group %s' % ( | |
78 value, | |
79 self.name | |
80 ) | |
81 ) | |
82 else: | |
83 setattr(self, name, value) | |
84 | |
85 def delete(self, dry_run=False): | |
86 if self.vpc_id: | |
87 return self.connection.delete_security_group( | |
88 group_id=self.id, | |
89 dry_run=dry_run | |
90 ) | |
91 else: | |
92 return self.connection.delete_security_group( | |
93 self.name, | |
94 dry_run=dry_run | |
95 ) | |
96 | |
97 def add_rule(self, ip_protocol, from_port, to_port, | |
98 src_group_name, src_group_owner_id, cidr_ip, | |
99 src_group_group_id, dry_run=False): | |
100 """ | |
101 Add a rule to the SecurityGroup object. Note that this method | |
102 only changes the local version of the object. No information | |
103 is sent to EC2. | |
104 """ | |
105 rule = IPPermissions(self) | |
106 rule.ip_protocol = ip_protocol | |
107 rule.from_port = from_port | |
108 rule.to_port = to_port | |
109 self.rules.append(rule) | |
110 rule.add_grant( | |
111 src_group_name, | |
112 src_group_owner_id, | |
113 cidr_ip, | |
114 src_group_group_id, | |
115 dry_run=dry_run | |
116 ) | |
117 | |
118 def remove_rule(self, ip_protocol, from_port, to_port, | |
119 src_group_name, src_group_owner_id, cidr_ip, | |
120 src_group_group_id, dry_run=False): | |
121 """ | |
122 Remove a rule to the SecurityGroup object. Note that this method | |
123 only changes the local version of the object. No information | |
124 is sent to EC2. | |
125 """ | |
126 if not self.rules: | |
127 raise ValueError("The security group has no rules") | |
128 | |
129 target_rule = None | |
130 for rule in self.rules: | |
131 if rule.ip_protocol == ip_protocol: | |
132 if rule.from_port == from_port: | |
133 if rule.to_port == to_port: | |
134 target_rule = rule | |
135 target_grant = None | |
136 for grant in rule.grants: | |
137 if grant.name == src_group_name or grant.group_id == src_group_group_id: | |
138 if grant.owner_id == src_group_owner_id: | |
139 if grant.cidr_ip == cidr_ip: | |
140 target_grant = grant | |
141 if target_grant: | |
142 rule.grants.remove(target_grant) | |
143 if len(rule.grants) == 0: | |
144 self.rules.remove(target_rule) | |
145 | |
146 def authorize(self, ip_protocol=None, from_port=None, to_port=None, | |
147 cidr_ip=None, src_group=None, dry_run=False): | |
148 """ | |
149 Add a new rule to this security group. | |
150 You need to pass in either src_group_name | |
151 OR ip_protocol, from_port, to_port, | |
152 and cidr_ip. In other words, either you are authorizing another | |
153 group or you are authorizing some ip-based rule. | |
154 | |
155 :type ip_protocol: string | |
156 :param ip_protocol: Either tcp | udp | icmp | |
157 | |
158 :type from_port: int | |
159 :param from_port: The beginning port number you are enabling | |
160 | |
161 :type to_port: int | |
162 :param to_port: The ending port number you are enabling | |
163 | |
164 :type cidr_ip: string or list of strings | |
165 :param cidr_ip: The CIDR block you are providing access to. | |
166 See http://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing | |
167 | |
168 :type src_group: :class:`boto.ec2.securitygroup.SecurityGroup` or | |
169 :class:`boto.ec2.securitygroup.GroupOrCIDR` | |
170 :param src_group: The Security Group you are granting access to. | |
171 | |
172 :rtype: bool | |
173 :return: True if successful. | |
174 """ | |
175 group_name = None | |
176 if not self.vpc_id: | |
177 group_name = self.name | |
178 group_id = None | |
179 if self.vpc_id: | |
180 group_id = self.id | |
181 src_group_name = None | |
182 src_group_owner_id = None | |
183 src_group_group_id = None | |
184 if src_group: | |
185 cidr_ip = None | |
186 src_group_owner_id = src_group.owner_id | |
187 if not self.vpc_id: | |
188 src_group_name = src_group.name | |
189 else: | |
190 if hasattr(src_group, 'group_id'): | |
191 src_group_group_id = src_group.group_id | |
192 else: | |
193 src_group_group_id = src_group.id | |
194 status = self.connection.authorize_security_group(group_name, | |
195 src_group_name, | |
196 src_group_owner_id, | |
197 ip_protocol, | |
198 from_port, | |
199 to_port, | |
200 cidr_ip, | |
201 group_id, | |
202 src_group_group_id, | |
203 dry_run=dry_run) | |
204 if status: | |
205 if not isinstance(cidr_ip, list): | |
206 cidr_ip = [cidr_ip] | |
207 for single_cidr_ip in cidr_ip: | |
208 self.add_rule(ip_protocol, from_port, to_port, src_group_name, | |
209 src_group_owner_id, single_cidr_ip, | |
210 src_group_group_id, dry_run=dry_run) | |
211 return status | |
212 | |
213 def revoke(self, ip_protocol=None, from_port=None, to_port=None, | |
214 cidr_ip=None, src_group=None, dry_run=False): | |
215 group_name = None | |
216 if not self.vpc_id: | |
217 group_name = self.name | |
218 group_id = None | |
219 if self.vpc_id: | |
220 group_id = self.id | |
221 src_group_name = None | |
222 src_group_owner_id = None | |
223 src_group_group_id = None | |
224 if src_group: | |
225 cidr_ip = None | |
226 src_group_owner_id = src_group.owner_id | |
227 if not self.vpc_id: | |
228 src_group_name = src_group.name | |
229 else: | |
230 if hasattr(src_group, 'group_id'): | |
231 src_group_group_id = src_group.group_id | |
232 else: | |
233 src_group_group_id = src_group.id | |
234 status = self.connection.revoke_security_group(group_name, | |
235 src_group_name, | |
236 src_group_owner_id, | |
237 ip_protocol, | |
238 from_port, | |
239 to_port, | |
240 cidr_ip, | |
241 group_id, | |
242 src_group_group_id, | |
243 dry_run=dry_run) | |
244 if status: | |
245 self.remove_rule(ip_protocol, from_port, to_port, src_group_name, | |
246 src_group_owner_id, cidr_ip, src_group_group_id, | |
247 dry_run=dry_run) | |
248 return status | |
249 | |
250 def copy_to_region(self, region, name=None, dry_run=False): | |
251 """ | |
252 Create a copy of this security group in another region. | |
253 Note that the new security group will be a separate entity | |
254 and will not stay in sync automatically after the copy | |
255 operation. | |
256 | |
257 :type region: :class:`boto.ec2.regioninfo.RegionInfo` | |
258 :param region: The region to which this security group will be copied. | |
259 | |
260 :type name: string | |
261 :param name: The name of the copy. If not supplied, the copy | |
262 will have the same name as this security group. | |
263 | |
264 :rtype: :class:`boto.ec2.securitygroup.SecurityGroup` | |
265 :return: The new security group. | |
266 """ | |
267 if region.name == self.region: | |
268 raise BotoClientError('Unable to copy to the same Region') | |
269 conn_params = self.connection.get_params() | |
270 rconn = region.connect(**conn_params) | |
271 sg = rconn.create_security_group( | |
272 name or self.name, | |
273 self.description, | |
274 dry_run=dry_run | |
275 ) | |
276 source_groups = [] | |
277 for rule in self.rules: | |
278 for grant in rule.grants: | |
279 grant_nom = grant.name or grant.group_id | |
280 if grant_nom: | |
281 if grant_nom not in source_groups: | |
282 source_groups.append(grant_nom) | |
283 sg.authorize(None, None, None, None, grant, | |
284 dry_run=dry_run) | |
285 else: | |
286 sg.authorize(rule.ip_protocol, rule.from_port, rule.to_port, | |
287 grant.cidr_ip, dry_run=dry_run) | |
288 return sg | |
289 | |
290 def instances(self, dry_run=False): | |
291 """ | |
292 Find all of the current instances that are running within this | |
293 security group. | |
294 | |
295 :rtype: list of :class:`boto.ec2.instance.Instance` | |
296 :return: A list of Instance objects | |
297 """ | |
298 rs = [] | |
299 if self.vpc_id: | |
300 rs.extend(self.connection.get_all_reservations( | |
301 filters={'instance.group-id': self.id}, | |
302 dry_run=dry_run | |
303 )) | |
304 else: | |
305 rs.extend(self.connection.get_all_reservations( | |
306 filters={'group-id': self.id}, | |
307 dry_run=dry_run | |
308 )) | |
309 instances = [i for r in rs for i in r.instances] | |
310 return instances | |
311 | |
312 | |
313 class IPPermissionsList(list): | |
314 | |
315 def startElement(self, name, attrs, connection): | |
316 if name == 'item': | |
317 self.append(IPPermissions(self)) | |
318 return self[-1] | |
319 return None | |
320 | |
321 def endElement(self, name, value, connection): | |
322 pass | |
323 | |
324 | |
325 class IPPermissions(object): | |
326 | |
327 def __init__(self, parent=None): | |
328 self.parent = parent | |
329 self.ip_protocol = None | |
330 self.from_port = None | |
331 self.to_port = None | |
332 self.grants = [] | |
333 | |
334 def __repr__(self): | |
335 return 'IPPermissions:%s(%s-%s)' % (self.ip_protocol, | |
336 self.from_port, self.to_port) | |
337 | |
338 def startElement(self, name, attrs, connection): | |
339 if name == 'item': | |
340 self.grants.append(GroupOrCIDR(self)) | |
341 return self.grants[-1] | |
342 return None | |
343 | |
344 def endElement(self, name, value, connection): | |
345 if name == 'ipProtocol': | |
346 self.ip_protocol = value | |
347 elif name == 'fromPort': | |
348 self.from_port = value | |
349 elif name == 'toPort': | |
350 self.to_port = value | |
351 else: | |
352 setattr(self, name, value) | |
353 | |
354 def add_grant(self, name=None, owner_id=None, cidr_ip=None, group_id=None, | |
355 dry_run=False): | |
356 grant = GroupOrCIDR(self) | |
357 grant.owner_id = owner_id | |
358 grant.group_id = group_id | |
359 grant.name = name | |
360 grant.cidr_ip = cidr_ip | |
361 self.grants.append(grant) | |
362 return grant | |
363 | |
364 | |
365 class GroupOrCIDR(object): | |
366 | |
367 def __init__(self, parent=None): | |
368 self.owner_id = None | |
369 self.group_id = None | |
370 self.name = None | |
371 self.cidr_ip = None | |
372 | |
373 def __repr__(self): | |
374 if self.cidr_ip: | |
375 return '%s' % self.cidr_ip | |
376 else: | |
377 return '%s-%s' % (self.name or self.group_id, self.owner_id) | |
378 | |
379 def startElement(self, name, attrs, connection): | |
380 return None | |
381 | |
382 def endElement(self, name, value, connection): | |
383 if name == 'userId': | |
384 self.owner_id = value | |
385 elif name == 'groupId': | |
386 self.group_id = value | |
387 elif name == 'groupName': | |
388 self.name = value | |
389 if name == 'cidrIp': | |
390 self.cidr_ip = value | |
391 else: | |
392 setattr(self, name, value) |