mirror of
https://github.com/OpenNebula/one.git
synced 2025-03-21 14:50:08 +03:00
feature #1069: Minor changes in OpenNebulaVNC class. Return user configuration in JSON
This commit is contained in:
parent
cea817e964
commit
9f66d8b2e2
@ -14,31 +14,38 @@
|
||||
# limitations under the License. #
|
||||
#--------------------------------------------------------------------------- #
|
||||
|
||||
|
||||
#This file provides support for launching and stopping a websockify proxy
|
||||
|
||||
require 'json'
|
||||
require 'OpenNebula'
|
||||
|
||||
#
|
||||
# This class provides support for launching and stopping a websockify proxy
|
||||
#
|
||||
class OpenNebulaVNC
|
||||
def initialize(config,opt={:json_errors => true})
|
||||
@proxy_path = config[:vnc_proxy_path]
|
||||
def initialize(config, opt={:json_errors => true})
|
||||
@proxy_path = config[:vnc_proxy_path]
|
||||
@proxy_base_port = config[:vnc_proxy_base_port].to_i
|
||||
|
||||
@wss = config[:vnc_proxy_support_wss]
|
||||
@enable_wss = (@wss == "yes") || (@wss == "only") || (@wss == true)
|
||||
@cert = @enable_wss? config[:vnc_proxy_cert] : nil
|
||||
@key = @enable_wss? config[:vnc_proxy_key] : nil
|
||||
@options=opt
|
||||
end
|
||||
|
||||
def error(code, msg)
|
||||
if @options[:json_errors]
|
||||
return [code,OpenNebula::Error.new(msg).to_json]
|
||||
if (@wss == "yes") || (@wss == "only") || (@wss == true)
|
||||
@enable_wss = true
|
||||
@cert = config[:vnc_proxy_cert]
|
||||
@key = config[:vnc_proxy_key]
|
||||
else
|
||||
return [code,msg]
|
||||
@enable_wss = false
|
||||
end
|
||||
|
||||
@options = opt
|
||||
end
|
||||
|
||||
# Start a VNC proxy
|
||||
def start(vm_resource)
|
||||
# Check configurations and VM attributes
|
||||
|
||||
if @proxy_path == nil || @proxy_path.empty?
|
||||
return error(403,"VNC proxy not configured")
|
||||
end
|
||||
|
||||
if vm_resource['LCM_STATE'] != "3"
|
||||
return error(403,"VM is not running")
|
||||
end
|
||||
@ -47,43 +54,50 @@ class OpenNebulaVNC
|
||||
return error(403,"VM has no VNC configured")
|
||||
end
|
||||
|
||||
# The VM host and its VNC port
|
||||
host = vm_resource['/VM/HISTORY_RECORDS/HISTORY[last()]/HOSTNAME']
|
||||
# Proxy data
|
||||
host = vm_resource['/VM/HISTORY_RECORDS/HISTORY[last()]/HOSTNAME']
|
||||
vnc_port = vm_resource['TEMPLATE/GRAPHICS/PORT']
|
||||
# The port on which the proxy will listen
|
||||
proxy_port = @proxy_base_port + vnc_port.to_i
|
||||
|
||||
if !@proxy_path || @proxy_path.size == 0
|
||||
return error(403,"VNC proxy not configured")
|
||||
end
|
||||
proxy_port = @proxy_base_port + vnc_port.to_i
|
||||
|
||||
proxy_options = ""
|
||||
|
||||
if @enable_wss
|
||||
proxy_options += " --cert #{@cert}"
|
||||
proxy_options += " --key #{@key}" if @key && @key.size > 0
|
||||
proxy_options += " --ssl-only" if @wss == "only"
|
||||
proxy_options << " --cert #{@cert}"
|
||||
proxy_options << " --key #{@key}" if @key && @key.size > 0
|
||||
proxy_options << " --ssl-only" if @wss == "only"
|
||||
end
|
||||
|
||||
proxy_cmd = "#{@proxy_path} #{proxy_options} #{proxy_port} #{host}:#{vnc_port}"
|
||||
cmd ="#{@proxy_path} #{proxy_options} #{proxy_port} #{host}:#{vnc_port}"
|
||||
|
||||
begin
|
||||
$stderr.puts("Starting vnc proxy: #{proxy_cmd}")
|
||||
pipe = IO.popen(proxy_cmd)
|
||||
pipe = IO.popen(cmd)
|
||||
rescue Exception => e
|
||||
error = Error.new(e.message)
|
||||
return [500, error.to_json]
|
||||
return [500, OpenNebula::Error.new(e.message).to_json]
|
||||
end
|
||||
|
||||
vnc_pw = vm_resource['TEMPLATE/GRAPHICS/PASSWD']
|
||||
info = {:pipe => pipe, :port => proxy_port, :password => vnc_pw}
|
||||
|
||||
info = {:pipe => pipe, :port => proxy_port, :password => vnc_pw}
|
||||
return [200, info]
|
||||
end
|
||||
|
||||
#handle exceptions outside
|
||||
# Stop a VNC proxy handle exceptions outside
|
||||
def self.stop(pipe)
|
||||
Process.kill('KILL',pipe.pid)
|
||||
pipe.close
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def error(code, msg)
|
||||
if @options[:json_errors]
|
||||
return [code,OpenNebula::Error.new(msg).to_json]
|
||||
else
|
||||
return [code,msg]
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
|
@ -147,37 +147,6 @@ class SunstoneServer
|
||||
end
|
||||
end
|
||||
|
||||
############################################################################
|
||||
# Unused
|
||||
############################################################################
|
||||
# def get_configuration(user_id)
|
||||
# if user_id != "0"
|
||||
# return [401, ""]
|
||||
# end
|
||||
|
||||
# one_config = VAR_LOCATION + "/config"
|
||||
# config = Hash.new
|
||||
|
||||
# begin
|
||||
# cfg = File.read(one_config)
|
||||
# rescue Exception => e
|
||||
# error = Error.new("Error reading config: #{e.inspect}")
|
||||
# return [500, error.to_json]
|
||||
# end
|
||||
|
||||
# cfg.lines do |line|
|
||||
# m=line.match(/^([^=]+)=(.*)$/)
|
||||
|
||||
# if m
|
||||
# name=m[1].strip.upcase
|
||||
# value=m[2].strip
|
||||
# config[name]=value
|
||||
# end
|
||||
# end
|
||||
|
||||
# return [200, config.to_json]
|
||||
# end
|
||||
|
||||
############################################################################
|
||||
#
|
||||
############################################################################
|
||||
@ -202,7 +171,6 @@ class SunstoneServer
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
########################################################################
|
||||
# VNC
|
||||
########################################################################
|
||||
@ -233,7 +201,6 @@ class SunstoneServer
|
||||
############################################################################
|
||||
#
|
||||
############################################################################
|
||||
|
||||
def get_monitoring(id, resource, monitor_resources, gid)
|
||||
watch_client = case resource
|
||||
when "vm","VM"
|
||||
@ -262,18 +229,11 @@ class SunstoneServer
|
||||
return [200, rc.to_json]
|
||||
end
|
||||
|
||||
############################################################################
|
||||
#
|
||||
############################################################################
|
||||
|
||||
############################################################################
|
||||
#
|
||||
############################################################################
|
||||
|
||||
|
||||
|
||||
private
|
||||
|
||||
############################################################################
|
||||
#
|
||||
############################################################################
|
||||
def retrieve_resource(kind, id)
|
||||
resource = case kind
|
||||
when "group" then GroupJSON.new_with_id(id, @client)
|
||||
|
@ -227,18 +227,18 @@ post '/logout' do
|
||||
end
|
||||
|
||||
##############################################################################
|
||||
# Config and Logs
|
||||
# User configuration and VM logs
|
||||
##############################################################################
|
||||
#get '/config' do
|
||||
# @SunstoneServer.get_configuration(session[:user_id])
|
||||
#end
|
||||
|
||||
get '/config/:opt' do
|
||||
case params[:opt]
|
||||
when "lang" then session[:lang]
|
||||
when "wss" then session[:wss]
|
||||
else "unknown"
|
||||
end
|
||||
get '/config' do
|
||||
uconf = {
|
||||
:user_config => {
|
||||
:lang => session[:lang]
|
||||
:wss => session[:wss]
|
||||
}
|
||||
}
|
||||
|
||||
[200, uconf.json]
|
||||
end
|
||||
|
||||
post '/config' do
|
||||
@ -250,8 +250,8 @@ post '/config' do
|
||||
|
||||
body.each do | key,value |
|
||||
case key
|
||||
when "lang" then session[:lang]=value
|
||||
when "wss" then session[:wss]=value
|
||||
when "lang" then session[:lang]= value
|
||||
when "wss" then session[:wss] = value
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Loading…
x
Reference in New Issue
Block a user