qemu 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -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'
@@ -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
@@ -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 = options.merge :format => "raw"
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
- system "qemu-img create -f #{format} #{file} #{size}"
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 ||= "#{file}.#{format}"
18
- system "qemu-img convert -O #{format} #{file} #{output_file}" and output_file
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
@@ -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
@@ -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 => 5 }.merge(attributes)
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
- @telnet ||= Net::Telnet::new "Host" => host, "Port" => port, "Timeout" => timeout, "Prompt" => /\(qemu\) /
14
+ Net::Telnet::new "Host" => host, "Port" => port, "Timeout" => timeout, "Prompt" => /\(qemu\) /
15
15
  end
16
16
 
17
17
  def command(command)
18
- telnet.cmd command
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
@@ -1,3 +1,3 @@
1
1
  module QEMU
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
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: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
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: 2013-05-19 00:00:00 Z
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
- version_requirements: &id001 !ruby/object:Gem::Requirement
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
- version_requirements: &id002 !ruby/object:Gem::Requirement
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
- version_requirements: &id003 !ruby/object:Gem::Requirement
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
- version_requirements: &id004 !ruby/object:Gem::Requirement
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
- version_requirements: &id005 !ruby/object:Gem::Requirement
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
- version_requirements: &id006 !ruby/object:Gem::Requirement
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
- version_requirements: &id007 !ruby/object:Gem::Requirement
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
- version_requirements: &id008 !ruby/object:Gem::Requirement
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