Commit b7416aa7 authored by Cédric de Saint Martin's avatar Cédric de Saint Martin

Merge remote-tracking branch 'origin/master' into lamp

parents 8b3915a6 572b8e6d
...@@ -5,12 +5,28 @@ extends = ...@@ -5,12 +5,28 @@ extends =
../zlib/buildout.cfg ../zlib/buildout.cfg
../ncurses/buildout.cfg ../ncurses/buildout.cfg
parts = postgresql parts = postgresql
[postgresql] [postgresql]
<= postgresql92
[postgresql91]
recipe = hexagonit.recipe.cmmi recipe = hexagonit.recipe.cmmi
url = http://ftp.postgresql.org/pub/source/v9.1.6/postgresql-9.1.6.tar.bz2 url = http://ftp.postgresql.org/pub/source/v9.1.7/postgresql-9.1.7.tar.bz2
md5sum = 000755f66c0de58bbd4cd2b89b45b8e2 md5sum = eaf7b67493d59d1a60767ffdfbd65ce9
configure-options = --with-openssl configure-options = --with-openssl
environment = environment =
CPPFLAGS=-I${zlib:location}/include -I${readline:location}/include -I${openssl:location}/include -I${ncurses:location}/lib CPPFLAGS=-I${zlib:location}/include -I${readline:location}/include -I${openssl:location}/include -I${ncurses:location}/lib
LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${readline:location}/lib -Wl,-rpath=${readline:location}/lib -L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib -L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${readline:location}/lib -Wl,-rpath=${readline:location}/lib -L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib -L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib
[postgresql92]
recipe = hexagonit.recipe.cmmi
url = http://ftp.postgresql.org/pub/source/v9.2.2/postgresql-9.2.2.tar.bz2
md5sum = 1cc388988e69bf75c6b55d59070100f6
configure-options = --with-openssl
environment =
CPPFLAGS=-I${zlib:location}/include -I${readline:location}/include -I${openssl:location}/include -I${ncurses:location}/lib
LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${readline:location}/lib -Wl,-rpath=${readline:location}/lib -L${openssl:location}/lib -Wl,-rpath=${openssl:location}/lib -L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib
...@@ -24,13 +24,17 @@ ...@@ -24,13 +24,17 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# #
############################################################################## ##############################################################################
import shutil import shutil
import os import os
import signal import signal
import subprocess
from binascii import b2a_uu as uuencode from binascii import b2a_uu as uuencode
from slapos.recipe.librecipe import GenericBaseRecipe from slapos.recipe.librecipe import GenericBaseRecipe
class Recipe(GenericBaseRecipe): class Recipe(GenericBaseRecipe):
def install(self): def install(self):
...@@ -66,11 +70,13 @@ class Recipe(GenericBaseRecipe): ...@@ -66,11 +70,13 @@ class Recipe(GenericBaseRecipe):
) )
path_list.append(httpd_conf) path_list.append(httpd_conf)
wrapper = self.createPythonScript(self.options['wrapper'], wrapper = self.createWrapper(name=self.options['wrapper'],
'slapos.recipe.librecipe.execute.execute', command=self.options['httpd-binary'],
[self.options['httpd-binary'], '-f', self.options['httpd-conf'], parameters=[
'-DFOREGROUND'] '-f',
) self.options['httpd-conf'],
'-DFOREGROUND'
])
path_list.append(wrapper) path_list.append(wrapper)
secret_key_filename = os.path.join(self.buildout['buildout']['directory'], secret_key_filename = os.path.join(self.buildout['buildout']['directory'],
...@@ -110,12 +116,16 @@ class Recipe(GenericBaseRecipe): ...@@ -110,12 +116,16 @@ class Recipe(GenericBaseRecipe):
self.substituteTemplate(self.options['template'], application_conf)) self.substituteTemplate(self.options['template'], application_conf))
path_list.append(config) path_list.append(config)
if os.path.exists(self.options['pid-file']): # Reload apache configuration.
# Reload apache configuration # notez-bien: a graceful restart or a SIGUSR1 can somehow hang the apache threads.
with open(self.options['pid-file']) as pid_file:
pid = int(pid_file.read().strip(), 10) subprocess.call([
try: self.options['httpd-binary'],
os.kill(pid, signal.SIGUSR1) # Graceful restart '-f',
except OSError: self.options['httpd-conf'],
pass '-k',
'graceful'
])
return path_list return path_list
...@@ -24,8 +24,7 @@ ...@@ -24,8 +24,7 @@
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# #
############################################################################## ##############################################################################
import os import subprocess
import signal
from slapos.recipe.librecipe import GenericBaseRecipe from slapos.recipe.librecipe import GenericBaseRecipe
...@@ -50,17 +49,23 @@ class Recipe(GenericBaseRecipe): ...@@ -50,17 +49,23 @@ class Recipe(GenericBaseRecipe):
) )
path_list.append(httpd_conf) path_list.append(httpd_conf)
wrapper = self.createPythonScript(self.options['wrapper'], wrapper = self.createWrapper(name=self.options['wrapper'],
'slapos.recipe.librecipe.execute.execute', command=self.options['httpd-binary'],
[self.options['httpd-binary'], '-f', self.options['httpd-conf'], parameters=[
'-DFOREGROUND'] '-f',
) self.options['httpd-conf'],
'-DFOREGROUND',
])
path_list.append(wrapper) path_list.append(wrapper)
if os.path.exists(self.options['pid-file']): subprocess.call([
# Reload apache configuration self.options['httpd-binary'],
with open(self.options['pid-file']) as pid_file: '-f',
pid = int(pid_file.read().strip(), 10) self.options['httpd-conf'],
os.kill(pid, signal.SIGUSR1) # Graceful restart '-k',
'graceful',
])
return path_list return path_list
...@@ -40,7 +40,7 @@ class Recipe(GenericBaseRecipe): ...@@ -40,7 +40,7 @@ class Recipe(GenericBaseRecipe):
This recipe creates: This recipe creates:
- a Postgres cluster - a Postgres cluster
- configuration to allow connections from IPV6 only (or unix socket) - configuration to allow connections from IPv4, IPv6 or unix socket.
- a superuser with provided name and generated password - a superuser with provided name and generated password
- a database with provided name - a database with provided name
- a foreground start script in the services directory - a foreground start script in the services directory
...@@ -49,27 +49,16 @@ class Recipe(GenericBaseRecipe): ...@@ -49,27 +49,16 @@ class Recipe(GenericBaseRecipe):
The URL can be used as-is (ie. in sqlalchemy) or by the _urlparse.py recipe. The URL can be used as-is (ie. in sqlalchemy) or by the _urlparse.py recipe.
""" """
def fetch_ipv6_host(self, options):
"""
Returns a string represtation of ipv6_host.
May receive a regular string, a set or a string serialized by buildout.
"""
ipv6_host = options['ipv6_host']
if isinstance(ipv6_host, set):
return ipv6_host.pop()
else:
return ipv6_host
def _options(self, options): def _options(self, options):
options['password'] = self.generatePassword() options['password'] = self.generatePassword()
options['url'] = 'postgresql://%(user)s:%(password)s@[%(ipv4_host)s]:%(port)s/%(dbname)s' % options options['url'] = 'postgresql://%(user)s:%(password)s@[%(ipv6_random)s]:%(port)s/%(dbname)s' % options
def install(self): def install(self):
pgdata = self.options['pgdata-directory'] pgdata = self.options['pgdata-directory']
# if the pgdata already exists, skip all steps, we don't need to do anything.
if not os.path.exists(pgdata): if not os.path.exists(pgdata):
self.createCluster() self.createCluster()
self.createConfig() self.createConfig()
...@@ -77,10 +66,12 @@ class Recipe(GenericBaseRecipe): ...@@ -77,10 +66,12 @@ class Recipe(GenericBaseRecipe):
self.createSuperuser() self.createSuperuser()
self.createRunScript() self.createRunScript()
return [ # install() methods usually return the pathnames of managed files.
# XXX should we really return something here? # If they are missing, they will be rebuilt.
# os.path.join(pgdata, 'postgresql.conf') # In this case, we already check for the existence of pgdata,
] # so we don't need to return anything here.
return []
def check_exists(self, path): def check_exists(self, path):
...@@ -89,6 +80,13 @@ class Recipe(GenericBaseRecipe): ...@@ -89,6 +80,13 @@ class Recipe(GenericBaseRecipe):
def createCluster(self): def createCluster(self):
"""\
A Postgres cluster is "a collection of databases that is managed
by a single instance of a running database server".
Here we create an empty cluster. The authentication for this
command is through the unix socket.
"""
initdb_binary = os.path.join(self.options['bin'], 'initdb') initdb_binary = os.path.join(self.options['bin'], 'initdb')
self.check_exists(initdb_binary) self.check_exists(initdb_binary)
...@@ -106,10 +104,12 @@ class Recipe(GenericBaseRecipe): ...@@ -106,10 +104,12 @@ class Recipe(GenericBaseRecipe):
def createConfig(self): def createConfig(self):
pgdata = self.options['pgdata-directory'] pgdata = self.options['pgdata-directory']
ipv4 = self.options['ipv4']
ipv6 = self.options['ipv6']
with open(os.path.join(pgdata, 'postgresql.conf'), 'wb') as cfg: with open(os.path.join(pgdata, 'postgresql.conf'), 'wb') as cfg:
cfg.write(textwrap.dedent("""\ cfg.write(textwrap.dedent("""\
listen_addresses = '%s,%s' listen_addresses = '%s'
logging_collector = on logging_collector = on
log_rotation_size = 50MB log_rotation_size = 50MB
max_connections = 100 max_connections = 100
...@@ -124,25 +124,29 @@ class Recipe(GenericBaseRecipe): ...@@ -124,25 +124,29 @@ class Recipe(GenericBaseRecipe):
unix_socket_directory = '%s' unix_socket_directory = '%s'
unix_socket_permissions = 0700 unix_socket_permissions = 0700
""" % ( """ % (
self.options['ipv4_host'], ','.join(ipv4.union(ipv6)),
self.fetch_ipv6_host(self.options),
pgdata, pgdata,
))) )))
with open(os.path.join(pgdata, 'pg_hba.conf'), 'wb') as cfg: with open(os.path.join(pgdata, 'pg_hba.conf'), 'wb') as cfg:
# see http://www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html # see http://www.postgresql.org/docs/9.1/static/auth-pg-hba-conf.html
cfg.write(textwrap.dedent("""\ cfg_lines = [
# TYPE DATABASE USER ADDRESS METHOD '# TYPE DATABASE USER ADDRESS METHOD',
'',
'# "local" is for Unix domain socket connections only (check unix_socket_permissions!)',
'local all all ident',
'host all all 127.0.0.1/32 md5',
'host all all ::1/128 md5',
]
# "local" is for Unix domain socket connections only (check unix_socket_permissions!) for ip in ipv4:
local all all ident cfg_lines.append('host all all %s/32 md5' % ip)
host all all 127.0.0.1/32 md5
host all all %s/32 md5 for ip in ipv6:
host all all ::1/128 md5 cfg_lines.append('host all all %s/128 md5' % ip)
host all all %s/128 md5
""" % (self.options['ipv4_host'], self.fetch_ipv6_host(self.options)))) cfg.write('\n'.join(cfg_lines))
def createDatabase(self): def createDatabase(self):
...@@ -150,7 +154,7 @@ class Recipe(GenericBaseRecipe): ...@@ -150,7 +154,7 @@ class Recipe(GenericBaseRecipe):
def createSuperuser(self): def createSuperuser(self):
""" """\
Creates a Postgres superuser - other than "slapuser#" for use by the application. Creates a Postgres superuser - other than "slapuser#" for use by the application.
""" """
...@@ -166,7 +170,7 @@ class Recipe(GenericBaseRecipe): ...@@ -166,7 +170,7 @@ class Recipe(GenericBaseRecipe):
def runPostgresCommand(self, cmd): def runPostgresCommand(self, cmd):
""" """\
Executes a command in single-user mode, with no daemon running. Executes a command in single-user mode, with no daemon running.
Multiple commands can be executed by providing newlines, Multiple commands can be executed by providing newlines,
...@@ -190,7 +194,7 @@ class Recipe(GenericBaseRecipe): ...@@ -190,7 +194,7 @@ class Recipe(GenericBaseRecipe):
def createRunScript(self): def createRunScript(self):
""" """\
Creates a script that runs postgres in the foreground. Creates a script that runs postgres in the foreground.
'exec' is used to allow easy control by supervisor. 'exec' is used to allow easy control by supervisor.
""" """
...@@ -207,14 +211,13 @@ class Recipe(GenericBaseRecipe): ...@@ -207,14 +211,13 @@ class Recipe(GenericBaseRecipe):
class ExportRecipe(GenericBaseRecipe): class ExportRecipe(GenericBaseRecipe):
def install(self): def install(self):
pgdata = self.options['pgdata-directory']
wrapper = self.options['wrapper'] wrapper = self.options['wrapper']
self.createBackupScript(wrapper) self.createBackupScript(wrapper)
return [wrapper] return [wrapper]
def createBackupScript(self, wrapper): def createBackupScript(self, wrapper):
""" """\
Create a script to backup the database in 'custom' format. Create a script to backup the database in 'custom' format.
""" """
content = textwrap.dedent("""\ content = textwrap.dedent("""\
...@@ -233,14 +236,13 @@ class ExportRecipe(GenericBaseRecipe): ...@@ -233,14 +236,13 @@ class ExportRecipe(GenericBaseRecipe):
class ImportRecipe(GenericBaseRecipe): class ImportRecipe(GenericBaseRecipe):
def install(self): def install(self):
pgdata = self.options['pgdata-directory']
wrapper = self.options['wrapper'] wrapper = self.options['wrapper']
self.createRestoreScript(wrapper) self.createRestoreScript(wrapper)
return [wrapper] return [wrapper]
def createRestoreScript(self, wrapper): def createRestoreScript(self, wrapper):
""" """\
Create a script to restore the database from 'custom' format. Create a script to restore the database from 'custom' format.
""" """
content = textwrap.dedent("""\ content = textwrap.dedent("""\
...@@ -256,5 +258,3 @@ class ImportRecipe(GenericBaseRecipe): ...@@ -256,5 +258,3 @@ class ImportRecipe(GenericBaseRecipe):
self.createExecutable(wrapper, content=content) self.createExecutable(wrapper, content=content)
...@@ -64,6 +64,10 @@ class Recipe(object): ...@@ -64,6 +64,10 @@ class Recipe(object):
Set of IPv4 addresses. Set of IPv4 addresses.
ipv6 ipv6
Set of IPv6 addresses. Set of IPv6 addresses.
ipv4_random
One of the IPv4 addresses.
ipv6_random
One of the IPv6 addresses.
tap tap
Set of TAP interfaces. Set of TAP interfaces.
configuration configuration
...@@ -109,6 +113,13 @@ class Recipe(object): ...@@ -109,6 +113,13 @@ class Recipe(object):
# XXX: emit warning on unknown address type ? # XXX: emit warning on unknown address type ?
options['ipv4'] = ipv4_set options['ipv4'] = ipv4_set
options['ipv6'] = ipv6_set options['ipv6'] = ipv6_set
# also export single ip values for those recipes that don't support sets.
if ipv4_set:
options['ipv4_random'] = list(ipv4_set)[0]
if ipv6_set:
options['ipv6_random'] = list(ipv6_set)[0]
options['tap'] = tap_set options['tap'] = tap_set
options['configuration'] = parameter_dict options['configuration'] = parameter_dict
match = self.OPTCRE_match match = self.OPTCRE_match
......
# Exactly the same as software.cfg, but fetch the slapos.cookbook and
# slapos.toolbox from git repository instead of fetching stable version,
# allowing to play with bleeding edge environment.
# You'll need to run buildout twice for this profile.
[buildout]
extends =
../../component/git/buildout.cfg
software.cfg
parts +=
# Development parts
slapos.cookbook-repository
slapos.core-repository
slapos.toolbox-repository
slapos.recipe.maarch-repository
check-recipe
develop =
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.core-repository
${:parts-directory}/slapos.toolbox-repository
${:parts-directory}/slapos.recipe.maarch-repository
[slapos.toolbox-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.toolbox.git
branch = master
git-executable = ${git:location}/bin/git
[slapos.cookbook-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.git
branch = lapp-resilient3
git-executable = ${git:location}/bin/git
[slapos.core-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.core.git
branch = master
git-executable = ${git:location}/bin/git
[slapos.recipe.maarch-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.recipe.maarch.git
branch = master
git-executable = ${git:location}/bin/git
[check-recipe]
recipe = plone.recipe.command
stop-on-error = true
update-command = ${:command}
command =
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.core.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.toolbox.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.recipe.maarch.egg-link
# Unpin versions, in case it has been pinned in software.cfg
[versions]
slapos.cookbook =
slapos.toolbox =
slapos.core =
slapos.recipe.maarch =
[buildout] [buildout]
extends = extends =
../../component/git/buildout.cfg
../../stack/lapp/buildout.cfg ../../stack/lapp/buildout.cfg
develop =
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.recipe.maarch-repository
# += since we need rdiff-backup and friends # += since we need rdiff-backup and friends
parts += parts +=
slapos-cookbook slapos-cookbook
...@@ -11,6 +18,36 @@ parts += ...@@ -11,6 +18,36 @@ parts +=
eggs eggs
instance instance
instance-apache-php instance-apache-php
slapos.cookbook-repository
slapos.recipe.maarch-repository
check-recipe
[versions]
slapos.cookbook =
slapos.recipe.maarch =
[slapos.recipe.maarch-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.recipe.maarch.git
branch = master
git-executable = ${git:location}/bin/git
[slapos.cookbook-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.git
branch = lapp-resilient3
git-executable = ${git:location}/bin/git
[check-recipe]
recipe = plone.recipe.command
stop-on-error = true
update-command = ${:command}
command =
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.recipe.maarch.egg-link
#---------------- #----------------
#-- #--
...@@ -71,6 +108,6 @@ install_cmd = ...@@ -71,6 +108,6 @@ install_cmd =
${:pear} info maarch/CLITools-0.3.1 >/dev/null || ${:pear} install maarch/CLITools-0.3.1 ${:pear} info maarch/CLITools-0.3.1 >/dev/null || ${:pear} install maarch/CLITools-0.3.1
${:pear} info MIME_Type >/dev/null || ${:pear} install MIME_Type ${:pear} info MIME_Type >/dev/null || ${:pear} install MIME_Type
#----------------
#----------------
...@@ -42,15 +42,16 @@ symlink_base = ${postgresql:location}/bin ...@@ -42,15 +42,16 @@ symlink_base = ${postgresql:location}/bin
recipe = slapos.cookbook:postgres recipe = slapos.cookbook:postgres
# Options # Options
ipv6_host = $${instance-parameters:ipv6} ipv6 = $${instance-parameters:ipv6}
ipv4_host = $${slap-network-information:local-ipv4} ipv4 = $${instance-parameters:ipv4}
ipv6_random = $${instance-parameters:ipv6_random}
user = user user = user
port = 5432 port = 5432
dbname = db dbname = db
# pgdata_directory is created by initdb, and should not exist beforehand. # pgdata_directory is created by initdb, and should not exist beforehand.
pgdata-directory = $${directories:var}/data pgdata-directory = $${directories:var}/data
services = $${directories:services}
bin = $${directories:bin} bin = $${directories:bin}
services = $${directories:services}
[publish] [publish]
......
...@@ -14,7 +14,7 @@ parts = ...@@ -14,7 +14,7 @@ parts =
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance.cfg.in url = ${:_profile_base_location_}/instance.cfg.in
output = ${buildout:directory}/template.cfg output = ${buildout:directory}/template.cfg
#md5sum = md5sum = 5ccffbfc2f1d06fd3ef199bc8b643db7
mode = 0644 mode = 0644
......
# Exactly the same as software.cfg, but fetch the slapos.cookbook and
# slapos.toolbox from git repository instead of fetching stable version,
# allowing to play with bleeding edge environment.
# You'll need to run buildout twice for this profile.
[buildout]
extends =
../../component/git/buildout.cfg
software.cfg
parts +=
# Development parts
slapos.cookbook-repository
slapos.core-repository
slapos.toolbox-repository
check-recipe
develop =
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.core-repository
${:parts-directory}/slapos.toolbox-repository
[slapos.toolbox-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.toolbox.git
branch = master
git-executable = ${git:location}/bin/git
[slapos.cookbook-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.git
branch = lapp-resilient3
git-executable = ${git:location}/bin/git
[slapos.core-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.core.git
branch = master
git-executable = ${git:location}/bin/git
[check-recipe]
recipe = plone.recipe.command
stop-on-error = true
update-command = ${:command}
command =
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.core.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.toolbox.egg-link
# Unpin versions, in case it has been pinned in software.cfg
[versions]
slapos.cookbook =
slapos.toolbox =
slapos.core =
...@@ -3,8 +3,8 @@ extends = ...@@ -3,8 +3,8 @@ extends =
../../stack/lamp/buildout.cfg ../../stack/lamp/buildout.cfg
[application] [application]
url = http://wordpress.org/wordpress-3.4.2.tar.gz url = http://wordpress.org/wordpress-3.5.tar.gz
md5sum = dfc56cee27eec8fb79070f033ecd4b25 md5sum = 105b5baff67344528bb5d8b71c050b0d
[application-template] [application-template]
recipe = slapos.recipe.download recipe = slapos.recipe.download
......
...@@ -36,7 +36,7 @@ tmp = $${buildout:directory}/tmp ...@@ -36,7 +36,7 @@ tmp = $${buildout:directory}/tmp
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
promises = $${rootdirectory:etc}/promise promises = $${rootdirectory:etc}/promise
......
...@@ -53,7 +53,7 @@ keep-compile-dir = false ...@@ -53,7 +53,7 @@ keep-compile-dir = false
[application] [application]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
#If provided tarball does not containt top directory this option shall be changed to false # If the provided tarball does not contain top directory, this option should be changed to false
strip-top-level-dir = true strip-top-level-dir = true
...@@ -71,7 +71,7 @@ mode = 0644 ...@@ -71,7 +71,7 @@ mode = 0644
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
output = ${buildout:directory}/instance-apache-php.cfg output = ${buildout:directory}/instance-apache-php.cfg
md5sum = fc29d853dcd0802dd61c60b09e898c11 md5sum = bf3219cd7d318e02e39c462fbb530715
mode = 0644 mode = 0644
[instance-apache-backup] [instance-apache-backup]
...@@ -101,21 +101,21 @@ mode = 0644 ...@@ -101,21 +101,21 @@ mode = 0644
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/mariadb/instance-mariadb.cfg.in url = ${:_profile_base_location_}/mariadb/instance-mariadb.cfg.in
output = ${buildout:directory}/instance-mariadb.cfg output = ${buildout:directory}/instance-mariadb.cfg
md5sum = ba8dd08dfd5e6a9dc614693d066eb21d md5sum = fafb873323c0084c522360f94ebe1df7
mode = 0644 mode = 0644
[instance-mariadb-import] [instance-mariadb-import]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/mariadb/instance-mariadb-import.cfg.in url = ${:_profile_base_location_}/mariadb/instance-mariadb-import.cfg.in
output = ${buildout:directory}/instance-mariadb-import.cfg output = ${buildout:directory}/instance-mariadb-import.cfg
md5sum = ea43b8ed38a55a11b027fc283c0e718a md5sum = 8009627bb669d1fee0df030daa8d3bdc
mode = 0644 mode = 0644
[instance-mariadb-export] [instance-mariadb-export]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/mariadb/instance-mariadb-export.cfg.in url = ${:_profile_base_location_}/mariadb/instance-mariadb-export.cfg.in
output = ${buildout:directory}/instance-mariadb-export.cfg output = ${buildout:directory}/instance-mariadb-export.cfg
md5sum = 685c8abf0f487c72273846002ec631a0 md5sum = 0513bf25fbb20cccd57f285c40d96498
mode = 0644 mode = 0644
...@@ -277,108 +277,82 @@ signature-certificate-list = ...@@ -277,108 +277,82 @@ signature-certificate-list =
n9MuhWaT21VOYhIGzJFPw5XW47/RrwhR n9MuhWaT21VOYhIGzJFPw5XW47/RrwhR
-----END CERTIFICATE----- -----END CERTIFICATE-----
[versions]
# 1.2.4b doesn't download
MySQL-python = 1.2.3
[versions]
Jinja2 = 2.6 Jinja2 = 2.6
Werkzeug = 0.8.3 Werkzeug = 0.8.3
apache-libcloud = 0.11.3 apache-libcloud = 0.11.4
async = 0.6.1 async = 0.6.1
buildout-versions = 1.7 buildout-versions = 1.7
gitdb = 0.5.4 gitdb = 0.5.4
hexagonit.recipe.cmmi = 1.6 hexagonit.recipe.cmmi = 1.6
meld3 = 0.6.9 inotifyx = 0.2.0
lxml = 3.0.2
meld3 = 0.6.10
netaddr = 0.7.10
pycrypto = 2.6 pycrypto = 2.6
pytz = 2012h
rdiff-backup = 1.0.5 rdiff-backup = 1.0.5
slapos.cookbook = 0.69
slapos.recipe.build = 0.11.5 slapos.recipe.build = 0.11.5
slapos.recipe.download = 1.0.dev-r4053 slapos.recipe.download = 1.0.dev-r4053
slapos.recipe.template = 2.4.2 slapos.recipe.template = 2.4.2
slapos.toolbox = 0.31
smmap = 0.8.2 smmap = 0.8.2
# Required by: # Required by:
# slapos.core==0.31.2 # slapos.core==0.33.2-dev
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
Flask = 0.9 Flask = 0.9
# Required by: # Required by:
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
GitPython = 0.3.2.RC1 GitPython = 0.3.2.RC1
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.toolbox==0.32.1-dev
PyXML = 0.8.4
# Required by:
# slapos.toolbox==0.31
atomize = 0.1.1 atomize = 0.1.1
# Required by: # Required by:
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
feedparser = 5.1.2 feedparser = 5.1.3
# Required by: # Required by:
# hexagonit.recipe.cmmi==1.6 # hexagonit.recipe.cmmi==1.6
hexagonit.recipe.download = 1.5.1 hexagonit.recipe.download = 1.6
# Required by:
# slapos.cookbook==0.69
inotifyx = 0.2.0
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.core==0.33.2-dev
# slapos.core==0.31.2
# xml-marshaller==0.9.7
lxml = 3.0.1
# Required by:
# slapos.cookbook==0.69
netaddr = 0.7.10
# Required by:
# slapos.core==0.31.2
netifaces = 0.8 netifaces = 0.8
# Required by: # Required by:
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
paramiko = 1.7.7.2 paramiko = 1.9.0
# Required by: # Required by:
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
psutil = 0.6.1 psutil = 0.6.1
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.core==0.33.2-dev
pytz = 2012f pyflakes = 0.5.0
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.cookbook==0.70.1-dev
# slapos.core==0.31.2 # slapos.core==0.33.2-dev
# slapos.toolbox==0.31 # slapos.toolbox==0.32.1-dev
# supervisor==3.0b1
# zc.buildout==1.6.0-dev-SlapOS-010 # zc.buildout==1.6.0-dev-SlapOS-010
# zc.recipe.egg==1.3.2 # zope.interface==4.0.2
setuptools = 0.6c12dev-r88846 setuptools = 0.6c12dev-r88846
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.core==0.33.2-dev
# slapos.toolbox==0.31
slapos.core = 0.31.2
# Required by:
# slapos.core==0.31.2
supervisor = 3.0b1 supervisor = 3.0b1
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.toolbox==0.32.1-dev
# slapos.toolbox==0.31
xml-marshaller = 0.9.7 xml-marshaller = 0.9.7
# Required by: # Required by:
# slapos.cookbook==0.69 # slapos.core==0.33.2-dev
zc.recipe.egg = 1.3.2 zope.interface = 4.0.2
# Required by:
# slapos.core==0.31.2
zope.interface = 4.0.1
...@@ -2,7 +2,13 @@ ...@@ -2,7 +2,13 @@
extends = ${instance-mariadb:output} extends = ${instance-mariadb:output}
${pbsready-export:output} ${pbsready-export:output}
parts += mariadb
parts +=
mariadb
# have to repeat the next one, as it's not inherited from pbsready-export
cron-entry-backup
[exporter] [exporter]
recipe = slapos.cookbook:mydumper recipe = slapos.cookbook:mydumper
......
...@@ -2,7 +2,12 @@ ...@@ -2,7 +2,12 @@
extends = ${instance-mariadb:output} extends = ${instance-mariadb:output}
${pbsready-import:output} ${pbsready-import:output}
parts += mariadb
parts +=
mariadb
# have to repeat the next one, as it's not inherited from pbsready-import
import-on-notification
[importer] [importer]
recipe = slapos.cookbook:mydumper recipe = slapos.cookbook:mydumper
......
...@@ -37,7 +37,7 @@ bin = $${buildout:directory}/bin ...@@ -37,7 +37,7 @@ bin = $${buildout:directory}/bin
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
script = $${rootdirectory:etc}/script script = $${rootdirectory:etc}/script
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
......
...@@ -8,9 +8,9 @@ This fork of the LAMP stack provides: ...@@ -8,9 +8,9 @@ This fork of the LAMP stack provides:
Log rotation is handled by Postgres itself. Log rotation is handled by Postgres itself.
- symlinks to all the postgres binaries, usable through unix socket - symlinks to all the postgres binaries, usable through unix socket
with no further authentication, or through ipv6 with no further authentication, or through ipv4/ipv6 with password
- a psycopg2 (postgres driver) egg - a psycopg2 (postgres driver) egg to be used by further configuration recipes
- configuration for a maarch instance (this part should be brought outside the stack) - a hook (custom-application-deployment) for configuring the PHP application
...@@ -32,7 +32,7 @@ tmp = $${buildout:directory}/tmp ...@@ -32,7 +32,7 @@ tmp = $${buildout:directory}/tmp
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
promises = $${rootdirectory:etc}/promise promises = $${rootdirectory:etc}/promise
......
...@@ -38,7 +38,7 @@ tmp = $${buildout:directory}/tmp ...@@ -38,7 +38,7 @@ tmp = $${buildout:directory}/tmp
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
promises = $${rootdirectory:etc}/promise promises = $${rootdirectory:etc}/promise
......
...@@ -39,6 +39,7 @@ extends = ...@@ -39,6 +39,7 @@ extends =
[application] [application]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
# If the provided tarball does not contain top directory, this option should be changed to false
strip-top-level-dir = true strip-top-level-dir = true
...@@ -56,14 +57,14 @@ mode = 0644 ...@@ -56,14 +57,14 @@ mode = 0644
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
output = ${buildout:directory}/instance-apache-php.cfg output = ${buildout:directory}/instance-apache-php.cfg
md5sum = bed286b680bd8cd494da080cdc229f1e md5sum = 3e4b7c176a7de23843f77261d88dd0b8
mode = 0644 mode = 0644
[instance-apache-backup] [instance-apache-backup]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-backup.cfg.in url = ${:_profile_base_location_}/apache/instance-apache-backup.cfg.in
output = ${buildout:directory}/instance-apache-backup.cfg output = ${buildout:directory}/instance-apache-backup.cfg
md5sum = 48f969d82319a9d145570f5f0fd27672 md5sum = db879141c0b6a77ef8b3b7e699f5583a
mode = 0644 mode = 0644
[template-resilient-lapp] [template-resilient-lapp]
...@@ -86,21 +87,21 @@ mode = 0644 ...@@ -86,21 +87,21 @@ mode = 0644
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/postgres/instance-postgres.cfg.in url = ${:_profile_base_location_}/postgres/instance-postgres.cfg.in
output = ${buildout:directory}/instance-postgres.cfg output = ${buildout:directory}/instance-postgres.cfg
md5sum = c5cd2a644fcd8450bc5d13bf53ec9f7d md5sum = 4a339ed20f7579e5558fc53637e441fd
mode = 0644 mode = 0644
[instance-postgres-import] [instance-postgres-import]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/postgres/instance-postgres-import.cfg.in url = ${:_profile_base_location_}/postgres/instance-postgres-import.cfg.in
output = ${buildout:directory}/instance-postgres-import.cfg output = ${buildout:directory}/instance-postgres-import.cfg
md5sum = 1989ba2164dd5f79793a04e0a02ea515 md5sum = 7edfa157ddccc27e99bf128fc1c2b9ee
mode = 0644 mode = 0644
[instance-postgres-export] [instance-postgres-export]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/postgres/instance-postgres-export.cfg.in url = ${:_profile_base_location_}/postgres/instance-postgres-export.cfg.in
output = ${buildout:directory}/instance-postgres-export.cfg output = ${buildout:directory}/instance-postgres-export.cfg
md5sum = 7bce31bc22a731a8fc6119aee96586f5 md5sum = 68080e5d861eb3474442211dd65c668b
mode = 0644 mode = 0644
...@@ -165,5 +166,82 @@ eggs = ...@@ -165,5 +166,82 @@ eggs =
[versions] [versions]
Jinja2 = 2.6
Werkzeug = 0.8.3
apache-libcloud = 0.11.4
async = 0.6.1
buildout-versions = 1.7
cns.recipe.symlink = 0.2.3
gitdb = 0.5.4
hexagonit.recipe.cmmi = 1.6
inotifyx = 0.2.0
lxml = 3.0.2
meld3 = 0.6.10 meld3 = 0.6.10
netaddr = 0.7.10
psycopg2 = 2.4.6
pycrypto = 2.6
pytz = 2012h
rdiff-backup = 1.0.5
slapos.recipe.download = 1.0.dev-r4053
slapos.recipe.template = 2.4.2
smmap = 0.8.2
# Required by:
# slapos.core==0.33.2-dev
# slapos.toolbox==0.32.1-dev
Flask = 0.9
# Required by:
# slapos.toolbox==0.32.1-dev
GitPython = 0.3.2.RC1
# Required by:
# slapos.toolbox==0.32.1-dev
atomize = 0.1.1
# Required by:
# slapos.toolbox==0.32.1-dev
feedparser = 5.1.3
# Required by:
# hexagonit.recipe.cmmi==1.6
hexagonit.recipe.download = 1.6
# Required by:
# slapos.core==0.33.2-dev
netifaces = 0.8
# Required by:
# slapos.toolbox==0.32.1-dev
paramiko = 1.9.0
# Required by:
# slapos.toolbox==0.32.1-dev
psutil = 0.6.1
# Required by:
# slapos.core==0.33.2-dev
pyflakes = 0.5.0
# Required by:
# cns.recipe.symlink==0.2.3
# slapos.cookbook==0.70.1-dev
# slapos.core==0.33.2-dev
# slapos.toolbox==0.32.1-dev
# supervisor==3.0b1
# zc.buildout==1.6.0-dev-SlapOS-010
# zope.interface==4.0.2
setuptools = 0.6c12dev-r88846
# Required by:
# slapos.core==0.33.2-dev
supervisor = 3.0b1
# Required by:
# slapos.toolbox==0.32.1-dev
xml-marshaller = 0.9.7
# Required by:
# slapos.core==0.33.2-dev
zope.interface = 4.0.2
...@@ -4,9 +4,12 @@ extends = ${instance-postgres:output} ...@@ -4,9 +4,12 @@ extends = ${instance-postgres:output}
parts += parts +=
urls urls
postgres-instance postgres-instance
postgres-promise postgres-promise
# have to repeat the next one, as it's not inherited from pbsready-export
cron-entry-backup
[exporter] [exporter]
......
...@@ -4,7 +4,10 @@ extends = ${instance-postgres:output} ...@@ -4,7 +4,10 @@ extends = ${instance-postgres:output}
parts += parts +=
postgres-instance postgres-instance
# have to repeat the next one, as it's not inherited from pbsready-import
import-on-notification
[importer] [importer]
recipe = slapos.cookbook:postgres.import recipe = slapos.cookbook:postgres.import
......
...@@ -37,7 +37,7 @@ bin = $${buildout:directory}/bin ...@@ -37,7 +37,7 @@ bin = $${buildout:directory}/bin
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
script = $${rootdirectory:etc}/script script = $${rootdirectory:etc}/script
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
...@@ -134,9 +134,9 @@ config-file = $${directory:stunnel-conf}/stunnel.conf ...@@ -134,9 +134,9 @@ config-file = $${directory:stunnel-conf}/stunnel.conf
key-file = $${directory:stunnel-conf}/stunnel.key key-file = $${directory:stunnel-conf}/stunnel.key
cert-file = $${directory:stunnel-conf}/stunnel.crt cert-file = $${directory:stunnel-conf}/stunnel.crt
pid-file = $${basedirectory:run}/stunnel.pid pid-file = $${basedirectory:run}/stunnel.pid
local-host = $${postgres-instance:ipv4_host} local-host = $${instance-parameters:ipv4_random}
local-port = $${postgres-instance:port} local-port = $${postgres-instance:port}
remote-host = $${slap-network-information:global-ipv6} remote-host = $${instance-parameters:ipv6_random}
remote-port = 6446 remote-port = 6446
client = false client = false
post-rotate-script = $${rootdirectory:bin}/stunnel_post_rotate post-rotate-script = $${rootdirectory:bin}/stunnel_post_rotate
...@@ -171,19 +171,19 @@ crl = $${directory:ca-dir}/crl/ ...@@ -171,19 +171,19 @@ crl = $${directory:ca-dir}/crl/
[postgres-instance] [postgres-instance]
recipe = slapos.cookbook:postgres recipe = slapos.cookbook:postgres
ipv6_host = $${slap-network-information:global-ipv6} ipv6 = $${instance-parameters:ipv6}
ipv4 = $${instance-parameters:ipv4}
ipv6_random = $${instance-parameters:ipv6_random}
user = postgres user = postgres
port = 5432 port = 5432
dbname = db dbname = db
# XXX the next line is required by stunnel, not by us
ipv4_host = $${slap-network-information:local-ipv4}
# pgdata_directory is created by initdb, and should not exist beforehand. # pgdata_directory is created by initdb, and should not exist beforehand.
pgdata-directory = $${rootdirectory:var}/data pgdata-directory = $${rootdirectory:var}/data
backup-directory = $${basedirectory:backup}/postgres backup-directory = $${basedirectory:backup}/postgres
services = $${basedirectory:services}
bin = $${rootdirectory:bin} bin = $${rootdirectory:bin}
services = $${basedirectory:services}
dependency-symlinks = $${symlinks:recipe} dependency-symlinks = $${symlinks:recipe}
[ca-stunnel] [ca-stunnel]
<= certificate-authority <= certificate-authority
recipe = slapos.cookbook:certificate_authority.request recipe = slapos.cookbook:certificate_authority.request
...@@ -227,7 +227,7 @@ path = $${directory:report}/slapmonitor-xml ...@@ -227,7 +227,7 @@ path = $${directory:report}/slapmonitor-xml
[postgres-promise] [postgres-promise]
recipe = slapos.cookbook:check_port_listening recipe = slapos.cookbook:check_port_listening
path = $${basedirectory:promises}/postgres path = $${basedirectory:promises}/postgres
hostname = $${slap-network-information:global-ipv6} hostname = $${instance-parameters:ipv6_random}
port = $${postgres-instance:port} port = $${postgres-instance:port}
...@@ -238,7 +238,7 @@ port = $${postgres-instance:port} ...@@ -238,7 +238,7 @@ port = $${postgres-instance:port}
[urls] [urls]
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
url = $${postgres-instance:url} url = $${postgres-instance:url}
ip = $${slap-network-information:global-ipv6} ip = $${instance-parameters:ipv6_random}
#---------------- #----------------
#-- #--
......
Base resilient stack
====================
This stack is meant to be extended by SR profiles, or other stacks, that need to provide
automated backup/restore, election of backup candidates, and instance failover.
As reference implementations, both stack/lamp and stack/lapp define resilient behavior for
MySQL and Postgres respectively.
This involves three different software_types:
* pull-backup
* {something}_export
* {something}_import
where 'something' is the component that needs resiliency (can be postgres, mysql, erp5, and so on).
pull-backup
-----------
This software type is defined in
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/stack/resilient/instance-pull-backup.cfg.in?js=1
and there should be no reason to modify or extend it.
An instance of type 'pull-backup' will receive data from an 'export' instance and immediately populate an 'import' instance.
The backup data is automatically used to build an historical, incremental archive in srv/backup/pbs.
export
------
example:
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/stack/lapp/postgres/instance-postgres-export.cfg.in?js=1
This is the *active* instance - the one providing live data to the application.
A backup is run via the bin/exporter script: it will
1) run bin/{something}-backup
and 2) notify the pull-backup instance that data is ready.
The pull-backup, upon receiving the notification, will make a copy of the data and transmit it to the 'import' instances.
You should provide the bin/{something}-exporter script, see for instance
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/slapos/recipe/postgres/__init__.py?js=1#l207
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/slapos/recipe/mydumper.py?js=1#l71
By default, as defined in
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/stack/resilient/pbsready-export.cfg.in?js=1#l27
the bin/exporter script is run every 60 minutes.
import
------
example:
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/stack/lapp/postgres/instance-postgres-import.cfg.in?js=1
This is the *fallback* instance - the one that can be activated and thus become active.
Any number of import instances can be used. Deciding which one should take over can be done manually
or through a monitoring + election script.
You should provide the bin/{something}-importer script, see for instance
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/slapos/recipe/postgres/__init__.py?js=1#l233
http://git.erp5.org/gitweb/slapos.git/blob/HEAD:/slapos/recipe/mydumper.py?js=1#l71
...@@ -22,7 +22,7 @@ parts = ...@@ -22,7 +22,7 @@ parts =
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/pbsready.cfg.in url = ${:_profile_base_location_}/pbsready.cfg.in
output = ${buildout:directory}/pbsready.cfg output = ${buildout:directory}/pbsready.cfg
md5sum = a2edaadfe652b4b131626b4801768f40 md5sum = e602f6746cbe5a1da82b90097719c4a1
mode = 0644 mode = 0644
[pbsready-import] [pbsready-import]
...@@ -47,7 +47,7 @@ mode = 0644 ...@@ -47,7 +47,7 @@ mode = 0644
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-pull-backup.cfg.in url = ${:_profile_base_location_}/instance-pull-backup.cfg.in
output = ${buildout:directory}/instance-pull-backup.cfg output = ${buildout:directory}/instance-pull-backup.cfg
md5sum = 18b88cd012e886fbaa457b03928c2d10 md5sum = 453d96f5a6c1230c01c878cc7640bae6
mode = 0644 mode = 0644
[template-replicated] [template-replicated]
......
...@@ -30,7 +30,7 @@ var = $${buildout:directory}/var ...@@ -30,7 +30,7 @@ var = $${buildout:directory}/var
[basedirectory] [basedirectory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
log = $${rootdirectory:var}/log log = $${rootdirectory:var}/log
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
run = $${rootdirectory:var}/run run = $${rootdirectory:var}/run
backup = $${rootdirectory:srv}/backup backup = $${rootdirectory:srv}/backup
promises = $${rootdirectory:etc}/promise promises = $${rootdirectory:etc}/promise
......
...@@ -24,7 +24,7 @@ parts += ...@@ -24,7 +24,7 @@ parts +=
#-- Creation of all needed directories. #-- Creation of all needed directories.
[basedirectory] [basedirectory]
services = $${rootdirectory:etc}/run services = $${rootdirectory:etc}/service
cache = $${rootdirectory:var}/cache cache = $${rootdirectory:var}/cache
notifier = $${rootdirectory:etc}/notifier notifier = $${rootdirectory:etc}/notifier
......
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