Skip to content

Commit 6b55d1b

Browse files
committed
vmHandler gets extensions. Extensions are qmp event handlers
1 parent b5f6244 commit 6b55d1b

15 files changed

+139
-114
lines changed

lib/config.coffee

+13
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,17 @@ module.exports.getVmConfigs = ->
6060
return vms
6161

6262

63+
module.exports.getVmHandlerExtensions = ->
64+
filesIn = fs.readdirSync "#{process.cwd()}/lib/src/vmHandlerExtensions"
65+
files = {}
66+
for file in filesIn
67+
files[file.split('.')[0]] = true
68+
out = []
69+
70+
for i of files
71+
out.push i
72+
73+
return out
74+
75+
6376
# ls #{process.cwd()}/isos/*.iso|sort -f

lib/socketServer.coffee

+5-47
Original file line numberDiff line numberDiff line change
@@ -28,60 +28,18 @@ module.exports.start = (httpServer) ->
2828
console.log "SOCK -> DIS #{sock.id} #{sock.handshake.address.address}"
2929
delete socks[sock.id]
3030

31-
sock.on 'vm-boot', (vmName) ->
32-
console.log "Boot #{vmName}"
33-
vmHandler.boot vmName, (ret) ->
34-
sock.emit 'msg', ret
35-
if ret.type is 'success'
36-
vmHandler.setVmStatus vmName, 'running'
37-
ioServer.sockets.emit 'set-vm-status', vmName, 'running'
38-
39-
sock.on 'vm-reset', (vmName) ->
40-
console.log "VM reset #{vmName}"
41-
vmHandler.resetVm vmName, (ret) ->
42-
if ret.status is 'success'
43-
sock.emit 'msg', {type:'success', msg:'System resetted.'}
44-
else
45-
sock.emit 'msg', {type:'error', msg:'System reset not possible.'}
46-
47-
sock.on 'vm-pause', (vmName) ->
48-
console.log "VM pause #{vmName}"
49-
vmHandler.pauseVm vmName, (ret) ->
50-
if ret.status is 'success'
51-
sock.emit 'msg', {type:'success', msg:'VM paused'}
52-
vmHandler.setVmStatus vmName, 'paused'
53-
ioServer.sockets.emit 'set-vm-status', vmName, 'paused'
54-
else
55-
sock.emit 'msg', {type:'error', msg:'Cant pause VM'}
56-
57-
sock.on 'vm-resume', (vmName) ->
58-
console.log "VM resume #{vmName}"
59-
vmHandler.resumeVm vmName, (ret) ->
60-
if ret.status is 'success'
61-
sock.emit 'msg', {type:'success', msg:'VM resumed'}
62-
vmHandler.setVmStatus vmName, 'running'
63-
ioServer.sockets.emit 'set-vm-status', vmName, 'running'
64-
else
65-
sock.emit 'msg', {type:'error', msg:'Cant resume VM'}
66-
67-
sock.on 'vm-stop', (vmName) ->
68-
console.log "VM stop #{vmName}"
69-
vmHandler.stopVm vmName, (ret) ->
70-
if ret.status is 'success'
71-
sock.emit 'msg', {type:'success', msg:'VM stopped.'}
72-
vmHandler.setVmStatus vmName, 'stopped'
73-
ioServer.sockets.emit 'set-vm-status', vmName, 'stopped'
74-
else
75-
sock.emit 'msg', {type:'error', msg:'Cant stop VM'}
76-
31+
sock.on 'qmp-command', (qmpCmd, vmName) ->
32+
console.log "QMP-Command #{qmpCmd}"
33+
vmHandler.qmpCommand qmpCmd, vmName
34+
7735
sock.on 'create-disk', (disk) ->
7836
vmHandler.createDisk disk, (ret) ->
7937
sock.emit 'msg', ret
8038
if ret.status is 'success'
8139
sock.emit 'reset-create-disk-form'
8240
ioServer.sockets.emit 'set-disk', ret.data.data
8341

84-
42+
8543
sock.on 'delete-disk', (diskName) ->
8644
if vmHandler.deleteDisk diskName
8745
sock.emit 'msg', {type:'success', msg:'image deleted'}

lib/src/disk/info.coffee

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ module.exports = (name, cb) ->
1717
info['disk_size'] = info['actual_size']
1818
info['name'] = name
1919
info['percentUsed'] = 100/info['virtual_size']*info['disk_size']
20-
console.dir info
20+
2121
cb status:'success', data:info
2222
else if os.type().toLowerCase() is 'linux'
2323
exec "qemu-img info #{process.cwd()}/disks/#{name}.img", (err, stdout, stderr) =>

lib/src/process.coffee

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ class Process
1616

1717
@process.on 'exit', (code, signal) ->
1818
if code is 0 then console.log "qemu process exit clean."
19-
else console.error "qemu exit with error: #{code}, signal: #{signal}"
20-
vmHandler.processExit vmCfg.name, code, signal
19+
else console.error "qemu process exit with error: #{code}, signal: #{signal}"
20+
vmHandler.SHUTDOWN vmCfg.name
2121
catch e
2222
console.error "process:start:e"
2323
console.dir e
24-
vmHandler.processExit vmCfg.name, 0x42, 0x42
24+
vmHandler.SHUTDOWN vmCfg.name
25+
vmHandler.stopQMP vmCfg.name
2526

2627
module.exports.Process = Process

lib/src/qmp.coffee

+20-8
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class Qmp
2222
@socket.on 'connect', =>
2323
console.log "qmp connected"
2424
@socket.write '{"execute":"qmp_capabilities"}'
25-
cb {type:'success', msg:'connected to VM'}
25+
cb status:'success'
2626

2727
@socket.on 'data', (data) =>
2828
jsons = data.toString().split '\r\n'
@@ -31,10 +31,20 @@ class Qmp
3131
for json in jsons
3232
try
3333
parsedData = JSON.parse json.toString()
34+
if parsedData.event? then event = parsedData.event else event = undefined
35+
36+
console.log " - - - QMP-START-DATA - - -"
37+
console.dir parsedData
38+
console.log " - - - QMP-END-DATA - - -"
39+
40+
if parsedData.QMP?.version? and parsedData.QMP?.capabilities?
41+
parsedData.timestamp = new Date().getTime()
42+
event = 'START'
3443

35-
if parsedData.event? and parsedData.event is 'SHUTDOWN'
36-
console.log "qmp: vm #{@vmName} shutdown"
37-
vmHandler.processExit @vmName, 0x47, 0x11
44+
if parsedData.timestamp? and event?
45+
if vmHandler[event]?
46+
console.log "QMP: call vmHandler[#{event}] for VM #{@vmName}"
47+
vmHandler[event] @vmName
3848

3949
if @dataCb?
4050
if parsedData.error?
@@ -51,15 +61,17 @@ class Qmp
5161
console.error parsedData
5262
@dataCb = undefined
5363
else
54-
console.log "no callback defined:"
55-
console.dir parsedData
64+
# console.log "no callback defined:"
65+
# console.dir parsedData
5666
catch e
5767
console.error "cant parse returned json, Buffer is:"
58-
console.error json.toString()
68+
console.error json.toString()
69+
console.error "error is:"
70+
console.dir e
5971

6072
@socket.on 'error', (e) =>
6173
if e.message is 'This socket has been ended by the other party'
62-
console.log 'qemu clossed connection'
74+
console.log 'qemu closed connection'
6375
else
6476
console.error 'qmpConnectError try reconnect'
6577
@connect cb

lib/src/vm.coffee

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ class Vm
2222
@qmp.connect @cfg.settings.qmpPort, cb
2323

2424
connectQmp: (cb) ->
25-
@qmp.connect @cfg.settings.qmpPort, cb
25+
@qmp.connect @cfg.settings.qmpPort, cb
26+
27+
stopQMP: ->
28+
delete @qmp
29+
@qmp = new qmp.Qmp @name
2630

2731
###
2832
# QMP commands
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
socketServer = require '../../socketServer'
3+
4+
module.exports = (vm) ->
5+
console.log "vmHandler Extension received RESET event"
6+
7+
vm.cfg.status = 'running'
8+
vm.saveConfig()
9+
socketServer.toAll 'set-vm-status', vm.name, 'running'
10+
socketServer.toAll 'msg', {type:'success', msg:"VM #{vm.name} reset."}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
socketServer = require '../../socketServer'
3+
4+
module.exports = (vm) ->
5+
console.log "vmHandler Extension received RESUME event"
6+
7+
vm.cfg.status = 'running'
8+
vm.saveConfig()
9+
socketServer.toAll 'set-vm-status', vm.name, 'running'
10+
socketServer.toAll 'msg', {type:'success', msg:"VM #{vm.name} resume."}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
2+
socketServer = require '../../socketServer'
3+
4+
module.exports = (vm) ->
5+
console.log "vmHandler Extension received SHUTDOWN event"
6+
console.log "qemu process exit VM #{vm.name}"
7+
8+
vm.cfg.status = 'stopped'
9+
vm.saveConfig()
10+
socketServer.toAll 'set-vm-status', vm.name, 'stopped'
11+
socketServer.toAll 'msg', {type:'success', msg:"VM #{vm.name} shutdown."}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
socketServer = require '../../socketServer'
3+
4+
module.exports = (vm) ->
5+
console.log "vmHandler Extension received START event"
6+
7+
vm.cfg.status = 'running'
8+
vm.saveConfig()
9+
socketServer.toAll 'set-vm-status', vm.name, 'running'
10+
socketServer.toAll 'msg', {type:'success', msg:"VM #{vm.name} start."}
+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
socketServer = require '../../socketServer'
3+
4+
module.exports = (vm) ->
5+
console.log "vmHandler Extension received STOP event"
6+
7+
vm.cfg.status = 'paused'
8+
vm.saveConfig()
9+
socketServer.toAll 'set-vm-status', vm.name, 'paused'
10+
socketServer.toAll 'msg', {type:'success', msg:"VM #{vm.name} paused."}

lib/vmHandler.coffee

+25-41
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Disk = require './src/disk'
66
config = require './config'
77
socketServer = require './socketServer'
88

9+
qmpStatusTranslation = {'start':'running', 'reset':'running', 'pause':'paused', 'resume':'running', 'stop':'stopped'}
910
isos = []
1011
disks = []
1112
vms = []
@@ -59,62 +60,45 @@ module.exports.newIso = (isoName) ->
5960
newIso = {name:isoName, size:fs.statSync("#{process.cwd()}/isos/#{isoName}").size}
6061
isos.push newIso
6162
socketServer.toAll 'set-iso', newIso
62-
63-
64-
module.exports.processExit = (vmName, code, signal) ->
65-
console.log "qemu process exit VM #{vmName}"
6663

67-
for vm in vms
68-
if vm.name is vmName
69-
vm.cfg.status = 'stopped'
70-
vm.saveConfig()
71-
socketServer.toAll 'set-vm-status', vmName, 'stopped' # | running | paused
7264

73-
setInterval ->
74-
for disk in disks
75-
Disk.info disk, (ret) ->
76-
socketServer.toAll 'set-disk', ret.data
77-
, 60 * 1000
65+
# setInterval ->
66+
# for disk in disks
67+
# Disk.info disk, (ret) ->
68+
# socketServer.toAll 'set-disk', ret.data
69+
# , 60 * 1000
70+
71+
72+
module.exports.loadExtensions = ->
73+
files = config.getVmHandlerExtensions()
74+
console.log "Found vmHandlerExtensions:"
75+
console.dir files
76+
77+
for file in files
78+
@setExtensionCallback file
79+
80+
module.exports.setExtensionCallback = (extension) ->
81+
module.exports[extension] = (vmName) ->
82+
for vm in vms
83+
if vm.name is vmName
84+
(require "#{process.cwd()}/lib/src/vmHandlerExtensions/#{extension}") vm
7885

7986

