qemu 0.0.1 → 0.0.2
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/lib/qemu.rb +6 -1
- data/lib/qemu/command.rb +5 -4
- data/lib/qemu/image.rb +35 -5
- data/lib/qemu/logger.rb +28 -0
- data/lib/qemu/monitor.rb +7 -4
- data/lib/qemu/version.rb +1 -1
- metadata +29 -28
data/lib/qemu.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
|
-
module QEMU
|
2
1
|
|
2
|
+
module QEMU
|
3
|
+
def self.sh!(command)
|
4
|
+
logger.debug "Execute '#{command}'"
|
5
|
+
system command or raise "Command failed: '#{command}'"
|
6
|
+
end
|
3
7
|
end
|
4
8
|
|
5
9
|
require 'qemu/version'
|
10
|
+
require 'qemu/logger'
|
6
11
|
|
7
12
|
require 'qemu/image'
|
8
13
|
require 'qemu/daemon'
|
data/lib/qemu/command.rb
CHANGED
@@ -25,7 +25,7 @@ module QEMU
|
|
25
25
|
end
|
26
26
|
|
27
27
|
class Disk
|
28
|
-
|
28
|
+
|
29
29
|
attr_accessor :file, :options
|
30
30
|
|
31
31
|
def initialize(file, options = {})
|
@@ -34,9 +34,10 @@ module QEMU
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def qemu_drive(index)
|
37
|
-
{
|
37
|
+
{
|
38
38
|
:file => File.expand_path(file),
|
39
39
|
:index => index,
|
40
|
+
:if => "virtio"
|
40
41
|
}.merge(options).map { |k,v| "#{k}=#{v}" }.join(',')
|
41
42
|
end
|
42
43
|
|
@@ -48,7 +49,7 @@ module QEMU
|
|
48
49
|
def vde_options
|
49
50
|
@vde_options ||= { :sock => "/var/run/vde2/tap0.ctl" }
|
50
51
|
end
|
51
|
-
|
52
|
+
|
52
53
|
attr_accessor :vnc
|
53
54
|
|
54
55
|
attr_accessor :monitor
|
@@ -93,7 +94,7 @@ module QEMU
|
|
93
94
|
|
94
95
|
def command_env
|
95
96
|
{}.tap do |env|
|
96
|
-
env["QEMU_AUDIO_DRV"] = audio_driver
|
97
|
+
env["QEMU_AUDIO_DRV"] = audio_driver
|
97
98
|
env["QEMU_ALSA_DAC_DEV"] = alsa_dac_dev if alsa_dac_dev
|
98
99
|
env["QEMU_ALSA_ADC_DEV"] = alsa_adc_dev if alsa_adc_dev
|
99
100
|
end
|
data/lib/qemu/image.rb
CHANGED
@@ -1,21 +1,51 @@
|
|
1
1
|
module QEMU
|
2
2
|
class Image
|
3
3
|
|
4
|
-
attr_accessor :file, :size, :format
|
4
|
+
attr_accessor :file, :size, :format, :options
|
5
5
|
|
6
6
|
def initialize(file, options = {})
|
7
7
|
self.file = file
|
8
|
-
options =
|
8
|
+
options = { :format => self.class.file_format(file) }.merge options
|
9
9
|
options.each { |k,v| send "#{k}=", v }
|
10
10
|
end
|
11
11
|
|
12
|
+
def self.file_format(file)
|
13
|
+
case `file #{file}`
|
14
|
+
when /qcow/
|
15
|
+
"qcow2"
|
16
|
+
when /x86 boot sector/
|
17
|
+
"raw"
|
18
|
+
else
|
19
|
+
QEMU.logger.info "Unknown file format : #{file}"
|
20
|
+
"raw"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def options_arguments
|
25
|
+
if options
|
26
|
+
options_value = options.map { |k,v| "#{k}=#{v}" }.join(",")
|
27
|
+
"-o #{options_value}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
12
31
|
def create
|
13
|
-
|
32
|
+
QEMU.sh! "qemu-img create -f #{format} #{options_arguments} #{file} #{size}"
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.output_file(file, format)
|
36
|
+
unless file.to_s.end_with? ".#{format}"
|
37
|
+
"#{file}.#{format}"
|
38
|
+
else
|
39
|
+
file
|
40
|
+
end
|
14
41
|
end
|
15
42
|
|
16
43
|
def convert(format, output_file = nil)
|
17
|
-
output_file ||=
|
18
|
-
|
44
|
+
output_file ||= self.class.output_file file, format
|
45
|
+
unless self.format.to_s == format.to_s
|
46
|
+
QEMU.sh! "qemu-img convert -O #{format} #{file} #{output_file}"
|
47
|
+
end
|
48
|
+
output_file
|
19
49
|
end
|
20
50
|
|
21
51
|
end
|
data/lib/qemu/logger.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
require "logger"
|
2
|
+
require "singleton"
|
3
|
+
|
4
|
+
class NullLogger
|
5
|
+
include Singleton
|
6
|
+
|
7
|
+
# To get the Logger API you can run this:
|
8
|
+
# (Logger.instance_methods.sort - Logger.methods).sort
|
9
|
+
[ :<<, :add, :close, :datetime_format,
|
10
|
+
:datetime_format=, :debug, :debug?, :error, :error?, :fatal,
|
11
|
+
:fatal?, :formatter, :formatter=, :info, :info?, :level, :level=,
|
12
|
+
:log, :progname, :progname=, :sev_threshold, :sev_threshold=,
|
13
|
+
:unknown, :warn, :warn? ].each do |method_name|
|
14
|
+
define_method method_name do |*args| end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module QEMU
|
19
|
+
|
20
|
+
@@logger = NullLogger.instance
|
21
|
+
def self.logger
|
22
|
+
@@logger
|
23
|
+
end
|
24
|
+
def self.logger=(logger)
|
25
|
+
@@logger = logger
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/lib/qemu/monitor.rb
CHANGED
@@ -6,18 +6,21 @@ module QEMU
|
|
6
6
|
attr_accessor :host, :port, :timeout
|
7
7
|
|
8
8
|
def initialize(attributes = {})
|
9
|
-
attributes = { :host => "localhost", :timeout =>
|
9
|
+
attributes = { :host => "localhost", :timeout => 30 }.merge(attributes)
|
10
10
|
attributes.each { |k,v| send "#{k}=", v }
|
11
11
|
end
|
12
12
|
|
13
13
|
def telnet
|
14
|
-
|
14
|
+
Net::Telnet::new "Host" => host, "Port" => port, "Timeout" => timeout, "Prompt" => /\(qemu\) /
|
15
15
|
end
|
16
16
|
|
17
17
|
def command(command)
|
18
|
-
telnet.
|
18
|
+
telnet.tap do |telnet|
|
19
|
+
telnet.cmd command
|
20
|
+
telnet.close
|
21
|
+
end
|
19
22
|
end
|
20
|
-
|
23
|
+
|
21
24
|
def reset
|
22
25
|
command "system_reset"
|
23
26
|
end
|
data/lib/qemu/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qemu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 27
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 2
|
10
|
+
version: 0.0.2
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Alban Peignier
|
@@ -16,11 +16,12 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date:
|
19
|
+
date: 2014-02-04 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
+
prerelease: false
|
22
23
|
type: :development
|
23
|
-
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
@@ -30,12 +31,12 @@ dependencies:
|
|
30
31
|
- 1
|
31
32
|
- 3
|
32
33
|
version: "1.3"
|
33
|
-
requirement: *id001
|
34
|
-
prerelease: false
|
35
34
|
name: bundler
|
35
|
+
version_requirements: *id001
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
|
+
prerelease: false
|
37
38
|
type: :development
|
38
|
-
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
40
|
none: false
|
40
41
|
requirements:
|
41
42
|
- - ">="
|
@@ -44,12 +45,12 @@ dependencies:
|
|
44
45
|
segments:
|
45
46
|
- 0
|
46
47
|
version: "0"
|
47
|
-
requirement: *id002
|
48
|
-
prerelease: false
|
49
48
|
name: rake
|
49
|
+
version_requirements: *id002
|
50
50
|
- !ruby/object:Gem::Dependency
|
51
|
+
prerelease: false
|
51
52
|
type: :development
|
52
|
-
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
54
|
none: false
|
54
55
|
requirements:
|
55
56
|
- - ">="
|
@@ -58,12 +59,12 @@ dependencies:
|
|
58
59
|
segments:
|
59
60
|
- 0
|
60
61
|
version: "0"
|
61
|
-
requirement: *id003
|
62
|
-
prerelease: false
|
63
62
|
name: simplecov
|
63
|
+
version_requirements: *id003
|
64
64
|
- !ruby/object:Gem::Dependency
|
65
|
+
prerelease: false
|
65
66
|
type: :development
|
66
|
-
|
67
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
67
68
|
none: false
|
68
69
|
requirements:
|
69
70
|
- - ">="
|
@@ -72,12 +73,12 @@ dependencies:
|
|
72
73
|
segments:
|
73
74
|
- 0
|
74
75
|
version: "0"
|
75
|
-
requirement: *id004
|
76
|
-
prerelease: false
|
77
76
|
name: rspec
|
77
|
+
version_requirements: *id004
|
78
78
|
- !ruby/object:Gem::Dependency
|
79
|
+
prerelease: false
|
79
80
|
type: :development
|
80
|
-
|
81
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
81
82
|
none: false
|
82
83
|
requirements:
|
83
84
|
- - ">="
|
@@ -86,12 +87,12 @@ dependencies:
|
|
86
87
|
segments:
|
87
88
|
- 0
|
88
89
|
version: "0"
|
89
|
-
requirement: *id005
|
90
|
-
prerelease: false
|
91
90
|
name: guard
|
91
|
+
version_requirements: *id005
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
|
+
prerelease: false
|
93
94
|
type: :development
|
94
|
-
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
95
96
|
none: false
|
96
97
|
requirements:
|
97
98
|
- - ">="
|
@@ -100,12 +101,12 @@ dependencies:
|
|
100
101
|
segments:
|
101
102
|
- 0
|
102
103
|
version: "0"
|
103
|
-
requirement: *id006
|
104
|
-
prerelease: false
|
105
104
|
name: guard-rspec
|
105
|
+
version_requirements: *id006
|
106
106
|
- !ruby/object:Gem::Dependency
|
107
|
+
prerelease: false
|
107
108
|
type: :development
|
108
|
-
|
109
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
109
110
|
none: false
|
110
111
|
requirements:
|
111
112
|
- - ">="
|
@@ -114,12 +115,12 @@ dependencies:
|
|
114
115
|
segments:
|
115
116
|
- 0
|
116
117
|
version: "0"
|
117
|
-
requirement: *id007
|
118
|
-
prerelease: false
|
119
118
|
name: rdoc
|
119
|
+
version_requirements: *id007
|
120
120
|
- !ruby/object:Gem::Dependency
|
121
|
+
prerelease: false
|
121
122
|
type: :runtime
|
122
|
-
|
123
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
123
124
|
none: false
|
124
125
|
requirements:
|
125
126
|
- - ">="
|
@@ -128,9 +129,8 @@ dependencies:
|
|
128
129
|
segments:
|
129
130
|
- 0
|
130
131
|
version: "0"
|
131
|
-
requirement: *id008
|
132
|
-
prerelease: false
|
133
132
|
name: daemons
|
133
|
+
version_requirements: *id008
|
134
134
|
description: Create QEMU command lines, start and stop daemon, send monitor commands to a qemu instances, create or convert QEMU disks, etc .. in Ruby
|
135
135
|
email:
|
136
136
|
- alban@tryphon.eu
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- lib/qemu/command.rb
|
152
152
|
- lib/qemu/daemon.rb
|
153
153
|
- lib/qemu/image.rb
|
154
|
+
- lib/qemu/logger.rb
|
154
155
|
- lib/qemu/monitor.rb
|
155
156
|
- lib/qemu/version.rb
|
156
157
|
- qemu.gemspec
|