susi-qemu 0.0.2 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +4 -4
  2. data/bin/susi +9 -4
  3. data/lib/disk.rb +7 -5
  4. data/lib/novnc/core/base64.js +104 -0
  5. data/lib/novnc/core/crypto/aes.js +178 -0
  6. data/lib/novnc/core/crypto/bigint.js +34 -0
  7. data/lib/novnc/core/crypto/crypto.js +90 -0
  8. data/lib/novnc/core/crypto/des.js +330 -0
  9. data/lib/novnc/core/crypto/dh.js +55 -0
  10. data/lib/novnc/core/crypto/md5.js +82 -0
  11. data/lib/novnc/core/crypto/rsa.js +132 -0
  12. data/lib/novnc/core/decoders/copyrect.js +27 -0
  13. data/lib/novnc/core/decoders/h264.js +321 -0
  14. data/lib/novnc/core/decoders/hextile.js +181 -0
  15. data/lib/novnc/core/decoders/jpeg.js +146 -0
  16. data/lib/novnc/core/decoders/raw.js +59 -0
  17. data/lib/novnc/core/decoders/rre.js +44 -0
  18. data/lib/novnc/core/decoders/tight.js +393 -0
  19. data/lib/novnc/core/decoders/tightpng.js +27 -0
  20. data/lib/novnc/core/decoders/zlib.js +51 -0
  21. data/lib/novnc/core/decoders/zrle.js +185 -0
  22. data/lib/novnc/core/deflator.js +84 -0
  23. data/lib/novnc/core/display.js +575 -0
  24. data/lib/novnc/core/encodings.js +53 -0
  25. data/lib/novnc/core/inflator.js +65 -0
  26. data/lib/novnc/core/input/domkeytable.js +311 -0
  27. data/lib/novnc/core/input/fixedkeys.js +129 -0
  28. data/lib/novnc/core/input/gesturehandler.js +567 -0
  29. data/lib/novnc/core/input/keyboard.js +294 -0
  30. data/lib/novnc/core/input/keysym.js +616 -0
  31. data/lib/novnc/core/input/keysymdef.js +688 -0
  32. data/lib/novnc/core/input/util.js +191 -0
  33. data/lib/novnc/core/input/vkeys.js +116 -0
  34. data/lib/novnc/core/input/xtscancodes.js +173 -0
  35. data/lib/novnc/core/ra2.js +312 -0
  36. data/lib/novnc/core/rfb.js +3257 -0
  37. data/lib/novnc/core/util/browser.js +172 -0
  38. data/lib/novnc/core/util/cursor.js +249 -0
  39. data/lib/novnc/core/util/element.js +32 -0
  40. data/lib/novnc/core/util/events.js +138 -0
  41. data/lib/novnc/core/util/eventtarget.js +35 -0
  42. data/lib/novnc/core/util/int.js +15 -0
  43. data/lib/novnc/core/util/logging.js +56 -0
  44. data/lib/novnc/core/util/strings.js +28 -0
  45. data/lib/novnc/core/websock.js +365 -0
  46. data/lib/novnc/screen.html +21 -0
  47. data/lib/novnc/vendor/pako/lib/utils/common.js +45 -0
  48. data/lib/novnc/vendor/pako/lib/zlib/adler32.js +27 -0
  49. data/lib/novnc/vendor/pako/lib/zlib/constants.js +47 -0
  50. data/lib/novnc/vendor/pako/lib/zlib/crc32.js +36 -0
  51. data/lib/novnc/vendor/pako/lib/zlib/deflate.js +1846 -0
  52. data/lib/novnc/vendor/pako/lib/zlib/gzheader.js +35 -0
  53. data/lib/novnc/vendor/pako/lib/zlib/inffast.js +324 -0
  54. data/lib/novnc/vendor/pako/lib/zlib/inflate.js +1527 -0
  55. data/lib/novnc/vendor/pako/lib/zlib/inftrees.js +322 -0
  56. data/lib/novnc/vendor/pako/lib/zlib/messages.js +11 -0
  57. data/lib/novnc/vendor/pako/lib/zlib/trees.js +1195 -0
  58. data/lib/novnc/vendor/pako/lib/zlib/zstream.js +24 -0
  59. data/lib/output.rb +11 -0
  60. data/lib/qmp.rb +6 -0
  61. data/lib/ssh.rb +3 -1
  62. data/lib/susi.rb +7 -6
  63. data/lib/version.rb +1 -1
  64. data/lib/vm.rb +44 -26
  65. data/lib/vnc.rb +34 -31
  66. metadata +57 -1
