aws-eni 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|