Commit f51d21f9 authored by Kazuhiko Shiozaki's avatar Kazuhiko Shiozaki

Merge remote-tracking branch 'origin/master' into erp5-cluster

parents 6d74d3b8 e543010a
[buildout] [buildout]
extends = extends =
../alsa/buildout.cfg ../alsa/buildout.cfg
../xorg/buildout.cfg ../dash/buildout.cfg
../fontconfig/buildout.cfg
../dbus/buildout.cfg ../dbus/buildout.cfg
../fontconfig/buildout.cfg
../gtk-2/buildout.cfg ../gtk-2/buildout.cfg
../libffi/buildout.cfg
../libpng/buildout.cfg ../libpng/buildout.cfg
../dash/buildout.cfg ../p11-kit/buildout.cfg
../xorg/buildout.cfg
parts = parts =
firefox firefox
...@@ -24,12 +26,12 @@ depends = ...@@ -24,12 +26,12 @@ depends =
${liberation-fonts:location} ${liberation-fonts:location}
${ipaex-fonts:location} ${ipaex-fonts:location}
version = 29.0.1 version = 30.0
# MD5SUMs are available at : # MD5SUMs are available at :
# https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/${:version}/MD5SUMS # https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/${:version}/MD5SUMS
x86 = http://download-installer.cdn.mozilla.net/pub/firefox/releases/${:version}/linux-i686/en-US/firefox-${:version}.tar.bz2 3cbe2bf2b0feb988c14dc2446fe5be9d x86 = http://download-installer.cdn.mozilla.net/pub/firefox/releases/${:version}/linux-i686/en-US/firefox-${:version}.tar.bz2 469be1f0aaf537f16e17c324bb5baa6b
x86-64 = http://download-installer.cdn.mozilla.net/pub/firefox/releases/${:version}/linux-x86_64/en-US/firefox-${:version}.tar.bz2 80070b4e236ef0897b680fb340b7331b x86-64 = http://download-installer.cdn.mozilla.net/pub/firefox/releases/${:version}/linux-x86_64/en-US/firefox-${:version}.tar.bz2 a4979b84a7d68f77d4109282a468f041
script = script =
if not self.options.get('url'): self.options['url'], self.options['md5sum'] = self.options[guessPlatform()].split(' ') if not self.options.get('url'): self.options['url'], self.options['md5sum'] = self.options[guessPlatform()].split(' ')
...@@ -40,7 +42,7 @@ script = ...@@ -40,7 +42,7 @@ script =
wrapper = open(wrapper_location, 'w') wrapper = open(wrapper_location, 'w')
wrapper.write("""#!${dash:location}/bin/dash wrapper.write("""#!${dash:location}/bin/dash
cd %(location)s cd %(location)s
export LD_LIBRARY_PATH=%(location)s:${alsa:location}/lib:${atk:location}/lib:${bzip2:location}/lib:${cairo:location}/lib:${dbus:location}/lib:${dbus-glib:location}/lib:${fontconfig:location}/lib:${freetype:location}/lib:${gdk-pixbuf:location}/lib:${gettext:location}/lib:${glib:location}/lib:${gtk-2:location}/lib:${harfbuzz:location}/lib:${libICE:location}/lib:${libSM:location}/lib:${libX11:location}/lib:${libXau:location}/lib:${libXcursor:location}/lib:${libXext:location}/lib:${libXrender:location}/lib:${libXt:location}/lib:${libffi:location}/lib:${libpng:location}/lib:${libtool:location}/lib:${libuuid:location}/lib:${libxcb:location}/lib:${libxml2:location}/lib:${pango:location}/lib:${pixman:location}/lib:${xfixes:location}/lib:${zlib:location}/lib export LD_LIBRARY_PATH=%(location)s:${alsa:location}/lib:${atk:location}/lib:${bzip2:location}/lib:${cairo:location}/lib:${dbus:location}/lib:${dbus-glib:location}/lib:${fontconfig:location}/lib:${freetype:location}/lib:${gdk-pixbuf:location}/lib:${gettext:location}/lib:${glib:location}/lib:${gtk-2:location}/lib:${harfbuzz:location}/lib:${libICE:location}/lib:${libSM:location}/lib:${libX11:location}/lib:${libXau:location}/lib:${libXcursor:location}/lib:${libXext:location}/lib:${libXrender:location}/lib:${libXt:location}/lib:${libffi:location}/lib:${libpng:location}/lib:${libtool:location}/lib:${libuuid:location}/lib:${libxcb:location}/lib:${libxml2:location}/lib:${pango:location}/lib:${p11-kit:location}/lib:${pixman:location}/lib:${xfixes:location}/lib:${zlib:location}/lib
export PATH=${fontconfig:location}/bin:$PATH export PATH=${fontconfig:location}/bin:$PATH
exec %(location)s/firefox $*""") exec %(location)s/firefox $*""")
wrapper.close() wrapper.close()
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
extends = extends =
../gmp/buildout.cfg ../gmp/buildout.cfg
../nettle/buildout.cfg ../nettle/buildout.cfg
../ncurses/buildout.cfg ../p11-kit/buildout.cfg
../readline/buildout.cfg ../pkgconfig/buildout.cfg
../xz-utils/buildout.cfg ../xz-utils/buildout.cfg
../zlib/buildout.cfg ../zlib/buildout.cfg
...@@ -11,27 +11,31 @@ parts = gnutls ...@@ -11,27 +11,31 @@ parts = gnutls
[gpg-error] [gpg-error]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
url = ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.10.tar.gz url = ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-1.13.tar.bz2
md5sum = 7c2710ef439f82ac429b88fec88e9a4c md5sum = fe0cfa7e15262ef8fdeee366109e9ff6
[gcrypt] [gcrypt]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
url = ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.5.0.tar.gz url = ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.6.1.tar.bz2
md5sum = 78f8f8bec4580f75b25816f7896d0389 md5sum = a5a5060dc2f80bcac700ab0236ea47dc
configure-options = configure-options =
--with-gpg-error-prefix=${gpg-error:location} --with-gpg-error-prefix=${gpg-error:location}
environment = environment =
CPPFLAGS=-I${gpg-error:location}/include CPPFLAGS=-I${gpg-error:location}/include
LDFLAGS=-lgpg-error -L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib LDFLAGS=-L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib
[gnutls] [gnutls]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
url = ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.0.tar.xz url = ftp://ftp.gnutls.org/gcrypt/gnutls/v3.2/gnutls-3.2.15.tar.xz
md5sum = e0cba4ddd923420026ff9739b3bc069a md5sum = ec3b06f80e312137386c5d322183ca5a
configure-options = configure-options =
--with-libgcrypt-prefix=${gcrypt:location}
--disable-static --disable-static
--disable-libdane
--disable-guile
--disable-crywrap
--without-tpm
environment = environment =
PATH=${xz-utils:location}/bin:%(PATH)s PATH=${pkgconfig:location}/bin:${xz-utils:location}/bin:%(PATH)s
CPPFLAGS=-I${zlib:location}/include -I${readline:location}/include -I${ncurses:location}/include -I${ncurses:location}/include/ncursesw -I${gmp:location}/include -I${gcrypt:location}/include -I${gpg-error:location}/include -I${nettle:location}/include PKG_CONFIG_PATH=${nettle:location}/lib/pkgconfig:${p11-kit:location}/lib/pkgconfig:${zlib:location}/lib/pkgconfig
LDFLAGS=-lgcrypt -L${gmp:location}/lib -Wl,-rpath=${gmp:location}/lib -L${readline:location}/lib -Wl,-rpath=${readline:location}/lib -L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib -L${gcrypt:location}/lib -Wl,-rpath=${gcrypt:location}/lib -L${nettle:location}/lib -Wl,-rpath=${nettle:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${gpg-error:location}/lib -Wl,-rpath=${gpg-error:location}/lib CPPFLAGS=-I${gmp:location}/include -I${zlib:location}/include
LDFLAGS=-L${gmp:location}/lib -Wl,-rpath=${gmp:location}/lib -Wl,-rpath=${nettle:location}/lib -L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib
[buildout]
extends =
../../component/libtool/buildout.cfg
../../component/automake/buildout.cfg
../../component/autoconf/buildout.cfg
parts =
hwloc
[hwloc]
recipe = slapos.recipe.cmmi
url = http://www.open-mpi.org/software/hwloc/v1.9/downloads/hwloc-1.9.tar.gz
md5sum = 1f9f9155682fe8946a97c08896109508
environment =
PATH=${pkgconfig:location}/bin:${automake:location}/bin:${autoconf:location}/bin:${libtool:location}/bin:%(PATH)s
configure-options =
--prefix="${buildout:parts-directory}/${:_buildout_section_name_}"
\ No newline at end of file
[buildout]
parts =
libtasn1
[libtasn1]
recipe = slapos.recipe.cmmi
url = ftp://ftp.gnu.org/gnu/libtasn1/libtasn1-3.6.tar.gz
md5sum = 6ed38e161e11013054f2a2bb4c4da449
configure-options =
--disable-static
--disable-gtk-doc-html
[buildout]
extends =
../readline/buildout.cfg
parts =
lua
[lua]
recipe = slapos.recipe.cmmi
url = http://www.lua.org/ftp/lua-5.2.3.tar.gz
md5sum = dc7f94ec6ff15c985d2d6ad0f1b35654
configure-command = make posix
make-targets =
install INSTALL_TOP=${buildout:parts-directory}/${:_buildout_section_name_}
environment =
CMAKE_INCLUDE_PATH=${readline:location}/include
CMAKE_LIBRARY_PATH=${readline:location}/lib
CPPFLAGS =-I${readline:location}/include
LDFLAGS =-L${readline:location}/lib -Wl,-rpath=${readline:location}/lib
...@@ -19,10 +19,10 @@ parts = ...@@ -19,10 +19,10 @@ parts =
[mariadb] [mariadb]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
version = 10.0.11 version = 10.0.12
revision = 1 revision = 1
url = https://downloads.mariadb.org/f/mariadb-${:version}/source/mariadb-${:version}.tar.gz/from/http:/ftp.osuosl.org/pub/mariadb url = https://downloads.mariadb.org/f/mariadb-${:version}/source/mariadb-${:version}.tar.gz/from/http:/ftp.osuosl.org/pub/mariadb
md5sum = faa2ea3f9c6f7bc5f021d299367a7a8d md5sum = 6e9a7c075526f8f2f83ad8e0933bab2f
# compile directory is required to build mysql plugins. # compile directory is required to build mysql plugins.
keep-compile-dir = true keep-compile-dir = true
patch-options = -p0 patch-options = -p0
......
[buildout]
parts =
p11-kit
extends =
../libffi/buildout.cfg
../libtasn1/buildout.cfg
../pkgconfig/buildout.cfg
[p11-kit]
recipe = slapos.recipe.cmmi
url = http://p11-glue.freedesktop.org/releases/p11-kit-0.20.2.tar.gz
md5sum = 757b97ee4ac0ce598661a90cd784c4f1
configure-options =
--disable-static
--disable-doc-html
environment =
PATH=${pkgconfig:location}/bin:%(PATH)s
PKG_CONFIG_PATH=${libffi:location}/lib/pkgconfig:${libtasn1:location}/lib/pkgconfig
...@@ -122,9 +122,9 @@ setuptools = 1.4.2 ...@@ -122,9 +122,9 @@ setuptools = 1.4.2
# incompatible with slapos package generation. # incompatible with slapos package generation.
pyOpenSSL = 0.13.1 pyOpenSSL = 0.13.1
Jinja2 = 2.7.2 Jinja2 = 2.7.3
MarkupSafe = 0.23 MarkupSafe = 0.23
Werkzeug = 0.9.4 Werkzeug = 0.9.6
buildout-versions = 1.7 buildout-versions = 1.7
cmd2 = 0.6.7 cmd2 = 0.6.7
collective.recipe.template = 1.11 collective.recipe.template = 1.11
...@@ -134,7 +134,7 @@ meld3 = 1.0.0 ...@@ -134,7 +134,7 @@ meld3 = 1.0.0
mr.developer = 1.30 mr.developer = 1.30
netaddr = 0.7.11 netaddr = 0.7.11
pyparsing = 2.0.2 pyparsing = 2.0.2
six = 1.6.1 six = 1.7.2
slapos.core = 1.1.2 slapos.core = 1.1.2
slapos.libnetworkcache = 0.14.1 slapos.libnetworkcache = 0.14.1
slapos.recipe.cmmi = 0.2 slapos.recipe.cmmi = 0.2
...@@ -152,7 +152,11 @@ cliff = 1.6.1 ...@@ -152,7 +152,11 @@ cliff = 1.6.1
# Required by: # Required by:
# slapos.core==1.1.2 # slapos.core==1.1.2
netifaces = 0.10.3 netifaces = 0.10.4
# Required by:
# slapos.core==1.1.2
psutil = 2.1.1
# Required by: # Required by:
# slapos.core==1.1.2 # slapos.core==1.1.2
......
...@@ -5,8 +5,8 @@ parts = ...@@ -5,8 +5,8 @@ parts =
[sqlite3] [sqlite3]
recipe = slapos.recipe.cmmi recipe = slapos.recipe.cmmi
url = http://www.sqlite.org/2014/sqlite-autoconf-3080403.tar.gz url = http://www.sqlite.org/2014/sqlite-autoconf-3080500.tar.gz
md5sum = 0f5459cde43cb269e5120ecd2c671ced md5sum = 0544ef6d7afd8ca797935ccc2685a9ed
configure-options = configure-options =
--disable-static --disable-static
--enable-readline --enable-readline
......
[buildout]
extends =
../../component/lua/buildout.cfg
../../component/hwloc/buildout.cfg
../../component/pkgconfig/buildout.cfg
../../component/libtool/buildout.cfg
../../component/make/buildout.cfg
../../component/openssl/buildout.cfg
../../component/tcl/buildout.cfg
../../component/libexpat/buildout.cfg
../../component/pcre/buildout.cfg
../../component/libcap/buildout.cfg
../../component/flex/buildout.cfg
../../component/ncurses/buildout.cfg
../../component/curl/buildout.cfg
../../component/zlib/buildout.cfg
parts =
trafficserver
[trafficserver]
recipe = slapos.recipe.cmmi
url = http://apache.claz.org/trafficserver/trafficserver-4.2.1.tar.bz2
md5sum = 18f7d56650cba260c8cce3bf4abfa56c
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_}
--with-openssl=${openssl:location}
--with-expat=${libexpat:location}
--with-pcre=${pcre:location}
--with-lua=${lua:location}
--with-ncurses=${ncurses:location}
--with-tcl=${tcl:location}/lib/
--with-zlib=${zlib:location}
environment =
PATH=${make:location}/bin:${libtool:location}/bin:${pkgconfig:location}/bin:%(PATH)s
LDFLAGS = -L${tcl:location}/lib -Wl,-rpath=${tcl:location}/lib
make-target =
check
install
...@@ -54,8 +54,9 @@ class Recipe(GenericBaseRecipe): ...@@ -54,8 +54,9 @@ class Recipe(GenericBaseRecipe):
if software_path_list: if software_path_list:
CONFIG["software_path_list"] = "[software_list]" CONFIG["software_path_list"] = "[software_list]"
CONFIG["software_path_list"] += \ CONFIG["software_path_list"] += \
"\npath_list = %s" % ",".join(software_path_list) "\npath_list = %s" % ",".join(software_path_list)
CONFIG['computer_id'] = self.buildout['slap-connection']['computer-id']
CONFIG['server_url'] = self.buildout['slap-connection']['server-url']
configuration_file = self.createFile( configuration_file = self.createFile(
self.options['configuration-file'], self.options['configuration-file'],
self.substituteTemplate( self.substituteTemplate(
...@@ -87,6 +88,8 @@ class Recipe(GenericBaseRecipe): ...@@ -87,6 +88,8 @@ class Recipe(GenericBaseRecipe):
lock_file=self.options['httpd-lock-file'], lock_file=self.options['httpd-lock-file'],
ip=self.options['httpd-ip'], ip=self.options['httpd-ip'],
port=self.options['httpd-port'], port=self.options['httpd-port'],
software_access_port=self.options['httpd-software-access-port'],
testnode_srv_directory=self.options['srv-directory'],
error_log=os.path.join(self.options['httpd-log-directory'], error_log=os.path.join(self.options['httpd-log-directory'],
'httpd-error.log'), 'httpd-error.log'),
access_log=os.path.join(self.options['httpd-log-directory'], access_log=os.path.join(self.options['httpd-log-directory'],
...@@ -94,6 +97,7 @@ class Recipe(GenericBaseRecipe): ...@@ -94,6 +97,7 @@ class Recipe(GenericBaseRecipe):
certificate=self.options['httpd-cert-file'], certificate=self.options['httpd-cert-file'],
key=self.options['httpd-key-file'], key=self.options['httpd-key-file'],
testnode_log_directory=self.options['log-directory'], testnode_log_directory=self.options['log-directory'],
testnode_software_directory=self.options['software-directory'],
) )
config_file = self.createFile(self.options['httpd-conf-file'], config_file = self.createFile(self.options['httpd-conf-file'],
self.substituteTemplate(self.getTemplateFilename('httpd.conf.in'), self.substituteTemplate(self.getTemplateFilename('httpd.conf.in'),
...@@ -107,4 +111,4 @@ class Recipe(GenericBaseRecipe): ...@@ -107,4 +111,4 @@ class Recipe(GenericBaseRecipe):
# create empty html page to not allow listing of / # create empty html page to not allow listing of /
page = open(os.path.join(self.options['log-directory'], "index.html"), "w") page = open(os.path.join(self.options['log-directory'], "index.html"), "w")
page.write("<html/>") page.write("<html/>")
page.close() page.close()
\ No newline at end of file
...@@ -2,8 +2,10 @@ ...@@ -2,8 +2,10 @@
slapos_directory = %(slapos_directory)s slapos_directory = %(slapos_directory)s
working_directory = %(working_directory)s working_directory = %(working_directory)s
test_suite_directory = %(test_suite_directory)s test_suite_directory = %(test_suite_directory)s
software_directory = %(software_directory)s
log_directory = %(log_directory)s log_directory = %(log_directory)s
run_directory = %(run_directory)s run_directory = %(run_directory)s
srv_directory = %(srv_directory)s
proxy_host = %(proxy_host)s proxy_host = %(proxy_host)s
proxy_port = %(proxy_port)s proxy_port = %(proxy_port)s
node_quantity = %(node_quantity)s node_quantity = %(node_quantity)s
...@@ -13,6 +15,9 @@ ipv6_address = %(ipv6_address)s ...@@ -13,6 +15,9 @@ ipv6_address = %(ipv6_address)s
test_suite_master_url = %(test_suite_master_url)s test_suite_master_url = %(test_suite_master_url)s
httpd_ip = %(httpd_ip)s httpd_ip = %(httpd_ip)s
httpd_port = %(httpd_port)s httpd_port = %(httpd_port)s
httpd_software_access_port = %(httpd_software_access_port)s
computer_id = %(computer_id)s
server_url = %(server_url)s
# Binaries # Binaries
git_binary = %(git_binary)s git_binary = %(git_binary)s
......
...@@ -50,12 +50,38 @@ SSLHonorCipherOrder On ...@@ -50,12 +50,38 @@ SSLHonorCipherOrder On
SSLCipherSuite RC4-SHA:HIGH:!ADH SSLCipherSuite RC4-SHA:HIGH:!ADH
SSLProxyEngine On SSLProxyEngine On
DocumentRoot "%(testnode_log_directory)s"
#DocumentRoot "%(testnode_log_directory)s"
# Directory protection # Directory protection
<Directory /> #<Directory />
Options Indexes FollowSymLinks # Options Indexes FollowSymLinks
IndexOptions FancyIndexing # IndexOptions FancyIndexing
order allow,deny # order allow,deny
Allow from All # Allow from All
</Directory> #</Directory>
\ No newline at end of file
# Directory protection
<VirtualHost *:%(port)s>
SSLEngine on
RewriteRule (.*) http://[%(ip)s]:%(port)s/VirtualHostBase/https/[%(ip)s]:%(port)s/VirtualHostRoot/$1 [L,P]
DocumentRoot "%(testnode_log_directory)s"
<Directory />
Options Indexes FollowSymLinks
IndexOptions FancyIndexing
order allow,deny
Allow from All
</Directory>
</VirtualHost>
Listen [%(ip)s]:%(software_access_port)s
<VirtualHost *:%(software_access_port)s>
SSLEngine on
RewriteRule (.*) http://[%(ip)s]:%(software_access_port)s/VirtualHostBase/https/[%(ip)s]:%(software_access_port)s/VirtualHostRoot/$1 [L,P]
DocumentRoot "%(testnode_software_directory)s"
<Directory />
Options FollowSymLinks
IndexOptions FancyIndexing
order allow,deny
Allow from All
</Directory>
</VirtualHost>
...@@ -234,7 +234,7 @@ lock-file = 2.0 ...@@ -234,7 +234,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -13,7 +13,8 @@ extends = ...@@ -13,7 +13,8 @@ extends =
../../component/dcron/buildout.cfg ../../component/dcron/buildout.cfg
../../component/logrotate/buildout.cfg ../../component/logrotate/buildout.cfg
../../component/rdiff-backup/buildout.cfg ../../component/rdiff-backup/buildout.cfg
../../component/squid/buildout.cfg ../../component/trafficserver/buildout.cfg
# Monitoring stack # Monitoring stack
../../stack/monitor/buildout.cfg ../../stack/monitor/buildout.cfg
...@@ -33,7 +34,6 @@ parts += ...@@ -33,7 +34,6 @@ parts +=
dcron dcron
logrotate logrotate
rdiff-backup rdiff-backup
squid
[slapos-toolbox] [slapos-toolbox]
recipe = zc.recipe.egg recipe = zc.recipe.egg
...@@ -67,7 +67,7 @@ mode = 0644 ...@@ -67,7 +67,7 @@ mode = 0644
[template-apache-frontend] [template-apache-frontend]
recipe = slapos.recipe.template recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-apache-frontend.cfg url = ${:_profile_base_location_}/instance-apache-frontend.cfg
md5sum = f5ec3d3b29d20ccdb00e3b64aa588fa5 md5sum = 070275aa2b2941702cc9ec637fe778e1
output = ${buildout:directory}/template-apache-frontend.cfg output = ${buildout:directory}/template-apache-frontend.cfg
mode = 0644 mode = 0644
...@@ -144,12 +144,6 @@ url = ${:_profile_base_location_}/templates/template-log-access.conf.in ...@@ -144,12 +144,6 @@ url = ${:_profile_base_location_}/templates/template-log-access.conf.in
md5sum = f85005b430978f3bd24ee7ce11b0e304 md5sum = f85005b430978f3bd24ee7ce11b0e304
mode = 640 mode = 640
[template-squid-configuration]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/templates/squid.conf.jinja2
md5sum = f17753fa87da074bc949b2967a330099
mode = 640
[template-empty] [template-empty]
recipe = slapos.recipe.build:download recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/templates/empty.in url = ${:_profile_base_location_}/templates/empty.in
...@@ -162,3 +156,12 @@ url = ${:_profile_base_location_}/templates/wrapper.in ...@@ -162,3 +156,12 @@ url = ${:_profile_base_location_}/templates/wrapper.in
output = ${buildout:directory}/template-wrapper.cfg output = ${buildout:directory}/template-wrapper.cfg
mode = 0644 mode = 0644
md5sum = 8cde04bfd0c0e9bd56744b988275cfd8 md5sum = 8cde04bfd0c0e9bd56744b988275cfd8
[template-trafficserver-records-config]
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/templates/trafficserver/${:filename}
md5sum = 950a19be225a25309a3bda3f61fb5f6a
location = ${buildout:parts-directory}/${:_buildout_section_name_}
filename = records.config.jinja2
download-only = true
mode = 0644
...@@ -9,16 +9,11 @@ parts = ...@@ -9,16 +9,11 @@ parts =
certificate-authority certificate-authority
logrotate-entry-apache logrotate-entry-apache
logrotate-entry-apache-cached logrotate-entry-apache-cached
logrotate-entry-squid
apache-frontend apache-frontend
apache-cached apache-cached
switch-apache-softwaretype switch-apache-softwaretype
frontend-apache-graceful frontend-apache-graceful
cached-apache-graceful cached-apache-graceful
squid-service
squid-prepare
squid-reload
promise-squid
dynamic-template-default-vh dynamic-template-default-vh
not-found-html not-found-html
promise-frontend-apache-configuration promise-frontend-apache-configuration
...@@ -28,6 +23,14 @@ parts = ...@@ -28,6 +23,14 @@ parts =
promise-apache-frontend-v6-https promise-apache-frontend-v6-https
promise-apache-frontend-v6-http promise-apache-frontend-v6-http
promise-apache-cached promise-apache-cached
trafficserver-launcher
trafficserver-reload
trafficserver-configuration-directory
trafficserver-records-config
trafficserver-remap-config
trafficserver-storage-config
## Monitoring part ## Monitoring part
###Parts to add for monitoring ###Parts to add for monitoring
certificate-authority certificate-authority
...@@ -36,6 +39,7 @@ parts = ...@@ -36,6 +39,7 @@ parts =
deploy-index deploy-index
deploy-settings-cgi deploy-settings-cgi
deploy-status-cgi deploy-status-cgi
deploy-status-history-cgi
setup-static-files setup-static-files
certificate-authority certificate-authority
zero-parameters zero-parameters
...@@ -47,6 +51,10 @@ parts = ...@@ -47,6 +51,10 @@ parts =
## Monitor for apache ## Monitor for apache
monitor-current-log-access monitor-current-log-access
monitor-backup-log-access monitor-backup-log-access
monitor-ats-cache-stats-wrapper
monitor-apache-configuration-verification
monitor-verify-re6st-connectivity
extends = ${monitor-template:output} extends = ${monitor-template:output}
...@@ -79,6 +87,7 @@ crontabs = $${:etc}/crontabs ...@@ -79,6 +87,7 @@ crontabs = $${:etc}/crontabs
cronstamps = $${:etc}/cronstamps cronstamps = $${:etc}/cronstamps
ca-dir = $${:srv}/ssl ca-dir = $${:srv}/ssl
[switch-apache-softwaretype] [switch-apache-softwaretype]
recipe = slapos.cookbook:softwaretype recipe = slapos.cookbook:softwaretype
single-default = $${dynamic-default-template-slave-list:rendered} single-default = $${dynamic-default-template-slave-list:rendered}
...@@ -117,14 +126,6 @@ apache-directory = ${apache-2.2:location} ...@@ -117,14 +126,6 @@ apache-directory = ${apache-2.2:location}
apache-ipv6 = $${instance-parameter:ipv6-random} apache-ipv6 = $${instance-parameter:ipv6-random}
apache-https-port = $${instance-parameter:configuration.port} apache-https-port = $${instance-parameter:configuration.port}
[monitor-current-log-access]
< = monitor-directory-access
source = $${directory:log}
[monitor-backup-log-access]
< = monitor-directory-access
source = $${directory:logrotate-backup}
[jinja2-template-base] [jinja2-template-base]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
rendered = $${buildout:directory}/$${:filename} rendered = $${buildout:directory}/$${:filename}
...@@ -135,6 +136,7 @@ context = ...@@ -135,6 +136,7 @@ context =
key develop_eggs_directory buildout:develop-eggs-directory key develop_eggs_directory buildout:develop-eggs-directory
key slap_software_type instance-parameter:slap-software-type key slap_software_type instance-parameter:slap-software-type
key slapparameter_dict instance-parameter:configuration key slapparameter_dict instance-parameter:configuration
section directory directory
$${:extra-context} $${:extra-context}
[dynamic-template-default-vh] [dynamic-template-default-vh]
...@@ -333,8 +335,8 @@ cache-access-log = $${directory:log}/frontend-apache-access-cached.log ...@@ -333,8 +335,8 @@ cache-access-log = $${directory:log}/frontend-apache-access-cached.log
cache-error-log = $${directory:log}/frontend-apache-error-cached.log cache-error-log = $${directory:log}/frontend-apache-error-cached.log
cache-pid-file = $${directory:run}/httpd-cached.pid cache-pid-file = $${directory:run}/httpd-cached.pid
# Comunication with squid # Comunication with ats
cache-port = 26010 cache-port = $${trafficserver-variable:input-port}
cache-through-port = 26011 cache-through-port = 26011
# Create wrapper for "apachectl conftest" in bin # Create wrapper for "apachectl conftest" in bin
...@@ -433,77 +435,70 @@ sharedscripts = true ...@@ -433,77 +435,70 @@ sharedscripts = true
notifempty = true notifempty = true
create = true create = true
[logrotate-entry-squid] #################
<= logrotate # Trafficserver
recipe = slapos.cookbook:logrotate.d #################
name = squid [trafficserver-directory]
log = $${squid-cache:cache-log-path} $${squid-cache:access-log-path}
frequency = daily
rotatep-num = 30
post = ${buildout:bin-directory}/killpidfromfile $${apache-configuration:pid-file} SIGHUP
sharedscripts = true
notifempty = true
create = true
######################
# Squid deployment
######################
[squid-directory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
squid-cache = $${directory:srv}/squid_cache configuration = $${directory:etc}/trafficserver
local-state = $${directory:var}/trafficserver
[squid-cache] bin_path = ${trafficserver:location}/bin
prepare-path = $${directory:etc-run}/squid-prepare log = $${directory:log}/trafficserver
wrapper-path = $${directory:service}/squid cache-path = $${directory:srv}/ats_cache
binary-path = ${squid:location}/sbin/squid
configuration-path = $${directory:etc}/squid.cfg [trafficserver-variable]
cache-path = $${squid-directory:squid-cache} wrapper-path = $${directory:service}/trafficserver
ip = $${instance-parameter:ipv4-random} reload-path = $${directory:etc-run}/trafficserver-reload
port = $${apache-configuration:cache-port} local-ip = $${instance-parameter:ipv4-random}
backend-ip = $${instance-parameter:ipv4-random} input-port = 23432
backend-port = $${apache-configuration:cache-through-port} hostname = $${slap-parameter:frontend-name}
open-port = $${instance-parameter:configuration.open-port} remap = map / http://$${instance-parameter:ipv4-random}:$${apache-configuration:cache-through-port}
access-log-path = $${directory:log}/squid-access.log disk-cache-config = $${trafficserver-directory:cache-path} 8G volume=$${slap-parameter:frontend-name}
cache-log-path = $${directory:log}/squid-cache.log
pid-filename-path = $${directory:run}/squid.pid [trafficserver-configuration-directory]
recipe = plone.recipe.command
[squid-configuration] command = cp -rn ${trafficserver:location}/etc/trafficserver/* $${:target}
< = jinja2-template-base target = $${trafficserver-directory:configuration}
template = ${template-squid-configuration:target}
rendered = $${squid-cache:configuration-path} [trafficserver-launcher]
extra-context =
key ip squid-cache:ip
key port squid-cache:port
key backend_ip squid-cache:backend-ip
key backend_port squid-cache:backend-port
key cache_path squid-cache:cache-path
key access_log_path squid-cache:access-log-path
key cache_log_path squid-cache:cache-log-path
key pid_filename_path squid-cache:pid-filename-path
key open_port squid-cache:open-port
[squid-service]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
command-line = $${squid-cache:binary-path} -N -f $${squid-configuration:rendered} command-line = ${trafficserver:location}/bin/traffic_cop
wrapper-path = $${squid-cache:wrapper-path} wrapper-path = $${trafficserver-variable:wrapper-path}
environment = TS_ROOT=$${buildout:directory}
[squid-prepare] [trafficserver-reload]
recipe = slapos.cookbook:wrapper recipe = slapos.cookbook:wrapper
command-line = $${squid-cache:binary-path} -z -f $${squid-configuration:rendered} command-line = ${trafficserver:location}/bin/traffic_line -x
wrapper-path = $${squid-cache:prepare-path} wrapper-path = $${trafficserver-variable:reload-path}
environment = TS_ROOT=$${buildout:directory}
[squid-reload] [trafficserver-records-config]
recipe = slapos.cookbook:wrapper < = jinja2-template-base
command-line = ${buildout:bin-directory}/killpidfromfile $${squid-cache:pid-filename-path} SIGHUP template = ${template-trafficserver-records-config:location}/${template-trafficserver-records-config:filename}
wrapper-path = $${directory:etc-run}/squid-reload rendered = $${trafficserver-directory:configuration}/records.config
mode = 700
context =
import os_module os
section ats_directory trafficserver-directory
section ats_configuration trafficserver-variable
[promise-squid] [trafficserver-remap-config]
recipe = slapos.cookbook:check_port_listening < = jinja2-template-base
path = $${directory:promise}/squid template = ${template-empty:target}
hostname = $${instance-parameter:ipv4-random} rendered = $${trafficserver-configuration-directory:target}/remap.config
port = $${apache-configuration:cache-port} mode = 700
context =
key content trafficserver-variable:remap
[trafficserver-storage-config]
< = jinja2-template-base
template = ${template-empty:target}
rendered = $${trafficserver-configuration-directory:target}/storage.config
mode = 700
context =
key content trafficserver-variable:disk-cache-config
# End of Squid part ### End of ATS sections
### Apaches Graceful and promises ### Apaches Graceful and promises
[frontend-apache-graceful] [frontend-apache-graceful]
...@@ -577,3 +572,72 @@ server_url = $${slap-connection:server-url} ...@@ -577,3 +572,72 @@ server_url = $${slap-connection:server-url}
software_release_url = $${slap-connection:software-release-url} software_release_url = $${slap-connection:software-release-url}
key_file = $${slap-connection:key-file} key_file = $${slap-connection:key-file}
cert_file = $${slap-connection:cert-file} cert_file = $${slap-connection:cert-file}
[slap-parameter]
# Define default parameter(s) that will be used later, in case user didn't
# specify it
# All parameters are available through the configuration.XX syntax.
# All possible parameters should have a default.
domain = example.org
public-ipv4 =
port = 4443
plain_http_port = 8080
server-admin = admin@example.com
apache_custom_https = ""
apache_custom_http = ""
apache-key =
apache-certificate =
open-port = 80 443
extra_slave_instance_list =
frontend-name =
#######
# Monitoring sections
#
[monitor-current-log-access]
< = monitor-directory-access
source = $${directory:log}
[monitor-backup-log-access]
< = monitor-directory-access
source = $${directory:logrotate-backup}
# Produce ATS Cache stats
[monitor-ats-cache-stats-wrapper]
< = jinja2-template-base
template = ${template-wrapper:output}
rendered = $${monitor-directory:monitoring-cgi}/ats-cache-stats
mode = 0700
command = export TS_ROOT=$${buildout:directory} && echo "<pre>$(${trafficserver:location}/bin/traffic_shell $${monitor-ats-cache-stats-config:rendered})</pre>"
extra-context =
key content monitor-ats-cache-stats-wrapper:command
[monitor-ats-cache-stats-config]
< = jinja2-template-base
template = ${template-empty:target}
rendered = $${trafficserver-configuration-directory:target}/cache-config.stats
mode = 644
context =
raw content show:cache-stats
# Display result of apache configuration check
[monitor-apache-configuration-verification]
< = jinja2-template-base
template = ${template-wrapper:output}
rendered = $${monitor-directory:monitoring-cgi}/front-httpd-configuration
mode = 0700
command = echo "<pre>$($${apache-configuration:frontend-configuration-verification})</pre>"
extra-context =
key content :command
[monitor-verify-re6st-connectivity]
recipe = slapos.cookbook:check_url_available
path = $${monitor-directory:monitor-custom-scripts}/re6st-connectivity
url = $${public:re6st-verification-url}
dash_path = ${dash:location}/bin/dash
curl_path = ${curl:location}/bin/curl
[public]
re6st-verification-url = http://[2001:67c:1254:4::1]/index.html
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
extends = common.cfg extends = common.cfg
[versions] [versions]
Jinja2 = 2.7.2 Jinja2 = 2.7.3
MarkupSafe = 0.23 MarkupSafe = 0.23
PyRSS2Gen = 1.1 PyRSS2Gen = 1.1
Werkzeug = 0.9.4 Werkzeug = 0.9.4
...@@ -28,7 +28,7 @@ pycrypto = 2.6.1 ...@@ -28,7 +28,7 @@ pycrypto = 2.6.1
pyparsing = 2.0.2 pyparsing = 2.0.2
pytz = 2014.3 pytz = 2014.3
rdiff-backup = 1.0.5 rdiff-backup = 1.0.5
six = 1.6.1 six = 1.7.2
slapos.cookbook = 0.87 slapos.cookbook = 0.87
slapos.recipe.build = 0.12 slapos.recipe.build = 0.12
slapos.recipe.cmmi = 0.2 slapos.recipe.cmmi = 0.2
......
refresh_pattern . 0 20% 4320 max-stale=604800
# Dissallow cachemgr access
http_access deny manager
# Squid service configuration
http_port {{ ip }}:{{ port }} accel defaultsite={{ ip }}
cache_peer {{ backend_ip }} parent {{ backend_port }} 0 no-query originserver name=backend
acl our_sites port {{ open_port }}
http_access allow our_sites
cache_peer_access backend allow our_sites
cache_peer_access backend deny all
# Drop squid headers
# via off
# reply_header_access X-Cache-Lookup deny all
# reply_header_access X-Squid-Error deny all
# reply_header_access X-Cache deny all
header_replace X-Forwarded-For
follow_x_forwarded_for allow all
forwarded_for on
cache_dir aufs {{ cache_path }} 5000 16 256
# Use 1Go of RAM
cache_mem 1024 MB
# But do not keep big object in RAM
maximum_object_size_in_memory 2048 KB
# Log
access_log {{ access_log_path }}
cache_log {{ cache_log_path }}
pid_filename {{ pid_filename_path }}
...@@ -288,7 +288,7 @@ netaddr = 0.7.10 ...@@ -288,7 +288,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -170,7 +170,7 @@ lock-file = 2.0 ...@@ -170,7 +170,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -206,7 +206,7 @@ lock-file = 2.0 ...@@ -206,7 +206,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -63,7 +63,7 @@ netaddr = 0.7.10 ...@@ -63,7 +63,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.14 # slapos.core==0.14
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.cookbook==0.24 # slapos.cookbook==0.24
......
...@@ -63,7 +63,7 @@ netaddr = 0.7.10 ...@@ -63,7 +63,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.14 # slapos.core==0.14
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.cookbook==0.24 # slapos.cookbook==0.24
......
...@@ -86,7 +86,7 @@ netaddr = 0.7.10 ...@@ -86,7 +86,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.28.5 # slapos.core==0.28.5
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# erp5.util==0.4.7 # erp5.util==0.4.7
......
...@@ -24,13 +24,14 @@ storage-path = $${buildout:directory}/.password ...@@ -24,13 +24,14 @@ storage-path = $${buildout:directory}/.password
[testnode] [testnode]
recipe = slapos.cookbook:erp5testnode recipe = slapos.cookbook:erp5testnode
slapos-directory = $${directory:slapos} slapos-directory = $${directory:slapos}
working-directory = $${directory:testnode} working-directory = $${directory:testnode}
test-suite-directory = $${directory:test-suite} test-suite-directory = $${directory:test-suite}
proxy-host = $${slap-network-information:global-ipv6} proxy-host = $${slap-network-information:global-ipv6}
proxy-port = 5000 proxy-port = 5000
log-directory = $${directory:log} log-directory = $${directory:log}
srv-directory = $${rootdirectory:srv}
software-directory = $${directory:software}
run-directory = $${directory:run} run-directory = $${directory:run}
test-node-title = $${slap-parameter:test-node-title} test-node-title = $${slap-parameter:test-node-title}
node-quantity = $${slap-parameter:node-quantity} node-quantity = $${slap-parameter:node-quantity}
...@@ -50,8 +51,10 @@ httpd-lock-file = $${basedirectory:run}/httpd.lock ...@@ -50,8 +51,10 @@ httpd-lock-file = $${basedirectory:run}/httpd.lock
httpd-conf-file = $${rootdirectory:etc}/httpd.conf httpd-conf-file = $${rootdirectory:etc}/httpd.conf
httpd-wrapper = $${rootdirectory:bin}/httpd httpd-wrapper = $${rootdirectory:bin}/httpd
httpd-port = 9080 httpd-port = 9080
httpd-software-access-port = 9081
httpd-ip = $${slap-network-information:global-ipv6} httpd-ip = $${slap-network-information:global-ipv6}
httpd-log-directory = $${basedirectory:log} httpd-log-directory = $${basedirectory:log}
httpd-software-directory = $${directory:software}
httpd-cert-file = $${rootdirectory:etc}/httpd-public.crt httpd-cert-file = $${rootdirectory:etc}/httpd-public.crt
httpd-key-file = $${rootdirectory:etc}/httpd-private.key httpd-key-file = $${rootdirectory:etc}/httpd-private.key
...@@ -151,6 +154,7 @@ testnode = $${rootdirectory:srv}/testnode ...@@ -151,6 +154,7 @@ testnode = $${rootdirectory:srv}/testnode
test-suite = $${rootdirectory:srv}/test_suite test-suite = $${rootdirectory:srv}/test_suite
log = $${basedirectory:log}/testnode log = $${basedirectory:log}/testnode
run = $${basedirectory:run}/testnode run = $${basedirectory:run}/testnode
software = $${rootdirectory:srv}/software
shellinabox = $${rootdirectory:srv}/shellinabox shellinabox = $${rootdirectory:srv}/shellinabox
ca-dir = $${rootdirectory:srv}/ca ca-dir = $${rootdirectory:srv}/ca
......
...@@ -74,7 +74,7 @@ recipe = slapos.recipe.template ...@@ -74,7 +74,7 @@ recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-default.cfg url = ${:_profile_base_location_}/instance-default.cfg
output = ${buildout:directory}/template-default.cfg output = ${buildout:directory}/template-default.cfg
mode = 0644 mode = 0644
md5sum = 9bb380748d5f6618ffa480e6d660217c md5sum = 8c6a106be8e7af2b30506a9a2e24044d
[networkcache] [networkcache]
# signature certificates of the following uploaders. # signature certificates of the following uploaders.
...@@ -185,7 +185,7 @@ pytz = ...@@ -185,7 +185,7 @@ pytz =
# pin version of setuptools # pin version of setuptools
setuptools = 2.2 setuptools = 2.2
Jinja2 = 2.7.2 Jinja2 = 2.7.3
MarkupSafe = 0.23 MarkupSafe = 0.23
PyXML = 0.8.5 PyXML = 0.8.5
Werkzeug = 0.9.4 Werkzeug = 0.9.4
...@@ -205,7 +205,7 @@ psutil = 2.1.0 ...@@ -205,7 +205,7 @@ psutil = 2.1.0
pyOpenSSL = 0.14 pyOpenSSL = 0.14
pyparsing = 2.0.2 pyparsing = 2.0.2
pytz = 2014.2 pytz = 2014.2
six = 1.6.1 six = 1.7.2
slapos.core = 1.0.5 slapos.core = 1.0.5
slapos.libnetworkcache = 0.14.1 slapos.libnetworkcache = 0.14.1
slapos.recipe.build = 0.12 slapos.recipe.build = 0.12
...@@ -228,7 +228,7 @@ lock-file = 2.0 ...@@ -228,7 +228,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==1.0.5 # slapos.core==1.0.5
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# cffi==0.8.2 # cffi==0.8.2
......
...@@ -92,7 +92,7 @@ cffi = 0.8.2 ...@@ -92,7 +92,7 @@ cffi = 0.8.2
cryptography = 0.4 cryptography = 0.4
plone.recipe.command = 1.1 plone.recipe.command = 1.1
pyOpenSSL = 0.14 pyOpenSSL = 0.14
six = 1.6.1 six = 1.7.2
# Required by: # Required by:
# cffi==0.8.2 # cffi==0.8.2
...@@ -134,7 +134,7 @@ netaddr = 0.7.10 ...@@ -134,7 +134,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -68,7 +68,7 @@ netaddr = 0.7.10 ...@@ -68,7 +68,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -107,7 +107,7 @@ signature-certificate-list = ...@@ -107,7 +107,7 @@ signature-certificate-list =
# Required by: # Required by:
# slapos.core==0.33.1 # slapos.core==0.33.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.cookbook==0.71.1 # slapos.cookbook==0.71.1
......
...@@ -175,7 +175,7 @@ netaddr = 0.7.10 ...@@ -175,7 +175,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# websockify==0.5.1 # websockify==0.5.1
......
...@@ -114,7 +114,7 @@ netaddr = 0.7.10 ...@@ -114,7 +114,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35 # slapos.core==0.35
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35 # slapos.core==0.35
......
...@@ -70,7 +70,7 @@ lxml = 2.3.4 ...@@ -70,7 +70,7 @@ lxml = 2.3.4
# Required by: # Required by:
# slapos.core==0.2 # slapos.core==0.2
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.2 # slapos.core==0.2
......
...@@ -69,7 +69,7 @@ netaddr = 0.7.10 ...@@ -69,7 +69,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -162,7 +162,7 @@ hexagonit.recipe.download = 1.6nxd002 ...@@ -162,7 +162,7 @@ hexagonit.recipe.download = 1.6nxd002
# Required by: # Required by:
# slapos.core==0.34 # slapos.core==0.34
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.34 # slapos.core==0.34
......
...@@ -183,7 +183,7 @@ lock-file = 2.0 ...@@ -183,7 +183,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -50,7 +50,7 @@ mode = 0644 ...@@ -50,7 +50,7 @@ mode = 0644
# pin version of setuptools # pin version of setuptools
setuptools = 2.2 setuptools = 2.2
Jinja2 = 2.7.2 Jinja2 = 2.7.3
MarkupSafe = 0.23 MarkupSafe = 0.23
Werkzeug = 0.9.4 Werkzeug = 0.9.4
buildout-versions = 1.7 buildout-versions = 1.7
...@@ -63,7 +63,7 @@ mr.developer = 1.30 ...@@ -63,7 +63,7 @@ mr.developer = 1.30
plone.recipe.command = 1.1 plone.recipe.command = 1.1
pyOpenSSL = 0.14 pyOpenSSL = 0.14
pyparsing = 2.0.2 pyparsing = 2.0.2
six = 1.6.1 six = 1.7.2
slapos.cookbook = 0.87 slapos.cookbook = 0.87
slapos.recipe.build = 0.12 slapos.recipe.build = 0.12
slapos.recipe.cmmi = 0.2 slapos.recipe.cmmi = 0.2
......
...@@ -154,7 +154,7 @@ itsdangerous = 0.23 ...@@ -154,7 +154,7 @@ itsdangerous = 0.23
lxml = 3.2.3 lxml = 3.2.3
meld3 = 0.6.10 meld3 = 0.6.10
netaddr = 0.7.10 netaddr = 0.7.10
netifaces = 0.10.3 netifaces = 0.10.4
pytz = 2013d pytz = 2013d
requests = 1.2.3 requests = 1.2.3
slapos.cookbook = 0.83.1 slapos.cookbook = 0.83.1
......
...@@ -184,7 +184,7 @@ netaddr = 0.7.10 ...@@ -184,7 +184,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==1.0.0 # slapos.core==1.0.0
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.cookbook==0.85 # slapos.cookbook==0.85
......
...@@ -89,7 +89,7 @@ hexagonit.recipe.download = 1.6nxd002 ...@@ -89,7 +89,7 @@ hexagonit.recipe.download = 1.6nxd002
# Required by: # Required by:
# slapos.core==0.34 # slapos.core==0.34
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -239,7 +239,7 @@ hexagonit.recipe.download = 1.7nxd002 ...@@ -239,7 +239,7 @@ hexagonit.recipe.download = 1.7nxd002
# Required by: # Required by:
# slapos.core==0.34 # slapos.core==0.34
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -346,7 +346,7 @@ feedparser = 5.1.3 ...@@ -346,7 +346,7 @@ feedparser = 5.1.3
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -71,7 +71,7 @@ Flask = 0.9 ...@@ -71,7 +71,7 @@ Flask = 0.9
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
......
...@@ -99,7 +99,7 @@ netaddr = 0.7.10 ...@@ -99,7 +99,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.33.1 # slapos.toolbox==0.33.1
......
...@@ -226,7 +226,7 @@ lock-file = 2.0 ...@@ -226,7 +226,7 @@ lock-file = 2.0
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -76,7 +76,7 @@ develop += ...@@ -76,7 +76,7 @@ develop +=
${:parts-directory}/cloudooo ${:parts-directory}/cloudooo
[versions] [versions]
Jinja2 = 2.7.2 Jinja2 = 2.7.3
MarkupSafe = 0.23 MarkupSafe = 0.23
Paste = 1.7.5.1 Paste = 1.7.5.1
PasteScript = 1.7.5 PasteScript = 1.7.5
...@@ -101,7 +101,7 @@ python-magic = 0.4.6 ...@@ -101,7 +101,7 @@ python-magic = 0.4.6
pytz = 2014.3 pytz = 2014.3
rdiff-backup = 1.0.5 rdiff-backup = 1.0.5
requests = 2.3.0 requests = 2.3.0
six = 1.6.1 six = 1.7.2
slapos.core = 1.1.2 slapos.core = 1.1.2
slapos.recipe.build = 0.12 slapos.recipe.build = 0.12
slapos.recipe.cmmi = 0.2 slapos.recipe.cmmi = 0.2
......
...@@ -614,7 +614,7 @@ ZODB3 = 3.10.5-ZMinitagePatched-ZODB33105 ...@@ -614,7 +614,7 @@ ZODB3 = 3.10.5-ZMinitagePatched-ZODB33105
cloudooo = 1.2.5-dev cloudooo = 1.2.5-dev
# use newer version than specified in ZTK # use newer version than specified in ZTK
Jinja2 = 2.7.2 Jinja2 = 2.7.3
PasteDeploy = 1.5.2 PasteDeploy = 1.5.2
Pygments = 1.6 Pygments = 1.6
argparse = 1.2.1 argparse = 1.2.1
...@@ -681,7 +681,7 @@ PyXML = 0.8.5 ...@@ -681,7 +681,7 @@ PyXML = 0.8.5
Pympler = 0.3.1 Pympler = 0.3.1
StructuredText = 2.11.1 StructuredText = 2.11.1
WSGIUtils = 0.7 WSGIUtils = 0.7
Werkzeug = 0.9.4 Werkzeug = 0.9.6
apache-libcloud = 0.14.1 apache-libcloud = 0.14.1
astroid = 1.1.1 astroid = 1.1.1
async = 0.6.1 async = 0.6.1
...@@ -722,7 +722,7 @@ python-ldap = 2.4.15 ...@@ -722,7 +722,7 @@ python-ldap = 2.4.15
python-magic = 0.4.6 python-magic = 0.4.6
python-memcached = 1.53 python-memcached = 1.53
pytz = 2014.4 pytz = 2014.4
qrcode = 4.0.4 qrcode = 5.0.1
restkit = 4.2.2 restkit = 4.2.2
rtjp-eventlet = 0.3.2 rtjp-eventlet = 0.3.2
slapos.recipe.build = 0.12 slapos.recipe.build = 0.12
...@@ -822,8 +822,8 @@ psutil = 2.1.1 ...@@ -822,8 +822,8 @@ psutil = 2.1.1
requests = 2.3.0 requests = 2.3.0
# Required by: # Required by:
# qrcode==4.0.4 # qrcode==5.0.1
six = 1.6.1 six = 1.7.2
# Required by: # Required by:
# slapos.core==1.1.2 # slapos.core==1.1.2
......
...@@ -151,7 +151,7 @@ netaddr = 0.7.6 ...@@ -151,7 +151,7 @@ netaddr = 0.7.6
# Required by: # Required by:
# slapos.core==0.24 # slapos.core==0.24
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.23 # slapos.toolbox==0.23
......
...@@ -352,7 +352,7 @@ feedparser = 5.1.3 ...@@ -352,7 +352,7 @@ feedparser = 5.1.3
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.34.0 # slapos.toolbox==0.34.0
......
...@@ -360,7 +360,7 @@ netaddr = 0.7.10 ...@@ -360,7 +360,7 @@ netaddr = 0.7.10
# Required by: # Required by:
# slapos.core==0.35.1 # slapos.core==0.35.1
netifaces = 0.10.3 netifaces = 0.10.4
# Required by: # Required by:
# slapos.toolbox==0.33.1 # slapos.toolbox==0.33.1
......
...@@ -10,7 +10,6 @@ extends = ...@@ -10,7 +10,6 @@ extends =
parts = parts =
slapos-cookbook slapos-cookbook
dcron dcron
download-static-files
monitor-eggs monitor-eggs
extra-eggs extra-eggs
monitor-bin monitor-bin
...@@ -42,54 +41,72 @@ recipe = slapos.recipe.template ...@@ -42,54 +41,72 @@ recipe = slapos.recipe.template
url = ${:_profile_base_location_}/monitor.cfg.in url = ${:_profile_base_location_}/monitor.cfg.in
output = ${buildout:directory}/monitor.cfg output = ${buildout:directory}/monitor.cfg
filename = monitor.cfg filename = monitor.cfg
md5sum = bd592a0f0c41ec15c643c4e91e9ec5cc md5sum = 0fe5b78cd16df190ec8838116954669e
mode = 0644 mode = 0644
[monitor-bin] [monitor-bin]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/${:filename} url = ${:_profile_base_location_}/${:filename}
download-only = true download-only = true
md5sum = 1e7b4698f6627150b1eb783b06f8b13a md5sum = cb2f15850d3dc82459a0044adb4416cf
destination = ${buildout:directory}/parts/monitor-template-monitor-bin destination = ${buildout:directory}/parts/monitor-template-monitor-bin
filename = monitor.py.in filename = monitor.py.in
mode = 0644 mode = 0644
[index] [index]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfiles/${:filename} url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true download-only = true
md5sum = 91ac749f86aecc0c383d93e51e15a572 md5sum = af1adc107b73290afb98d011f7307de1
destination = ${buildout:directory}/parts/monitor-index destination = ${buildout:directory}/parts/monitor-index
filename = index.cgi.in filename = index.cgi.in
mode = 0644 mode = 0644
[index-template] [index-template]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfiles/${:filename} url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true download-only = true
destination = ${buildout:directory}/parts/monitor-template-index destination = ${buildout:directory}/parts/monitor-template-index
md5sum = e0d2aaeffc046b2ac6d9d717e1ba321d md5sum = 05051a2ff81ce7dc2eef3106d75b33f9
filename = index.html.jinja2 filename = index.html.jinja2
mode = 0644 mode = 0644
[status-cgi] [status-cgi]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfiles/${:filename} url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true download-only = true
md5sum = aa2764cab87e457410435974f729e906 md5sum = e43d79bec8824265e22df7960744113a
destination = ${buildout:directory}/parts/monitor-template-status-cgi destination = ${buildout:directory}/parts/monitor-template-status-cgi
filename = status.cgi.in filename = status.cgi.in
mode = 0644 mode = 0644
[status-history-cgi]
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
md5sum = fa8ec5aa5395b1bc6b9c7e898d6c5ec5
destination = ${buildout:directory}/parts/monitor-template-status-history-cgi
filename = status-history.cgi.in
mode = 0644
[settings-cgi] [settings-cgi]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfiles/${:filename} url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true download-only = true
md5sum = 18574b804da0c65d8670959f9e7c4774 md5sum = b4cef123a3273e848e8fe496e22b20a8
destination = ${buildout:directory}/parts/monitor-template-settings-cgi destination = ${buildout:directory}/parts/monitor-template-settings-cgi
filename = settings.cgi.in filename = settings.cgi.in
mode = 0644 mode = 0644
[monitor-password-cgi]
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/webfile-directory/${:filename}
download-only = true
md5sum = c7ba7ecb09d0d1d24e7cb73a212cc33f
destination = ${buildout:directory}/parts/monitor-template-monitor-password-cgi
filename = monitor-password.cgi.in
mode = 0644
[rss-bin] [rss-bin]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/${:filename} url = ${:_profile_base_location_}/${:filename}
...@@ -106,11 +123,20 @@ output = $${directory:services}/crond ...@@ -106,11 +123,20 @@ output = $${directory:services}/crond
mode = 0700 mode = 0700
logfile = $${directory:log}/crond.log logfile = $${directory:log}/crond.log
[download-static-files] [download-monitor-static]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
url = https://github.com/SlapOS/staticForMonitoring/blob/db670e7568871c69a64916d462ccb57629f1c77d/static-files.tar.gz?raw=true url = http://git.erp5.org/gitweb/slapos.git/snapshot/930be99041ea26b7b1186830e5eb56ef0acc1bdf.tar.gz
download-only = true download-only = false
md5sum = 9e3feb2b520620d5b8d478eb9a9be6de filename = monitor-static.tar.gz
filename = static-files.tar.gz
destination = ${buildout:directory}/parts/monitor-static-files destination = ${buildout:directory}/parts/monitor-static-files
ignore-existing = true
strip-top-level-dir = true
mode = 0644
[download-monitor-jquery]
recipe = hexagonit.recipe.download
url = http://code.jquery.com/jquery-1.10.2.min.js
download-only = true
destination = ${download-monitor-static:destination}
filename = jquery-1.10.2.min.js
mode = 0644 mode = 0644
...@@ -18,6 +18,7 @@ url = https://[$${slap-parameters:ipv6-random}]:$${:port} ...@@ -18,6 +18,7 @@ url = https://[$${slap-parameters:ipv6-random}]:$${:port}
index-filename = index.cgi index-filename = index.cgi
index-path = $${monitor-directory:www}/$${:index-filename} index-path = $${monitor-directory:www}/$${:index-filename}
db-path = $${monitor-directory:etc}/monitor.db db-path = $${monitor-directory:etc}/monitor.db
monitor-password-path = $${monitor-directory:etc}/.monitor.shadow
[monitor-directory] [monitor-directory]
recipe = slapos.cookbook:mkdirectory recipe = slapos.cookbook:mkdirectory
...@@ -86,24 +87,24 @@ frequency = */5 * * * * ...@@ -86,24 +87,24 @@ frequency = */5 * * * *
command = $${make-rss:rendered} command = $${make-rss:rendered}
[setup-static-files] [setup-static-files]
recipe = hexagonit.recipe.download recipe = plone.recipe.command
url = ${download-static-files:destination}/${download-static-files:filename} command = ln -s ${download-monitor-jquery:destination} $${monitor-directory:www}/static
filename = static update-command = $${:command}
destination = $${monitor-directory:www}
ignore-existing = true
mode = 0644
[deploy-index] [deploy-index]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
template = ${index:location}/${index:filename} template = ${index:location}/${index:filename}
rendered = $${monitor-parameters:index-path} rendered = $${monitor-parameters:index-path}
update-apache-access = ${apache:location}/bin/htpasswd -cb $${monitor-parameters:htaccess-file} admin
mode = 0744 mode = 0744
context = context =
key cgi_directory monitor-directory:cgi-bin key cgi_directory monitor-directory:cgi-bin
raw index_template $${deploy-index-template:location}/$${deploy-index-template:filename} raw index_template $${deploy-index-template:location}/$${deploy-index-template:filename}
key password zero-parameters:monitor-password key monitor_password_path monitor-parameters:monitor-password-path
key monitor_password_script_path deploy-monitor-password-cgi:rendered
key apache_update_command :update-apache-access
raw extra_eggs_interpreter ${buildout:directory}/bin/${extra-eggs:interpreter} raw extra_eggs_interpreter ${buildout:directory}/bin/${extra-eggs:interpreter}
raw default_page /welcome.html raw default_page /static/welcome.html
[deploy-index-template] [deploy-index-template]
recipe = hexagonit.recipe.download recipe = hexagonit.recipe.download
...@@ -126,6 +127,17 @@ context = ...@@ -126,6 +127,17 @@ context =
key this_file :filename key this_file :filename
raw python_executable ${buildout:executable} raw python_executable ${buildout:executable}
[deploy-status-history-cgi]
recipe = slapos.recipe.template:jinja2
template = ${status-history-cgi:location}/${status-history-cgi:filename}
rendered = $${monitor-directory:monitoring-cgi}/$${:filename}
filename = status-history.cgi
mode = 0744
context =
key monitor_db_path monitor-parameters:db-path
key status_history_length zero-parameters:status-history-length
raw python_executable ${buildout:executable}
[deploy-settings-cgi] [deploy-settings-cgi]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
template = ${settings-cgi:location}/${settings-cgi:filename} template = ${settings-cgi:location}/${settings-cgi:filename}
...@@ -139,6 +151,17 @@ context = ...@@ -139,6 +151,17 @@ context =
key pwd monitor-directory:knowledge0-cgi key pwd monitor-directory:knowledge0-cgi
key this_file :filename key this_file :filename
[deploy-monitor-password-cgi]
recipe = slapos.recipe.template:jinja2
template = ${monitor-password-cgi:location}/${monitor-password-cgi:filename}
rendered = $${monitor-directory:knowledge0-cgi}/$${:filename}
filename = monitor-password.cgi
mode = 0744
context =
raw python_executable ${buildout:executable}
key pwd monitor-directory:knowledge0-cgi
key this_file :filename
[deploy-monitor-script] [deploy-monitor-script]
recipe = slapos.recipe.template:jinja2 recipe = slapos.recipe.template:jinja2
template = ${monitor-bin:location}/${monitor-bin:filename} template = ${monitor-bin:location}/${monitor-bin:filename}
...@@ -159,12 +182,6 @@ context = ...@@ -159,12 +182,6 @@ context =
section directory monitor-directory section directory monitor-directory
section monitor_parameters monitor-parameters section monitor_parameters monitor-parameters
[monitor-htaccess]
recipe = plone.recipe.command
stop-on-error = true
htaccess-path = $${monitor-parameters:htaccess-file}
command = ${apache:location}/bin/htpasswd -cb $${:htaccess-path} admin $${zero-parameters:monitor-password}
[monitor-directory-access] [monitor-directory-access]
recipe = plone.recipe.command recipe = plone.recipe.command
command = ln -s $${:source} $${monitor-directory:private-directory} command = ln -s $${:source} $${monitor-directory:private-directory}
...@@ -211,7 +228,7 @@ name = example.com ...@@ -211,7 +228,7 @@ name = example.com
[public] [public]
recipe = slapos.cookbook:zero-knowledge.write recipe = slapos.cookbook:zero-knowledge.write
filename = knowledge0.cfg filename = knowledge0.cfg
monitor-password = passwordtochange status-history-length = 5
[zero-parameters] [zero-parameters]
recipe = slapos.cookbook:zero-knowledge.read recipe = slapos.cookbook:zero-knowledge.read
...@@ -279,7 +296,7 @@ input = inline: ...@@ -279,7 +296,7 @@ input = inline:
</Files> </Files>
AuthType Basic AuthType Basic
AuthName "Private access" AuthName "Private access"
AuthUserFile "$${monitor-htaccess:htaccess-path}" AuthUserFile "$${monitor-parameters:htaccess-file}"
Require valid-user Require valid-user
Options Indexes FollowSymLinks Options Indexes FollowSymLinks
Satisfy all Satisfy all
...@@ -315,4 +332,3 @@ curl_path = ${curl:location}/bin/curl ...@@ -315,4 +332,3 @@ curl_path = ${curl:location}/bin/curl
[publish-connection-informations] [publish-connection-informations]
recipe = slapos.cookbook:publish recipe = slapos.cookbook:publish
monitor_url = $${monitor-parameters:url} monitor_url = $${monitor-parameters:url}
IMPORTANT_monitor_info = Change the monitor_password as soon as possible ! Default is : $${public:monitor-password} . You can change it in the setting.cgi section of your monitorin interface
...@@ -7,6 +7,7 @@ import subprocess ...@@ -7,6 +7,7 @@ import subprocess
import sys import sys
import sqlite3 import sqlite3
import time import time
import threading
from optparse import OptionParser, make_option from optparse import OptionParser, make_option
...@@ -34,6 +35,26 @@ option_list = [ ...@@ -34,6 +35,26 @@ option_list = [
help="add the file containing services\'pid to the files to monitor") help="add the file containing services\'pid to the files to monitor")
] ]
class Popen(subprocess.Popen):
__timeout = None
def timeout(self, delay, delay_before_kill=5):
if self.__timeout is not None: self.__timeout.cancel()
self.__timeout = threading.Timer(delay, self.stop, [delay_before_kill])
self.__timeout.start()
def waiter():
self.wait()
self.__timeout.cancel()
threading.Thread(target=waiter).start()
def stop(self, delay_before_kill=5):
if self.__timeout is not None: self.__timeout.cancel()
self.terminate()
t = threading.Timer(delay_before_kill, self.kill)
t.start()
r = self.wait()
t.cancel()
return r
def init_db(): def init_db():
db = sqlite3.connect(db_path) db = sqlite3.connect(db_path)
...@@ -89,24 +110,26 @@ def runServices(directory): ...@@ -89,24 +110,26 @@ def runServices(directory):
def runScripts(directory): def runScripts(directory):
scripts = getListOfScripts(directory) scripts = getListOfScripts(directory)
script_timeout = 3 # XXX script_timeout could be passed as parameters
script_timeout = 60 # in seconds
result = {} result = {}
for script in scripts: for script in scripts:
command = [os.path.join(promise_dir, script)] command = [os.path.join(promise_dir, script)]
script = os.path.basename(command[0]) script = os.path.basename(command[0])
result[script] = '' result[script] = ''
process_handler = subprocess.Popen(command, process_handler = Popen(command,
cwd=instance_path, cwd=instance_path,
env=None if sys.platform == 'cygwin' else {}, env=None if sys.platform == 'cygwin' else {},
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stderr=subprocess.PIPE,
stdin=subprocess.PIPE) stdin=subprocess.PIPE)
process_handler.stdin.flush() process_handler.stdin.flush()
process_handler.stdin.close() process_handler.stdin.close()
process_handler.stdin = None process_handler.stdin = None
time.sleep(script_timeout) process_handler.timeout(script_timeout)
process_handler.wait()
if process_handler.poll() is None: if process_handler.poll() is None:
process_handler.terminate() process_handler.terminate()
......
...@@ -3,11 +3,12 @@ ...@@ -3,11 +3,12 @@
import cgi import cgi
import cgitb import cgitb
import Cookie import Cookie
import base64
import hashlib
import hmac
import jinja2 import jinja2
import json
import os import os
import subprocess import subprocess
import sys
import urllib import urllib
cgitb.enable(display=0, logdir="/tmp/cgi.log") cgitb.enable(display=0, logdir="/tmp/cgi.log")
...@@ -17,6 +18,58 @@ cookie = Cookie.SimpleCookie() ...@@ -17,6 +18,58 @@ cookie = Cookie.SimpleCookie()
cgi_path = "{{ cgi_directory }}" cgi_path = "{{ cgi_directory }}"
monitor_password_path = "{{ monitor_password_path }}"
monitor_password_script_path = "{{ monitor_password_script_path }}"
monitor_apache_password_command = "{{ apache_update_command }}"
########
# Password functions
#######
def crypt(word, salt="$$"):
salt = salt.split("$")
algo = salt[0] or 'sha1'
if algo in hashlib.algorithms:
H = getattr(hashlib, algo)
elif algo == "plain":
return "%s$%s" % (algo, word)
else:
raise ValueError
rounds = min(max(0, int(salt[1])), 30) if salt[1] else 9
salt = salt[2] or base64.b64encode(os.urandom(12), "./")
h = hmac.new(salt, word, H).digest()
for x in xrange(1, 1 << rounds):
h = H(h).digest()
return "%s$%s$%s$%s" % (algo, rounds, salt,
base64.b64encode(h, "./").rstrip("="))
def is_password_set():
if not os.path.exists(monitor_password_path):
return False
hashed_password = open(monitor_password_path, 'r').read()
try:
void, algo, salt, hsh = hashed_password.split('$')
except ValueError:
return False
return True
def set_password(raw_password):
hashed_password = crypt(raw_password)
subprocess.check_call(monitor_apache_password_command + " %s" % raw_password,
shell=True)
open(monitor_password_path, 'w').write(hashed_password)
def check_password(raw_password):
"""
Returns a boolean of whether the raw_password was correct. Handles
encryption formats behind the scenes.
"""
if not os.path.exists(monitor_password_path) or not raw_password:
return False
hashed_password = open(monitor_password_path, 'r').read()
return hashed_password == crypt(raw_password, hashed_password)
### End of password functions
def forward_form(): def forward_form():
command = os.path.join(cgi_path, form['posting-script'].value) command = os.path.join(cgi_path, form['posting-script'].value)
...@@ -33,8 +86,10 @@ def forward_form(): ...@@ -33,8 +86,10 @@ def forward_form():
pass pass
def return_document(): def return_document(command=None):
command = os.path.join(cgi_path, form['script'].value) if not command:
script = form['script'].value
command = os.path.join(cgi_path, script)
#XXX this functions should be called only for display, #XXX this functions should be called only for display,
#so a priori it doesn't need form data #so a priori it doesn't need form data
os.environ['QUERY_STRING'] = '' os.environ['QUERY_STRING'] = ''
...@@ -45,8 +100,8 @@ def return_document(): ...@@ -45,8 +100,8 @@ def return_document():
print open(command).read() print open(command).read()
else: else:
raise OSError raise OSError
except (subprocess.CalledProcessError, OSError): except (subprocess.CalledProcessError, OSError) as e:
print "<p>File cannot be found</p>" print "<p>Error :</p><pre>%s</pre>" % e
def make_menu(): def make_menu():
...@@ -62,33 +117,52 @@ def make_menu(): ...@@ -62,33 +117,52 @@ def make_menu():
return folder_list return folder_list
# Beginning of response def get_cookie_password():
print "Content-Type: text/html"
# Check if user is logged
if "password" in form:
password = form['password'].value
if password == '{{ password }}' :
cookie['password'] = password
print cookie, "; Path=/; HttpOnly"
else:
cookie_string = os.environ.get('HTTP_COOKIE') cookie_string = os.environ.get('HTTP_COOKIE')
if cookie_string: if cookie_string:
cookie.load(cookie_string) cookie.load(cookie_string)
try: try:
password = cookie['password'].value return cookie['password'].value
except KeyError: except KeyError:
password = None pass
else: return None
password = None
def set_cookie_password(password):
cookie['password'] = password
print cookie, "; Path=/; HttpOnly"
# Beginning of response
print "Content-Type: text/html"
password = None
# Check if user is logged
if "password_2" in form and "password" in form:
password_2 = form['password_2'].value
password_1 = form['password'].value
password = get_cookie_password()
if not is_password_set() or check_password(password):
if password_2 == password_1:
password = password_1
set_password(password)
set_cookie_password(password)
elif "password" in form:
password = form['password'].value
if is_password_set() and check_password(password):
set_cookie_password(password)
else:
password = get_cookie_password()
print '\n' print '\n'
if not password or password != '{{ password }}':
if not is_password_set():
return_document(monitor_password_script_path)
elif not check_password(password):
print "<html><head>" print "<html><head>"
print """ print """
<link rel="stylesheet" href="pure-min.css"> <link rel="stylesheet" href="static/pure-min.css">
<link rel="stylesheet" href="/style.css">""" <link rel="stylesheet" href="static/style.css">"""
print "</head><body>" print "</head><body>"
if password is None: if password is None:
print "<h1>This is the monitoring interface</h1>" print "<h1>This is the monitoring interface</h1>"
...@@ -101,7 +175,6 @@ if not password or password != '{{ password }}': ...@@ -101,7 +175,6 @@ if not password or password != '{{ password }}':
<button type="submit" class="pure-button pure-button-primary">Access</button> <button type="submit" class="pure-button pure-button-primary">Access</button>
</form> </form>
</body></html>""" </body></html>"""
# redirection to the required script/page # redirection to the required script/page
else: else:
print print
......
<html> <html>
<head> <head>
<title>Monitoring Interface</title> <title>Monitoring Interface</title>
<link rel="stylesheet" href="pure-min.css"> <link rel="stylesheet" href="static/pure-min.css">
<link rel="stylesheet" href="/style.css"> <link rel="stylesheet" href="static/style.css">
<script src="jquery-1.10.2.min.js"></script> <script src="static/jquery-1.10.2.min.js"></script>
<script src="script.js"></script> <script src="static/script.js"></script>
</head> </head>
<body> <body>
<div id="div-menu"> <div id="div-menu">
......
#!{{ python_executable }}
import cgitb
cgitb.enable()
print "<html><head>"
print """
<script type="text/javascript" src="static/jquery-1.10.2.min.js"></script>
<link rel="stylesheet" href="static/pure-min.css">
<link rel="stylesheet" href="static/style.css">"""
print "</head><body>"
print "<h1>This is the monitoring interface</h1>"
print "<h2>Please set your password for later access</h2>"
print """
<form action="/index.cgi" method="post" class="pure-form-aligned">
<div class="pure-control-group">
<label for="password">Password*:</label>
<input placeholder="Set your password" type="password" name="password" id="password"></br>
</div><div class="pure-control-group">
<label for="password">Verify Password*:</label>
<input placeholder="Verify password" type="password" name="password_2" id="password_2"></br>
</div><p id="validate-status" style="color:red"></p>
<div class="pure-controls">
<button id="register-button" type="submit" class="pure-button pure-button-primary" disabled>Access</button></div>
</form>
<script type="text/javascript" src="static/monitor-register.js"></script>
</body></html>
"""
...@@ -9,22 +9,27 @@ cgitb.enable() ...@@ -9,22 +9,27 @@ cgitb.enable()
form = cgi.FieldStorage() form = cgi.FieldStorage()
print "<html><head>" print "<html><head>"
print "<link rel=\"stylesheet\" href=\"pure-min.css\">" print "<link rel=\"stylesheet\" href=\"static/pure-min.css\">"
print "<link rel=\"stylesheet\" href=\"/style.css\">" print "<link rel=\"stylesheet\" href=\"static/style.css\">"
print "</head><body>" print "</head><body>"
config_file = "{{ config_cfg }}" config_file = "{{ config_cfg }}"
if not os.path.exists(config_file): if not os.path.exists(config_file):
print "Your software does <b>not</b> embed 0-knowledge. \ print "Your software does <b>not</b> embed 0-knowledge. \
This interface is useless in this case" This interface is useless in this case</body></html>"
exit(0) exit(0)
parser = ConfigParser.ConfigParser() parser = ConfigParser.ConfigParser()
parser.read(config_file) parser.read(config_file)
if not parser.has_section('public'):
print "<p>Your software does not use 0-knowledge settings.</p></body></html>"
exit(0)
for name in form: for name in form:
parser.set('public', name, form[name].value) if parser.has_option('public', name):
parser.set('public', name, form[name].value)
with open(config_file, 'w') as file: with open(config_file, 'w') as file:
parser.write(file) parser.write(file)
...@@ -39,8 +44,8 @@ print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">" ...@@ -39,8 +44,8 @@ print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
print "<input type=\"hidden\" name=\"posting-script\" value=\"{{ pwd }}/{{ this_file }}\">" print "<input type=\"hidden\" name=\"posting-script\" value=\"{{ pwd }}/{{ this_file }}\">"
for option in parser.options("public"): for option in parser.options("public"):
print "<div class=\"pure-control-group\">" print "<div class=\"pure-control-group\">"
print "<label for=\"%s\">%s</label>"%(option, option) print "<label for=\"%s\">%s</label>" % (cgi.escape(option, quote=True), cgi.escape(option))
print "<input type=\"text\" name=\"%s\" value=\"%s\">"%(option, parser.get('public', option)) print "<input type=\"text\" name=\"%s\" value=\"%s\">" % (cgi.escape(option, quote=True), cgi.escape(parser.get('public', option), quote=True))
print "</div>" print "</div>"
print "<div class=\"pure-controls\"><button type=\"submit\" class=\"pure-button \ print "<div class=\"pure-controls\"><button type=\"submit\" class=\"pure-button \
pure-button-primary\">Save</button></div></form>" pure-button-primary\">Save</button></div></form>"
...@@ -51,8 +56,8 @@ for section in parser.sections(): ...@@ -51,8 +56,8 @@ for section in parser.sections():
if section != 'public': if section != 'public':
for option in parser.options(section): for option in parser.options(section):
print "<div class=\"pure-control-group\">" print "<div class=\"pure-control-group\">"
print "<label for=\"%s\">%s</label>"%(option, option) print "<label for=\"%s\">%s</label>" % (cgi.escape(option, quote=True), cgi.escape(option))
print "<input type=\"text\" name=\"%s\" value=\"%s\" readonly>"%(option, parser.get(section, option)) print "<input type=\"text\" name=\"%s\" value=\"%s\" readonly>" %(cgi.escape(option, quote=True), cgi.escape(parser.get(section, option), quote=True))
print "</div>" print "</div>"
print "</form>" print "</form>"
......
$(window).load(function(){
$(document).ready(function() {
$("#password_2").keyup(validate);
});
function validate() {
var password1 = $("#password").val();
var password2 = $("#password_2").val();
if(password1 == password2) {
$("#register-button").removeAttr("disabled");
$("#validate-status").attr("style", "display:none");
}
else {
$("#register-button").attr("disabled", "disabled");
$("#validate-status").attr("style", "").text("Passwords do not match");
}
}
});
\ No newline at end of file
This diff is collapsed.
$(document).ready(function() {
function doDataUrl (data) {
var frame_content = document.getElementsByTagName("iframe")[0].contentWindow;
var b64 = btoa(data);
dataurl = 'data:text/html;base64,' + b64;
$("iframe").attr('src', dataurl);
}
if ( window.self === window.top ) {
//not in an iframe
$(".script").click(function(e) {
e.preventDefault();
var message = $(this).attr('href');
var slash_pos = message.search('/');
//let's differenciate kind of script called
if ( slash_pos === -1 || slash_pos === 0) {
url = message;
}
else {
url = '/index.cgi';
}
$("iframe").attr('src', url + '?script=' + encodeURIComponent(message));
});
$(".link").click(function(e) {
e.preventDefault();
var url = $(this).attr('href');
$("iframe").attr('src', url);
});
}
else {
//in an iframe
$("body").empty();
}
});
body {
padding: 15px;
}
.pure-menu .pure-menu-heading {
font-size: 120%;
}
#content {
display: inline-block;
min-width: 72%;
height: 97%;
margin-left: 30px;
}
#div-menu {
display: inline-block;
vertical-align: top;
}
#div-menu h1 {
text-align: center;
}
iframe {
width: 100%;
height: 100%;
margin: 0px;
padding: 0px;
border-style: none;
}
<html>
<head>
<title>Welcome to the Monitoring Interface</title>
<link rel="stylesheet" href="pure-min.css">
<link rel="stylesheet" href="style.css">
</head>
<body>
<h1>Welcome to your monitoring interface</h1>
<p>From this interface you can monitor, configure your instance</p>
</body>
</html>
#!{{ python_executable }}
import cgi
import datetime
import os
import sqlite3
db_path = '{{ monitor_db_path }}'
status_history_length = '{{ status_history_length }}'
db = sqlite3.connect(db_path)
print """<html><head>
<link rel="stylesheet" href="static/pure-min.css">
<link rel="stylesheet" href="static/style.css">
</head><body>
<h1>Monitor Status History :</h1>"""
def get_date_from_timestamp(timestamp):
return datetime.datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
def print_individual_status(timestamp):
print "<div><h3>Failure on %s</h3><ul>" % get_date_from_timestamp(timestamp)
rows = db.execute("select status, element, output from individual_status where timestamp=?", (timestamp,))
for row in rows:
status, element, output = row
print "<li>%s , %s :</br><pre>%s</pre></li>" % (status, cgi.escape(element), cgi.escape(output))
print "</ul></div>"
if not os.path.exists(db_path):
print """No status history found</p></body></html>"""
exit(0)
failure_row_list = db.execute("select timestamp from status where status='FAILURE' order by timestamp desc limit ?", status_history_length )
for failure_row in failure_row_list:
timestamp, = failure_row
print_individual_status(timestamp)
print "</body></html>"
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
import cgi import cgi
import cgitb import cgitb
import json import json
import os
import subprocess import subprocess
def refresh(): def refresh():
...@@ -11,15 +12,26 @@ def refresh(): ...@@ -11,15 +12,26 @@ def refresh():
cgitb.enable(display=0, logdir="/tmp/cgi.log") cgitb.enable(display=0, logdir="/tmp/cgi.log")
form = cgi.FieldStorage() form = cgi.FieldStorage()
if "refresh" in form:
refresh()
json_file = "{{ json_file }}" json_file = "{{ json_file }}"
if not os.path.exists(json_file) or "refresh" in form:
refresh()
if not os.path.exists(json_file):
print """<html><head>
<link rel="stylesheet" href="static/pure-min.css">
<link rel="stylesheet" href="static/style.css">
</head><body>
<h1>Monitoring :</h1>
No status file found</p></body></html>"""
exit(0)
result = json.load(open(json_file)) result = json.load(open(json_file))
print "<html><head>" print "<html><head>"
print "<link rel=\"stylesheet\" href=\"pure-min.css\">" print "<link rel=\"stylesheet\" href=\"static/pure-min.css\">"
print "<link rel=\"stylesheet\" href=\"/style.css\">" print "<link rel=\"stylesheet\" href=\"static/style.css\">"
print "</head><body>" print "</head><body>"
print "<h1>Monitoring :</h1>" print "<h1>Monitoring :</h1>"
print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">" print "<form action=\"/index.cgi\" method=\"post\" class=\"pure-form-aligned\">"
...@@ -33,7 +45,7 @@ print "<br/>" ...@@ -33,7 +45,7 @@ print "<br/>"
print "<h2>These scripts and promises have failed :</h2>" print "<h2>These scripts and promises have failed :</h2>"
for r in result: for r in result:
if result[r] != '': if result[r] != '':
print "<h3>%s</h3><p style=\"padding-left:30px;\">%s</p>" % (r, result[r]) print "<h3>%s</h3><pre style=\"padding-left:30px;\">%s</pre>" % (cgi.escape(r), cgi.escape(result[r]))
print "<br/>" print "<br/>"
print "<h2>These scripts and promises were successful :</h2>" print "<h2>These scripts and promises were successful :</h2>"
......
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