@@ -0,0 +1,24 @@
1
+ export default function ZStream() {
2
+ /* next input byte */
3
+ this.input = null; // JS specific, because we have no pointers
4
+ this.next_in = 0;
5
+ /* number of bytes available at input */
6
+ this.avail_in = 0;
7
+ /* total number of input bytes read so far */
8
+ this.total_in = 0;
9
+ /* next output byte should be put there */
10
+ this.output = null; // JS specific, because we have no pointers
11
+ this.next_out = 0;
12
+ /* remaining free space at output */
13
+ this.avail_out = 0;
14
+ /* total number of bytes output so far */
15
+ this.total_out = 0;
16
+ /* last error message, NULL if no error */
17
+ this.msg = ''/*Z_NULL*/;
18
+ /* not visible by applications */
19
+ this.state = null;
20
+ /* best guess about the data type: binary or text */
21
+ this.data_type = 2/*Z_UNKNOWN*/;
22
+ /* adler32 value of the uncompressed data */
23
+ this.adler = 0;
24
+ }
data/lib/output.rb ADDED
@@ -0,0 +1,11 @@
1
+ module Susi
2
+ DEBUG = false
3
+
4
+ def self.debug(msg)
5
+ puts msg if DEBUG
6
+ end
7
+
8
+ def self.info(msg)
9
+ puts msg
10
+ end
11
+ end
data/lib/qmp.rb CHANGED
@@ -1,9 +1,13 @@
1
1
  require 'socket'
2
2
  require 'json'
3
3
 
4
+ require_relative 'output'
5
+
4
6
  module Susi
5
7
  class QMP
6
8
  def initialize(port)
9
+ Susi::debug "Connecting to QMP on port #{port}"
10
+
7
11
  @port = port
8
12
  @server = TCPSocket.new('localhost', @port)
9
13
 
@@ -47,9 +51,11 @@ module Susi
47
51
 
48
52
  def quit
49
53
  @server.puts('{"execute":"quit"}')
54
+ close
50
55
  end
51
56
 
52
57
  def close
58
+ Susi::debug "Closing QMP connection"
53
59
  @server.close
54
60
  end
55
61
  end
data/lib/ssh.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  require 'socket'
2
2
  require 'net/ssh'
3
3
 
4
+ require_relative 'output'
5
+
4
6
  module Susi
5
7
  class SSH
6
8
  def self.open(name)
@@ -11,7 +13,7 @@ module Susi
11
13
  def self.set_hostname(name)
12
14
  vm = VM.new(name)
13
15
  Net::SSH.start(vm.ip, 'dabo', port: vm.ssh_port, keys: [File.expand_path('~/.ssh/id_ed25519')]) do |ssh|
14
- puts "setting up VM..."
16
+ Susi::debug "setting up VM..."
15
17
  ssh.exec!("sudo hostnamectl set-hostname #{name}")
16
18
  end
17
19
  end
data/lib/susi.rb CHANGED
@@ -5,6 +5,7 @@ require_relative 'vm'
5
5
  require_relative 'ssh'
6
6
  require_relative 'vnc'
7
7
  require_relative 'disk'
8
+ require_relative 'output'
8
9
 
9
10
  require 'yaml'
10
11
  require 'securerandom'
@@ -59,15 +60,15 @@ YAML
59
60
  # check if disk exist, if not clone it
60
61
  disk_name = "#{DISK_DIR}/#{id}"
61
62
  if !File.exist?("#{disk_name}.qcow2")
62
- puts "Disk not found, cloning..."
63
- Susi::Disk.clone(disk_template, disk_name)
63
+ Susi::debug "Disk not found, cloning..."
64
+ Disk.clone(disk_template, disk_name)
64
65
 
65
- Susi::VM.start(name, disk_name)
66
+ VM.start(name, disk_name)
66
67
 
67
68
  # SSH into VM and set hostname
68
- Susi::SSH.set_hostname(name)
69
+ SSH.set_hostname(name)
69
70
  else
70
- Susi::VM.start(name, disk_name)
71
+ VM.start(name, disk_name)
71
72
  end
72
73
  end
73
74
 
@@ -83,7 +84,7 @@ YAML
83
84
 
84
85
  if File.exist?(disk_name)
85
86
  # verbose remove file
86
- puts "removing #{disk_name}"
87
+ Susi::debug "removing #{disk_name}"
87
88
  File.delete(disk_name)
88
89
  end
89
90
  end
data/lib/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Susi
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.5'
3
3
  end
data/lib/vm.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require_relative 'output'
2
+
1
3
  module Susi
2
4
  class VM
3
5
  def self.running?(name)