8087
###
8188
8289
###
83-
module.exports.boot = (vmName, cb) ->
90+
module.exports.qmpCommand = (qmpCmd, vmName, cb) ->
8491
for vm in vms
8592
if vm.name is vmName
86-
vm.start cb
93+
vm[qmpCmd](->)
8794
return
8895
cb {type:'error', msg:'VM not available'}
8996

90-
module.exports.resetVm = (vmName, cb) ->
91-
for vm in vms
92-
if vm.name is vmName
93-
vm.reset cb
94-
return
95-
cb {type:'error', msg:'VM not available'}
9697

97-
module.exports.pauseVm = (vmName, cb) ->
98-
for vm in vms
99-
if vm.name is vmName
100-
vm.pause cb
101-
return
102-
cb {type:'error', msg:'VM not paused'}
103-
104-
module.exports.resumeVm = (vmName, cb) ->
98+
module.exports.stopQMP = (vmName) ->
10599
for vm in vms
106100
if vm.name is vmName
107-
vm.resume cb
108-
return
109-
cb {type:'error', msg:'VM not resumed'}
110-
111-
module.exports.stopVm = (vmName, cb) ->
112-
for vm in vms
113-
if vm.name is vmName
114-
vm.stop cb
115-
return
116-
cb {type:'error', msg:'VM not stopped.'}
117-
101+
vm.stopQMP()
118102

119103
module.exports.setVmStatus = (vmName, status) ->
120104
for vm in vms

public/index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ <h3>list of vms</h3>
6161
<td data-bind="text: false != hardware.disk ? hardware.disk : hardware.partition "></td>
6262
<td data-bind="text: hardware.iso == false ? 'none' : hardware.iso"</td>
6363
<td>
64-
<button data-bind="click: $root.boot, visible: status() == 'stopped' " class="btn btn-default btn-sm"><span class="glyphicon glyphicon-off" /></button>
64+
<button data-bind="click: $root.start, visible: status() == 'stopped' " class="btn btn-default btn-sm"><span class="glyphicon glyphicon-off" /></button>
6565

6666
<button data-bind="click: $root.pause, visible: status() != 'stopped' && status() != 'paused'" class="btn btn-default btn-sm"><span class="glyphicon glyphicon-pause" /></button>
6767

public/js/classes.coffee

+12-12
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,27 @@ class VmsViewModel
1313

1414
@vms.sort (left, right) ->
1515
return left.vms.name == right.name ? 0 : (left.name < right.name ? -1 : 1)
16-
17-
boot: (vm) ->
18-
console.log "Boot: #{vm.name}"
19-
app.socket.emit 'vm-boot', vm.name
20-
16+
17+
start: (vm) ->
18+
console.log "Start: #{vm.name}"
19+
app.socket.emit 'qmp-command', 'start', vm.name
20+
2121
reset: (vm) ->
2222
console.log "Reset: #{vm.name}"
23-
app.socket.emit 'vm-reset', vm.name
24-
23+
app.socket.emit 'qmp-command', 'reset', vm.name
24+
2525
pause: (vm) ->
2626
console.log "Pause: #{vm.name}"
27-
app.socket.emit 'vm-pause', vm.name
27+
app.socket.emit 'qmp-command', 'pause', vm.name
2828

2929
resume: (vm) ->
3030
console.log "Resume: #{vm.name}"
31-
app.socket.emit 'vm-resume', vm.name
32-
31+
app.socket.emit 'qmp-command', 'resume', vm.name
32+
3333
stop: (vm) ->
3434
console.log "Stop: #{vm.name}"
35-
app.socket.emit 'vm-stop', vm.name
36-
35+
app.socket.emit 'qmp-command', 'stop', vm.name
36+
3737
setStatus: (vmName, status) ->
3838
for vm in @vms()
3939
if vm.name is vmName

server.coffee

+2
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@ socketServer = require './lib/socketServer'
66
webServer.start()
77
socketServer.start webServer.getHttpServer()
88

9+
vmHandler.loadExtensions()
10+
911
vmHandler.loadFiles()
1012
vmHandler.reconnectVms()

0 commit comments

Comments
 (0)