1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-21 14:50:08 +03:00

feature #1370: separate novnc server from sunstone server

This commit is contained in:
Javi Fontan 2013-03-04 17:30:28 +01:00
parent 455d56f97b
commit 1052b4b168
3 changed files with 190 additions and 35 deletions

View File

@ -27,9 +27,10 @@ class OpenNebulaVNC
attr_reader :proxy_port
def initialize(config, logger, opts={
:json_errors => true,
:token_folder_name => 'sunstone_vnc_tokens'})
def initialize(config, logger, options = {})
opts={ :json_errors => true,
:token_folder_name => 'sunstone_vnc_tokens'}.merge(options)
@pipe = nil
@token_folder = File.join(VAR_LOCATION, opts[:token_folder_name])
@proxy_path = config[:vnc_proxy_path]
@ -38,6 +39,8 @@ class OpenNebulaVNC
@wss = config[:vnc_proxy_support_wss]
@lock_file = config[:lock_file] || '/tmp/novnc.lock'
if (@wss == "yes") || (@wss == "only") || (@wss == true)
@enable_wss = true
@cert = config[:vnc_proxy_cert]
@ -48,21 +51,24 @@ class OpenNebulaVNC
@options = opts
@logger = logger
begin
Dir.mkdir(@token_folder)
rescue Exception => e
@logger.error "Cannot create token folder"
@logger.error e.message
end
end
def start
if @proxy_path == nil || @proxy_path.empty?
@logger.info "VNC proxy not configured"
return
if is_running?
message="VNC server already running"
STDERR.puts message
@logger.info message
return false
end
if @proxy_path == nil || @proxy_path.empty?
@logger.error "VNC proxy not configured"
return false
end
create_token_dir
proxy_options = "--target-config=#{@token_folder} "
if @enable_wss
@ -75,16 +81,31 @@ class OpenNebulaVNC
begin
@logger.info { "Starting VNC proxy: #{cmd}" }
@pipe = IO.popen(cmd,'r')
pid=start_daemon(cmd, 'VNC_LOG')
rescue Exception => e
@logger.error e.message
return
return false
end
File.write(@lock_file, pid)
sleep 1
if !is_running?
message="Error starting VNC proxy"
STDERR.puts message
@logger.error message
File.delete(@lock_file) if File.exist?(@lock_file)
return false
end
true
end
def proxy(vm_resource)
# Check configurations and VM attributes
if !@pipe
if !is_running?
return error(400, "VNC Proxy is not running")
end
@ -121,12 +142,6 @@ class OpenNebulaVNC
:token => random_str,
}
# Delete token soon after
Thread.new do
sleep TOKEN_EXPIRE_SECONDS
delete_token(token_file)
end
return [200, info.to_json]
end
@ -140,17 +155,31 @@ class OpenNebulaVNC
end
end
def stop
if !@pipe then return end
@logger.info "Killing VNC proxy"
Process.kill('TERM',@pipe.pid)
@pipe.close
begin
Dir.rmdir(@token_folder)
rescue => e
@logger.error "Error deleting token folder"
@logger.error e.message
def stop(force=false)
pid=get_pid
if pid
@logger.info "Killing VNC proxy"
signal=(force ? 'KILL' : 'TERM')
Process.kill(signal ,pid)
sleep 1
if is_running?
message="The server is still running"
STDERR.puts message
logger.error message
return false
end
delete_token_dir
else
message="The server is not running"
@logger.info message
STDERR.puts message
end
true
end
private
@ -163,4 +192,56 @@ class OpenNebulaVNC
end
end
def create_token_dir
delete_token_dir
begin
Dir.mkdir(@token_folder) if !File.exist?(@token_folder)
rescue Exception => e
@logger.error "Cannot create token folder"
@logger.error e.message
end
end
def delete_token_dir
if File.exist?(@token_folder)
begin
Dir.glob("#{@token_folder}/*").each do |file|
File.delete(file)
end
Dir.rmdir(@token_folder)
rescue => e
@logger.error "Error deleting token folder"
@logger.error e.message
end
end
end
alias_method :get_pid, :is_running?
def is_running?
if File.exist?(@lock_file)
pid=File.read(@lock_file).strip
if system("ps #{pid} 1> /dev/null")
return pid.to_i
end
@logger.info "Deleting stale lock file"
File.delete(@lock_file)
end
false
end
def start_daemon(cmd, log)
pid=spawn(*cmd.split(" "),
:pgroup => true,
:in => :close,
[:out, :err] => [log, "a"],
:close_others => true )
Process.detach(pid)
pid
end
end

78
src/sunstone/novnc-server.rb Executable file
View File

@ -0,0 +1,78 @@
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
# -------------------------------------------------------------------------- #
# Copyright 2002-2013, OpenNebula Project (OpenNebula.org), C12G Labs #
# #
# Licensed under the Apache License, Version 2.0 (the "License"); you may #
# not use this file except in compliance with the License. You may obtain #
# a copy of the License at #
# #
# http://www.apache.org/licenses/LICENSE-2.0 #
# #
# Unless required by applicable law or agreed to in writing, software #
# distributed under the License is distributed on an "AS IS" BASIS, #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
# See the License for the specific language governing permissions and #
# limitations under the License. #
#--------------------------------------------------------------------------- #
ONE_LOCATION = ENV["ONE_LOCATION"]
if !ONE_LOCATION
LOG_LOCATION = "/var/log/one"
LOCK_LOCATION = "/var/lock/one"
VAR_LOCATION = "/var/lib/one"
ETC_LOCATION = "/etc/one"
RUBY_LIB_LOCATION = "/usr/lib/one/ruby"
else
VAR_LOCATION = ONE_LOCATION + "/var"
LOCK_LOCATION = ONE_LOCATION + "/var"
LOG_LOCATION = ONE_LOCATION + "/var"
ETC_LOCATION = ONE_LOCATION + "/etc"
RUBY_LIB_LOCATION = ONE_LOCATION+"/lib/ruby"
end
VNC_LOCK = LOCK_LOCATION + "/novnc.lock"
VNC_LOG = LOG_LOCATION + "/novnc.log"
CONFIGURATION_FILE = ETC_LOCATION + "/sunstone-server.conf"
PLUGIN_CONFIGURATION_FILE = ETC_LOCATION + "/sunstone-plugins.yaml"
SUNSTONE_ROOT_DIR = File.dirname(__FILE__)
$: << RUBY_LIB_LOCATION
$: << RUBY_LIB_LOCATION+'/cloud'
$: << SUNSTONE_ROOT_DIR
$: << SUNSTONE_ROOT_DIR+'/models'
require 'logger'
require 'yaml'
require 'OpenNebulaVNC'
$log=Logger.new(VNC_LOG)
begin
conf = YAML.load_file(CONFIGURATION_FILE)
rescue Exception => e
STDERR.puts "Error parsing config file #{CONFIGURATION_FILE}: #{e.message}"
exit 1
end
vnc=OpenNebulaVNC.new(conf, $log)
if ARGV[0]
res=case ARGV[0].downcase.to_sym
when :start
vnc.start
when :stop
vnc.stop(ARGV[1]=='--force')
end
exit(-1) if !res
else
exit(-1)
end

View File

@ -104,10 +104,6 @@ set :cloud_auth, cloud_auth
configure do
set :run, false
set :vnc, OpenNebulaVNC.new(conf, settings.logger)
settings.vnc.start()
Kernel.at_exit do
settings.vnc.stop
end
end
##############################################################################