@@ -13,60 +15,78 @@ module Susi
13
15
 
14
16
  def initialize(name)
15
17
  @name = name
18
+ @qmp = nil
16
19
  @qmp_port = nil
17
20
  @vnc_port = nil
18
21
  @ssh_port = nil
19
22
 
23
+ Susi::debug "Searching for VM #{name}"
24
+
20
25
  ps = `ps aux | grep qemu-system-x86_64`
26
+ Susi::debug ps
21
27
  ps.split("\n").each do |line|
22
28
  next unless line.match /\-name/
23
- m = line.match(/-name (\w+)/)
29
+ m = line.match(/-name ([a-zA-Z0-9\-_\.]+)\s/)
30
+ Susi::debug "match: #{m[1]}"
24
31
  n = m[1]
25
32
  next unless n == @name
33
+ Susi::debug "Found VM #{n}"
26
34
 
27
35
  m = line.match(/-qmp tcp:localhost:(\d+)/)
28
36
  @qmp_port = m[1].to_i
37
+ Susi::debug "Found QMP port #{@qmp_port}"
38
+ end
39
+ @qmp = QMP.new(@qmp_port)
40
+
41
+ if block_given?
42
+ yield(self)
43
+
44
+ @qmp.close
29
45
  end
30
46
  end
31
47
 
32
48
  def quit
33
- QMP.new(@qmp_port) { |q| q.quit }
49
+ #QMP.new(@qmp_port) { |q| q.quit }
50
+ @qmp.quit
34
51
  end
35
52
 
36
53
  def disk
37
54
  d = ''
38
- QMP.new(@qmp_port) { |q| d = q.execute("query-block")[0]['inserted']['file'] }
55
+ #QMP.new(@qmp_port) { |q| d = q.execute("query-block")[0]['inserted']['file'] }
56
+ d = @qmp.execute("query-block")[0]['inserted']['file']
39
57
  d
40
58
  end
41
59
 
42
60
  def vnc_port
43
61
  @vnc_port ||= begin
44
62
  port = -1
45
- QMP.new(@qmp_port) { |q| port = q.execute("query-vnc")['service'] }
63
+ #QMP.new(@qmp_port) { |q| port = q.execute("query-vnc")['service'] }
64
+ port = @qmp.execute("query-vnc")['service']
46
65
  port.to_i
47
66
  end
48
67
  end
49
68
 
50
69
  def vnc_www_port
51
- vnc_port - 5900 + 5800
70
+ vnc_port - 100
52
71
  end
53
72
 
54
73
  def vnc_websocket_port
55
- vnc_port - 5900 + 5700
74
+ vnc_port - 200
56
75
  end
57
76
 
58
77
  def ssh_port
59
78
  @ssh_port ||= begin
60
79
  port = -1
61
- QMP.new(@qmp_port) do |q|
62
- resp = q.execute_with_args("human-monitor-command", {"command-line" => "info usernet"})
80
+ #QMP.new(@qmp_port) do |q|
81
+ #resp = q.execute_with_args("human-monitor-command", {"command-line" => "info usernet"})
82
+ resp = @qmp.execute_with_args("human-monitor-command", {"command-line" => "info usernet"})
63
83
  resp = resp.split("\r\n")[2].split
64
84
  src_port = resp[3].to_i
65
85
  dst_port = resp[5].to_i
66
86
  if dst_port == 22
67
87
  port = src_port
68
88
  end
69
- end
89
+ #end
70
90
  port.to_i
71
91
  end
72
92
  end
@@ -106,14 +126,10 @@ module Susi
106
126
  qmp_port = self.get_free_port(4000, 4099)
107
127
  ssh_port = self.get_free_port(2000, 2099)
108
128
  vnc_port = self.get_free_port(5900, 5999)
109
- vnc_www_port = 5800 + vnc_port - 5900
110
- vnc_websocket_port = 5700 + vnc_port - 5900
129
+ vnc_www_port = vnc_port - 100
130
+ vnc_websocket_port = vnc_port - 200
111
131
 
112
- puts "QMP Port: #{qmp_port}"
113
- puts "SSH Port: #{ssh_port}"
114
- puts "VNC Port: #{vnc_port}"
115
- puts "VNC WWW Port: #{vnc_www_port}"
116
- puts "VNC WebSocket Port: #{vnc_websocket_port}"
132
+ Susi::debug "Starting VM #{name} with QMP on port #{qmp_port}, VNC on port #{vnc_port}, SSH on port #{ssh_port}"
117
133
 
118
134
  cmd = []
119
135
 
