Commit 66626020 authored by Kirill Smelkov's avatar Kirill Smelkov

Merge remote-tracking branch 'origin/master' into x/gitlab

parents a9f3ff19 5d243d1a
Changes
=======
1.0.14 (2015-10.26)
-------------------
* kvm recipe: Allow to set keyboard layout language used by qemu and VNC
* simplehttpserver-recipe: fix encoding error
0.103 (2015-07-24)
------------------
* kvm: fix issues with boolean parameters and add 'qed' in external disk format list.
......
......@@ -11,13 +11,10 @@ extends =
recipe = slapos.recipe.cmmi
url = http://toxygen.net/6tunnel/6tunnel-0.11rc2.tar.gz
md5sum = 74e02d4f0704b3083a01feda66033449
configure-command =
pre-configure =
aclocal
autoheader
automake --foreign
autoconf
./configure
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_}
environment =
PATH=${autoconf:location}/bin:${automake:location}/bin:%(PATH)s
......@@ -33,9 +33,10 @@ recipe = slapos.recipe.cmmi
version = 2.4.16
url = https://archive.apache.org/dist/httpd/httpd-${:version}.tar.bz2
md5sum = 2b19cd338fd526dd5a63c57b1e9bfee2
configure-command = cp -ar ${apr:location}/apr-${apr:version} srclib/apr/; cp -ar ${apr-util:location}/apr-util-${apr-util:version} srclib/apr-util; ./configure
configure-options = --prefix=${buildout:parts-directory}/${:_buildout_section_name_}
--disable-static
pre-configure =
cp -ar ${apr:location}/apr-${apr:version} srclib/apr/ &&
cp -ar ${apr-util:location}/apr-util-${apr-util:version} srclib/apr-util
configure-options = --disable-static
--enable-authn-alias
--enable-bucketeer
--enable-cache
......
......@@ -7,12 +7,9 @@ extends =
../ncurses/buildout.cfg
../perl/buildout.cfg
[aspell-common-dictionary]
location = ${buildout:parts-directory}/${:_buildout_section_name_}
recipe = plone.recipe.command
command = mkdir -p ${:location}
update-command = ${:command}
stop-on-error = yes
[aspell-dictionary-common]
recipe = slapos.recipe.cmmi
configure-command = ./configure --vars ASPELL=${aspell:location}/bin/aspell PREZIP=${aspell:location}/bin/prezip-bin
[aspell]
recipe = slapos.recipe.cmmi
......@@ -24,7 +21,6 @@ environment =
LDFLAGS=-L${ncurses:location}/lib -Wl,-rpath=${ncurses:location}/lib
[aspell-en-dictionary]
recipe = slapos.recipe.cmmi
<= aspell-dictionary-common
url = ftp://ftp.gnu.org/gnu/aspell/dict/en/aspell6-en-7.1-0.tar.bz2
md5sum = beba5e8f3afd3ed1644653bb685b2dfb
configure-command = ./configure --vars ASPELL=${aspell:location}/bin/aspell PREZIP=${aspell:location}/bin/prezip-bin
......@@ -10,7 +10,7 @@ recipe = slapos.recipe.cmmi
url = http://ftp.gnu.org/gnu/coreutils/coreutils-8.23.tar.xz
md5sum = abed135279f87ad6762ce57ff6d89c41
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_} --enable-install-program=tr,basename,uname,cat,cp,ls
-enable-install-program=tr,basename,uname,cat,cp,ls
environment =
PATH=${xz-utils:location}/bin:%(PATH)s
LDFLAGS=-Wl,--as-needed -L${gmp:location}/lib -Wl,-rpath=${gmp:location}/lib
......
......@@ -14,13 +14,11 @@ recipe = slapos.recipe.cmmi
url = ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.26.tar.gz
md5sum = a7f4e5e559a0e37b3ffc438c9456e425
location = ${buildout:parts-directory}/${:_buildout_section_name_}
configure-command =
pre-configure =
"${libtool:location}/bin/libtoolize" -c -f &&
"${automake:location}/bin/aclocal" -I "${libtool:location}/share/aclocal" -I config -I cmulocal &&
"${automake:location}/bin/automake" -c -a -f &&
./configure
"${automake:location}/bin/automake" -c -a -f
configure-options =
--prefix=${:location}
--disable-digest
--disable-gssapi
--disable-otp
......
......@@ -20,7 +20,6 @@ md5sum = 0284ea239083f04c8b874e08e1aca243
url = http://matt.ucc.asn.au/dropbear/releases/dropbear-0.53.1.tar.bz2
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_}
--with-zlib=${zlib:location}
CFLAGS="-DENABLE_SINGLEUSER -D__DIRTY_NO_SHELL_CHECKING"
......
......@@ -81,6 +81,7 @@ environment =
GLIB_LIBS=-L${glib:location}/lib -lglib-2.0 -lintl -lgobject-2.0
FFI_CFLAGS=-I${libffi:location}/include
FFI_LIBS=-L${libffi:location}/lib -Wl,-rpath=${libffi:location}/lib -lffi
GIR_DIR=${buildout:parts-directory}/${:_buildout_section_name_}/share/gir-1.0
[pygobject3]
recipe = slapos.recipe.cmmi
......@@ -144,4 +145,3 @@ extra-paths =
${dbus-python:python-egg}
${firewalld:python-egg}
${pygobject3:python-egg}
......@@ -32,8 +32,8 @@ environment =
[ghostscript-9]
<= ghostscript-common
url = http://downloads.ghostscript.com/public/ghostscript-9.16.tar.bz2
md5sum = 21732fd6e39acc283bc623b8842cbfbb
url = http://downloads.ghostscript.com/public/ghostscript-9.18.tar.bz2
md5sum = aa125af368d89b3dbd15fc379f13375f
[ghostscript-fonts]
recipe = hexagonit.recipe.download
......
......@@ -16,9 +16,10 @@ patches =
${:_profile_base_location_}/CVE-2014-9029.patch#d69195cf17878f024cc0b580045ec314
${:_profile_base_location_}/CVE-2014-8137.patch#bc5103b9a33315538106bf6652383a10
${:_profile_base_location_}/CVE-2014-8138.patch#bfb9604fe84b6e686fea29bd760cf34d
# jasper configure script is not executable by default
configure-command =
/bin/sh ./configure --prefix=${buildout:parts-directory}/${:_buildout_section_name_} --disable-static --enable-shared --disable-opengl
configure-options =
--disable-static
--enable-shared
--disable-opengl
environment =
CPPFLAGS=-I${libjpeg:location}/include
LDFLAGS=-L${libjpeg:location}/lib -Wl,-rpath=${libjpeg:location}/lib
[buildout]
parts = leptonica
extends =
../libtool/buildout.cfg
../zlib/buildout.cfg
../libjpeg/buildout.cfg
../libpng/buildout.cfg
......@@ -13,13 +12,11 @@ extends =
recipe = slapos.recipe.cmmi
url = http://leptonica.googlecode.com/files/leptonica-1.68.tar.gz
md5sum = 5cd7092f9ff2ca7e3f3e73bfcd556403
configure-command =
./autogen.sh
./configure --prefix=${buildout:parts-directory}/${:_buildout_section_name_} --disable-static
configure-options =
--disable-static
patch-options = -p1
patches =
${:_profile_base_location_}/leptonica-1.69-zlib-include.patch#cff3dc942075190939b407c38e0d3201
environment =
ACLOCAL_ARGS=-I${libtool:location}/share/aclocal
CPPFLAGS=-I${zlib:location}/include -I${libjpeg:location}/include -I${libpng:location}/include -I${libtiff:location}/include -I${webp:location}/include -I${giflib:location}/include
LDFLAGS=-L${zlib:location}/lib -Wl,-rpath=${zlib:location}/lib -L${libjpeg:location}/lib -Wl,-rpath=${libjpeg:location}/lib -L${libpng:location}/lib -Wl,-rpath=${libpng:location}/lib -L${libtiff:location}/lib -Wl,-rpath=${libtiff:location}/lib -L${webp:location}/lib -Wl,-rpath=${webp:location}/lib -L${giflib:location}/lib -Wl,-rpath=${giflib:location}/lib
......@@ -18,15 +18,15 @@ environment =
[libpng12]
<= libpng-common
url = http://download.sourceforge.net/libpng/libpng-1.2.52.tar.xz
md5sum = 49d5c71929bf69a172147c47b9309fbe
url = http://download.sourceforge.net/libpng/libpng-1.2.53.tar.xz
md5sum = 7d18a74e6fd2029aee76ccd00e00a9e6
[libpng15]
<= libpng-common
url = http://download.sourceforge.net/libpng/libpng-1.5.21.tar.xz
md5sum = 22eaa2e90352fcd153bed0cdecf542cb
url = http://download.sourceforge.net/libpng/libpng-1.5.23.tar.xz
md5sum = 725f9b98143450df03decf08b4bc42e3
[libpng]
<= libpng-common
url = http://download.sourceforge.net/libpng/libpng-1.6.16.tar.xz
md5sum = 23b7286b5d4a86de950fd2ffc5cac742
url = http://download.sourceforge.net/libpng/libpng-1.6.18.tar.xz
md5sum = 6a57c8e0f5469b9c9949a4b43d57b3a1
......@@ -20,15 +20,16 @@ parts =
[mariadb]
recipe = slapos.recipe.cmmi
version = 10.0.21
version = 10.1.8
url = https://downloads.mariadb.org/f/mariadb-${:version}/source/mariadb-${:version}.tar.gz/from/http:/ftp.osuosl.org/pub/mariadb
md5sum = 956561f3798d1fe8dfbe4b665287a87a
md5sum = 9ba0aaabba40153d83e70edcc1aa43a8
location = ${buildout:parts-directory}/${:_buildout_section_name_}
patch-options = -p0
patches =
${:_profile_base_location_}/mariadb_10.0.8_create_system_tables__no_test.patch#a176d491cf45fccd53ee397c70393bc4
${:_profile_base_location_}/mariadb_10.1.8_create_system_tables__no_test.patch#d2f337e76b290071daf8985a79bda82a
configure-command = ${cmake:location}/bin/cmake
configure-options =
-DCMAKE_INSTALL_PREFIX=${buildout:parts-directory}/${:_buildout_section_name_}
-DCMAKE_INSTALL_PREFIX=${:location}
-DBUILD_CONFIG=mysql_release
-DDEFAULT_CHARSET=utf8
-DDEFAULT_COLLATION=utf8_unicode_ci
......@@ -52,6 +53,9 @@ environment =
CMAKE_INCLUDE_PATH=${libaio:location}/include:${libaio:location}/include:${libxml2:location}/include:${ncurses:location}/include:${openssl:location}/include:${pcre:location}/include:${readline5:location}/include:${zlib:location}/include
CMAKE_LIBRARY_PATH=${libaio:location}/lib:{libaio:location}/lib:${libxml2:location}/lib:${ncurses:location}/lib:${openssl:location}/lib:${pcre:location}/lib:${readline5:location}/lib:${zlib:location}/lib
LDFLAGS=-L${jemalloc:location}/lib -Wl,-rpath=${jemalloc:location}/lib -L${libaio:location}/lib -Wl,-rpath=${libaio:location}/lib -L${pcre:location}/lib -L${zlib:location}/lib
post-install =
mkdir -p ${:location}/include/wsrep &&
cp -p wsrep/wsrep_api.h ${:location}/include/wsrep
[mroonga-mariadb]
# mroonga - a storage engine for MySQL. It provides fast fulltext search feature to all MySQL users.
......@@ -59,9 +63,10 @@ environment =
recipe = slapos.recipe.cmmi
url = http://packages.groonga.org/source/mroonga/mroonga-5.08.tar.gz
md5sum = 65011c1da8700c4950d11dea7355b32d
configure-command = mkdir fake_mariadb_source && ln -s ${mariadb:location}/include/mysql/private fake_mariadb_source/sql && ./configure
pre-configure =
mkdir fake_mariadb_source &&
ln -s ${mariadb:location}/include/mysql/private fake_mariadb_source/sql
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_}
--with-mysql-source=fake_mariadb_source
--with-mysql-config=${mariadb:location}/bin/mysql_config
--disable-static
......@@ -69,6 +74,7 @@ configure-options =
patch-options = -p1
patches =
${:_profile_base_location_}/mroonga_boolean.patch#36645770ae612515b74b90884ecc59fc
${:_profile_base_location_}/mroonga_5.08_mariadb_10.1.8.patch#ead45e0fbb4cf3c2d39ece012793d3c4
environment =
PATH=${groonga:location}/bin:${pkgconfig:location}/bin:%(PATH)s
CPPFLAGS=-I${groonga:location}/include/groonga -I${pcre:location}/include
......
......@@ -5,8 +5,8 @@ circumstances as it is checked first.
See http://bugs.debian.org/301741
and http://bugs.mysql.com/bug.php?id=6901
--- scripts/mysql_system_tables_data.sql.orig 2013-11-05 17:46:05.000000000 +0100
+++ scripts/mysql_system_tables_data.sql 2013-11-08 09:28:34.707291508 +0100
--- scripts/mysql_system_tables_data.sql.orig 2015-10-15 17:43:45.000000000 +0200
+++ scripts/mysql_system_tables_data.sql 2015-10-19 16:44:16.121393390 +0200
@@ -30,8 +30,6 @@
-- Fill "db" table with default grants for anyone to
-- access database 'test' and 'test_%' if "db" table didn't exist
......@@ -17,9 +17,9 @@ and http://bugs.mysql.com/bug.php?id=6901
DROP TABLE tmp_db;
@@ -43,8 +41,6 @@
REPLACE INTO tmp_user SELECT @current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N' FROM dual WHERE @current_hostname != 'localhost';
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N');
REPLACE INTO tmp_user VALUES ('::1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N');
REPLACE INTO tmp_user SELECT @current_hostname,'root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N','',0 FROM dual WHERE @current_hostname != 'localhost';
REPLACE INTO tmp_user VALUES ('127.0.0.1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N','',0);
REPLACE INTO tmp_user VALUES ('::1','root','','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','','','','',0,0,0,0,'','','N','N', '', 0);
-INSERT INTO tmp_user (host,user) VALUES ('localhost','');
-INSERT INTO tmp_user (host,user) SELECT @current_hostname,'' FROM dual WHERE @current_hostname != 'localhost';
INSERT INTO user SELECT * FROM tmp_user WHERE @had_user_table=0;
......
commit 4a40e81d17d1df28cfeca56d3d9c8f26d0132cfa
Author: Kouhei Sutou <kou@clear-code.com>
Date: Sun Oct 18 17:23:28 2015 +0900
Use public API
It fixes a build error on MariaDB 10.1.8.
diff --git a/ha_mroonga.cpp b/ha_mroonga.cpp
index 819de30..bfd9631 100644
--- a/ha_mroonga.cpp
+++ b/ha_mroonga.cpp
@@ -9620,13 +9620,13 @@ void ha_mroonga::check_count_skip(key_part_map start_key_part_map,
if (where->type() == Item::FUNC_ITEM) {
Item_func *func_item = static_cast<Item_func *>(where);
- if (func_item->arg_count == 0) {
+ if (func_item->argument_count() == 0) {
break;
}
target = func_item->key_item();
where = where->next;
if (func_item->arguments()[0] == where) {
- uint n_args = func_item->arg_count;
+ uint n_args = func_item->argument_count();
for (; n_args > 0; --n_args) {
where = where->next;
}
......@@ -11,7 +11,6 @@ configure-options =
--with-shared
--without-ada
--without-manpages
--without-progs
--without-tests
--without-normal
--without-debug
......
......@@ -19,10 +19,9 @@ md5sum = 77f27dce7ef88d0634d0d6f90e03a77f
location = ${buildout:parts-directory}/${:_buildout_section_name_}
# build pkg-config twice so that second configure can use pkg-config
# to compute GLIB_CFLAGS and GLIB_LIBS.
configure-command =
./configure --prefix=${:location} --with-installed-glib --with-installed-popt && make && ./configure
pre-configure =
./configure --prefix=${:location} --with-installed-glib --with-installed-popt && make
configure-options =
--prefix=${:location}
--with-installed-glib
--with-installed-popt
--disable-host-tool
......
......@@ -15,8 +15,8 @@ extends =
[kvm]
recipe = slapos.recipe.cmmi
# qemu-kvm and qemu are now the same since 1.3.
url = http://wiki.qemu-project.org/download/qemu-2.2.1.tar.bz2
md5sum = 833ff4457062456d38d6567f802ffef4
url = http://wiki.qemu-project.org/download/qemu-2.4.0.tar.bz2
md5sum = 186ee8194140a484a455f8e3c74589f4
configure-options =
--target-list="$(uname -m 2>/dev/null|sed 's,^i[456]86$,i386,')-softmmu"
--enable-system
......@@ -29,9 +29,9 @@ configure-options =
--disable-curl
--enable-kvm
--disable-docs
--enable-vnc
--enable-vnc-png
--disable-vnc-jpeg
--enable-vnc-ws
--extra-cflags="-I${gnutls:location}/include -I${libuuid:location}/include -I${zlib:location}/include -I${libpng:location}/include"
--extra-ldflags="-Wl,-rpath -Wl,${glib:location}/lib -L${glib:location}/lib -Wl,-rpath -Wl,${gnutls:location}/lib -L${gnutls:location}/lib -Wl,-rpath -Wl,${gpg-error:location}/lib -L${gpg-error:location}/lib -L${gettext:location}/lib -Wl,-rpath -Wl,${gettext:location}/lib -Wl,-rpath -Wl,${libpng:location}/lib -L${libpng:location}/lib -L${libuuid:location}/lib -Wl,-rpath -Wl,${libuuid:location}/lib -L${zlib:location}/lib -Wl,-rpath -Wl,${zlib:location}/lib -lpng -lz -lgnutls"
--disable-werror
......
......@@ -20,13 +20,15 @@ patch-options =
patches =
${:_profile_base_location_}/tesseract-3.00-gcc-4.7-build.patch#ca80db3ec489c547b03f3ee48879c1b1
${:_profile_base_location_}/tesseract-3.01-remove-bom.patch#2e691858cb492b7c17d23bf0912b3d24
configure-command =
pre-configure =
libtoolize -f -c
aclocal -I ${libtool:location}/share/aclocal -I config
autoheader -f
automake -c -a -f
autoconf -Wno-portability
./configure --prefix=${buildout:parts-directory}/${:_buildout_section_name_} --disable-static --datarootdir=${tesseract-eng-traineddata:location}
configure-options =
--disable-static
--datarootdir=${tesseract-eng-traineddata:location}
# XXX: tesseract seems not easily configurable at runtime about where to find
# its trained data, so we set its datarootdir above to a controlled location
......
[buildout]
extends =
../../component/lua/buildout.cfg
../../component/hwloc/buildout.cfg
../../component/pkgconfig/buildout.cfg
../../component/libtool/buildout.cfg
../../component/make/buildout.cfg
......@@ -23,7 +22,6 @@ recipe = slapos.recipe.cmmi
url = http://apache.claz.org/trafficserver/trafficserver-4.2.3.tar.bz2
md5sum = 1d06a6e9063ceea3f19dbb84752ec710
configure-options =
--prefix=${buildout:parts-directory}/${:_buildout_section_name_}
--with-openssl=${openssl:location}
--with-xml=libxml2
--with-libxml2=${libxml2:location}
......
......@@ -28,7 +28,7 @@ from setuptools import setup, find_packages
import glob
import os
version = '1.0.9.dev0'
version = '1.0.15.dev0'
name = 'slapos.cookbook'
long_description = open("README.txt").read() + "\n" + \
open("CHANGES.txt").read() + "\n"
......
......@@ -49,6 +49,11 @@ httpd_port = %(httpd-port)s
netcat_bin = '%(netcat-binary)s'.strip()
cluster_doc_host = '%(cluster-doc-host)s'
cluster_doc_port = %(cluster-doc-port)s
language = '%(language)s'
language_list = ['ar', 'da', 'de', 'de-ch', 'en-gb', 'en-us', 'es', 'et', 'fi',
'fo', 'fr', 'fr-be', 'fr-ca', 'fr-ch', 'hr', 'hu', 'is', 'it', 'ja', 'lt',
'lv', 'mk', 'nl', 'nl-be', 'no', 'pl', 'pt', 'pt-br', 'ru', 'sl', 'sv',
'th', 'tr']
def md5Checksum(file_path):
with open(file_path, 'rb') as fh:
......@@ -246,6 +251,8 @@ if tap_network_parameter == [] and nat_network_parameter == []:
print 'Warning : No network interface defined.'
else:
kvm_argument_list += nat_network_parameter + tap_network_parameter
if language in language_list:
kvm_argument_list.extend(['-k', language])
for disk in additional_disk_list:
kvm_argument_list.extend([
......
......@@ -33,7 +33,7 @@ class Recipe(GenericBaseRecipe):
def _options(self, options):
self.directory = options.copy()
del self.directory['recipe']
self.mode = int(self.directory.pop('mode', '700'), 8)
self.mode = int(self.directory.pop('mode', '0777'), 8)
def install(self):
for path in sorted(self.directory.itervalues()):
......
......@@ -65,7 +65,7 @@ class ServerHandler(SimpleHTTPRequestHandler):
logging.info('Writing recieved content to file %s' % file_path)
try:
with open(file_path, method) as myfile:
myfile.write(content.decode('utf-8'))
myfile.write(content)
logging.info('Done.')
except IOError as e:
logging.error('Something happened while processing \'writeFile\'. The message is %s' %
......
......@@ -98,7 +98,7 @@ mode = 0644
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/instance-kvm.cfg.jinja2
mode = 644
md5sum = 52e115fe1aaf232994af9037bf7c292c
md5sum = 90309e9a1efe6d6b981a27f503c86277
download-only = true
on-update = true
......@@ -106,7 +106,7 @@ on-update = true
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/instance-kvm-cluster.cfg.jinja2.in
mode = 644
md5sum = 5700de1cadde0b5bede78f08e215f47a
md5sum = 0e06ef2879454eee140fe00e167a01d5
download-only = true
on-update = true
......@@ -114,7 +114,7 @@ on-update = true
recipe = hexagonit.recipe.download
url = ${:_profile_base_location_}/instance-kvm-resilient.cfg.jinja2
mode = 644
md5sum = 7071b61a862ee681c2e4323e6435e98d
md5sum = 450a50069f5617993ac8de47d533d653
download-only = true
on-update = true
......
......@@ -122,6 +122,25 @@
},
"type": "object"
},
"fw-restricted-access": {
"title": "Restrict all access to VM with firewall.",
"description": "When Firewall is enabled, this parameter define if only vm of this cluster and authorized sources ip should have access to cluster.",
"type": "string",
"enum": ["on", "off"],
"default": "off"
},
"fw-authorized-sources": {
"title": "List of IP/Network address authorized to cluster.",
"description": "When Firewall is enabled, this contain the list of IP address to authorize for access to all VM of this cluster.",
"type": "array",
"optional": true
},
"fw-reject-sources": {
"title": "List of IP/Network address rejected, if 'Restrict all access' is off.",
"description": "When Firewall is enabled, this contain the list of IP address which should not access to all VM of this cluster.",
"type": "array",
"optional": true
},
"authorized-keys": {
"title": "Public keys for virtual machines.",
"description": "Set the list of public keys to add in your virtual machine. The public key file will be available in the VM via url http://10.0.2.100/authorized_keys if you keep the NAT interface enabled",
......@@ -198,6 +217,12 @@
"description": "Simulate a multi node NUMA system. If mem and cpus are omitted, resources are split equally. Each numa option are separated by space: node,nodeid=4,cpus=40-49,mem=64g node,nodeid=1,cpus=10-19,mem=128g. Set this option if you know what you're doing.",
"type": "string"
},
"keyboard-layout-language": {
"title": "Use keyboard layout language",
"description": "Use keyboard layout language (for example fr for French). Can be usefull with VNC display",
"type": "string",
"enum": ["ar", "da", "de", "de-ch", "en-gb", "en-us", "es", "et", "fi", "fo", "fr", "fr-be", "fr-ca", "fr-ch", "hr", "hu", "is", "it", "ja", "lt", "lv", "mk", "nl", "nl-be", "no", "pl", "pt", "pt-br", "ru", "sl", "sv", "th", "tr"]
},
"nbd-host": {
"title": "NBD hostname or IP",
"description": "hostname (or IP) of the NBD server containing the boot image.",
......
......@@ -74,6 +74,13 @@ config-enable-monitor = True
config-document-host = ${apache-conf:ip}
config-document-port = ${apache-conf:port}
config-document-path = ${hash-code:passwd}
config-keyboard-layout-language = {{ dumps(kvm_parameter_dict.get('keyboard-layout-language', '')) }}
{% set authorized_source_list = slapparameter_dict.get('fw-authorized-sources', []) -%}
{% set rejected_source_list = slapparameter_dict.get('fw-reject-sources', []) -%}
sla-fw_authorized_sources = {{ authorized_source_list | join(' ') }}
sla-fw_rejected_sources = {{ rejected_source_list | join(' ') }}
sla-fw_restricted_access = {{ dumps(slapparameter_dict.get('fw-restricted-access', 'off')) }}
return =
backend-url
......
......@@ -44,6 +44,12 @@
"description": "Simulate a multi node NUMA system. If mem and cpus are omitted, resources are split equally. Each numa option are separated by space: node,nodeid=4,cpus=40-49,mem=64g node,nodeid=1,cpus=10-19,mem=128g. Set this option if you know what you're doing.",
"type": "string"
},
"keyboard-layout-language": {
"title": "Use keyboard layout language",
"description": "Use keyboard layout language (for example fr for French). Can be usefull with VNC display",
"type": "string",
"enum": ["ar", "da", "de", "de-ch", "en-gb", "en-us", "es", "et", "fi", "fo", "fr", "fr-be", "fr-ca", "fr-ch", "hr", "hu", "is", "it", "ja", "lt", "lv", "mk", "nl", "nl-be", "no", "pl", "pt", "pt-br", "ru", "sl", "sv", "th", "tr"]
},
"nbd-host": {
"title": "NBD hostname",
......
......@@ -34,7 +34,7 @@ return =
# XXX: return ALL parameters (like nat rules), through jinja
backend-url url ip
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
backend-url = ${request-kvm:connection-backend-url}
url = ${request-kvm:connection-url}
......
......@@ -186,6 +186,7 @@ cluster-doc-host =
cluster-doc-port = 0
{% endif -%}
netcat-binary = {{ netcat_bin }}
language = ${slap-parameter:keyboard-layout-language}
[kvm-vnc-promise]
recipe = slapos.cookbook:check_port_listening
......@@ -567,3 +568,6 @@ authorized-key =
# send some content which will be accessible to the vm through static url: http://10.0.2.100/data
data-to-vm =
# Change keyboard layout language
keyboard-layout-language =
#!/usr/bin/env python
# Parse Ansible result log file and and generate a report
import os, time
import json
import sqlite3
from datetime import datetime, timedelta
import sys
FIELDS = ['cmd', 'command', 'start', 'end', 'delta', 'msg', 'stdout', 'stderr',
'response', 'status_code', 'url', 'dest']
class ansibleReport(object):
def __init__(self, db_path,
ansible_log_dir,
name):
self.db_path = db_path
self.ansible_log_dir = ansible_log_dir
self.name = name
self.result_OK = '127.0.0.1_OK'
self.result_failed = '127.0.0.1_FAILED'
self.result_failed_ignore = '127.0.0.1_FAILED_INGORED' # tipo in ansible log upload pluging
self.date_format = '%Y-%m-%d %H:%M:%S'
self.day_format = '%Y-%m-%d'
self._init_db()
def _init_db(self):
db = sqlite3.connect(self.db_path)
c = db.cursor()
c.executescript("""
CREATE TABLE IF NOT EXISTS ansible_report (
name VARCHAR(40),
reportdate VARCHAR(15),
createdate VARCHAR(15),
status VARCHAR(20),
success_count INTEGER,
ignored_count INTEGER,
failed_count INTEGER,
ignored TEXT,
failed TEXT,
success TEXT);
""")
db.commit()
db.close()
def connect_db(self):
db = sqlite3.connect(self.db_path)
return db
def insertEntryDb(self, table_name, data_dict):
db = self.connect_db()
columns = data_dict.keys()
entries = ', '.join(columns)
values = '?' + ', ?' * (len(columns)-1)
sql_string = "insert into %s(%s) values (%s)" % (
table_name, entries, values)
tuple_data = ()
for key in columns:
tuple_data += (data_dict[key],)
db.execute(sql_string, tuple_data)
db.commit()
db.close()
def selectEntriesDb(self, fields=[], start_date=None, limit=0, success=None, order='DESC', where=""):
db = self.connect_db()
entries = ', '.join(fields) if fields else '*'
query = "select %s from ansible_report " % entries
where = " and %s" % where if where else ""
if not start_date:
start_date = datetime.utcnow().strftime(self.day_format)
tuple_values = (start_date,)
if success is not None:
status = 'OK' if success else 'FAILLED'
query += "where createdate>=? and status=? %s order by createdate %s" % (where, order)
tuple_values += (status,)
else:
query += "where createdate>=? %s order by createdate %s" % (where, order)
if limit:
query += " limit ?"
tuple_values += (limit,)
rows = db.cursor().execute(query, tuple_values)
#db.close()
if rows:
return [list(row) for row in rows]
return []
def truncateEntriesDb(self, table_name, on_field, to_value, operator='<'):
db = self.connect_db()
query = "delete from %s where %s%s?" % (table_name, on_field,
operator)
db.execute(query, (to_value,))
db.commit()
db.close()
def getLogString(self, res, head=False):
log = ""
if type(res) == type(dict()):
log = '%s, args [%s]\n' % (res['invocation']['module_name'],
res['invocation']['module_args'])
if head:
return log
for field in FIELDS:
if field in res.keys():
# use default encoding, check out sys.setdefaultencoding
log += '\n{0}:\n{1}'.format(field, res[field])
return log
def _read_file(self, filepath):
content = '[]'
with open(filepath, 'r') as f:
content = f.read()
return content
def saveResult(self):
date = datetime.utcnow().strftime(self.date_format)
files_list = os.listdir(self.ansible_log_dir)
if not len(files_list):
return
to_date = (datetime.now() - timedelta(days=2)).strftime(self.date_format)
cmp_file = os.path.join(self.ansible_log_dir, files_list.pop())
modification_date = datetime.fromtimestamp(
os.path.getmtime(cmp_file)
).strftime(self.date_format)
# Get the latest insert date
result = self.selectEntriesDb(['reportdate'], start_date=to_date, limit=1)
if len(result):
latest_date = result[0][0]
if latest_date >= modification_date:
return
file_map = dict(
success_file=os.path.join(self.ansible_log_dir, self.result_OK),
failed_file=os.path.join(self.ansible_log_dir, self.result_failed),
ignored_file=os.path.join(self.ansible_log_dir, self.result_failed_ignore))
data = dict(name=self.name, status='FAILED',
reportdate=modification_date, createdate=date,
success_count=0, ignored_count=0,
failed_count=0, success="",
failed="", ignored="")
for category in ('failed', 'success', 'ignored'):
file_category = file_map['%s_file' % category]
if os.path.exists(file_category):
text_content = self._read_file(file_category)
count = len(json.loads(text_content))
if count > 0:
data['%s_count' % category] = count
data[category] = text_content
if data['failed_count'] == 0:
data['status'] = 'OK'
self.insertEntryDb('ansible_report', data)
def getAnsibleReport(self, start_date=None, limit=0, success=None, order='DESC', category=None, head=False, only_state=True):
"""Get one or many entries from the ansible report table.
"""
where = ""
get_content = category is not None
fields = ['name', 'reportdate', 'createdate', 'status', 'success_count',
'ignored_count', 'failed_count']
if category:
where = " %s_count>0" % category
if not only_state:
fields.append(category)
rows = self.selectEntriesDb(fields=fields, start_date=start_date,
limit=limit, success=success, order=order,
where=where)
result_dict = {}
if category and not only_state:
last_pos = len(fields) -1
for i in range (0, len(rows)):
message = ""
message_list = json.loads(rows[i][last_pos])
for msg in message_list:
message += '%s\n\n' % self.getLogString(msg, head=head)
rows[i][last_pos] = message
else:
return {}
return rows
if __name__ == "__main__":
json = """{
"status": "OK",
"message": "kvm-1: OK(114) FAILED(0) IGNORED(2)",
"description": "Ansible playbook report in kvm-1. Execution date is: 2015-08-28 17:42:01."
}"""
parameter_dict = json.loads(sys.argv[1])
with open(parameter_dict['status_path'], 'w') as status_file:
status_file.write(json)
\ No newline at end of file
......@@ -19,11 +19,30 @@ extends =
parts =
# keep neoppod first so that ZODB3 is built correctly,
# before any other section that would depend on it
neoppod-develop
neoppod
slapos-deps-eggs
slapos-cookbook-develop
slapos-cookbook
[neoppod-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/neoppod.git
git-executable = ${git:location}/bin/git
[neoppod-develop]
recipe = zc.recipe.egg:develop
setup = ${neoppod-repository:location}
[neoppod]
recipe = zc.recipe.egg
eggs = neoppod[admin, ctl, master, storage-importer, storage-mysqldb]
${mysql-python:egg}
ZODB3
ZODB3-patches =
${:_profile_base_location_}/../../component/egg-patch/ZODB3-3.10.5.patch
ZODB3-patch-options = -p1
[slapos-deps-eggs]
recipe = zc.recipe.egg
eggs =
......@@ -90,17 +109,8 @@ md5sum = 84b1150ce30ec827485f9c17debd6b44
url = ${:_profile_base_location_}/my.cnf.in
md5sum = febd3ed58043ce1367b86cf6e4e69700
[neoppod]
recipe = zc.recipe.egg
eggs = neoppod[admin, ctl, master, storage-importer, storage-mysqldb]
${mysql-python:egg}
ZODB3
ZODB3-patches = ${:_profile_base_location_}/../../component/egg-patch/ZODB3-3.10.5.patch
ZODB3-patch-options = -p1
[versions]
MySQL-python = 1.2.5
neoppod = 1.5
slapos.recipe.template = 2.8
# patched egg
ZODB3 = 3.10.5+SlapOSPatched001
......
......@@ -16,7 +16,6 @@ ecdsa = 0.13
erp5.util = 0.4.43
gitdb = 0.6.4
gunicorn = 19.3.0
plone.recipe.command = 1.1
prettytable = 0.7.2
pycrypto = 2.6.1
slapos.recipe.template = 2.8
......
......@@ -324,7 +324,7 @@ md5sum = 985c0010db6b553a89dbdb31353c56f5
[template-zope]
<= download-base
filename = instance-zope.cfg.in
md5sum = 0cd033da89a79c5b26dc0342ea57d5f7
md5sum = 07d5d0df5d16b46602760a8673d4395b
link-binary =
${aspell:location}/bin/aspell
${dmtx-utils:location}/bin/dmtxwrite
......@@ -674,7 +674,6 @@ ipython = 4.0.0
logilab-common = 1.1.0
numpy = 1.10.1
objgraph = 2.0.1
plone.recipe.command = 1.1
ply = 3.8
polib = 1.0.7
pprofile = 1.7.3
......@@ -704,11 +703,6 @@ xupdate-processor = 0.4
# Products.CMFCore==2.2.9
Products.ZSQLMethods = 2.13.4
# Required by:
# ipython==4.0.0
# traitlets==4.0.0
decorator = 4.0.4
# Required by:
# SOAPpy===0.12.0nxd001
fpconst = 0.7.2
......
......@@ -285,9 +285,9 @@ node-id = {{ dumps(node_id_base ~ '-' ~ index) }}
{% for db_name, zodb in zodb_dict.iteritems() -%}
{% if zodb['type'] == 'neo' -%}
{% do import_set.add('neo.client') -%}
{% set log = '~/var/log/' ~ name ~ '-neo-' ~ db_name ~ '.log' -%}
{% do log_list.append(log) -%}
{% do zodb['storage-dict'].update(logfile=log) -%}
{% set log = name ~ '-neo-' ~ db_name ~ '.log' -%}
{% do log_list.append('${directory:log}/' + log) -%}
{% do zodb['storage-dict'].update(logfile='~/var/log/'+log) -%}
{% endif -%}
{% endfor -%}
import-list = {{ dumps(list(import_set)) }}
......
......@@ -25,7 +25,7 @@ parts +=
promise
frontend-promise
content-promise
publish-connection-informations
publish-connection-information
{{ replicated.replicate("mariadb", "3", "mariadb-export", "mariadb-import") }}
......@@ -45,7 +45,7 @@ wrapper = /bin/true
path = ${directory:www}
# Add "exporter" parameters to list of published connection parameters
[publish-connection-informations]
[publish-connection-information]
# XXX-Cedric: Long term goal: could be a recipe that requests an instance and
# bubbles ALL
# parameters of the requested instance. Requirement: aggregated publish.
......
......@@ -13,7 +13,7 @@ parts =
frontend-promise
content-promise
publish-connection-informations
publish-connection-information
${custom-application-deployment:part-list}
......@@ -276,7 +276,7 @@ config-custom_domain = $${slap-parameter:domain}
#--
#-- Publish instance parameters.
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
backend_url = $${apache-php:url}
url = $${request-frontend:connection-site_url}
......
......@@ -74,7 +74,7 @@ mode = 0644
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
output = ${buildout:directory}/instance-apache-php.cfg
md5sum = b2564a719fdde097f402ef80e0991903
md5sum = 963ec2e460b281405b9e0e2748a27e62
mode = 0644
[instance-apache-import]
......@@ -96,7 +96,7 @@ context = key templateapache instance-apache-php:output
import-list = file parts template-parts:destination
file replicated template-replicated:destination
md5sum = 24c5d0db063e5343a3cb0db9d5fbc738
md5sum = 00068d0f68a9e1eb5a6e89e73a3dc399
mode = 0644
[instance-resilient]
......@@ -112,7 +112,7 @@ context = key buildout buildout:bin-directory
import-list = file parts template-parts:destination
file replicated template-replicated:destination
md5sum = 5e2f917b032e43af6a736532966ae1f0
md5sum = f171782b98c1143d44ec2a35d8259254
mode = 0644
[instance-mariadb]
......
......@@ -11,7 +11,7 @@ offline = true
# += because we need to take up parts (like instance-custom, slapmonitor etc) from the profile we extended
parts +=
{{ parts.replicate("apache", "3") }}
publish-connection-informations
publish-connection-information
{{ replicated.replicate("apache", "3", "apache-export", "apache-import") }}
......@@ -27,7 +27,7 @@ config-mariadb3-computer-guid = ${slap-parameter:mariadb3-computer-guid}
config-pbs-mariadb3-computer-guid = ${slap-parameter:pbs-mariadb3-computer-guid}
config-domain = ${slap-parameter:domain}
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
backend_url = ${request-apache:connection-backend_url}
url = ${request-apache:connection-url}
......
......@@ -25,7 +25,7 @@ parts +=
promise
frontend-promise
content-promise
publish-connection-informations
publish-connection-information
{{ replicated.replicate("postgres", "3", "postgres-export", "postgres-import") }}
......@@ -45,7 +45,7 @@ wrapper = /bin/true
path = ${directory:www}
# Add "exporter" parameters to list of published connection parameters
[publish-connection-informations]
[publish-connection-information]
# XXX-Cedric: Long term goal: could be a recipe that requests an instance and
# bubbles ALL
# parameters of the requested instance. Requirement: aggregated publish.
......
......@@ -15,7 +15,7 @@ parts =
frontend-promise
content-promise
publish-connection-informations
publish-connection-information
${custom-application-deployment:part-list}
eggs-directory = ${buildout:eggs-directory}
......@@ -261,7 +261,7 @@ path = $${directory:report}/slapmonitor-xml
#--
#-- Publish instance parameters.
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
backend_url = $${apache-php:url}
url = $${request-frontend:connection-site_url}
......
......@@ -62,7 +62,7 @@ mode = 0644
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
output = ${buildout:directory}/instance-apache-php.cfg
md5sum = 7a0670c747f2f21a79c240bfbfbf9f6e
md5sum = 8b9e7ac376cad5235e88a45ece817e6b
mode = 0644
[instance-apache-import]
......@@ -84,7 +84,7 @@ context = key templateapache instance-apache-php:output
import-list = file parts template-parts:destination
file replicated template-replicated:destination
md5sum = bdc7e126567ece6bf93a9bb493e29fac
md5sum = dca811871e293cf3ce1bfc52dd8dab64
mode = 0644
[instance-resilient]
......@@ -100,7 +100,7 @@ context = key buildout buildout:bin-directory
import-list = file parts template-parts:destination
file replicated template-replicated:destination
md5sum = 35bbf8cb40fe7185664641d82b406334
md5sum = e8fd20a32c87853ecba2846f50cd0898
mode = 0644
[instance-postgres]
......
......@@ -11,7 +11,7 @@ offline = true
# += because we need to take up parts (like instance-custom, slapmonitor etc) from the profile we extended
parts +=
{{ parts.replicate("apache", "3") }}
publish-connection-informations
publish-connection-information
{{ replicated.replicate("apache", "3", "apache-export", "apache-import") }}
......@@ -28,7 +28,7 @@ config-pbs-postgres3-computer-guid = ${slap-parameter:pbs-postgres3-computer-gui
config-domain = ${slap-parameter:domain}
config-maarch-sql-data-file = ${slap-parameter:maarch-sql-data-file}
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
backend_url = ${request-apache:connection-backend_url}
url = ${request-apache:connection-url}
......
......@@ -41,7 +41,7 @@ recipe = slapos.recipe.template
url = ${:_profile_base_location_}/monitor.cfg.in
output = ${buildout:directory}/monitor.cfg
filename = monitor.cfg
md5sum = 51284c0aeb62eccd37f8a4e1621ee28c
md5sum = 9b31959560d3cde094199e267bbb013b
mode = 0644
[monitor-bin]
......
......@@ -288,3 +288,6 @@ curl_path = ${curl:location}/bin/curl
[publish-connection-informations]
recipe = slapos.cookbook:publish
monitor_url = $${monitor-parameters:url}
[publish-connection-information]
<= publish-connection-informations
......@@ -38,7 +38,7 @@ eggs = collective.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/pbsready.cfg.in
output = ${buildout:directory}/pbsready.cfg
md5sum = 7d7cb70cb76a41f853e74cc34a9ef428
md5sum = 4962204261e38c782c80ab9ca71410e9
mode = 0644
[pbsready-import]
......@@ -63,13 +63,13 @@ mode = 0644
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-pull-backup.cfg.in
output = ${buildout:directory}/instance-pull-backup.cfg
md5sum = 0e6a95e7a9b38d402f94c11b7d10397e
md5sum = 932acec2718e3daef839886b71e667cd
mode = 0644
[template-replicated]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/template-replicated.cfg.in
md5sum = 0641a65142fe0f624bf7c112081c2527
md5sum = 738f21e9fbfaee0d150d49da0afd7435
mode = 0644
destination = ${buildout:directory}/template-replicated.cfg.in
......
[buildout]
parts =
publish-connection-informations
publish-connection-information
pbs
logrotate
cron
......@@ -245,7 +245,7 @@ ignore-known-hosts-file = false
#--
#-- Publish instance parameters.
[publish-connection-informations]
[publish-connection-information]
recipe = slapos.cookbook:publish
ssh-key = $${sshkeys-dropbear:public-key-value}
notification-url = http://[$${notifier:host}]:$${notifier:port}/notify
......@@ -272,5 +272,5 @@ mode = 700
context =
key input_feed_directory directory:notifier-feeds
key monitor_feed_directory monitor-directory:public-cgi
key base_url publish-connection-informations:feeds-url
key base_url publish-connection-information:feeds-url
raw python_executable ${buildout:executable}
......@@ -120,7 +120,7 @@ create = true
<= logrotate
recipe = slapos.cookbook:logrotate.d
name = equeue
log = $${equeue:log}
log = $${equeue:log} $${dropbear-sshd:log}
frequency = daily
rotate-num = 30
......@@ -188,6 +188,14 @@ dropbear-binary = ${dropbear:location}/sbin/dropbear
recipe = slapos.cookbook:dropbear.add_authorized_key
key = $${slap-parameter:authorized-key}
[dropbear-sshd]
recipe = collective.recipe.template
log = $${basedirectory:log}/sshd.log
input = inline:#!/bin/sh
exec $${dropbear-server:wrapper} >> $${:log}/sshd.log 2>&1
output = $${rootdirectory:bin}/raw_sshd_log
mode = 700
#----------------
#--
......@@ -210,7 +218,7 @@ keygen-binary = ${dropbear:location}/bin/dropbearkey
recipe = slapos.cookbook:sshkeys_authority.request
name = dropbear
type = rsa
executable = $${dropbear-server:wrapper}
executable = $${dropbear-sshd:output}
public-key = $${dropbear-server:rsa-keyfile}.pub
private-key = $${dropbear-server:rsa-keyfile}
wrapper = $${basedirectory:services}/sshd
......
......@@ -97,7 +97,7 @@ sla-{{ key }} = {{ value }}
{% endfor -%}
{% endif %}
[publish-connection-informations]
[publish-connection-information]
feed-url-{{namebase}}-{{id}}-push = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${request-{{namebase}}-pseudo-replicating-{{id}}:pbs-notification-id}
takeover-{{namebase}}-{{id}}-url = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-takeover-url}
takeover-{{namebase}}-{{id}}-password = ${request-{{namebase}}-pseudo-replicating-{{id}}:connection-takeover-password}
......@@ -208,7 +208,7 @@ config-remove-backup-older-than = {{ slapparameter_dict.get('remove-backup-older
slave = true
sla-instance_guid = ${request-pbs-{{namebase}}-{{id}}:instance_guid}
[publish-connection-informations]
[publish-connection-information]
feed-url-{{namebase}}-{{id}}-pull = ${request-pbs-{{namebase}}-{{id}}:connection-feeds-url}${request-pull-backup-server-{{namebase}}-{{id}}:config-notification-id}
......
......@@ -138,18 +138,18 @@ requests = 2.8.1
setuptools = 18.1
simplejson = 3.8.0
six = 1.10.0
slapos.cookbook = 1.0.9
slapos.core = 1.3.12
slapos.cookbook = 1.0.14
slapos.core = 1.3.13
slapos.extension.strip = 0.1
slapos.libnetworkcache = 0.14.5
slapos.recipe.build = 0.21
slapos.recipe.build = 0.23
slapos.recipe.cmmi = 0.2
stevedore = 1.9.0
unicodecsv = 0.14.1
xml-marshaller = 0.9.7
# Required by:
# slapos.core==1.3.12
# slapos.core==1.3.13
Flask = 0.10.1
# Required by:
......@@ -174,15 +174,15 @@ functools32 = 3.2.3.post2
ipaddress = 1.0.14
# Required by:
# slapos.cookbook==1.0.9
# slapos.cookbook==1.0.14
jsonschema = 2.5.1
# Required by:
# slapos.cookbook==1.0.9
# slapos.cookbook==1.0.14
lock-file = 2.0
# Required by:
# slapos.core==1.3.12
# slapos.core==1.3.13
netifaces = 0.10.4
# Required by:
......@@ -190,15 +190,15 @@ netifaces = 0.10.4
pycparser = 2.14
# Required by:
# slapos.core==1.3.12
# slapos.core==1.3.13
supervisor = 3.1.3
# Required by:
# slapos.core==1.3.12
# slapos.core==1.3.13
uritemplate = 0.6
# Required by:
# slapos.core==1.3.12
# slapos.core==1.3.13
zope.interface = 4.1.3
[networkcache]
......
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