susi-qemu 0.0.3 → 0.0.6

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.
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 +36 -13
  65. data/lib/vnc.rb +34 -30
  66. metadata +85 -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.3'
2
+ VERSION = '0.0.6'
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,36 +15,53 @@ 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
@@ -58,15 +77,16 @@ module Susi
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
@@ -109,6 +129,8 @@ module Susi
109
129
  vnc_www_port = vnc_port - 100
110
130
  vnc_websocket_port = vnc_port - 200
111
131
 
132
+ Susi::debug "Starting VM #{name} with QMP on port #{qmp_port}, VNC on port #{vnc_port}, SSH on port #{ssh_port}"
133
+
112
134
  cmd = []
113
135
 
114
136
  cmd << "qemu-system-x86_64"
@@ -133,7 +155,7 @@ module Susi
133
155
  end
134
156
 
135
157
  cmd = cmd.join(" ")
136
- puts cmd
158
+ Susi::debug cmd
137
159
  system(cmd)
138
160
 
139
161
  QMP.new(qmp_port).close
@@ -147,19 +169,20 @@ module Susi
147
169
  # get VM access
148
170
  m = line.match(/-name (\w+)/)
149
171
  n = m[1]
150
- vm = VM.new(n)
172
+ VM.new(n) do |vm|
173
+ # get local device name or IP
174
+ ip = vm.ip
151
175
 
152
- # get local device name or IP
153
- ip = vm.ip
154
-
155
- puts <<-EOF
176
+ puts <<-EOF
156
177
  VM: #{n}
157
178
  - Disk: #{vm.disk}
158
179
  - QMP: #{vm.qmp_port}
159
180
  - VNC: vnc://#{ip}:#{vm.vnc_port}
160
181
  - Screen: http://#{ip}:#{vm.vnc_www_port}/
182
+ - Websocket: ws://#{ip}:#{vm.vnc_websocket_port}/
161
183
  - SSH: ssh -p #{vm.ssh_port} dabo@#{ip}
162
184
  EOF
185
+ end
163
186
  end
164
187
  end
165
188
  end
data/lib/vnc.rb CHANGED
@@ -1,45 +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
- token = (0...8).map { (65 + rand(26)).chr }.join
10
- url = "http://#{vm.ip}:#{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}"
11
14
 
12
- # prepare paths and files
13
- path = File.expand_path(File.dirname(__FILE__))
14
- novnc_path = File.join(path, "novnc")
15
- html = File.read(File.join(novnc_path, "screen.html"))
16
- html.gsub!("###TOKEN###", token)
17
- html.gsub!("###HOST###", ip.ip_address)
18
- 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)
19
22
 
