Commit e444daf2 authored by Marco Mariani's avatar Marco Mariani

replaced slapos.cookbook:maarch.configuration with own egg

parent 18f04c54
......@@ -113,7 +113,6 @@ setup(name=name,
'postgres = slapos.recipe.postgres:Recipe',
'postgres.import = slapos.recipe.postgres:ImportRecipe',
'postgres.export = slapos.recipe.postgres:ExportRecipe',
'maarch.configuration = slapos.recipe.maarch.configuration:Recipe',
'proactive = slapos.recipe.proactive:Recipe',
'publish = slapos.recipe.publish:Recipe',
'publishurl = slapos.recipe.publishurl:Recipe',
......
##############################################################################
#
# Copyright (c) 2010 Vifib SARL and Contributors. All Rights Reserved.
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# guarantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 3
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
##############################################################################
import ConfigParser
import errno
import lxml.etree
import md5
import os
import lxml
# XXX: When run inside webrunner, Postgres refuses connection.
# TODO: make the recipe work inside webrunner
# XXX What follows is a crud hack to import psycopg2.
# It basically relies on the fact that lxml (required by slapos.core) is installed
# alongside with psycopg2.
# This should be rewritten (how?) and DOES NOT WORK WHEN DEVELOPING slapos.core.
def temporary_hack():
import sys
develop_eggs = '/'.join(lxml.__file__.split('/')[:lxml.__file__.split('/').index('develop-eggs')+1])
for egg_folder in os.listdir(develop_eggs):
if egg_folder.startswith('psycopg2'):
sys.path.append(os.path.join(develop_eggs, egg_folder))
temporary_hack()
import psycopg2
from slapos.recipe.librecipe import GenericBaseRecipe
def xpath_set(xml, settings):
for path, value in settings.iteritems():
xml.xpath(path)[0].text = value
class Recipe(GenericBaseRecipe):
"""\
This recipe configures a maarch instance to be ready to run,
without going through the initial wizard:
- creation of two xml files from the provided defaults
- php.ini as required by Maarch
- database setup.
The superuser password will be the same as the Postgres one.
"""
def install(self):
self.update_phpini(php_ini_path=os.path.join(self.options['php_ini_dir'], 'php.ini'))
self.load_initial_db()
ret = []
apps_config_xml = self.create_apps_config_xml()
if apps_config_xml:
ret.append(apps_config_xml)
core_config_xml = self.create_core_config_xml()
if core_config_xml:
ret.append(core_config_xml)
# confirm that everything is done, the app will run without further setup
lck_path = self.installed_lock()
ret.append(lck_path)
return ret
def create_apps_config_xml(self):
options = self.options
folder = os.path.join(options['htdocs'], 'apps/maarch_entreprise/xml')
config_xml_default = os.path.join(folder, 'config.xml.default')
config_xml = os.path.join(folder, 'config.xml')
# do not overwrite the config.xml file (it can be customized inside the application)
if os.path.exists(config_xml):
return
content = open(config_xml_default, 'rb').read()
xml = lxml.etree.fromstring(content)
xpath_set(xml, {
'CONFIG/databaseserver': options['db_host'],
'CONFIG/databaseserverport': options['db_port'],
'CONFIG/databasename': options['db_dbname'],
'CONFIG/databaseuser': options['db_username'],
'CONFIG/databasepassword': options['db_password'],
'CONFIG/lang': options['language'],
})
with os.fdopen(os.open(config_xml, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600), 'w') as fout:
fout.write(lxml.etree.tostring(xml, xml_declaration=True, encoding='utf-8').encode('utf-8'))
return config_xml
def create_core_config_xml(self):
options = self.options
folder = os.path.join(options['htdocs'], 'core/xml')
config_xml_default = os.path.join(folder, 'config.xml.default')
config_xml = os.path.join(folder, 'config.xml')
# do not overwrite the config.xml file (it can be customized inside the application)
if os.path.exists(config_xml):
return
content = open(config_xml_default, 'rb').read()
xml = lxml.etree.fromstring(content)
xpath_set(xml, {
'CONFIG/defaultlanguage': options['language'],
})
with os.fdopen(os.open(config_xml, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600), 'w') as fout:
fout.write(lxml.etree.tostring(xml, xml_declaration=True, encoding='utf-8').encode('utf-8'))
return config_xml
def update_phpini(self, php_ini_path):
php_ini = ConfigParser.RawConfigParser()
php_ini.read(php_ini_path)
php_ini.set('PHP', 'error_reporting', 'E_ALL & ~E_DEPRECATED & ~E_NOTICE')
php_ini.set('PHP', 'display_errors', 'On')
php_ini.set('PHP', 'short_open_tag', 'On')
php_ini.set('PHP', 'magic_quotes_gpc', 'Off')
with os.fdopen(os.open(php_ini_path, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600), 'w') as fout:
php_ini.write(fout)
def load_initial_db(self):
"""
This method:
- creates the initial schema
- patches the schema for ipv6
- loads initial data
- sets initial superadmin password
- configures and creates docservers directories
"""
options = self.options
conn = psycopg2.connect(host = options['db_host'],
port = int(options['db_port']),
database = options['db_dbname'],
user = options['db_username'],
password = options['db_password'])
cur = conn.cursor()
# skip everything if the tables have already been created
cur.execute("SELECT 1 FROM information_schema.tables WHERE table_schema='public' AND table_name='docservers';")
if cur.rowcount == 1:
conn.close()
return
htdocs = options['htdocs']
# load the schema
with open(os.path.join(htdocs, 'structure.sql')) as fin:
cur.execute(fin.read())
# patch the schema to store long addresses (ipv6)
cur.execute('ALTER TABLE HISTORY ALTER COLUMN remote_ip TYPE CHAR(255);')
with open(os.path.join(htdocs, 'data_mini.sql')) as fin:
cur.execute(fin.read())
# initial admin password
enc_password = md5.md5(options['db_password']).hexdigest()
cur.execute("UPDATE users SET password=%s WHERE user_id='superadmin';", (enc_password, ))
# directories described in http://wiki.maarch.org/Maarch_Entreprise/fr/Man/Admin/Stockage
for docserver_id, foldername in [
('OFFLINE_1', 'offline'),
('FASTHD_AI', 'ai'),
('OAIS_MAIN_1', 'OAIS_main'),
('OAIS_SAFE_1', 'OAIS_safe'),
('FASTHD_MAN', 'manual'),
('TEMPLATES', 'templates'),
]:
full_path = os.path.join(self.options['root_docservers'], foldername)
cur.execute('UPDATE docservers SET path_template=%s WHERE docserver_id=%s', (full_path, docserver_id))
try:
os.makedirs(full_path)
except OSError as exc:
if exc.errno == errno.EEXIST:
pass
else:
raise
conn.commit()
cur.close()
conn.close()
def installed_lock(self):
"""\
Create an empty file to mean the setup is completed
"""
htdocs = self.options['htdocs']
lck_path = os.path.join(htdocs, 'installed.lck')
with open(lck_path, 'w'):
pass
return lck_path
[buildout]
[maarch-configuration]
recipe = slapos.cookbook:maarch.configuration
recipe = slapos.recipe.maarch:default
htdocs = $${apache-php:htdocs}
db_host = $${postgres-urlparse:host}
db_port = $${postgres-urlparse:port}
......
......@@ -54,7 +54,7 @@ part-list = maarch-configuration
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-custom.cfg.in
output = ${buildout:directory}/instance-custom.cfg
md5sum = f132fcb57297ad9b10c07f97023b5ff4
md5sum = 28f6ad42b73806901ac2cd4ec563d73b
mode = 0644
......
......@@ -33,11 +33,6 @@ extends =
../slapos.cfg
# XXX TODO
#[instance-recipe]
#egg = slapos.cookbook
#module = lamp.request
#----------------
#-- Application-specific part (maarch, etc.)
......@@ -82,7 +77,7 @@ context = key templateapache instance-apache-php:output
import-list = file parts template-parts:destination
file replicated template-replicated:destination
md5sum = 29b44a5783263581bf2258de9e994a57
md5sum = 33215ed0f1a900c04d71ff9c309d9193
mode = 0644
......
......@@ -6,7 +6,8 @@
extends =
{{templateapache}}
parts =
# += because we need to take up parts (like instance-custom) from the profile we extended
parts +=
{{ parts.replicate("postgres","3") }}
request-apache-backup-1
request-apache-backup-2
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment