vagrant-command-dns 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9091d62e746bfa1ac32f14792aed653bd4897110
4
- data.tar.gz: 93912f062c9535573c51eab4e1da0024230b2f97
3
+ metadata.gz: cd77fab9b2c0d0d39c8b38f2db26615e58c27c84
4
+ data.tar.gz: 8cfd993bbc28ced4e07711752166157fa8bdf7b6
5
5
  SHA512:
6
- metadata.gz: 41ac13370fd2a073ce190974ac479c34503477abd98a3898f0782700165d7da6a9c805afe96898a115a74af0d7672c5bb1bb4bc2f68f6b442b9644eba081dbbe
7
- data.tar.gz: fe983024d0b333baebca6021ccf25e1f14bbdf87dfd36985d0531bd0bfc583c8e3ecd57f850206b6aaf515a2de30ef08415fc449edb1c757e37b11404f506cc5
6
+ metadata.gz: 42520e3d9c9fc2332455695663dfafdc7b246f2df7d74b9a43765943b2c38cf5f3e93864a50ad3d841e9de45d7b7d15b9e5588d7498dfca46e528dbbf54f196c
7
+ data.tar.gz: e5725a24eb19b3b81b90d90aa9598fbcedc131830d9822f7774cd0dc9d0ff452fd2b6c5768e2fe0794bafda492e87ef78565f2675d2a41e71933aef733d030c9
data/README.md CHANGED
@@ -1,25 +1,118 @@
1
1
  VagrantPlugins::CommandDns
2
2
  ==========================
3
3
 
