vmit 0.0.3
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 +4 -0
- data/Gemfile +4 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +119 -0
- data/Rakefile +1 -0
- data/bin/vmit +145 -0
- data/bin/vmit-ifdown +10 -0
- data/bin/vmit-ifup +18 -0
- data/lib/vmit.rb +67 -0
- data/lib/vmit/autoyast.rb +110 -0
- data/lib/vmit/bootstrap.rb +273 -0
- data/lib/vmit/debian_preseed.rb +64 -0
- data/lib/vmit/ext.rb +38 -0
- data/lib/vmit/kickstart.rb +67 -0
- data/lib/vmit/logger.rb +66 -0
- data/lib/vmit/network.rb +161 -0
- data/lib/vmit/plugins/bootstrap.rb +82 -0
- data/lib/vmit/plugins/hello.rb +33 -0
- data/lib/vmit/refcounted_resource.rb +134 -0
- data/lib/vmit/utils.rb +103 -0
- data/lib/vmit/version.rb +23 -0
- data/lib/vmit/vfs.rb +210 -0
- data/lib/vmit/virtual_machine.rb +299 -0
- data/test/bootstrap_test.rb +50 -0
- data/test/data/dir1/file.txt +2 -0
- data/test/data/test_vfs.iso +0 -0
- data/test/helper.rb +28 -0
- data/test/refcounted_resource_test.rb +35 -0
- data/test/vfs_test.rb +85 -0
- data/vmit.gemspec +31 -0
- metadata +244 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
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
|
5
|
+
a copy of this software and associated documentation files (the
|
6
|
+
"Software"), to deal in the Software without restriction, including
|
7
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be
|
13
|
+
included in all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
data/README.rdoc
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
|
2
|
+
= Vmit
|
3
|
+
|
4
|
+
* http://guthub.com/dmacvicar/vmit
|
5
|
+
|
6
|
+
== Introduction
|
7
|
+
|
8
|
+
Vmit is a simple tool to manage virtual kvm machines for development/testing.
|
9
|
+
|
10
|
+
I wrote in desperation for after having various directories with images, scripts to
|
11
|
+
launch qemu, network setup scripts, etc.
|
12
|
+
|
13
|
+
== Philosophy
|
14
|
+
|
15
|
+
* Inspired in git: the directory where you are gives the context of the virtual machine
|
16
|
+
you are working with.
|
17
|
+
* No XML (virsh)
|
18
|
+
* Good defaults: the default configuration is no configuration
|
19
|
+
* Changing the mac address, RAM size and other parameters should be posible when launching
|
20
|
+
the VM (one time value) or persistent (per VM workspace)
|
21
|
+
* Easy creation of a snapshot to test something. Easy rollback.
|
22
|
+
|
23
|
+
== Usage
|
24
|
+
|
25
|
+
=== First steps
|
26
|
+
|
27
|
+
Just create a directory for your VM:
|
28
|
+
|
29
|
+
mkdir myvm
|
30
|
+
cd myvm
|
31
|
+
|
32
|
+
You don't need any configuration, but without a disk image:
|
33
|
+
|
34
|
+
$ vmit run
|
35
|
+
I, [2012-03-14T16:40:07.368677 #19781] INFO -- : Starting VM...
|
36
|
+
I, [2012-03-14T16:40:07.368774 #19781] INFO -- : => memory : 1G
|
37
|
+
I, [2012-03-14T16:40:07.368840 #19781] INFO -- : => mac_address : 0e:86:d7:76:94:89
|
38
|
+
F, [2012-03-14T16:40:07.369028 #19781] FATAL -- : No hard disk image available
|
39
|
+
|
40
|
+
So try init first. You can specify disk size or memory as parameter. Any option which is
|
41
|
+
not a default wil be written into a config.yml file:
|
42
|
+
|
43
|
+
$ vmit init
|
44
|
+
I, [2012-03-14T16:45:23.477649 #20129] INFO -- : Writing config.yml...
|
45
|
+
I, [2012-03-14T16:45:23.607814 #20129] INFO -- : Formatting '/space/vm/minix3/sda-1331739923.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536
|
46
|
+
|
47
|
+
The just launch the vm. You can pass a cdrom with --cdrom
|
48
|
+
|
49
|
+
$ vmit run --cdrom minix_R3.2.0-116fcea.iso
|
50
|
+
I, [2012-03-14T16:46:59.130827 #20189] INFO -- : Starting VM...
|
51
|
+
I, [2012-03-14T16:46:59.130929 #20189] INFO -- : => memory : 1G
|
52
|
+
I, [2012-03-14T16:46:59.130996 #20189] INFO -- : => cdrom : minix_R3.2.0-116fcea.iso
|
53
|
+
I, [2012-03-14T16:46:59.131024 #20189] INFO -- : => mac_address : 2a:eb:6c:6d:77:86
|
54
|
+
I, [2012-03-14T16:46:59.241318 #20189] INFO -- : Bringing interface tap1 up
|
55
|
+
I, [2012-03-14T16:46:59.244394 #20189] INFO -- : Connecting tap1 --> br0
|
56
|
+
|
57
|
+
You don't care about network setup. If you don't say anything vmit will connect
|
58
|
+
all virtual machines to a bridge in the 192.168.58.0/24 network. If this bridge
|
59
|
+
does not exist it will setup it for you and also setup NAT so that your virtual machines
|
60
|
+
get internet access. A DHCP server will give an ip to the virtual machine.
|
61
|
+
|
62
|
+
=== Snapshots
|
63
|
+
|
64
|
+
Once you installed your base OS, you can keep the base image as read only and use copy-on-write
|
65
|
+
to your further changes:
|
66
|
+
|
67
|
+
$ vmit disk-snapshot
|
68
|
+
I, [2012-03-14T16:48:13.187875 #20278] INFO -- : Formatting '/space/vm/minix3/sda-1331740093.qcow2', fmt=qcow2 size=10737418240 backing_file='/space/vm/minix3/sda-1331739923.qcow2' encryption=off cluster_size=65536
|
69
|
+
|
70
|
+
You can then rollback to the previous version:
|
71
|
+
|
72
|
+
$ vmit disk-rollback
|
73
|
+
I, [2012-03-14T16:54:02.080964 #20716] INFO -- : Removing /space/vm/minix3/sda-1331740209.qcow2
|
74
|
+
|
75
|
+
vmit init
|
76
|
+
vmit run
|
77
|
+
vmit disk-snapshot
|
78
|
+
vmit disk-rollback
|
79
|
+
vmit disk-images
|
80
|
+
|
81
|
+
== Configuration
|
82
|
+
|
83
|
+
Per-VM configuration is stored in the virtual machine directory in a file called config.yml.
|
84
|
+
|
85
|
+
=== General
|
86
|
+
|
87
|
+
Automatically generated configuration is stored in config.yml
|
88
|
+
|
89
|
+
---
|
90
|
+
:mac_address: 8e:55:c5:de:a0:16
|
91
|
+
:uuid: 7c6ff9eb-fe14-4444-bbbf-a6d954870978
|
92
|
+
|
93
|
+
=== Networking
|
94
|
+
|
95
|
+
If you don't do anything, the VM will be attached to 192.168.58.0/24 on a bridge, and NAT will be
|
96
|
+
setup on the network.
|
97
|
+
|
98
|
+
You can override the network in config.yml:
|
99
|
+
|
100
|
+
:network:
|
101
|
+
:address: 192.168.51.0/24
|
102
|
+
|
103
|
+
Or, you can edit /root/.vmit/networks.yml
|
104
|
+
|
105
|
+
---
|
106
|
+
myalias:
|
107
|
+
address: 192.168.51.0/24
|
108
|
+
|
109
|
+
And then in config.yml
|
110
|
+
|
111
|
+
:network: myalias
|
112
|
+
|
113
|
+
== Authors
|
114
|
+
|
115
|
+
* Duncan Mac-Vicar P. <dmacvicar@suse.de>
|
116
|
+
|
117
|
+
== License
|
118
|
+
|
119
|
+
See MIT-LICENSE file.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/vmit
ADDED
@@ -0,0 +1,145 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
3
|
+
require 'rubygems'
|
4
|
+
require 'active_support/inflector'
|
5
|
+
require 'clamp'
|
6
|
+
require 'vmit'
|
7
|
+
|
8
|
+
#Vmit.logger = Logger.new(STDERR)
|
9
|
+
# Don't show by default anything
|
10
|
+
#Vmit.logger.level = Logger::INFO
|
11
|
+
#Vmit.logger.level = Logger::DEBUG if ENV['DEBUG']
|
12
|
+
# TODO find a good format
|
13
|
+
#Vmit.logger.formatter = proc do |severity, datetime, progname, msg|
|
14
|
+
# "#{datetime}: #{severity} #{msg}\n"
|
15
|
+
#end
|
16
|
+
|
17
|
+
module Vmit
|
18
|
+
|
19
|
+
class BaseVmCommand < Clamp::Command
|
20
|
+
option ["-m", "--memory"], "N", "Amount of RAM" do |memory|
|
21
|
+
if not memory =~ /(\d)+(M|K|G)/
|
22
|
+
raise ArgumentError, "Memory should be given as 1M, 2G, etc"
|
23
|
+
end
|
24
|
+
memory
|
25
|
+
end
|
26
|
+
|
27
|
+
option ['-u', '--uuid'], "UUID", "unique id for the virtual machine"
|
28
|
+
end
|
29
|
+
|
30
|
+
class InitCommand < BaseVmCommand
|
31
|
+
|
32
|
+
OPTION_KEYS = [:disk_size, :memory, :uuid]
|
33
|
+
|
34
|
+
option ["-s","--disk-size"], "SIZE",
|
35
|
+
"Initialize disk with SIZE (eg: 10M, 10G, 10K)" do |disk_size|
|
36
|
+
if not disk_size =~ /(\d)+(M|K|G)/
|
37
|
+
raise ArgumentError, "Disk size should be given as 1M, 2G, etc"
|
38
|
+
end
|
39
|
+
disk_size
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute
|
43
|
+
options = {}
|
44
|
+
vm = Vmit::VirtualMachine.new(File.expand_path(Dir.pwd))
|
45
|
+
|
46
|
+
OPTION_KEYS.each do |k|
|
47
|
+
val = self.send(k)
|
48
|
+
options[k] = val if val
|
49
|
+
end
|
50
|
+
|
51
|
+
vm.options.merge!(options)
|
52
|
+
vm.save_config!
|
53
|
+
|
54
|
+
vm.disk_image_init!(options)
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
class RunCommand < BaseVmCommand
|
61
|
+
|
62
|
+
OPTION_KEYS = [:memory, :cdrom]
|
63
|
+
|
64
|
+
option ["-cdrom","--cdrom"], "CD", "Use CD as cdrom device (ISO, dev)" do |cdrom|
|
65
|
+
if not File.exist?(cdrom)
|
66
|
+
raise ArgumentError, "CDROM cdevice #{cdrom} not found"
|
67
|
+
end
|
68
|
+
cdrom
|
69
|
+
end
|
70
|
+
|
71
|
+
def execute
|
72
|
+
options = {}
|
73
|
+
vm = Vmit::VirtualMachine.new(File.expand_path(Dir.pwd))
|
74
|
+
|
75
|
+
OPTION_KEYS.each do |k|
|
76
|
+
val = self.send(k)
|
77
|
+
options[k] = val if val
|
78
|
+
end
|
79
|
+
|
80
|
+
vm.run(options)
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
class DiskSnapshotCommand < Clamp::Command
|
86
|
+
|
87
|
+
def execute
|
88
|
+
vm = Vmit::VirtualMachine.new(File.expand_path(Dir.pwd))
|
89
|
+
vm.disk_snapshot!
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
class DiskImagesCommand < Clamp::Command
|
95
|
+
|
96
|
+
def execute
|
97
|
+
vm = Vmit::VirtualMachine.new(File.expand_path(Dir.pwd))
|
98
|
+
puts vm.disk_images.last
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
class DiskRollbackCommand < Clamp::Command
|
104
|
+
|
105
|
+
def execute
|
106
|
+
vm = Vmit::VirtualMachine.new(File.expand_path(Dir.pwd))
|
107
|
+
vm.disk_rollback!
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|
111
|
+
|
112
|
+
class MainCommand < Clamp::Command
|
113
|
+
|
114
|
+
subcommand "init", "Initialize the vm", InitCommand
|
115
|
+
subcommand "run", "Run the vm", RunCommand
|
116
|
+
subcommand "disk-images", "List disk images", DiskImagesCommand
|
117
|
+
subcommand "disk-snapshot", "Creates a new disk-snapshot", DiskSnapshotCommand
|
118
|
+
subcommand "disk-rollback", "Rollbacks to previous disk snapshot", DiskRollbackCommand
|
119
|
+
|
120
|
+
# Add commands offered via plugins
|
121
|
+
Vmit.plugins.each do |plugin|
|
122
|
+
if plugin.is_a?(Class) && plugin.ancestors.include?(::Clamp::Command)
|
123
|
+
plugin_id = plugin.to_s.split('::').last.underscore
|
124
|
+
subcommand plugin_id, "Plugin command", plugin
|
125
|
+
Vmit.logger.debug "Enabling plugin #{plugin_id}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
|
131
|
+
end
|
132
|
+
|
133
|
+
begin
|
134
|
+
Vmit::MainCommand.run
|
135
|
+
rescue SystemExit, Interrupt
|
136
|
+
Vmit.logger.fatal "interrupted"
|
137
|
+
exit(1)
|
138
|
+
rescue Exception => e
|
139
|
+
Vmit.logger.fatal e.message
|
140
|
+
e.backtrace.each do |bt_line|
|
141
|
+
Vmit.logger.debug " #{bt_line}"
|
142
|
+
end
|
143
|
+
exit(1)
|
144
|
+
end
|
145
|
+
exit(0)
|
data/bin/vmit-ifdown
ADDED
data/bin/vmit-ifup
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$: << File.join(File.dirname(__FILE__), "..", "lib")
|
3
|
+
|
4
|
+
#/sbin/brctl setfd ${switch} 0
|
5
|
+
#/sbin/brctl stp ${switch} off
|
6
|
+
|
7
|
+
require 'rubygems'
|
8
|
+
require 'vmit'
|
9
|
+
require 'drb'
|
10
|
+
|
11
|
+
DRb.start_service
|
12
|
+
vmit = DRbObject.new nil, ENV['VMIT_SERVER']
|
13
|
+
|
14
|
+
vmit.ifup(ARGV[0])
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
data/lib/vmit.rb
ADDED
@@ -0,0 +1,67 @@
|
|
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/version'
|
22
|
+
require 'vmit/bootstrap'
|
23
|
+
require 'vmit/logger'
|
24
|
+
require 'vmit/refcounted_resource'
|
25
|
+
require 'vmit/network'
|
26
|
+
require 'vmit/vfs'
|
27
|
+
require 'vmit/virtual_machine'
|
28
|
+
require 'vmit/ext'
|
29
|
+
require 'pidfile'
|
30
|
+
|
31
|
+
module Vmit
|
32
|
+
|
33
|
+
RUN_DIR = case Process.uid
|
34
|
+
when 0 then '/run/vmit'
|
35
|
+
else File.join(Dir::tmpdir, 'vmit')
|
36
|
+
end
|
37
|
+
|
38
|
+
module Plugins
|
39
|
+
end
|
40
|
+
# Your code goes here...
|
41
|
+
|
42
|
+
def self.add_plugin(plugin)
|
43
|
+
Vmit.plugins << plugin
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.plugins
|
47
|
+
@plugins ||= []
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
# Scan plugins
|
53
|
+
plugin_glob = File.join(File.dirname(__FILE__), 'vmit', 'plugins', '*.rb')
|
54
|
+
Dir.glob(plugin_glob).each do |plugin|
|
55
|
+
Vmit.logger.debug("Loading file: #{plugin}")
|
56
|
+
#puts "Loading file: #{plugin}"
|
57
|
+
load plugin
|
58
|
+
end
|
59
|
+
|
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
|
+
end
|
@@ -0,0 +1,110 @@
|
|
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 'nokogiri'
|
22
|
+
|
23
|
+
module Vmit
|
24
|
+
|
25
|
+
class AutoYaST
|
26
|
+
|
27
|
+
attr_accessor :patterns
|
28
|
+
attr_accessor :packages
|
29
|
+
|
30
|
+
def initialize
|
31
|
+
@net_udev = {}
|
32
|
+
@patterns = []
|
33
|
+
@packages = []
|
34
|
+
end
|
35
|
+
|
36
|
+
def minimal_opensuse!
|
37
|
+
@patterns << 'base'
|
38
|
+
end
|
39
|
+
|
40
|
+
def minimal_sle!
|
41
|
+
@patterns << 'Minimal'
|
42
|
+
end
|
43
|
+
|
44
|
+
# Map a network device name and make
|
45
|
+
# it persistent
|
46
|
+
#
|
47
|
+
# @param [String] MAC mac address
|
48
|
+
# @param [String] device name
|
49
|
+
def name_network_device(mac, name)
|
50
|
+
if @net_udev.has_key?(mac) or @net_udev.has_value?(mac)
|
51
|
+
raise "Device with MAC #{mac} is already assigned to #{@net_udev[name]}"
|
52
|
+
end
|
53
|
+
@net_udev[mac] = name
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_xml
|
57
|
+
builder = Nokogiri::XML::Builder.new do |xml|
|
58
|
+
xml.profile('xmlns' => 'http://www.suse.com/1.0/yast2ns',
|
59
|
+
'xmlns:config' => 'http://www.suse.com/1.0/configns') {
|
60
|
+
xml.users('config:type' => 'list') {
|
61
|
+
xml.user {
|
62
|
+
xml.username 'root'
|
63
|
+
xml.user_password 'linux'
|
64
|
+
xml.encrypted(false,'config:type' => 'boolean')
|
65
|
+
xml.forename
|
66
|
+
xml.surname
|
67
|
+
}
|
68
|
+
}
|
69
|
+
xml.general {
|
70
|
+
xml.mode {
|
71
|
+
xml.confirm(false, 'config:type' => 'boolean')
|
72
|
+
xml.forceboot('config:type' => 'boolean')
|
73
|
+
xml.final_reboot(true, 'config:type' => 'boolean')
|
74
|
+
xml.second_stage(true, 'config:type' => 'boolean')
|
75
|
+
}
|
76
|
+
}
|
77
|
+
xml.runlevel {
|
78
|
+
xml.default 3
|
79
|
+
xml.services {
|
80
|
+
xml.service {
|
81
|
+
xml.service_name 'sshd'
|
82
|
+
xml.service_status 'enable'
|
83
|
+
xml.service_start '3 5'
|
84
|
+
xml.service_stop '3 5'
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
xml.software {
|
89
|
+
xml.patterns('config:type' => 'list') {
|
90
|
+
@patterns.each do |pat|
|
91
|
+
xml.pattern pat
|
92
|
+
end
|
93
|
+
}
|
94
|
+
}
|
95
|
+
# SLE 11 can do without this basic partitioning but
|
96
|
+
# SLE 10 is not that smart.
|
97
|
+
xml.partitioning('config:type' => 'list') {
|
98
|
+
xml.drive {
|
99
|
+
xml.use 'all'
|
100
|
+
}
|
101
|
+
}
|
102
|
+
xml.networking {
|
103
|
+
xml.keep_install_network(true, 'config:type' => 'boolean')
|
104
|
+
}
|
105
|
+
}
|
106
|
+
end
|
107
|
+
builder.to_xml
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|