vmit 0.0.3 → 0.0.3.99
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/vmit +89 -13
- data/lib/vmit.rb +25 -18
- data/lib/vmit/autoyast.rb +81 -22
- data/lib/vmit/debian_preseed.rb +35 -1
- data/lib/vmit/install_media.rb +224 -0
- data/lib/vmit/kickstart.rb +44 -8
- data/lib/vmit/libvirt_vm.rb +274 -0
- data/lib/vmit/plugins/bootstrap.rb +33 -17
- data/lib/vmit/registry.rb +208 -0
- data/lib/vmit/unattended_install.rb +43 -0
- data/lib/vmit/utils.rb +51 -1
- data/lib/vmit/version.rb +1 -1
- data/lib/vmit/workspace.rb +181 -0
- data/test/data/registry.yml +5 -0
- data/test/data/registry/key1 +1 -0
- data/test/data/registry/key2 +1 -0
- data/test/data/registry/key4/key1 +1 -0
- data/test/install_media_test.rb +67 -0
- data/test/registry_test.rb +118 -0
- data/test/{bootstrap_test.rb → workspace_test.rb} +23 -19
- data/vmit.gemspec +4 -1
- metadata +46 -19
- data/bin/vmit-ifdown +0 -10
- data/bin/vmit-ifup +0 -18
- data/lib/vmit/bootstrap.rb +0 -273
- data/lib/vmit/virtual_machine.rb +0 -299
data/bin/vmit
CHANGED
@@ -41,14 +41,14 @@ module Vmit
|
|
41
41
|
|
42
42
|
def execute
|
43
43
|
options = {}
|
44
|
-
vm = Vmit::
|
44
|
+
vm = Vmit::Workspace.new(File.expand_path(Dir.pwd))
|
45
45
|
|
46
46
|
OPTION_KEYS.each do |k|
|
47
47
|
val = self.send(k)
|
48
48
|
options[k] = val if val
|
49
49
|
end
|
50
50
|
|
51
|
-
vm.
|
51
|
+
vm.config.configure(options)
|
52
52
|
vm.save_config!
|
53
53
|
|
54
54
|
vm.disk_image_init!(options)
|
@@ -57,7 +57,7 @@ module Vmit
|
|
57
57
|
|
58
58
|
end
|
59
59
|
|
60
|
-
class
|
60
|
+
class UpCommand < BaseVmCommand
|
61
61
|
|
62
62
|
OPTION_KEYS = [:memory, :cdrom]
|
63
63
|
|
@@ -70,23 +70,89 @@ module Vmit
|
|
70
70
|
|
71
71
|
def execute
|
72
72
|
options = {}
|
73
|
-
|
73
|
+
workspace = Vmit::Workspace.new(File.expand_path(Dir.pwd))
|
74
74
|
|
75
75
|
OPTION_KEYS.each do |k|
|
76
76
|
val = self.send(k)
|
77
77
|
options[k] = val if val
|
78
78
|
end
|
79
79
|
|
80
|
-
vm.
|
80
|
+
vm = Vmit::LibvirtVM.new(workspace, options)
|
81
|
+
vm.up
|
81
82
|
end
|
82
83
|
|
83
84
|
end
|
84
85
|
|
86
|
+
class SpiceCommand < Clamp::Command
|
87
|
+
def execute
|
88
|
+
vm = LibvirtVM.from_pwd
|
89
|
+
vm.spice
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
class VncCommand < Clamp::Command
|
94
|
+
def execute
|
95
|
+
vm = LibvirtVM.from_pwd
|
96
|
+
vm.vnc
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
class SshCommand < Clamp::Command
|
101
|
+
def execute
|
102
|
+
vm = LibvirtVM.from_pwd
|
103
|
+
vm.assert_up
|
104
|
+
|
105
|
+
while not vm.ip_address
|
106
|
+
sleep(1)
|
107
|
+
Vmit.logger.info("Waiting for ip address...")
|
108
|
+
end
|
109
|
+
Vmit.logger.info("ip address is #{vm.ip_address}")
|
110
|
+
Vmit::Utils.wait_for_port(vm.ip_address, 22)
|
111
|
+
system("ssh root@#{vm.ip_address}")
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class StatusCommand < Clamp::Command
|
116
|
+
def execute
|
117
|
+
vm = LibvirtVM.from_pwd
|
118
|
+
st, reason = vm.state
|
119
|
+
|
120
|
+
puts "VM is #{st}...(#{reason})"
|
121
|
+
if vm.ip_address
|
122
|
+
puts " #{vm.ip_address}"
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class RebootCommand < Clamp::Command
|
129
|
+
def execute
|
130
|
+
vm = LibvirtVM.from_pwd
|
131
|
+
vm.reboot
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
class ShutdownCommand < Clamp::Command
|
136
|
+
def execute
|
137
|
+
vm = LibvirtVM.from_pwd
|
138
|
+
vm.shutdown
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
class DestroyCommand < Clamp::Command
|
143
|
+
def execute
|
144
|
+
vm = LibvirtVM.from_pwd
|
145
|
+
vm.destroy
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
85
149
|
class DiskSnapshotCommand < Clamp::Command
|
86
150
|
|
87
151
|
def execute
|
88
|
-
vm =
|
89
|
-
vm.
|
152
|
+
vm = LibvirtVM.from_pwd
|
153
|
+
vm.assert_down
|
154
|
+
|
155
|
+
vm.workspace.disk_snapshot!
|
90
156
|
end
|
91
157
|
|
92
158
|
end
|
@@ -94,8 +160,8 @@ module Vmit
|
|
94
160
|
class DiskImagesCommand < Clamp::Command
|
95
161
|
|
96
162
|
def execute
|
97
|
-
vm =
|
98
|
-
puts vm.disk_images.last
|
163
|
+
vm = LibvirtVM.from_pwd
|
164
|
+
puts vm.workspace.disk_images.last
|
99
165
|
end
|
100
166
|
|
101
167
|
end
|
@@ -103,19 +169,30 @@ module Vmit
|
|
103
169
|
class DiskRollbackCommand < Clamp::Command
|
104
170
|
|
105
171
|
def execute
|
106
|
-
vm =
|
107
|
-
vm.
|
172
|
+
vm = LibvirtVM.from_pwd
|
173
|
+
vm.assert_down
|
174
|
+
|
175
|
+
vm.workspace.disk_rollback!
|
108
176
|
end
|
109
177
|
|
110
178
|
end
|
111
179
|
|
180
|
+
Vmit.load_plugins!
|
181
|
+
|
112
182
|
class MainCommand < Clamp::Command
|
113
183
|
|
114
184
|
subcommand "init", "Initialize the vm", InitCommand
|
115
|
-
subcommand "
|
185
|
+
subcommand "up", "Run the vm", UpCommand
|
186
|
+
subcommand "status", "Show VM status", StatusCommand
|
187
|
+
subcommand "shutdown", "Shutdown the VM", ShutdownCommand
|
188
|
+
subcommand "reboot", "Reboot the VM", RebootCommand
|
189
|
+
subcommand "destroy", "Destroy the VM", DestroyCommand
|
116
190
|
subcommand "disk-images", "List disk images", DiskImagesCommand
|
117
191
|
subcommand "disk-snapshot", "Creates a new disk-snapshot", DiskSnapshotCommand
|
118
192
|
subcommand "disk-rollback", "Rollbacks to previous disk snapshot", DiskRollbackCommand
|
193
|
+
subcommand "spice", "SPICE into the machine", SpiceCommand
|
194
|
+
subcommand "ssh", "SSH into the machine", SshCommand
|
195
|
+
subcommand "vnc", "VNC into the machine", VncCommand
|
119
196
|
|
120
197
|
# Add commands offered via plugins
|
121
198
|
Vmit.plugins.each do |plugin|
|
@@ -127,7 +204,6 @@ module Vmit
|
|
127
204
|
end
|
128
205
|
end
|
129
206
|
|
130
|
-
|
131
207
|
end
|
132
208
|
|
133
209
|
begin
|
data/lib/vmit.rb
CHANGED
@@ -19,13 +19,18 @@
|
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
21
|
require 'vmit/version'
|
22
|
-
require 'vmit/
|
22
|
+
require 'vmit/unattended_install'
|
23
23
|
require 'vmit/logger'
|
24
|
-
require 'vmit/refcounted_resource'
|
25
24
|
require 'vmit/network'
|
26
25
|
require 'vmit/vfs'
|
27
|
-
require 'vmit/
|
26
|
+
require 'vmit/workspace'
|
27
|
+
require 'vmit/libvirt_vm'
|
28
|
+
require 'vmit/autoyast'
|
29
|
+
require 'vmit/kickstart'
|
30
|
+
require 'vmit/debian_preseed'
|
31
|
+
require 'vmit/install_media'
|
28
32
|
require 'vmit/ext'
|
33
|
+
require 'vmit/utils'
|
29
34
|
require 'pidfile'
|
30
35
|
|
31
36
|
module Vmit
|
@@ -47,21 +52,23 @@ module Vmit
|
|
47
52
|
@plugins ||= []
|
48
53
|
end
|
49
54
|
|
50
|
-
|
55
|
+
def self.load_plugins!
|
56
|
+
# Scan plugins
|
57
|
+
plugin_glob = File.join(File.dirname(__FILE__), 'vmit', 'plugins', '*.rb')
|
58
|
+
Dir.glob(plugin_glob).each do |plugin|
|
59
|
+
Vmit.logger.debug("Loading file: #{plugin}")
|
60
|
+
#puts "Loading file: #{plugin}"
|
61
|
+
load plugin
|
62
|
+
end
|
51
63
|
|
52
|
-
#
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
64
|
+
# instantiate plugins
|
65
|
+
::Vmit::Plugins.constants.each do |cnt|
|
66
|
+
pl_class = ::Vmit::Plugins.const_get(cnt)
|
67
|
+
#pl_instance = pl_class.new
|
68
|
+
Vmit.add_plugin(pl_class)
|
69
|
+
Vmit.logger.debug("Loaded: #{pl_class}")
|
70
|
+
#puts "Loaded: #{pl_class}"
|
71
|
+
end
|
72
|
+
end
|
59
73
|
|
60
|
-
# instantiate plugins
|
61
|
-
::Vmit::Plugins.constants.each do |cnt|
|
62
|
-
pl_class = ::Vmit::Plugins.const_get(cnt)
|
63
|
-
#pl_instance = pl_class.new
|
64
|
-
Vmit.add_plugin(pl_class)
|
65
|
-
Vmit.logger.debug("Loaded: #{pl_class}")
|
66
|
-
#puts "Loaded: #{pl_class}"
|
67
74
|
end
|
data/lib/vmit/autoyast.rb
CHANGED
@@ -19,38 +19,92 @@
|
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
21
|
require 'nokogiri'
|
22
|
+
require 'vmit/unattended_install'
|
23
|
+
require 'vmit/vfs'
|
22
24
|
|
23
25
|
module Vmit
|
24
26
|
|
25
|
-
class AutoYaST
|
27
|
+
class AutoYaST < UnattendedInstall
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def initialize
|
31
|
-
@net_udev = {}
|
32
|
-
@patterns = []
|
33
|
-
@packages = []
|
29
|
+
def initialize(location)
|
30
|
+
super(location)
|
31
|
+
base!
|
34
32
|
end
|
35
33
|
|
36
|
-
def
|
37
|
-
|
34
|
+
def base!
|
35
|
+
config.add_patterns! 'base'
|
36
|
+
config.add_packages! 'zypper'
|
37
|
+
config.add_packages! 'openssh'
|
38
38
|
end
|
39
39
|
|
40
|
-
|
41
|
-
|
40
|
+
# minimal installation
|
41
|
+
# does not work with openSUSE
|
42
|
+
def minimal!
|
43
|
+
config.add_patterns! 'Minimal'
|
44
|
+
config.add_packages! 'zypper'
|
45
|
+
config.add_packages! 'openssh'
|
42
46
|
end
|
43
47
|
|
44
|
-
#
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
48
|
+
# @param [Hash] args Arguments for 1st stage
|
49
|
+
def execute_autoinstall(vm, args)
|
50
|
+
vm.config.push!
|
51
|
+
begin
|
52
|
+
vm.config.configure(args)
|
53
|
+
media = Vmit::VFS.from(location)
|
54
|
+
kernel_append_arg = case media
|
55
|
+
when Vmit::VFS::URI then "install=#{location}"
|
56
|
+
when Vmit::VFS::ISO then 'install=cdrom'
|
57
|
+
else raise ArgumentError.new("Unsupported autoinstallation: #{location}")
|
58
|
+
end
|
59
|
+
vm.config.add_kernel_cmdline!(kernel_append_arg)
|
60
|
+
|
61
|
+
if media.is_a?(Vmit::VFS::ISO)
|
62
|
+
vm.config.cdrom = location.to_s
|
63
|
+
end
|
64
|
+
|
65
|
+
Dir.mktmpdir do |floppy_dir|
|
66
|
+
FileUtils.chmod_R 0775, floppy_dir
|
67
|
+
vm.config.floppy = floppy_dir
|
68
|
+
#vm.config.add_kernel_cmdline!('autoyast=device://fd0/autoinst.xml')
|
69
|
+
vm.config.add_kernel_cmdline!('autoyast=floppy')
|
70
|
+
vm.config.reboot = false
|
71
|
+
|
72
|
+
# WTF SLE and openSUSE have different
|
73
|
+
# base pattern names
|
74
|
+
#media.open('/content') do |content_file|
|
75
|
+
# content_file.each_line do |line|
|
76
|
+
# case line
|
77
|
+
# when /^DISTRIBUTION (.+)$/
|
78
|
+
# case $1
|
79
|
+
# when /SUSE_SLE/ then autoyast.minimal_sle!
|
80
|
+
# when /openSUSE/ then autoyast.minimal_opensuse!
|
81
|
+
# end
|
82
|
+
# end
|
83
|
+
# end
|
84
|
+
#end
|
85
|
+
|
86
|
+
File.write(File.join(floppy_dir, 'autoinst.xml'), to_xml)
|
87
|
+
Vmit.logger.info "AutoYaST: 1st stage."
|
88
|
+
puts vm.config.inspect
|
89
|
+
vm.up
|
90
|
+
vm.wait_until_shutdown! do
|
91
|
+
vm.vnc
|
92
|
+
end
|
93
|
+
vm.config.pop!
|
94
|
+
|
95
|
+
Vmit.logger.info "AutoYaST: 2st stage."
|
96
|
+
# 2nd stage
|
97
|
+
vm.config.push!
|
98
|
+
vm.config.configure(:reboot => false)
|
99
|
+
vm.up
|
100
|
+
vm.wait_until_shutdown! do
|
101
|
+
vm.vnc
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
ensure
|
106
|
+
vm.config.pop!
|
52
107
|
end
|
53
|
-
@net_udev[mac] = name
|
54
108
|
end
|
55
109
|
|
56
110
|
def to_xml
|
@@ -87,10 +141,15 @@ module Vmit
|
|
87
141
|
}
|
88
142
|
xml.software {
|
89
143
|
xml.patterns('config:type' => 'list') {
|
90
|
-
|
144
|
+
config.patterns.each do |pat|
|
91
145
|
xml.pattern pat
|
92
146
|
end
|
93
147
|
}
|
148
|
+
xml.packages('config:type' => 'list') {
|
149
|
+
config.packages.each do |pkg|
|
150
|
+
xml.package pkg
|
151
|
+
end
|
152
|
+
}
|
94
153
|
}
|
95
154
|
# SLE 11 can do without this basic partitioning but
|
96
155
|
# SLE 10 is not that smart.
|
data/lib/vmit/debian_preseed.rb
CHANGED
@@ -19,23 +19,54 @@
|
|
19
19
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
20
|
#
|
21
21
|
require 'erb'
|
22
|
+
require 'vmit/unattended_install'
|
22
23
|
|
23
24
|
module Vmit
|
24
25
|
|
25
26
|
# Some good references here:
|
26
27
|
# http://www.hps.com/~tpg/notebook/autoinstall.php
|
27
|
-
class DebianPreseed
|
28
|
+
class DebianPreseed < UnattendedInstall
|
29
|
+
|
30
|
+
def execute_autoinstall(vm, args)
|
31
|
+
vm.config.push!
|
32
|
+
begin
|
33
|
+
vm.config.configure(args)
|
34
|
+
Dir.mktmpdir do |floppy_dir|
|
35
|
+
FileUtils.chmod_R 0755, floppy_dir
|
36
|
+
vm.config.floppy = floppy_dir
|
37
|
+
vm.config.add_kernel_cmdline!('preseed/file=/floppy/preseed.cfg')
|
38
|
+
vm.config.add_kernel_cmdline!('auto=true')
|
39
|
+
vm.config.add_kernel_cmdline!('priority=critical')
|
40
|
+
vm.config.reboot = false
|
41
|
+
|
42
|
+
File.write(File.join(floppy_dir, 'preseed.cfg'), to_txt)
|
43
|
+
Vmit.logger.info "Preseed: 1st stage."
|
44
|
+
vm.up
|
45
|
+
vm.wait_until_shutdown! do
|
46
|
+
vm.vnc
|
47
|
+
end
|
48
|
+
end
|
49
|
+
ensure
|
50
|
+
vm.config.pop!
|
51
|
+
end
|
52
|
+
end
|
28
53
|
|
29
54
|
def to_txt
|
30
55
|
template = ERB.new <<-EOF
|
56
|
+
d-i debconf/priority select critical
|
57
|
+
d-i auto-install/enabled boolean true
|
31
58
|
d-i debian-installer/locale string en_US
|
32
59
|
d-i console-tools/archs select at
|
33
60
|
d-i console-keymaps-at/keymap select American English
|
61
|
+
|
34
62
|
d-i debian-installer/keymap string us
|
63
|
+
|
64
|
+
d-i netcfg/choose_interface select auto
|
35
65
|
d-i netcfg/get_hostname string unassigned-hostname
|
36
66
|
d-i netcfg/get_hostname seen true
|
37
67
|
d-i netcfg/get_domain string unassigned-domain
|
38
68
|
d-i netcfg/get_domain seen true
|
69
|
+
|
39
70
|
d-i mirror/protocol string ftp
|
40
71
|
d-i mirror/ftp/hostname string ftp.de.debian.org
|
41
72
|
d-i mirror/ftp/directory string /debian/
|
@@ -51,7 +82,10 @@ d-i clock-setup/utc boolean true
|
|
51
82
|
d-i time/zone string US/Eastern
|
52
83
|
d-i clock-setup/ntp boolean true
|
53
84
|
popularity-contest popularity-contest/participate boolean false
|
85
|
+
|
54
86
|
d-i pkgsel/include string ssh rsync initrd-tools cramfsprogs lzop
|
87
|
+
|
88
|
+
d-i passwd/root-login boolean true
|
55
89
|
d-i passwd/root-password password linux
|
56
90
|
d-i passwd/root-password-again password linux
|
57
91
|
d-i passwd/make-user boolean false
|
@@ -0,0 +1,224 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (C) 2013 Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
5
|
+
# this software and associated documentation files (the "Software"), to deal in
|
6
|
+
# the Software without restriction, including without limitation the rights to
|
7
|
+
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
8
|
+
# the Software, and to permit persons to whom the Software is furnished to do so,
|
9
|
+
# subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
16
|
+
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
17
|
+
# COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
18
|
+
# IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
19
|
+
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
20
|
+
#
|
21
|
+
require 'vmit/utils'
|
22
|
+
require 'vmit/vfs'
|
23
|
+
require 'confstruct'
|
24
|
+
|
25
|
+
module Vmit
|
26
|
+
|
27
|
+
class InstallMedia
|
28
|
+
abstract_method :unattended_install_class
|
29
|
+
abstract_method :kernel_path
|
30
|
+
abstract_method :initrd_path
|
31
|
+
|
32
|
+
attr_reader :location
|
33
|
+
|
34
|
+
def initialize(location)
|
35
|
+
@location = location
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
"#{super.to_s}:#{location}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def unattended_install
|
43
|
+
unless @unattended_install
|
44
|
+
@unattended_install = unattended_install_class.new(location)
|
45
|
+
end
|
46
|
+
@unattended_install
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.class_for_media_type(type)
|
50
|
+
case type.to_s.downcase
|
51
|
+
when /fedora|redhat|centos/ then FedoraInstallMedia
|
52
|
+
when /suse/ then SUSEInstallMedia
|
53
|
+
when /debian/ then DebianInstallMedia
|
54
|
+
else
|
55
|
+
raise "Don't know how to bootstrap media #{location}"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [InstallMedia] an install media for an arbitrary
|
60
|
+
# string like 'sles 11 sp2' or 'SLED-11_SP3'
|
61
|
+
#
|
62
|
+
# @raise [ArgumentError] if can't figure out an install media
|
63
|
+
# from the string
|
64
|
+
def self.alias_to_install_media(key)
|
65
|
+
case key.to_s.downcase.gsub(/[\s_\-]+/, '')
|
66
|
+
when /^opensuse(\d+\.\d+)$/
|
67
|
+
SUSEInstallMedia.new(
|
68
|
+
'http://download.opensuse.org/distribution/$version/repo/oss/'
|
69
|
+
.gsub('$version', $1))
|
70
|
+
when /^(opensuse)?factory$/
|
71
|
+
SUSEInstallMedia.new(
|
72
|
+
'http://download.opensuse.org/factory/repo/oss/')
|
73
|
+
when /^debian(.+)$/
|
74
|
+
DebianInstallMedia.new(
|
75
|
+
'http://cdn.debian.net/debian/dists/$version'
|
76
|
+
.gsub('$version', $1))
|
77
|
+
when /^ubuntu(.+)$/
|
78
|
+
UbuntuInstallMedia.new(
|
79
|
+
'http://archive.ubuntu.com/ubuntu/dists/$version'
|
80
|
+
.gsub('$version', $1))
|
81
|
+
when /^fedora(\d+)/
|
82
|
+
FedoraInstallMedia.new(
|
83
|
+
'http://mirrors.n-ix.net/fedora/linux/releases/$release/Fedora/$arch/os/'
|
84
|
+
.gsub('$arch', Vmit::Utils.arch)
|
85
|
+
.gsub('$release', $1))
|
86
|
+
when /^sle(s|d)?(\d+)(sp(\d+))?$/
|
87
|
+
edition = case $1
|
88
|
+
when 's' then 'sle-server'
|
89
|
+
when 'd' then 'sle-desktop'
|
90
|
+
else
|
91
|
+
Vmit.logger.warn "SLE given. Assuming server."
|
92
|
+
'sle-server'
|
93
|
+
end
|
94
|
+
release = $2
|
95
|
+
sp = $4 || '0'
|
96
|
+
klass = if release.to_i > 9
|
97
|
+
SUSEInstallMedia
|
98
|
+
else
|
99
|
+
SUSE9InstallMedia
|
100
|
+
end
|
101
|
+
suffix = if (release.to_i > 9)
|
102
|
+
'/DVD1'
|
103
|
+
else
|
104
|
+
if (sp.to_i > 0)
|
105
|
+
'/CD1'
|
106
|
+
else
|
107
|
+
''
|
108
|
+
end
|
109
|
+
end
|
110
|
+
klass.new(
|
111
|
+
"http://schnell.suse.de/BY_PRODUCT/$edition-$release-sp$sp-$arch$topdir"
|
112
|
+
.gsub('$edition', edition)
|
113
|
+
.gsub('$arch', Vmit::Utils.arch)
|
114
|
+
.gsub('$release', release)
|
115
|
+
.gsub('$sp', sp)
|
116
|
+
.gsub('$topdir', suffix))
|
117
|
+
else raise ArgumentError.new("Unknown install media '#{key}'")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# @return [InstallMedia] an install media for a url.
|
122
|
+
# it accesses the network in order to detect the
|
123
|
+
# url type.
|
124
|
+
#
|
125
|
+
# @raise [ArgumentError] if can't figure out an install media
|
126
|
+
# from the string
|
127
|
+
def self.url_to_install_media(url)
|
128
|
+
begin
|
129
|
+
media = Vmit::VFS.from(url)
|
130
|
+
media.open('/content')
|
131
|
+
return SUSEInstallMedia.new(url)
|
132
|
+
rescue
|
133
|
+
raise ArgumentError.new("Don't know the install media '#{url}'")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# @return [InstallMedia] scans the install media
|
138
|
+
# and returns a specific type (suse, debian, etc...)
|
139
|
+
def self.scan(key)
|
140
|
+
case key
|
141
|
+
when /^http:\/|ftp:\// then url_to_install_media(key)
|
142
|
+
else alias_to_install_media(key)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def autoinstall(vm)
|
147
|
+
Vmit.logger.debug("Autoinstall from #{location}")
|
148
|
+
media = Vmit::VFS.from(location)
|
149
|
+
kernel = media.open(kernel_path)
|
150
|
+
initrd = media.open(initrd_path)
|
151
|
+
opts = {:kernel => kernel.path, :initrd => initrd.path}
|
152
|
+
unattended_install.execute_autoinstall(vm, opts)
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
class SUSEInstallMedia < InstallMedia
|
158
|
+
|
159
|
+
def unattended_install_class
|
160
|
+
Vmit::AutoYaST
|
161
|
+
end
|
162
|
+
|
163
|
+
def initrd_path
|
164
|
+
"/boot/#{Vmit::Utils.arch}/loader/initrd"
|
165
|
+
end
|
166
|
+
|
167
|
+
def kernel_path
|
168
|
+
"/boot/#{Vmit::Utils.arch}/loader/linux"
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
class SUSE9InstallMedia < SUSEInstallMedia
|
173
|
+
def initrd_path
|
174
|
+
"/boot/loader/initrd"
|
175
|
+
end
|
176
|
+
|
177
|
+
def kernel_path
|
178
|
+
"/boot/loader/linux"
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
class FedoraInstallMedia < InstallMedia
|
183
|
+
|
184
|
+
def unattended_install_class
|
185
|
+
Vmit::Kickstart
|
186
|
+
end
|
187
|
+
|
188
|
+
def initrd_path
|
189
|
+
'/images/pxeboot/initrd.img'
|
190
|
+
end
|
191
|
+
|
192
|
+
def kernel_path
|
193
|
+
'/images/pxeboot/vmlinuz'
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
class DebianInstallMedia < InstallMedia
|
198
|
+
|
199
|
+
def name
|
200
|
+
'debian'
|
201
|
+
end
|
202
|
+
|
203
|
+
def unattended_install_class
|
204
|
+
Vmit::DebianPreseed
|
205
|
+
end
|
206
|
+
|
207
|
+
def initrd_path
|
208
|
+
arch = Vmit::Utils.arch.gsub(/x86_64/, 'amd64')
|
209
|
+
"/main/installer-#{arch}/current/images/netboot/#{name}-installer/#{arch}/initrd.gz"
|
210
|
+
end
|
211
|
+
|
212
|
+
def kernel_path
|
213
|
+
arch = Vmit::Utils.arch.gsub(/x86_64/, 'amd64')
|
214
|
+
"/main/installer-#{arch}/current/images/netboot/#{name}-installer/#{arch}/linux"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
218
|
+
class UbuntuInstallMedia < DebianInstallMedia
|
219
|
+
def name
|
220
|
+
'ubuntu'
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
end
|