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 %>
+