aws-eni 0.1.3 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/aws-eni +5 -4
- data/lib/aws-eni.rb +78 -18
- data/lib/aws-eni/ifconfig.rb +2 -2
- data/lib/aws-eni/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5bd70f82e45aa8e1c89003fefe1118b3c3e7a0ff
|
4
|
+
data.tar.gz: 8f7c1cbbb2136f722d34f8d414a167327e6920f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d7d4e8422d6232c893375f284b4cbc33b232c2cbc2af731be6f679540c017ab97e6162a22ce52ca011a49ca11dac653f862b51bba9893ebf5ed6a78ca280b89
|
7
|
+
data.tar.gz: 09dafcec8f9c13900c99754f0dfad80b7a912da55512de34f163a8a546fc4cdd2efaba04b8eb34032f5dd6857a95e35c9cce5c686272818cf32093c81af0ec24
|
data/bin/aws-eni
CHANGED
@@ -361,9 +361,10 @@ command [:unassign] do |c|
|
|
361
361
|
c.switch [:r,:release], negatable: false
|
362
362
|
|
363
363
|
c.action do |global,opts,args|
|
364
|
-
help_now! "Missing argument" if args.empty?
|
365
364
|
params = parse_args args, :interface_id, :device_name, :private_ip
|
365
|
+
help_now! "Missing argument" unless params[:private_ip]
|
366
366
|
params[:release] = opts[:release]
|
367
|
+
|
367
368
|
unassign = Aws::ENI.unassign_secondary_ip(params[:private_ip], params)
|
368
369
|
if unassign[:released]
|
369
370
|
puts "EIP #{unassign[:public_ip]} (#{unassign[:allocation_id]}) dissociated from #{unassign[:private_ip]} and released"
|
@@ -416,10 +417,10 @@ command [:dissociate] do |c|
|
|
416
417
|
c.switch [:r,:release], negatable: false
|
417
418
|
|
418
419
|
c.action do |global,opts,args|
|
419
|
-
help_now! "Missing argument" if args.empty?
|
420
420
|
params = parse_args args, :private_ip, :public_ip, :allocation_id, :association_id, :interface_id, :device_name
|
421
|
-
|
422
|
-
|
421
|
+
address = params[:private_ip] || params[:public_ip] || params[:association_id] || params[:allocation_id]
|
422
|
+
help_now! "Missing argument" unless address
|
423
|
+
dissoc = Aws::ENI.dissociate_elastic_ip(address, params)
|
423
424
|
if dissoc[:released]
|
424
425
|
puts "EIP #{dissoc[:public_ip]} (#{dissoc[:allocation_id]}) dissociated from #{dissoc[:private_ip]} on #{dissoc[:device_name]} (#{dissoc[:interface_id]}) and released"
|
425
426
|
else
|
data/lib/aws-eni.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'time'
|
2
|
-
require 'resolv'
|
3
2
|
require 'aws-sdk'
|
4
3
|
require 'aws-eni/version'
|
5
4
|
require 'aws-eni/errors'
|
@@ -258,15 +257,44 @@ module Aws
|
|
258
257
|
|
259
258
|
# remove a private ip using the AWS api and remove it from local config
|
260
259
|
def unassign_secondary_ip(private_ip, options = {})
|
261
|
-
|
260
|
+
do_release = !!options[:release]
|
261
|
+
|
262
|
+
find = options[:device_name] || options[:device_number] || options[:interface_id] || private_ip
|
263
|
+
device = IFconfig[find].assert(
|
264
|
+
exists: true,
|
265
|
+
device_name: options[:device_name],
|
266
|
+
interface_id: options[:interface_id],
|
267
|
+
device_number: options[:device_number]
|
268
|
+
)
|
269
|
+
|
270
|
+
resp = client.describe_network_interfaces(network_interface_ids: [device.interface_id])
|
271
|
+
interface = resp[:network_interfaces].first
|
272
|
+
raise UnknownInterfaceError, "Interface attachment could not be located" unless interface
|
273
|
+
|
274
|
+
unless addr_info = interface[:private_ip_addresses].find { |addr| addr[:private_ip_address] == private_ip }
|
275
|
+
raise InvalidParameterError, "IP #{private_ip} not found on #{device.name}"
|
276
|
+
end
|
277
|
+
if addr_info[:primary]
|
278
|
+
raise InvalidParameterError, "The primary IP address of an interface cannot be unassigned"
|
279
|
+
end
|
280
|
+
|
281
|
+
if assoc = addr_info[:association]
|
282
|
+
client.release_address(allocation_id: assoc[:allocation_id]) if do_release
|
283
|
+
end
|
284
|
+
|
285
|
+
device.remove_alias(private_ip)
|
286
|
+
client.unassign_private_ip_addresses(
|
287
|
+
network_interface_id: interface[:network_interface_id],
|
288
|
+
private_ip_addresses: [private_ip]
|
289
|
+
)
|
262
290
|
{
|
263
|
-
private_ip:
|
264
|
-
device_name:
|
265
|
-
interface_id:
|
266
|
-
public_ip:
|
267
|
-
allocation_id:
|
268
|
-
association_id:
|
269
|
-
released:
|
291
|
+
private_ip: private_ip,
|
292
|
+
device_name: device.name,
|
293
|
+
interface_id: device.interface_id,
|
294
|
+
public_ip: assoc[:public_ip],
|
295
|
+
allocation_id: assoc[:allocation_id],
|
296
|
+
association_id: assoc[:association_id],
|
297
|
+
released: assoc && do_release
|
270
298
|
}
|
271
299
|
end
|
272
300
|
|
@@ -318,15 +346,36 @@ module Aws
|
|
318
346
|
# dissociate a public ip from a private ip through the AWS api and
|
319
347
|
# optionally release the public ip
|
320
348
|
def dissociate_elastic_ip(ip, options = {})
|
321
|
-
|
349
|
+
do_release = !!options[:release]
|
350
|
+
eip = describe_address(ip)
|
351
|
+
|
352
|
+
if find = options[:device_name] || options[:device_number] || options[:interface_id]
|
353
|
+
device = IFconfig[find].assert(
|
354
|
+
device_name: options[:device_name],
|
355
|
+
device_number: options[:device_number],
|
356
|
+
interface_id: options[:interface_id]
|
357
|
+
)
|
358
|
+
if device.interface_id != eip[:network_interface_id]
|
359
|
+
raise UnknownInterfaceError, "EIP #{public_ip} is not associated with interface #{device.name} (#{device.interface_id})"
|
360
|
+
end
|
361
|
+
else
|
362
|
+
begin
|
363
|
+
device = IFconfig[eip[:network_interface_id]]
|
364
|
+
rescue UnknownInterfaceError
|
365
|
+
raise UnknownInterfaceError, "EIP #{public_ip} is not associated with an interface on this machine"
|
366
|
+
end
|
367
|
+
end
|
368
|
+
|
369
|
+
client.disassociate_address(association_id: eip[:association_id])
|
370
|
+
client.release_address(allocation_id: eip[:allocation_id]) if do_release
|
322
371
|
{
|
323
|
-
private_ip:
|
324
|
-
device_name:
|
325
|
-
interface_id:
|
326
|
-
public_ip:
|
327
|
-
allocation_id:
|
328
|
-
association_id:
|
329
|
-
released:
|
372
|
+
private_ip: eip[:private_ip_address],
|
373
|
+
device_name: device.name,
|
374
|
+
interface_id: eip[:network_interface_id],
|
375
|
+
public_ip: eip[:public_ip],
|
376
|
+
allocation_id: eip[:allocation_id],
|
377
|
+
association_id: eip[:association_id],
|
378
|
+
released: do_release
|
330
379
|
}
|
331
380
|
end
|
332
381
|
|
@@ -425,7 +474,18 @@ module Aws
|
|
425
474
|
|
426
475
|
# use either an ip address or allocation id
|
427
476
|
def describe_address(address)
|
428
|
-
filter_by = address
|
477
|
+
filter_by = case address
|
478
|
+
when /^eipalloc-/
|
479
|
+
'allocation-id'
|
480
|
+
when /^eipassoc-/
|
481
|
+
'allocation-id'
|
482
|
+
else
|
483
|
+
if IPAddr.new(environment[:vpc_cidr]) === IPAddr.new(address)
|
484
|
+
'private-ip-address'
|
485
|
+
else
|
486
|
+
'public-ip'
|
487
|
+
end
|
488
|
+
end
|
429
489
|
resp = client.describe_addresses(filters: [
|
430
490
|
{ name: 'domain', values: ['vpc'] },
|
431
491
|
{ name: filter_by, values: [address] }
|
data/lib/aws-eni/ifconfig.rb
CHANGED
@@ -22,7 +22,7 @@ module Aws
|
|
22
22
|
when /^(?:eth)?([0-9]+)$/
|
23
23
|
self[$1.to_i]
|
24
24
|
when /^eni-/
|
25
|
-
find { |dev| dev.
|
25
|
+
find { |dev| dev.interface_id == index }
|
26
26
|
when /^[0-9a-f:]+$/i
|
27
27
|
find { |dev| dev.hwaddr.casecmp(index) == 0 }
|
28
28
|
when /^[0-9\.]+$/
|
@@ -314,7 +314,7 @@ module Aws
|
|
314
314
|
end
|
315
315
|
|
316
316
|
# Remove a secondary ip from this interface
|
317
|
-
def remove_alias
|
317
|
+
def remove_alias(ip)
|
318
318
|
cmd("addr del #{ip}/#{prefix} dev #{name}")
|
319
319
|
unless name == 'eth0' || !cmd("rule list").match(/([0-9]+):\s+from #{ip} lookup #{route_table}/)
|
320
320
|
cmd("rule delete pref #{$1}")
|
data/lib/aws-eni/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aws-eni
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mike Greiling
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: gli
|