4
- _*Currently in development. DO NOT USE.*_
4
+ [![Gem Version](https://badge.fury.io/rb/vagrant-command-dns.svg)](https://badge.fury.io/rb/vagrant-command-dns)
5
5
 
6
+ Todo:
7
+ - add confirm to destroy subcommands
8
+ - add windows support
6
9
 
7
- #
8
- - Untested in multi-machine environments
9
10
 
11
+ # Installation
12
+ ```
13
+ vagrant plugin install vagrant-command-dns
14
+ ```
10
15
 
11
- # Development
12
16
 
13
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake false` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
17
+ # Configuration
18
+ - [optional] `aliases` List of FQDNs to register this box's ip with
19
+ - [optional] `route53_version` The version of the AWS api to use
20
+ - [optional] `route53_access_key_id` The access key ID for accessing AWS
21
+ - [optional] `route53_secret_access_key` The secret access key for accessing AWS
22
+ - [optional] `route53_session_token` The token associated with the key for accessing AWS
23
+ - [optional] `route53_zone_id` The Route53 Zone ID
14
24
 
15
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
25
+
26
+ # Usage
27
+ ```
28
+ vagrant dns
29
+ Usage: vagrant dns <subcommand>
30
+
31
+ Available subcommands:
32
+ host
33
+ ip
34
+ route53
35
+
36
+ For help on any individual subcommand run `vagrant dns <subcommand> -h`
37
+ ```
38
+
39
+
40
+ ## Hostname and Aliases
41
+ The hostname and any aliases will be used to create records
42
+ ```
43
+ config.vm.hostname = "www.example.com"
44
+ config.route53.aliases = ["alias.example.com", "alias2.example.com"]
45
+ ```
46
+
47
+
48
+ ## Network
49
+ This plugin works only for `:private_network` and `:public_network`.
50
+ ```
51
+ config.vm.network :private_network, ip: "172.18.7.1"
52
+ ```
53
+
54
+ or
55
+
56
+ ```
57
+ config.vm.network :public_network
58
+ ```
59
+
60
+
61
+ ## Box Providers
62
+ Currently only VirtualBox is supported, because that is what I have to test with.
63
+
64
+ Pull requests are welcome.
65
+
66
+
67
+ ## DNS Providers
68
+ Currently only editing the host's (linux/osx) `/etc/hosts` file and AWS Route53 are supported.
69
+
70
+ Pull requests are welcome.
71
+
72
+
73
+ # Route53
74
+ ## IAM Permissions
75
+ ```
76
+ {
77
+ "Version": "2012-10-17",
78
+ "Statement": [
79
+ {
80
+ "Effect": "Allow",
81
+ "Action": [
82
+ "route53:CreateHostedZone",
83
+ "route53:GetHostedZone",
84
+ "route53:ListHostedZones",
85
+ "route53:ChangeResourceRecordSets",
86
+ "route53:ListResourceRecordSets"
87
+ ],
88
+ "Resource": [
89
+ "arn:aws:route53:::hostedzone/1A2B3C4D5E6F"
90
+ ]
91
+ }
92
+ ]
93
+ }
94
+ ```
95
+
96
+
97
+ # FAQ
98
+ Q) I reloaded my box and the `dns` command is only returning the VirtualBox NAT interface.
99
+ A) Run reload once more. This is a known issue with no workaround at the moment.
100
+
101
+
102
+ # Shortfalls
103
+ - Untested in multi-machine environments
104
+ - Does not support Windows hosts or guests
105
+
106
+
107
+ # Sponsors
108
+ This plugin was made possible by [Shiftgig](https://www.shiftgig.com)
16
109
 
17
110
 
18
111
  # Contributing
112
+ Pull requests are welcome on GitHub at https://github.com/cornfeedhobo/vagrant-command-dns.
19
113
 
20
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/vagrant-command-dns. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
114
+ This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](contributor-covenant.org) code of conduct.
21
115
 
22
116
 
23
117
  # License
24
-
25
118
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -19,25 +19,29 @@ module VagrantPlugins
19
19
  ip = nil
20
20
 
21
21
  case env[:machine].provider_name
22
- when :virtualbox
23
- # We only operate on the first network defined in the Vagrantfile
24
- unless env[:machine].config.vm.networks[1].nil?
25
- network = env[:machine].config.vm.networks[1]
26
- if network[1][:dns] == 'skip'
27
- @logger.info('')
28
- env[:ui].info('')
29
- else
30
- cmd = "vagrant ssh -c \"ip -4 addr show \\$(ip -4 route | head -n2 | tail -n1 | awk '{print \\$5}') | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}'\" 2>/dev/null"
31
- begin
32
- ip = IPAddr.new(`#{cmd}`.chomp)
33
- rescue IPAddr::InvalidAddressError
34
- raise Errors::InvalidAddressError
22
+ when :virtualbox
23
+ env[:machine].config.vm.networks.each do |network|
24
+ key, options = network[0], network[1]
25
+ if key == :private_network or key == :public_network
26
+ if options[:dns] != 'skip'
27
+ case key
28
+ when :private_network
29
+ cmd = "vagrant ssh -c \"ip -4 addr show \\$(ip -4 route | tail -n1 | awk '{print \\$3}') | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}'\" 2>/dev/null"
30
+ when :public_network
31
+ cmd = "vagrant ssh -c \"ip -4 addr show \\$(ip -4 route | head -n2 | tail -n1 | awk '{print \\$5}') | grep -oP '(?<=inet\\s)\\d+(\\.\\d+){3}'\" 2>/dev/null"
32
+ end
33
+ begin
34
+ ip = IPAddr.new(`#{cmd}`.chomp)
35
+ rescue IPAddr::InvalidAddressError
36
+ raise Errors::InvalidAddressError
37
+ end
38
+ else
39
+ env[:ui].info(I18n.t('vagrant_command_dns.config.network_skip'))
40
+ end
35
41
  end
36
42
  end
37
- end
38
-
39
- else
40
- raise Errors::UnsupportedProviderError
43
+ else
44
+ raise Errors::UnsupportedProviderError
41
45
  end
42
46
 
43
47
  unless ip.nil?
@@ -48,7 +52,6 @@ module VagrantPlugins
48
52
 
49
53
  record_map = {}
50
54
  host_names.each do |h|
51
- env[:ui].info "#{h} #{ip.to_string}"
52
55
  record_map[h] = ip.to_string
53
56
  end
54
57
 
@@ -16,27 +16,37 @@ module VagrantPlugins
16
16
  raise Errors::MachineStateError, state: 'running'
17
17
  end
18
18
 
19
- lines = []
20
- env[:record_map].each do |hostname, ip|
21
- loose_pattern = Regexp.new('^\s*[0-9]{1,3}[0-9]{1,3}[0-9]{1,3}[0-9]{1,3}\s+' + hostname)
22
- precise_pattern = Regexp.new('^\s*' + ip + '\s+' + hostname)
23
- File.open('/etc/hosts', 'r') do |f|
24
- f.each_line do |line|
19
+ record_map = env[:record_map]
20
+
21
+ File.open('/etc/hosts', 'r') do |file|
22
+ file.each_line do |line|
23
+ env[:record_map].each do |hostname, ip|
24
+ precise_pattern = Regexp.new('^\s*' + ip + '\s+' + hostname)
25
+ loose_pattern = Regexp.new('^\s*[0-9]{1,3}[0-9]{1,3}[0-9]{1,3}[0-9]{1,3}\s+' + hostname)
25
26
  if line.match(/#{precise_pattern}/)
26
- env[:ui].info(I18n.t('vagrant_command_dns.command.host.create_exists_match',
27
- ip: ip, hostname: hostname))
28
- return
27
+ record_map.delete(hostname)
28
+ env[:ui].info(I18n.t('vagrant_command_dns.command.host.create_exists_match', ip: ip, hostname: hostname))
29
29
  elsif line.match(/#{loose_pattern}/)
30
30
  env[:ui].info(I18n.t('vagrant_command_dns.command.host.create_exists_conflict'))
31
31
  end
32
32
  end
33
33
  end
34
+ end
35
+
36
+ lines = []
37
+ record_map.each do |hostname, ip|
34
38
  lines.push("#{ip} #{hostname}")
35
39
  end
36
40
 
37
- content = lines.join("\n").strip
38
- unless system("sudo sh -c 'echo \"#{content}\" >> /etc/hosts'")
39
- env[:ui].error(I18n.t('vagrant_command_dns.command.host.edit_error'))
41
+ if lines.length > 0
42
+ content = lines.join("\n").strip
43
+ if system("sudo sh -c 'echo \"#{content}\" >> /etc/hosts'")
44
+ record_map.each do |hostname, ip|
45
+ env[:ui].info(I18n.t('vagrant_command_dns.command.host.create_success', ip: ip, hostname: hostname))
46
+ end
47
+ else
48
+ env[:ui].error(I18n.t('vagrant_command_dns.command.host.edit_error'))
49
+ end
40
50
  end
41
51
 
42
52
  @app.call(env)
@@ -18,25 +18,39 @@ module VagrantPlugins
18
18
  end
19
19
  end
20
20
 
21
+ # read the file into memory to save reading it for each alias
21
22
  lines = []
23
+ File.open('/etc/hosts', 'r') do |file|
24
+ file.each_line do |line|
25
+ lines.push(line.chomp)
26
+ end
27
+ end
28
+
29
+ destroyed = {}
22
30
  env[:record_map].each do |hostname, ip|
23
31
  if env[:machine].config.dns.__skip
24
32
  record_pattern = Regexp.new('^\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s+' + hostname)
25
33
  else
26
34
  record_pattern = Regexp.new('^\s*' + ip + '\s+' + hostname)
27
35
  end
28
- File.open('/etc/hosts', 'r') do |f|
29
- f.each_line do |line|
30
- unless line.match(/#{record_pattern}/)
31
- lines.push(line.chomp)
32
- end
36
+
37
+ lines.each do |line|
38
+ if line.match(/#{record_pattern}/)
39
+ lines.delete(line)
40
+ destroyed[hostname] = ip
33
41
  end
34
42
  end
35
43
  end
36
44
 
37
- content = lines.join("\n").strip
38
- unless system("sudo sh -c 'echo \"#{content}\" > /etc/hosts'")
39
- env[:ui].error(I18n.t('vagrant_command_dns.command.host.edit_error'))
45
+ if destroyed.length > 0
46
+ content = lines.join("\n").strip
47
+ if system("sudo sh -c 'echo \"#{content}\" > /etc/hosts'")
48
+ destroyed.each do |hostname, ip|
49
+ env[:ui].info(I18n.t('vagrant_command_dns.command.host.destroy_success', hostname: hostname))
50
+ end
51
+ else
52
+ env[:ui].error(I18n.t('vagrant_command_dns.command.host.edit_error'))
53
+ end
40
54
  end
41
55
 
42
56
  @app.call(env)
@@ -10,8 +10,9 @@ module VagrantPlugins
10
10
 
11
11
  def call(env)
12
12
  if env[:record_map]
13
- ip = env[:record_map].values[0]
14
- env[:ui].info("#{ip}")
13
+ env[:record_map].each do |h, ip|
14
+ env[:ui].info "#{h} #{ip}"
15
+ end
15
16
  end
16
17
 
17
18
  @app.call(env)
@@ -1,5 +1,5 @@
1
1
  module VagrantPlugins
2
2
  module CommandDns
3
- VERSION = '0.1.0'
3
+ VERSION = '0.2.0'
4
4
  end
5
5
  end
data/locales/en.yml CHANGED
@@ -2,6 +2,8 @@ en:
2
2
  vagrant_command_dns:
3
3
 
4
4
  config:
5
+ network_skip: |-
6
+ Skip requested for network in Vagrantfile
5
7
  route53_zone_id_required: |-
6
8
  A zone ID must be specified via "route53_zone_id"
7
9
  route53_access_key_id_required: |-
@@ -21,10 +23,14 @@ en:
21
23
  host:
22
24
  edit_error: |-
23
25
  Unable to edit /etc/hosts. Consult documentation or submit a pull request.
26
+ create_success: |-
27
+ /etc/hosts record created for %{ip} %{hostname}
24
28
  create_exists_match: |-
25
29
  /etc/hosts record exists for %{ip} %{hostname}
26
30
  create_exists_conflict: |-
27
- this should be a friendly message telling them they have other conflicting entries to remove
31
+ Potentially conflicting entries found in /etc/hosts. Please update manually...
32
+ destroy_success: |-
33
+ /etc/hosts record destroyed for %{hostname}
28
34
 
29
35
  route53:
30
36
  fog_error: |-
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-command-dns
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - cornfeedhobo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-03 00:00:00.000000000 Z
11
+ date: 2016-03-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog