33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/vbox/cli.rb', line 33
def run
@options = { :verbose => 0 }
optparser = OptionParser.new do |opts|
opts.banner = banner
opts.on "-m", "--[no-]multiple",
"(default: auto) assume <vm_name> is a wildcard,",
"and run on multiple VMs.",
"All glob(7) patterns like *,?,[a-z] are supported",
"plus additional pattern {1-20} which matches","a sequence of numbers: 1,2,3,...,19,20" do |x|
@options[:multiple] = x
end
opts.on "-n", "--dry-run", "do not change anything, just print commands to be invoked" do
@options[:dry_run] = true
end
opts.on "-v", "--verbose", "increase verbosity" do
@options[:verbose] ||= 0
@options[:verbose] += 1
end
opts.on "-c", "--clones N", Integer, "clone: make N clones" do |x|
@options[:clones] = x
end
a = 'new last take make'.split.map{ |x| [x, x.upcase] }.flatten
opts.on "-snapshot", "--snapshot MODE", a, "clone: use LAST shapshot or make NEW" do |x|
@options[:snapshot] = x.downcase
end
opts.on "-H", "--headless", "start: start VM in headless mode" do
@options[:headless] = true
end
opts.on "-h", "--help", "show this message" do
puts @help
exit
end
end
@help = optparser.help
@argv = optparser.parse(@argv)
unless @options.key?(:multiple)
@options[:multiple] = "{#{@argv.first}}" !~ UUID_RE
end
@vbox = VBOX::CmdLineAPI.new(@options)
if @argv.size == 0 || @argv.last == 'list'
vms = @vbox.list_vms
@vbox.list_vms(:running => true).each do |vm|
vms.find{ |vm1| vm1.uuid == vm.uuid }.state = :running
end
if @argv.size == 2 && @argv.last == 'list'
if @options[:multiple]
@globs = _expand_glob(@argv.first).flatten
vms = vms.keep_if{ |vm| _fnmatch(vm.name) }
else
vms = vms.keep_if{ |vm| vm.name == @argv.first }
end
end
longest = (vms.map(&:name).map(&:size)+[4]).max
puts "%-*s %5s %6s %-12s %s".gray % [longest, *%w'NAME MEM DIRSZ STATE UUID']
vms.each do |vm|
if @options[:verbose] > 0
@vbox.get_vm_details vm
state = (vm.state == :poweroff) ? '' : vm.state.to_s.upcase
s = sprintf "%-*s %5d %6s %-12s %s", longest, vm.name, vm.memory_size||0, vm.dir_size||0,
state, vm.uuid
else
state = (vm.state == :poweroff) ? '' : vm.state.to_s.upcase
s = sprintf "%-*s %5s %6s %-12s %s", longest, vm.name, '', '',
state, vm.uuid
end
s = s.green if vm.state == :running
puts s
end
else
name = @argv.shift
cmd = @argv.shift || 'show'
cmd = ALIASES[cmd] if ALIASES[cmd]
if @options[:multiple]
_run_multiple_cmd cmd, name
else
_run_cmd cmd, name
end
end
end
|