vagrant-vm-info 0.0.4

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.
data/.gitignore ADDED
@@ -0,0 +1,20 @@
1
+ *.gem
2
+ *.rbc
3
+ Gemfile.lock
4
+ .bundle
5
+ .config
6
+ .yardoc
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .vagrant
19
+ Vagrantfile
20
+ .*.swp
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vagrant-vm-info.gemspec
4
+ gemspec
5
+
6
+ group :development do
7
+ # We depend on Vagrant for development, but we don't add it as a
8
+ # gem dependency because we expect to be installed within the
9
+ # Vagrant environment itself using `vagrant plugin`.
10
+ gem "vagrant", :git => "git://github.com/mitchellh/vagrant.git" , :tag => 'v1.6.3'
11
+ end
12
+
13
+ group :plugins do
14
+ gem "vagrant-vm-info", path: "."
15
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Kostiantyn Chkhaidze
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Vagrant::Vm::Info
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'vagrant-vm-info'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install vagrant-vm-info
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,151 @@
1
+ begin
2
+ require "vagrant"
3
+ require Vagrant.source_root.join('plugins/commands/up/start_mixins')
4
+ rescue LoadError
5
+ raise "The vagrant-vm-info vagrant plugin must be run with vagrant."
6
+ end
7
+
8
+ require "yaml"
9
+ require "time"
10
+
11
+ # This is a sanity check to make sure no one is attempting to install
12
+ # this into an early Vagrant version.
13
+ if Vagrant::VERSION < "1.1.0"
14
+ raise "The vagrant-vm-info vagrant plugin is only compatible with Vagrant 1.1+"
15
+ end
16
+
17
+ module VagrantVminfo
18
+ class Plugin < Vagrant.plugin("2")
19
+ name "vagrant-vm-info"
20
+ description <<-DESC
21
+ This plugin provides the 'info' command that will display detailed information about the VM in YAML for easy parsing
22
+ DESC
23
+
24
+ command("info") do
25
+ InfoCommand
26
+ end
27
+ end
28
+
29
+ class InfoCommand < Vagrant.plugin(2, :command)
30
+ include VagrantPlugins::CommandUp::StartMixins
31
+
32
+ def get_vm_info(vm)
33
+ # Get some provider specific details for vm
34
+ provider = vm.provider_name.id2name
35
+ if provider == 'virtualbox'
36
+ return get_vm_info_virtualbox(vm)
37
+ elsif provider == 'vmware_workstation' or provider == 'vmware_fusion'
38
+ return get_vm_info_vmware(vm)
39
+ end
40
+ end
41
+
42
+ def get_vm_info_virtualbox(vm)
43
+ # Get VM info by virtualbox provider
44
+ # All we need is network interfaces details
45
+
46
+ networks = []
47
+ begin
48
+ nic_count = vm.provider.driver.execute("guestproperty", "get", vm.id, "/VirtualBox/GuestInfo/Net/Count")[/Value: (\d)/, 1]
49
+ rescue Exception => e
50
+ @logger.warn(e.message)
51
+ nic_count = 0
52
+ else
53
+ nic_count = Integer(nic_count)
54
+ end
55
+ # Check nic_count is not defined in case of VBox Guest Additions not install, or some other issue
56
+ vminfo = vm.provider.driver.execute("showvminfo", vm.id, "--machinereadable")
57
+ if nic_count > 0
58
+ (0..(nic_count-1)).each do |i|
59
+ nic_ip = vm.provider.driver.execute("guestproperty", "get", vm.id, "/VirtualBox/GuestInfo/Net/#{i}/V4/IP")[/Value: (.*)/, 1]
60
+ nic_mac = vm.provider.driver.execute("guestproperty", "get", vm.id, "/VirtualBox/GuestInfo/Net/#{i}/MAC")[/Value: (.*)/, 1]
61
+ nic_broadcast = vm.provider.driver.execute("guestproperty", "get", vm.id, "/VirtualBox/GuestInfo/Net/#{i}/V4/Broadcast")[/Value: (.*)/, 1]
62
+ nic_netmask = vm.provider.driver.execute("guestproperty", "get", vm.id, "/VirtualBox/GuestInfo/Net/#{i}/V4/Netmask")[/Value: (.*)/, 1]
63
+ # Get the number of this network device based on the mac address
64
+ # TODO: probably just should just get a hash of all of this info somehow, my ruby foo is weak
65
+ nic_number = vminfo[/\w*(\d)=\"#{nic_mac}\"/, 1]
66
+ nic_type = vminfo[/nic#{nic_number}=\"(.*)\"/, 1]
67
+ networks << {'ip' => nic_ip,
68
+ 'mac' => nic_mac,
69
+ 'netmask' => nic_netmask,
70
+ 'broadcast' => nic_broadcast,
71
+ 'type' => nic_type}
72
+ end
73
+ end
74
+ # If VM is running - VMStateChangeTime is actually it's launch time
75
+ state_change_time = vminfo[/VMStateChangeTime=\"(.*)\"/, 1]
76
+ return {"launch_time" => Time.parse(state_change_time).strftime("%Y-%m-%d %H:%M:%S"),
77
+ "networks" => networks}
78
+
79
+ end
80
+
81
+ def get_vm_info_vmware(vm)
82
+ # Get VM info by virtualbox provider
83
+ # We can get some network interfaces details and current IP address
84
+
85
+ # Collect details for all the network interfaces
86
+ nics = {}
87
+ vm.provider.driver.send(:read_vmx_data).each do |key, val|
88
+ key1, key2 = key.split('.')
89
+ m = /^ethernet\d+$/.match(key1)
90
+ if m
91
+ if !nics.include?(m[0])
92
+ nics[m[0]] = {}
93
+ end
94
+ nics[m[0]][key2] = val
95
+ end
96
+ end
97
+
98
+ # Check and normalize collected network information
99
+ networks = []
100
+ nics.values.each do |nic|
101
+ nic_type = nic['connectiontype']
102
+ nic_addresstype = nic['addresstype']
103
+ nic_mac = nic_addresstype == 'generated' ? nic['generatedaddress'] : nic['address']
104
+ #TODO: For now I don't know simple way to retrieve these details
105
+ #nic_ip = nil
106
+ #nic_netmask = nil
107
+ #nic_broadcast = nil
108
+
109
+ networks << {#'ip' => nic_ip,
110
+ 'mac' => nic_mac,
111
+ #'netmask' => nic_netmask,
112
+ #'broadcast' => nic_broadcast,
113
+ 'type' => nic_type}
114
+ end
115
+
116
+ # We can try to get IP address for VM but can not assign it to any network interface
117
+ ip = nil
118
+ begin
119
+ resp = vm.provider.driver.send(:vmrun, *['getGuestIPAddress', vm.id])
120
+ rescue Exception => e
121
+ @logger.warn(e.message)
122
+ else
123
+ m = /(?<ip>\d{1,3}\.\d{1,3}.\d{1,3}\.\d{1,3})/.match(resp.stdout)
124
+ ip = (resp.exit_code == 0 and m) ? m['ip'] : nil
125
+ end
126
+
127
+ return {'ip' => ip,
128
+ 'networks' => networks }
129
+ end
130
+
131
+ def execute
132
+ # Not sure if this is the only way to do this? How else would I get argv?
133
+ argv = parse_options(OptionParser.new)
134
+
135
+ info = {}
136
+
137
+ with_target_vms(argv) do |vm|
138
+ info["name"] = vm.name.id2name
139
+ info["status"] = vm.state.id.id2name
140
+
141
+ # Check if vm is running - try to get some provider specific details
142
+ if vm.state.id == :running
143
+ info["id"] = vm.id
144
+ info["provider"] = vm.provider_name.id2name
145
+ info.merge!(get_vm_info(vm))
146
+ end
147
+ end
148
+ puts info.to_yaml
149
+ end
150
+ end
151
+ end
@@ -0,0 +1,3 @@
1
+ module VagrantVminfo
2
+ VERSION = "0.0.4"
3
+ end
@@ -0,0 +1,19 @@
1
+ require "pathname"
2
+
3
+ module VagrantVminfo
4
+
5
+ def self.vagrant_vm_info_root
6
+ @vagrant_vm_info_root ||= Pathname.new(File.expand_path("../../", __FILE__))
7
+ end
8
+
9
+ def self.load_script(script_file_name)
10
+ File.read(expand_script_path(script_file_name))
11
+ end
12
+
13
+ def self.load_script_template(script_file_name, options)
14
+ Vagrant::Util::TemplateRenderer.render(expand_script_path(script_file_name), options)
15
+ end
16
+
17
+ end
18
+
19
+ require "vagrant-vm-info/plugin"
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vagrant-vm-info/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vagrant-vm-info"
8
+ spec.version = VagrantVminfo::VERSION
9
+ spec.authors = ["Lin Salisbury", "Kostiantyn Chkhaidze"]
10
+ spec.email = ["lin.salisbury@gmail.com", "kchkhaidze@rivermeadow.com"]
11
+ spec.description = %q{Plugin to get detailed VM info from Vagrant}
12
+ spec.summary = %q{Gets detailed information about the VM, including network interfaes}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ # spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec-core", "~> 2.12.2"
24
+ spec.add_development_dependency "rspec-expectations", "~> 2.12.1"
25
+ spec.add_development_dependency "rspec-mocks", "~> 2.12.1"
26
+ end
metadata ADDED
@@ -0,0 +1,121 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vagrant-vm-info
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lin Salisbury
9
+ - Kostiantyn Chkhaidze
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-07-08 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rake
17
+ requirement: !ruby/object:Gem::Requirement
18
+ none: false
19
+ requirements:
20
+ - - ! '>='
21
+ - !ruby/object:Gem::Version
22
+ version: '0'
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: rspec-core
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ~>
37
+ - !ruby/object:Gem::Version
38
+ version: 2.12.2
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ version: 2.12.2
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec-expectations
49
+ requirement: !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 2.12.1
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ~>
61
+ - !ruby/object:Gem::Version
62
+ version: 2.12.1
63
+ - !ruby/object:Gem::Dependency
64
+ name: rspec-mocks
65
+ requirement: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ~>
69
+ - !ruby/object:Gem::Version
70
+ version: 2.12.1
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ version: 2.12.1
79
+ description: Plugin to get detailed VM info from Vagrant
80
+ email:
81
+ - lin.salisbury@gmail.com
82
+ - kchkhaidze@rivermeadow.com
83
+ executables: []
84
+ extensions: []
85
+ extra_rdoc_files: []
86
+ files:
87
+ - .gitignore
88
+ - Gemfile
89
+ - LICENSE.txt
90
+ - README.md
91
+ - Rakefile
92
+ - lib/vagrant-vm-info.rb
93
+ - lib/vagrant-vm-info/plugin.rb
94
+ - lib/vagrant-vm-info/version.rb
95
+ - vagrant-vm-info.gemspec
96
+ homepage: ''
97
+ licenses:
98
+ - MIT
99
+ post_install_message:
100
+ rdoc_options: []
101
+ require_paths:
102
+ - lib
103
+ required_ruby_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ! '>='
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ none: false
111
+ requirements:
112
+ - - ! '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 1.8.23
118
+ signing_key:
119
+ specification_version: 3
120
+ summary: Gets detailed information about the VM, including network interfaes
121
+ test_files: []