@@ -138,8 +154,9 @@ module Susi
138
154
  cmd << "-cdrom #{cdrom}"
139
155
  end
140
156
 
141
- puts cmd.join(" ")
142
- system(cmd.join(" "))
157
+ cmd = cmd.join(" ")
158
+ Susi::debug cmd
159
+ system(cmd)
143
160
 
144
161
  QMP.new(qmp_port).close
145
162
  end
@@ -152,19 +169,20 @@ module Susi
152
169
  # get VM access
153
170
  m = line.match(/-name (\w+)/)
154
171
  n = m[1]
155
- vm = VM.new(n)
172
+ VM.new(n) do |vm|
173
+ # get local device name or IP
174
+ ip = vm.ip
156
175
 
157
- # get local device name or IP
158
- ip = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
159
-
160
- puts <<-EOF
176
+ puts <<-EOF
161
177
  VM: #{n}
162
178
  - Disk: #{vm.disk}
163
179
  - QMP: #{vm.qmp_port}
164
- - VNC: vnc://#{ip.ip_address}:#{vm.vnc_port}
165
- - Screen: http://#{ip.ip_address}:#{vm.vnc_www_port}/
166
- - SSH: ssh -p #{vm.ssh_port} dabo@#{ip.ip_address}
180
+ - VNC: vnc://#{ip}:#{vm.vnc_port}
181
+ - Screen: http://#{ip}:#{vm.vnc_www_port}/
182
+ - Websocket: ws://#{ip}:#{vm.vnc_websocket_port}/
183
+ - SSH: ssh -p #{vm.ssh_port} dabo@#{ip}
167
184
  EOF
185
+ end
168
186
  end
169
187
  end
170
188
  end
data/lib/vnc.rb CHANGED
@@ -1,46 +1,49 @@
1
1
  require 'socket'
2
2
  require 'webrick'
3
3
 
4
+ require_relative 'output'
5
+
4
6
  module Susi
5
7
  class VNC
6
8
  def self.open(name)
7
- vm = VM.new(name)
8
- port = vm.vnc_www_port
9
- ip = Socket.ip_address_list.find { |ai| ai.ipv4? && !ai.ipv4_loopback? }
10
- token = (0...8).map { (65 + rand(26)).chr }.join
11
- url = "http://#{ip.ip_address}:#{port}/#{token}.html"
9
+ VM.new(name) do |vm|
10
+ port = vm.vnc_www_port
11
+ token = (0...8).map { (65 + rand(26)).chr }.join
12
+ url = "http://#{vm.ip}:#{port}/#{token}.html"
13
+ Susi::info "VNC: #{url}"
12
14
 
13
- # prepare paths and files
14
- path = File.expand_path(File.dirname(__FILE__))
15
- novnc_path = File.join(path, "novnc")
16
- html = File.read(File.join(novnc_path, "screen.html"))
17
- html.gsub!("###TOKEN###", token)
18
- html.gsub!("###HOST###", ip.ip_address)
19
- html.gsub!("###PORT###", vm.vnc_websocket_port.to_s)
15
+ # prepare paths and files
16
+ path = File.expand_path(File.dirname(__FILE__))
17
+ novnc_path = File.join(path, "novnc")
18
+ html = File.read(File.join(novnc_path, "screen.html"))
19
+ html.gsub!("###TOKEN###", token)
20
+ html.gsub!("###HOST###", vm.ip)
21
+ html.gsub!("###PORT###", vm.vnc_websocket_port.to_s)
20
22
 
