diff --git a/install.sh b/install.sh index c66d986469..05f136f6c3 100755 --- a/install.sh +++ b/install.sh @@ -212,6 +212,7 @@ SUNSTONE_DIRS="$SUNSTONE_LOCATION/models \ $SUNSTONE_LOCATION/public \ $SUNSTONE_LOCATION/public/js \ $SUNSTONE_LOCATION/public/js/plugins \ + $SUNSTONE_LOCATION/public/js/user-plugins \ $SUNSTONE_LOCATION/public/css \ $SUNSTONE_LOCATION/public/vendor \ $SUNSTONE_LOCATION/public/vendor/jQueryLayout \ @@ -223,7 +224,8 @@ SUNSTONE_DIRS="$SUNSTONE_LOCATION/models \ $SUNSTONE_LOCATION/share \ $SUNSTONE_LOCATION/share/OneMonitor \ $SUNSTONE_LOCATION/public/images \ - $SUNSTONE_LOCATION/templates" + $SUNSTONE_LOCATION/templates \ + $SUNSTONE_LOCATION/views" LIB_ECO_CLIENT_DIRS="$LIB_LOCATION/ruby \ $LIB_LOCATION/ruby/OpenNebula \ @@ -326,6 +328,7 @@ INSTALL_SUNSTONE_FILES=( SUNSTONE_MODELS_FILES:$SUNSTONE_LOCATION/models SUNSTONE_MODELS_JSON_FILES:$SUNSTONE_LOCATION/models/OpenNebulaJSON SUNSTONE_TEMPLATE_FILES:$SUNSTONE_LOCATION/templates + SUNSTONE_VIEWS_FILES:$SUNSTONE_LOCATION/views SUNSTONE_PUBLIC_JS_FILES:$SUNSTONE_LOCATION/public/js SUNSTONE_PUBLIC_JS_PLUGINS_FILES:$SUNSTONE_LOCATION/public/js/plugins SUNSTONE_PUBLIC_CSS_FILES:$SUNSTONE_LOCATION/public/css @@ -791,10 +794,12 @@ SUNSTONE_FILES="src/sunstone/config.ru \ SUNSTONE_BIN_FILES="src/sunstone/bin/sunstone-server" -SUNSTONE_ETC_FILES="src/sunstone/etc/sunstone-server.conf" +SUNSTONE_ETC_FILES="src/sunstone/etc/sunstone-server.conf \ + src/sunstone/etc/sunstone-plugins.yaml" SUNSTONE_MODELS_FILES="src/sunstone/models/OpenNebulaJSON.rb \ - src/sunstone/models/SunstoneServer.rb" + src/sunstone/models/SunstoneServer.rb \ + src/sunstone/models/SunstonePlugins.rb" SUNSTONE_MODELS_JSON_FILES="src/sunstone/models/OpenNebulaJSON/HostJSON.rb \ src/sunstone/models/OpenNebulaJSON/ImageJSON.rb \ @@ -806,8 +811,9 @@ SUNSTONE_MODELS_JSON_FILES="src/sunstone/models/OpenNebulaJSON/HostJSON.rb \ src/sunstone/models/OpenNebulaJSON/TemplateJSON.rb \ src/sunstone/models/OpenNebulaJSON/VirtualNetworkJSON.rb" -SUNSTONE_TEMPLATE_FILES="src/sunstone/templates/index.html \ - src/sunstone/templates/login.html" +SUNSTONE_TEMPLATE_FILES="src/sunstone/templates/login.html" + +SUNSTONE_VIEWS_FILES="src/sunstone/views/index.erb" SUNSTONE_PUBLIC_JS_FILES="src/sunstone/public/js/layout.js \ src/sunstone/public/js/login.js \ diff --git a/src/sunstone/config.ru b/src/sunstone/config.ru index 8b695e23af..9c0c37947d 100644 --- a/src/sunstone/config.ru +++ b/src/sunstone/config.ru @@ -16,8 +16,9 @@ # limitations under the License. # #--------------------------------------------------------------------------- # -# TBD Change path for intallation tree -$: << File.dirname(__FILE__) +SUNSTONE_ROOT_DIR = File.dirname(__FILE__) + +$: << SUNSTONE_ROOT_DIR require 'sunstone-server.rb' diff --git a/src/sunstone/etc/sunstone-plugins.yaml b/src/sunstone/etc/sunstone-plugins.yaml new file mode 100644 index 0000000000..05b6eb0aed --- /dev/null +++ b/src/sunstone/etc/sunstone-plugins.yaml @@ -0,0 +1,33 @@ +--- +- plugins/dashboard-tab.js: + :ALL: true + :user: + :group: +- plugins/hosts-tab.js: + :ALL: true + :user: + :group: +- plugins/groups-tab.js: + :ALL: true + :user: + :group: +- plugins/templates-tab.js: + :ALL: true + :user: + :group: +- plugins/vms-tab.js: + :ALL: true + :user: + :group: +- plugins/vnets-tab.js: + :ALL: true + :user: + :group: +- plugins/images-tab.js: + :ALL: true + :user: + :group: +- plugins/users-tab.js: + :ALL: true + :user: + :group: diff --git a/src/sunstone/models/SunstonePlugins.rb b/src/sunstone/models/SunstonePlugins.rb new file mode 100644 index 0000000000..e9246437f2 --- /dev/null +++ b/src/sunstone/models/SunstonePlugins.rb @@ -0,0 +1,102 @@ +# -------------------------------------------------------------------------- # +# Copyright 2002-2011, OpenNebula Project Leads (OpenNebula.org) # +# # +# 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. # +#--------------------------------------------------------------------------- # + +require 'yaml' +require 'json' + +class SunstonePlugins + USER_PLUGIN_POLICY = false # or true to enable them by default + + attr_reader :plugins_conf + + def initialize + load_conf + check_plugins + end + + def load_conf + @plugins_conf = YAML.load_file(PLUGIN_CONFIGURATION_FILE) + end + + def check_plugins + base_path = SUNSTONE_ROOT_DIR+'/public/js/' + + @installed_plugins = Array.new + + # read user plugins + modified = false + Dir[base_path+'user-plugins/*.js'].each do |p_path| + m = p_path.match(/^#{base_path}(.*)$/) + if m and plugin = m[1] + @installed_plugins << plugin + if !plugins.include? plugin + @plugins_conf << {plugin=>{:ALL => USER_PLUGIN_POLICY, + :user => nil, + :group => nil}} + modified = true + end + end + end + write_conf if modified + + # read base plugins + Dir[base_path+'plugins/*.js'].each do |p_path| + m = p_path.match(/^#{base_path}(.*)$/) + if m and plugin = m[1] + @installed_plugins << plugin + end + end + end + + def plugins + @plugins_conf.collect{|p| p.keys[0]} + end + + def installed?(plugin) + @installed_plugins.include? plugin + end + + def authorized_plugins(user,group=nil) + auth_plugins = {"user-plugins"=>Array.new, "plugins"=>Array.new} + + @plugins_conf.each do |plugin_conf| + plugin = plugin_conf.keys.first + perms = plugin_conf[plugin] + if installed?(plugin) + p_path, p_name = plugin.split('/') + + if perms[:user] and perms[:user][user] + auth_plugins[p_path] << p_name + elsif perms[:group] and perms[:group][group] + auth_plugins[p_path] << p_name + elsif perms[:ALL] + auth_plugins[p_path] << p_name + end + end + end + auth_plugins + end + + def write_conf + File.open(PLUGIN_CONFIGURATION_FILE,'w') do |f| + f.write(@plugins_conf.to_yaml) + end + end + + def to_json + @plugins_conf.to_json + end +end diff --git a/src/sunstone/share/OneMonitor/runOneMonitor.rb b/src/sunstone/share/OneMonitor/runOneMonitor.rb index 48818a852c..8ca591235b 100755 --- a/src/sunstone/share/OneMonitor/runOneMonitor.rb +++ b/src/sunstone/share/OneMonitor/runOneMonitor.rb @@ -16,8 +16,6 @@ # limitations under the License. # #--------------------------------------------------------------------------- # -$: << File.dirname(__FILE__) - require 'HostMonitor.rb' require 'VMMonitor.rb' diff --git a/src/sunstone/sunstone-server.rb b/src/sunstone/sunstone-server.rb index e941bb6cfa..96a15d8a03 100755 --- a/src/sunstone/sunstone-server.rb +++ b/src/sunstone/sunstone-server.rb @@ -15,7 +15,7 @@ # 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"] @@ -24,28 +24,32 @@ if !ONE_LOCATION VAR_LOCATION = "/var/lib/one" RUBY_LIB_LOCATION = "/usr/lib/one/ruby" CONFIGURATION_FILE = "/etc/one/sunstone-server.conf" + PLUGIN_CONFIGURATION_FILE = "/etc/sunstone-plugins.yaml" else VAR_LOCATION = ONE_LOCATION+"/var" LOG_LOCATION = ONE_LOCATION+"/var" RUBY_LIB_LOCATION = ONE_LOCATION+"/lib/ruby" CONFIGURATION_FILE = ONE_LOCATION+"/etc/sunstone-server.conf" + PLUGIN_CONFIGURATION_FILE = ONE_LOCATION+"/etc/sunstone-plugins.yaml" end HOST_LOG_FOLDER = LOG_LOCATION+"/OneMonitor/host" VM_LOG_FOLDER = LOG_LOCATION+"/OneMonitor/vm" $: << RUBY_LIB_LOCATION -$: << File.dirname(__FILE__)+'/models' -$: << File.dirname(__FILE__)+'/share/OneMonitor' +$: << SUNSTONE_ROOT_DIR+'/models' +$: << SUNSTONE_ROOT_DIR+'/share/OneMonitor' ############################################################################## # Required libraries ############################################################################## require 'rubygems' require 'sinatra' +require 'erb' require 'cloud/Configuration' require 'SunstoneServer' +require 'SunstonePlugins' set :config, Configuration.new(CONFIGURATION_FILE) @@ -95,7 +99,6 @@ helpers do session.clear return [204, ""] end - end before do @@ -133,11 +136,14 @@ get '/' do :value=>"#{session[:user_id]}", :expires=>time) - File.read(File.dirname(__FILE__)+'/templates/index.html') + p = SunstonePlugins.new + @plugins = p.authorized_plugins(session[:user]) + + erb :index end get '/login' do - File.read(File.dirname(__FILE__)+'/templates/login.html') + File.read(SUNSTONE_ROOT_DIR+'/templates/login.html') end ############################################################################## diff --git a/src/sunstone/templates/index.html b/src/sunstone/views/index.erb similarity index 81% rename from src/sunstone/templates/index.html rename to src/sunstone/views/index.erb index 2d6bff8eb2..8683c0f683 100644 --- a/src/sunstone/templates/index.html +++ b/src/sunstone/views/index.erb @@ -27,17 +27,18 @@ - - - - - - - - - - + +<% @plugins["plugins"].each do |plugin| %> + +<% end %> + + + +<% @plugins["user-plugins"].each do |plugin| %> + +<% end %> +