Process modules installation only for /admin/install request.
This makes installation process safer, and controlled.
This commit is contained in:
@@ -77,7 +77,7 @@ CREATE TABLE tb_demo(
|
||||
api.logger.put_error ("Could not initialize database for demo module", generating_type)
|
||||
end
|
||||
end
|
||||
api.storage.set_custom_value ("is_initialized", "module-" + name, "yes")
|
||||
Precursor {CMS_MODULE}(api)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ feature -- Access
|
||||
Result := environment
|
||||
end
|
||||
|
||||
feature {CMS_API} -- API Access
|
||||
|
||||
enabled_modules: CMS_MODULE_COLLECTION
|
||||
-- List of enabled modules.
|
||||
local
|
||||
@@ -51,7 +53,14 @@ feature -- Access
|
||||
only_enabled_modules: across Result as ic all ic.item.is_enabled end
|
||||
end
|
||||
|
||||
feature {CMS_MODULE, CMS_API} -- Restricted access
|
||||
feature {CMS_MODULE, CMS_API, CMS_SETUP_ACCESS} -- Restricted access
|
||||
|
||||
modules: CMS_MODULE_COLLECTION
|
||||
-- List of available modules.
|
||||
deferred
|
||||
end
|
||||
|
||||
feature {NONE} -- Implementation: update
|
||||
|
||||
update_module_status_within (a_module: CMS_MODULE; a_collection: CMS_MODULE_COLLECTION)
|
||||
-- Update status of module `a_module', taking into account its dependencies within the collection `a_collection'.
|
||||
@@ -101,11 +110,6 @@ feature {CMS_MODULE, CMS_API} -- Restricted access
|
||||
end
|
||||
end
|
||||
|
||||
modules: CMS_MODULE_COLLECTION
|
||||
-- List of available modules.
|
||||
deferred
|
||||
end
|
||||
|
||||
feature -- Access: Site
|
||||
|
||||
site_id: READABLE_STRING_8
|
||||
|
||||
12
src/configuration/cms_setup_access.e
Normal file
12
src/configuration/cms_setup_access.e
Normal file
@@ -0,0 +1,12 @@
|
||||
note
|
||||
description: "Interface to access restricted data from {CMS_SETUP}."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_SETUP_ACCESS
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
15
src/service/cms_access.e
Normal file
15
src/service/cms_access.e
Normal file
@@ -0,0 +1,15 @@
|
||||
note
|
||||
description: "Interface giving access to internal CMS features."
|
||||
date: "$Date$"
|
||||
revision: "$Revision$"
|
||||
|
||||
deferred class
|
||||
CMS_ACCESS
|
||||
|
||||
inherit
|
||||
CMS_SETUP_ACCESS
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -34,6 +34,8 @@ feature {NONE} -- Initialize
|
||||
-- Initialize the persitent layer.
|
||||
local
|
||||
l_module: CMS_MODULE
|
||||
l_enabled_modules: CMS_MODULE_COLLECTION
|
||||
l_uninstalled_mods: detachable ARRAYED_LIST [CMS_MODULE]
|
||||
do
|
||||
-- Initialize formats.
|
||||
initialize_formats
|
||||
@@ -45,22 +47,40 @@ feature {NONE} -- Initialize
|
||||
create {CMS_STORAGE_NULL} storage
|
||||
end
|
||||
|
||||
-- Keep enable modules list.
|
||||
l_enabled_modules := setup.enabled_modules
|
||||
enabled_modules := l_enabled_modules
|
||||
|
||||
-- Complete storage setup.
|
||||
storage.set_api (Current)
|
||||
|
||||
-- Initialize enabled modules.
|
||||
across
|
||||
setup.enabled_modules as ic
|
||||
l_enabled_modules as ic
|
||||
loop
|
||||
l_module := ic.item
|
||||
-- FIXME: should we initialize first, and then install
|
||||
-- or the reverse, or merge installation and initialization
|
||||
-- and leave the responsability to the module to know
|
||||
-- if this is installed or not...
|
||||
if not l_module.is_installed (Current) then
|
||||
l_module.install (Current)
|
||||
-- if not l_module.is_installed (Current) then
|
||||
-- l_module.install (Current)
|
||||
-- end
|
||||
if l_module.is_installed (Current) then
|
||||
l_module.initialize (Current)
|
||||
else
|
||||
if l_uninstalled_mods = Void then
|
||||
create l_uninstalled_mods.make (1)
|
||||
end
|
||||
l_uninstalled_mods.force (l_module)
|
||||
end
|
||||
end
|
||||
if l_uninstalled_mods /= Void then
|
||||
across
|
||||
l_uninstalled_mods as ic
|
||||
loop
|
||||
l_enabled_modules.remove (ic.item)
|
||||
end
|
||||
l_module.initialize (Current)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -81,6 +101,30 @@ feature {NONE} -- Initialize
|
||||
formats.extend (f)
|
||||
end
|
||||
|
||||
feature {CMS_ACCESS} -- Installation
|
||||
|
||||
install
|
||||
-- Install CMS or uninstalled module which are enabled.
|
||||
local
|
||||
l_module: CMS_MODULE
|
||||
do
|
||||
across
|
||||
setup.modules as ic
|
||||
loop
|
||||
l_module := ic.item
|
||||
-- FIXME: should we initialize first, and then install
|
||||
-- or the reverse, or merge installation and initialization
|
||||
-- and leave the responsability to the module to know
|
||||
-- if this is installed or not...
|
||||
if not l_module.is_installed (Current) then
|
||||
l_module.install (Current)
|
||||
if l_module.is_enabled then
|
||||
l_module.initialize (Current)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
feature -- Access
|
||||
|
||||
setup: CMS_SETUP
|
||||
@@ -197,6 +241,14 @@ feature -- Permissions system
|
||||
|
||||
feature -- Query: module
|
||||
|
||||
is_module_installed (a_module: CMS_MODULE): BOOLEAN
|
||||
-- Is `a_module' installed?
|
||||
do
|
||||
Result := a_module.is_installed (Current)
|
||||
end
|
||||
|
||||
enabled_modules: CMS_MODULE_COLLECTION
|
||||
|
||||
module (a_type: TYPE [CMS_MODULE]): detachable CMS_MODULE
|
||||
-- Enabled module typed `a_type', if any.
|
||||
--| usage: if attached module ({FOO_MODULE}) as mod then ...
|
||||
|
||||
@@ -44,7 +44,7 @@ feature {NONE} -- Initialization
|
||||
setup_storage (l_setup)
|
||||
setup_modules (l_setup)
|
||||
create api.make (l_setup)
|
||||
modules := setup.enabled_modules
|
||||
modules := api.enabled_modules
|
||||
|
||||
initialize_cms
|
||||
Precursor
|
||||
@@ -66,7 +66,7 @@ feature {NONE} -- Initialization
|
||||
initialize_modules
|
||||
-- Intialize modules and keep only enabled modules.
|
||||
do
|
||||
modules := setup.enabled_modules
|
||||
modules := api.enabled_modules
|
||||
ensure
|
||||
only_enabled_modules: across modules as ic all ic.item.is_enabled end
|
||||
end
|
||||
@@ -118,6 +118,7 @@ feature -- Settings: router
|
||||
local
|
||||
l_api: like api
|
||||
l_router: like router
|
||||
l_module: CMS_MODULE
|
||||
do
|
||||
api.logger.put_debug (generator + ".setup_router", Void)
|
||||
-- Configure root of api handler.
|
||||
@@ -130,7 +131,10 @@ feature -- Settings: router
|
||||
across
|
||||
modules as ic
|
||||
loop
|
||||
ic.item.setup_router (l_router, l_api)
|
||||
l_module := ic.item
|
||||
if l_module.is_initialized then
|
||||
l_module.setup_router (l_router, l_api)
|
||||
end
|
||||
end
|
||||
-- Configure files handler.
|
||||
configure_api_file_handler (l_router)
|
||||
@@ -148,6 +152,8 @@ feature -- Settings: router
|
||||
a_router.handle ("/", l_root_handler, l_methods)
|
||||
a_router.handle ("", l_root_handler, l_methods)
|
||||
map_uri_agent ("/favicon.ico", agent handle_favicon, a_router.methods_head_get)
|
||||
|
||||
map_uri ("/admin/install", create {CMS_ADMIN_INSTALL_HANDLER}.make (api), a_router.methods_head_get)
|
||||
end
|
||||
|
||||
configure_api_file_handler (a_router: WSF_ROUTER)
|
||||
|
||||
@@ -86,14 +86,14 @@ feature {CMS_API} -- Module management
|
||||
require
|
||||
is_not_installed: not is_installed (api)
|
||||
do
|
||||
api.storage.set_custom_value ("is_initialized", "module-" + name, "yes")
|
||||
api.storage.set_custom_value ("is_initialized", "yes", "module-" + name)
|
||||
end
|
||||
|
||||
uninstall (api: CMS_API)
|
||||
require
|
||||
is_installed: is_installed (api)
|
||||
do
|
||||
api.storage.set_custom_value ("is_initialized", "module-" + name, "no")
|
||||
api.storage.set_custom_value ("is_initialized", "no", "module-" + name)
|
||||
end
|
||||
|
||||
feature -- Router
|
||||
|
||||
80
src/service/handler/cms_admin_install_handler.e
Normal file
80
src/service/handler/cms_admin_install_handler.e
Normal file
@@ -0,0 +1,80 @@
|
||||
note
|
||||
description: "Handler to process CMS installation process."
|
||||
date: "$Date: 2015-02-13 13:08:13 +0100 (ven., 13 févr. 2015) $"
|
||||
revision: "$Revision: 96616 $"
|
||||
|
||||
class
|
||||
CMS_ADMIN_INSTALL_HANDLER
|
||||
|
||||
inherit
|
||||
CMS_HANDLER
|
||||
|
||||
WSF_URI_HANDLER
|
||||
rename
|
||||
new_mapping as new_uri_mapping
|
||||
end
|
||||
|
||||
WSF_RESOURCE_HANDLER_HELPER
|
||||
redefine
|
||||
do_get
|
||||
end
|
||||
|
||||
CMS_ACCESS
|
||||
|
||||
REFACTORING_HELPER
|
||||
|
||||
create
|
||||
make
|
||||
|
||||
feature -- execute
|
||||
|
||||
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- Execute request handler
|
||||
do
|
||||
execute_methods (req, res)
|
||||
end
|
||||
|
||||
feature -- HTTP Methods
|
||||
|
||||
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
|
||||
-- <Precursor>
|
||||
local
|
||||
r: CMS_RESPONSE
|
||||
l_module: CMS_MODULE
|
||||
s: STRING
|
||||
lst: ARRAYED_LIST [CMS_MODULE]
|
||||
do
|
||||
create {GENERIC_VIEW_CMS_RESPONSE} r.make (req, res, api)
|
||||
r.set_title (r.translation ("CMS Installation ...", Void))
|
||||
create s.make_from_string ("<h1>Modules</h1><ul>")
|
||||
create lst.make (1)
|
||||
across
|
||||
api.setup.modules as ic
|
||||
loop
|
||||
l_module := ic.item
|
||||
if api.is_module_installed (l_module) then
|
||||
s.append ("<li>" + l_module.name + " is already installed.</li>%N")
|
||||
else
|
||||
lst.force (l_module)
|
||||
end
|
||||
end
|
||||
api.install
|
||||
across
|
||||
lst as ic
|
||||
loop
|
||||
l_module := ic.item
|
||||
if api.is_module_installed (l_module) then
|
||||
s.append ("<li>" + l_module.name + " was successfully installed.</li>%N")
|
||||
else
|
||||
s.append ("<li>" + l_module.name + " could not be installed!</li>%N")
|
||||
end
|
||||
end
|
||||
s.append ("</ul>")
|
||||
r.set_main_content (s)
|
||||
r.execute
|
||||
end
|
||||
|
||||
note
|
||||
copyright: "2011-2015, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
|
||||
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
||||
end
|
||||
@@ -71,7 +71,7 @@ feature {NONE} -- Initialization
|
||||
l_module: CMS_MODULE
|
||||
l_enabled_modules: CMS_MODULE_COLLECTION
|
||||
do
|
||||
l_enabled_modules := setup.enabled_modules
|
||||
l_enabled_modules := api.enabled_modules
|
||||
across
|
||||
l_enabled_modules as ic
|
||||
loop
|
||||
|
||||
Reference in New Issue
Block a user