21
- server = WEBrick::HTTPServer.new(:Port => port,
23
+ server = WEBrick::HTTPServer.new(:Port => port,
22
24
  :Logger => WEBrick::Log.new("/dev/null"),
23
25
  :AccessLog => [])
24
- server.mount_proc "/#{token}.html" do |req, res|
25
- # print access by someone on command line
26
- puts "[#{Time.now}] Access by: #{req.peeraddr[3]}"
27
- res.body = html
28
- end
29
- server.mount_proc "/#{token}.close.html" do |req, res|
30
- puts "[#{Time.now}] Closing VNC..."
31
- res.body = "Closing VNC..."
32
- server.shutdown
33
- end
34
- server.mount("/core",
35
- WEBrick::HTTPServlet::FileHandler,
36
- File.join(novnc_path, "core"))
37
- server.mount("/vendor",
38
- WEBrick::HTTPServlet::FileHandler,
39
- File.join(novnc_path, "vendor"))
26
+ server.mount_proc "/#{token}.html" do |req, res|
27
+ # print access by someone on command line
28
+ Susi.info "[#{Time.now}] Access by: #{req.peeraddr[3]}"
29
+ res.body = html
30
+ end
31
+ server.mount_proc "/#{token}.close.html" do |req, res|
32
+ Susi.info "[#{Time.now}] Closing by #{req.peeraddr[3]}"
33
+ res.body = "Closing VNC..."
34
+ server.shutdown
35
+ end
36
+ server.mount("/core",
37
+ WEBrick::HTTPServlet::FileHandler,
38
+ File.join(novnc_path, "core"))
39
+ server.mount("/vendor",
40
+ WEBrick::HTTPServlet::FileHandler,
41
+ File.join(novnc_path, "vendor"))
40
42
 
41
- puts "[#{Time.now}] VNC screen: #{url}"
43
+ Susi::debug "[#{Time.now}] VNC screen: #{url}"
42
44
 
43
- server.start
45
+ server.start
46
+ end
44
47
  end
45
48
  end
46
49
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: susi-qemu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bovensiepen
@@ -33,6 +33,62 @@ extra_rdoc_files: []
33
33
  files:
34
34
  - bin/susi
35
35
  - lib/disk.rb
36
+ - lib/novnc/core/base64.js
37
+ - lib/novnc/core/crypto/aes.js
38
+ - lib/novnc/core/crypto/bigint.js
39
+ - lib/novnc/core/crypto/crypto.js
40
+ - lib/novnc/core/crypto/des.js
41
+ - lib/novnc/core/crypto/dh.js
42
+ - lib/novnc/core/crypto/md5.js
43
+ - lib/novnc/core/crypto/rsa.js
44
+ - lib/novnc/core/decoders/copyrect.js
45
+ - lib/novnc/core/decoders/h264.js
46
+ - lib/novnc/core/decoders/hextile.js
47
+ - lib/novnc/core/decoders/jpeg.js
48
+ - lib/novnc/core/decoders/raw.js
49
+ - lib/novnc/core/decoders/rre.js
50
+ - lib/novnc/core/decoders/tight.js
51
+ - lib/novnc/core/decoders/tightpng.js
52
+ - lib/novnc/core/decoders/zlib.js
53
+ - lib/novnc/core/decoders/zrle.js
54
+ - lib/novnc/core/deflator.js
55
+ - lib/novnc/core/display.js
56
+ - lib/novnc/core/encodings.js
57
+ - lib/novnc/core/inflator.js
58
+ - lib/novnc/core/input/domkeytable.js
59
+ - lib/novnc/core/input/fixedkeys.js
60
+ - lib/novnc/core/input/gesturehandler.js
61
+ - lib/novnc/core/input/keyboard.js
62
+ - lib/novnc/core/input/keysym.js
63
+ - lib/novnc/core/input/keysymdef.js
64
+ - lib/novnc/core/input/util.js
65
+ - lib/novnc/core/input/vkeys.js
66
+ - lib/novnc/core/input/xtscancodes.js
67
+ - lib/novnc/core/ra2.js
68
+ - lib/novnc/core/rfb.js
69
+ - lib/novnc/core/util/browser.js
70
+ - lib/novnc/core/util/cursor.js
71
+ - lib/novnc/core/util/element.js
72
+ - lib/novnc/core/util/events.js
73
+ - lib/novnc/core/util/eventtarget.js
74
+ - lib/novnc/core/util/int.js
75
+ - lib/novnc/core/util/logging.js
76
+ - lib/novnc/core/util/strings.js
77
+ - lib/novnc/core/websock.js
78
+ - lib/novnc/screen.html
79
+ - lib/novnc/vendor/pako/lib/utils/common.js
80
+ - lib/novnc/vendor/pako/lib/zlib/adler32.js
81
+ - lib/novnc/vendor/pako/lib/zlib/constants.js
82
+ - lib/novnc/vendor/pako/lib/zlib/crc32.js
83
+ - lib/novnc/vendor/pako/lib/zlib/deflate.js
84
+ - lib/novnc/vendor/pako/lib/zlib/gzheader.js
85
+ - lib/novnc/vendor/pako/lib/zlib/inffast.js
86
+ - lib/novnc/vendor/pako/lib/zlib/inflate.js
87
+ - lib/novnc/vendor/pako/lib/zlib/inftrees.js
88
+ - lib/novnc/vendor/pako/lib/zlib/messages.js
89
+ - lib/novnc/vendor/pako/lib/zlib/trees.js
90
+ - lib/novnc/vendor/pako/lib/zlib/zstream.js
91
+ - lib/output.rb
36
92
  - lib/qmp.rb
37
93
  - lib/ssh.rb
38
94
  - lib/susi.rb