20
- server = WEBrick::HTTPServer.new(:Port => port,
23
+ server = WEBrick::HTTPServer.new(:Port => port,
21
24
  :Logger => WEBrick::Log.new("/dev/null"),
22
25
  :AccessLog => [])
23
- server.mount_proc "/#{token}.html" do |req, res|
24
- # print access by someone on command line
25
- puts "[#{Time.now}] Access by: #{req.peeraddr[3]}"
26
- res.body = html
27
- end
28
- server.mount_proc "/#{token}.close.html" do |req, res|
29
- puts "[#{Time.now}] Closing VNC..."
30
- res.body = "Closing VNC..."
31
- server.shutdown
32
- end
33
- server.mount("/core",
34
- WEBrick::HTTPServlet::FileHandler,
35
- File.join(novnc_path, "core"))
36
- server.mount("/vendor",
37
- WEBrick::HTTPServlet::FileHandler,
38
- 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"))
39
42
 
40
- puts "[#{Time.now}] VNC screen: #{url}"
43
+ Susi::debug "[#{Time.now}] VNC screen: #{url}"
41
44
 
42
- server.start
45
+ server.start
46
+ end
43
47
  end
44
48
  end
45
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.3
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Bovensiepen
@@ -24,6 +24,34 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 7.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: ed25519
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.3.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.3.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: bcrypt_pbkdf
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 1.1.1
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 1.1.1
27
55
  description: Config, manage, and maintain multiple QEMU instances for your projects
28
56
  email: oss@bovi.li
29
57
  executables:
@@ -33,6 +61,62 @@ extra_rdoc_files: []
33
61
  files:
34
62
  - bin/susi
35
63
  - lib/disk.rb
64
+ - lib/novnc/core/base64.js
65
+ - lib/novnc/core/crypto/aes.js
66
+ - lib/novnc/core/crypto/bigint.js
67
+ - lib/novnc/core/crypto/crypto.js
68
+ - lib/novnc/core/crypto/des.js
69
+ - lib/novnc/core/crypto/dh.js
70
+ - lib/novnc/core/crypto/md5.js
71
+ - lib/novnc/core/crypto/rsa.js
72
+ - lib/novnc/core/decoders/copyrect.js
73
+ - lib/novnc/core/decoders/h264.js
74
+ - lib/novnc/core/decoders/hextile.js
75
+ - lib/novnc/core/decoders/jpeg.js
76
+ - lib/novnc/core/decoders/raw.js
77
+ - lib/novnc/core/decoders/rre.js
78
+ - lib/novnc/core/decoders/tight.js
79
+ - lib/novnc/core/decoders/tightpng.js
80
+ - lib/novnc/core/decoders/zlib.js
81
+ - lib/novnc/core/decoders/zrle.js
82
+ - lib/novnc/core/deflator.js
83
+ - lib/novnc/core/display.js
84
+ - lib/novnc/core/encodings.js
85
+ - lib/novnc/core/inflator.js
86
+ - lib/novnc/core/input/domkeytable.js
87
+ - lib/novnc/core/input/fixedkeys.js
88
+ - lib/novnc/core/input/gesturehandler.js
89
+ - lib/novnc/core/input/keyboard.js
90
+ - lib/novnc/core/input/keysym.js
91
+ - lib/novnc/core/input/keysymdef.js
92
+ - lib/novnc/core/input/util.js
93
+ - lib/novnc/core/input/vkeys.js
94
+ - lib/novnc/core/input/xtscancodes.js
95
+ - lib/novnc/core/ra2.js
96
+ - lib/novnc/core/rfb.js
97
+ - lib/novnc/core/util/browser.js
98
+ - lib/novnc/core/util/cursor.js
99
+ - lib/novnc/core/util/element.js
100
+ - lib/novnc/core/util/events.js
101
+ - lib/novnc/core/util/eventtarget.js
102
+ - lib/novnc/core/util/int.js
103
+ - lib/novnc/core/util/logging.js
104
+ - lib/novnc/core/util/strings.js
105
+ - lib/novnc/core/websock.js
106
+ - lib/novnc/screen.html
107
+ - lib/novnc/vendor/pako/lib/utils/common.js
108
+ - lib/novnc/vendor/pako/lib/zlib/adler32.js
109
+ - lib/novnc/vendor/pako/lib/zlib/constants.js
110
+ - lib/novnc/vendor/pako/lib/zlib/crc32.js
111
+ - lib/novnc/vendor/pako/lib/zlib/deflate.js
112
+ - lib/novnc/vendor/pako/lib/zlib/gzheader.js
113
+ - lib/novnc/vendor/pako/lib/zlib/inffast.js
114
+ - lib/novnc/vendor/pako/lib/zlib/inflate.js
115
+ - lib/novnc/vendor/pako/lib/zlib/inftrees.js
116
+ - lib/novnc/vendor/pako/lib/zlib/messages.js
117
+ - lib/novnc/vendor/pako/lib/zlib/trees.js
118
+ - lib/novnc/vendor/pako/lib/zlib/zstream.js
119
+ - lib/output.rb
36
120
  - lib/qmp.rb
37
121
  - lib/ssh.rb
38
122
  - lib/susi.rb