Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Romain Courteaud
slapos
Commits
561ffa48
Commit
561ffa48
authored
Apr 30, 2013
by
Kazuhiko Shiozaki
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'erp5' into erp5-z2.13
parents
0d105d0e
bb6746ed
Changes
28
Hide whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
247 additions
and
108 deletions
+247
-108
CHANGES.txt
CHANGES.txt
+7
-0
component/groonga/buildout.cfg
component/groonga/buildout.cfg
+4
-4
component/jsl/buildout.cfg
component/jsl/buildout.cfg
+24
-0
component/libxml2/buildout.cfg
component/libxml2/buildout.cfg
+2
-2
component/mariadb/buildout.cfg
component/mariadb/buildout.cfg
+2
-2
component/noVNC/buildout.cfg
component/noVNC/buildout.cfg
+1
-1
component/qemu-kvm/buildout.cfg
component/qemu-kvm/buildout.cfg
+8
-3
component/zabbix/buildout.cfg
component/zabbix/buildout.cfg
+2
-2
setup.py
setup.py
+1
-1
slapos/recipe/apachephp/__init__.py
slapos/recipe/apachephp/__init__.py
+5
-0
slapos/recipe/kvm_frontend/__init__.py
slapos/recipe/kvm_frontend/__init__.py
+2
-1
slapos/recipe/kvm_frontend/template/kvm-proxy.js
slapos/recipe/kvm_frontend/template/kvm-proxy.js
+63
-39
slapos/recipe/kvm_frontend/template/nodejs_run.in
slapos/recipe/kvm_frontend/template/nodejs_run.in
+1
-1
slapos/recipe/zabbixagent/__init__.py
slapos/recipe/zabbixagent/__init__.py
+7
-4
software/kvm/common.cfg
software/kvm/common.cfg
+4
-10
software/kvm/development.cfg
software/kvm/development.cfg
+10
-3
software/kvm/instance-frontend.cfg.in
software/kvm/instance-frontend.cfg.in
+13
-4
software/kvm/instance-kvm.cfg.in
software/kvm/instance-kvm.cfg.in
+3
-4
software/kvm/instance-kvmplus.cfg.in
software/kvm/instance-kvmplus.cfg.in
+0
-14
software/kvm/instance.cfg.in
software/kvm/instance.cfg.in
+0
-1
software/kvm/software.cfg
software/kvm/software.cfg
+1
-1
software/tt-rss/development.cfg
software/tt-rss/development.cfg
+57
-0
software/tt-rss/instance-custom.cfg.in
software/tt-rss/instance-custom.cfg.in
+6
-1
software/tt-rss/software.cfg
software/tt-rss/software.cfg
+5
-2
software/tt-rss/template/config.php.in
software/tt-rss/template/config.php.in
+1
-2
stack/erp5/buildout.cfg
stack/erp5/buildout.cfg
+3
-0
stack/lamp/apache/instance-apache-php.cfg.in
stack/lamp/apache/instance-apache-php.cfg.in
+12
-3
stack/lamp/buildout.cfg
stack/lamp/buildout.cfg
+3
-3
No files found.
CHANGES.txt
View file @
561ffa48
Changes
Changes
=======
=======
0.78.0 (2013-04-28)
-------------------
* LAMP stack: Allow to give application-dependent parameters to application configuration file. [Cedric de Saint Martin]
* zabbix-agent: Allow user to pass zabbix parameter. [Cedric de Saint Martin]
* kvm frontend: listen to ipv6 and ipv4. [Jean-Baptiste Petre]
0.77.1 (2013-04-18)
0.77.1 (2013-04-18)
-------------------
-------------------
...
...
component/groonga/buildout.cfg
View file @
561ffa48
...
@@ -11,9 +11,9 @@ extends =
...
@@ -11,9 +11,9 @@ extends =
[groonga]
[groonga]
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
version = 3.0.
2
version = 3.0.
3
url = http://packages.groonga.org/source/groonga/groonga-${:version}.tar.gz
url = http://packages.groonga.org/source/groonga/groonga-${:version}.tar.gz
md5sum =
b17934ef2589a4e261ed0d99aec713eb
md5sum =
19dbee5393b2f9c793c4caae5ba81bec
configure-options =
configure-options =
--disable-static
--disable-static
--disable-glibtest
--disable-glibtest
...
@@ -27,9 +27,9 @@ environment =
...
@@ -27,9 +27,9 @@ environment =
[groonga-normalizer-mysql]
[groonga-normalizer-mysql]
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
version = 1.0.
2
version = 1.0.
3
url = http://packages.groonga.org/source/groonga-normalizer-mysql/groonga-normalizer-mysql-${:version}.tar.gz
url = http://packages.groonga.org/source/groonga-normalizer-mysql/groonga-normalizer-mysql-${:version}.tar.gz
md5sum =
782111599dcba5023beb698dc5ea514a
md5sum =
3f266c608017eb1b2e24b6bac1801ab2
location = ${groonga:location}
location = ${groonga:location}
depends =
depends =
${groonga:version}
${groonga:version}
...
...
component/jsl/buildout.cfg
0 → 100644
View file @
561ffa48
# jsl - command line javascript lint
# http://javascriptlint.com/
[buildout]
parts = jsl
[jsl]
recipe = slapos.recipe.build
url = http://www.javascriptlint.com/download/jsl-0.3.0-src.tar.gz
md5sum = 2b94ffa4fab07acabe0c5e73cd49bcdf
script =
location = %(location)r
self.failIfPathExists(location)
import sys
url = self.options['url']
md5sum = self.options['md5sum']
extract_dir = self.extract(self.download(url, md5sum))
workdir = guessworkdir(extract_dir)
os.chdir(os.path.join(workdir, 'src'))
os.system('make -f Makefile.ref')
os.mkdir(location)
bindir = os.path.join(location, 'bin')
os.mkdir(bindir)
os.system('cp */jsl ' + bindir)
component/libxml2/buildout.cfg
View file @
561ffa48
...
@@ -8,8 +8,8 @@ parts =
...
@@ -8,8 +8,8 @@ parts =
[libxml2]
[libxml2]
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
url = ftp://ftp.xmlsoft.org/libxml2/libxml2-2.9.
0
.tar.gz
url = ftp://ftp.xmlsoft.org/libxml2/libxml2-2.9.
1
.tar.gz
md5sum =
5b9bebf4f5d2200ae2c4efe8fa6103f7
md5sum =
9c0cfef285d5c4a5c80d00904ddab380
configure-options =
configure-options =
--disable-static
--disable-static
--without-python
--without-python
...
...
component/mariadb/buildout.cfg
View file @
561ffa48
...
@@ -62,8 +62,8 @@ environment =
...
@@ -62,8 +62,8 @@ environment =
# mroonga - a storage engine for MySQL. It provides fast fulltext search feature to all MySQL users.
# mroonga - a storage engine for MySQL. It provides fast fulltext search feature to all MySQL users.
# http://mroonga.github.com/
# http://mroonga.github.com/
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
url = http://packages.groonga.org/source/mroonga/mroonga-3.0
2
.tar.gz
url = http://packages.groonga.org/source/mroonga/mroonga-3.0
3
.tar.gz
md5sum =
b2d1a4abc12030fdbd9064bbb6175366
md5sum =
daa1547259145b05b4cdee6b513bf8c8
configure-options =
configure-options =
--with-mysql-source=${mariadb:location}__compile__/mariadb-${mariadb:version}
--with-mysql-source=${mariadb:location}__compile__/mariadb-${mariadb:version}
--with-mysql-config=${mariadb:location}/bin/mysql_config
--with-mysql-config=${mariadb:location}/bin/mysql_config
...
...
component/noVNC/buildout.cfg
View file @
561ffa48
...
@@ -6,5 +6,5 @@ parts =
...
@@ -6,5 +6,5 @@ parts =
recipe = hexagonit.recipe.download
recipe = hexagonit.recipe.download
# Post-0.4 release from January 2013
# Post-0.4 release from January 2013
url = http://github.com/kanaka/noVNC/zipball/3b2acc2258d36137a37edfbe0f03a3099189c49d
url = http://github.com/kanaka/noVNC/zipball/3b2acc2258d36137a37edfbe0f03a3099189c49d
md5sum =
0d06abc20e59643e14fefe52b42daf60
md5sum =
a276be8fa193652bb5de8a271603f11f
strip-top-level-dir = true
strip-top-level-dir = true
component/qemu-kvm/buildout.cfg
View file @
561ffa48
...
@@ -3,6 +3,7 @@ extends =
...
@@ -3,6 +3,7 @@ extends =
../../component/gnutls/buildout.cfg
../../component/gnutls/buildout.cfg
../../component/libpng/buildout.cfg
../../component/libpng/buildout.cfg
../../component/libuuid/buildout.cfg
../../component/libuuid/buildout.cfg
../../component/xorg/buildout.cfg
../../component/zlib/buildout.cfg
../../component/zlib/buildout.cfg
[kvm]
[kvm]
...
@@ -11,9 +12,11 @@ extends =
...
@@ -11,9 +12,11 @@ extends =
[qemu-kvm]
[qemu-kvm]
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
url = http://downloads.sourceforge.net/project/kvm/qemu-kvm/1.2.0/qemu-kvm-1.2.0.tar.gz
# qemu-kvm and qemu are now the same since 1.3.
md5sum = d7b18b673c48abfee65a9c0245df0415
url = http://wiki.qemu-project.org/download/qemu-1.4.1.tar.bz2
md5sum = eb2d696956324722b5ecfa46e41f9a75
configure-options =
configure-options =
--target-list=""
--disable-sdl
--disable-sdl
--disable-xen
--disable-xen
--enable-vnc-tls
--enable-vnc-tls
...
@@ -24,9 +27,11 @@ configure-options =
...
@@ -24,9 +27,11 @@ configure-options =
--disable-docs
--disable-docs
--enable-vnc-png
--enable-vnc-png
--disable-vnc-jpeg
--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-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"
--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
--disable-werror
environment =
environment =
PATH=${pkgconfig:location}/bin:%(PATH)s
PATH=${pkgconfig:location}/bin:%(PATH)s
PKG_CONFIG_PATH=${gnutls:location}/lib/pkgconfig:${glib:location}/lib/pkgconfig
PKG_CONFIG_PATH=${gnutls:location}/lib/pkgconfig:${glib:location}/lib/pkgconfig:${pixman:location}/lib/pkgconfig
component/zabbix/buildout.cfg
View file @
561ffa48
...
@@ -4,8 +4,8 @@ parts =
...
@@ -4,8 +4,8 @@ parts =
[zabbix-agent]
[zabbix-agent]
recipe = slapos.recipe.cmmi
recipe = slapos.recipe.cmmi
url = http://prdownloads.sourceforge.net/zabbix/zabbix-2.0.
1
.tar.gz?download
url = http://prdownloads.sourceforge.net/zabbix/zabbix-2.0.
5
.tar.gz?download
md5sum =
3b301aa4f2b7cb5ede46884b9c7873e1
md5sum =
0c0721c31889b63bce9aa556bcb927e8
configure-options =
configure-options =
--enable-agent
--enable-agent
--enable-ipv6
--enable-ipv6
setup.py
View file @
561ffa48
...
@@ -28,7 +28,7 @@ from setuptools import setup, find_packages
...
@@ -28,7 +28,7 @@ from setuptools import setup, find_packages
import
glob
import
glob
import
os
import
os
version
=
'0.7
7.2
.dev'
version
=
'0.7
8.1
.dev'
name
=
'slapos.cookbook'
name
=
'slapos.cookbook'
long_description
=
open
(
"README.txt"
).
read
()
+
"
\
n
"
+
\
long_description
=
open
(
"README.txt"
).
read
()
+
"
\
n
"
+
\
open
(
"CHANGES.txt"
).
read
()
+
"
\
n
"
open
(
"CHANGES.txt"
).
read
()
+
"
\
n
"
...
...
slapos/recipe/apachephp/__init__.py
View file @
561ffa48
...
@@ -105,6 +105,11 @@ class Recipe(GenericBaseRecipe):
...
@@ -105,6 +105,11 @@ class Recipe(GenericBaseRecipe):
port
=
self
.
options
[
'port'
],
port
=
self
.
options
[
'port'
],
# XXX-Cedric: add frontend url.
# XXX-Cedric: add frontend url.
)
)
# Allow to give custom parameters to template
application_parameter_prefix
=
'application-'
for
key
in
self
.
options
.
keys
():
if
key
.
startswith
(
application_parameter_prefix
):
application_conf
[
key
.
lstrip
(
application_parameter_prefix
)]
=
self
.
options
[
key
]
directory
,
file_
=
os
.
path
.
split
(
self
.
options
[
'configuration'
])
directory
,
file_
=
os
.
path
.
split
(
self
.
options
[
'configuration'
])
...
...
slapos/recipe/kvm_frontend/__init__.py
View file @
561ffa48
...
@@ -107,7 +107,8 @@ class Recipe(GenericSlapRecipe):
...
@@ -107,7 +107,8 @@ class Recipe(GenericSlapRecipe):
http_redirect_server
=
''
http_redirect_server
=
''
config
=
dict
(
config
=
dict
(
ip
=
self
.
options
[
'ip'
],
ipv6
=
self
.
options
[
'ipv6'
],
ipv4
=
self
.
options
[
'ipv4'
],
port
=
self
.
options
[
'port'
],
port
=
self
.
options
[
'port'
],
key
=
self
.
options
[
'ssl-key-path'
],
key
=
self
.
options
[
'ssl-key-path'
],
certificate
=
self
.
options
[
'ssl-cert-path'
],
certificate
=
self
.
options
[
'ssl-cert-path'
],
...
...
slapos/recipe/kvm_frontend/template/kvm-proxy.js
View file @
561ffa48
...
@@ -37,12 +37,13 @@ var fs = require('fs'),
...
@@ -37,12 +37,13 @@ var fs = require('fs'),
httpProxy
=
require
(
'
http-proxy
'
),
httpProxy
=
require
(
'
http-proxy
'
),
proxyByUrl
=
require
(
'
proxy-by-url
'
);
proxyByUrl
=
require
(
'
proxy-by-url
'
);
var
listenInterface
=
process
.
argv
[
2
],
var
listenInterfacev6
=
process
.
argv
[
2
],
port
=
process
.
argv
[
3
],
listenInterfacev4
=
process
.
argv
[
3
],
sslKeyFile
=
process
.
argv
[
4
],
port
=
process
.
argv
[
4
],
sslCertFile
=
process
.
argv
[
5
],
sslKeyFile
=
process
.
argv
[
5
],
proxyTable
=
process
.
argv
[
6
],
sslCertFile
=
process
.
argv
[
6
],
redirect
=
process
.
argv
[
7
]
||
false
,
proxyTable
=
process
.
argv
[
7
],
redirect
=
process
.
argv
[
8
]
||
false
,
isRawIPv6
;
isRawIPv6
;
if
(
process
.
argv
.
length
<
7
)
{
if
(
process
.
argv
.
length
<
7
)
{
...
@@ -50,11 +51,6 @@ if (process.argv.length < 7) {
...
@@ -50,11 +51,6 @@ if (process.argv.length < 7) {
process
.
exit
(
1
);
process
.
exit
(
1
);
}
}
isRawIPv6
=
function
checkipv6
(
str
)
{
// Inspired by http://forums.intermapper.com/viewtopic.php?t=452
return
(
/^
\s
*
((([
0-9A-Fa-f
]{1,4}
:
){7}([
0-9A-Fa-f
]{1,4}
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){6}(
:
[
0-9A-Fa-f
]{1,4}
|
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3})
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){5}(((
:
[
0-9A-Fa-f
]{1,4}){1,2})
|:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3})
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){4}(((
:
[
0-9A-Fa-f
]{1,4}){1,3})
|
((
:
[
0-9A-Fa-f
]{1,4})?
:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3}))
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){3}(((
:
[
0-9A-Fa-f
]{1,4}){1,4})
|
((
:
[
0-9A-Fa-f
]{1,4}){0,2}
:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3}))
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){2}(((
:
[
0-9A-Fa-f
]{1,4}){1,5})
|
((
:
[
0-9A-Fa-f
]{1,4}){0,3}
:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3}))
|:
))
|
(([
0-9A-Fa-f
]{1,4}
:
){1}(((
:
[
0-9A-Fa-f
]{1,4}){1,6})
|
((
:
[
0-9A-Fa-f
]{1,4}){0,4}
:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3}))
|:
))
|
(
:
(((
:
[
0-9A-Fa-f
]{1,4}){1,7})
|
((
:
[
0-9A-Fa-f
]{1,4}){0,5}
:
((
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)(\.(
25
[
0-5
]
|2
[
0-4
]\d
|1
\d\d
|
[
1-9
]?\d)){3}))
|:
)))(
%.+
)?\s
*$/
.
test
(
str
));
}(
listenInterface
);
/**
/**
* Dummy middleware that throws 404 not found. Does not contain websocket
* Dummy middleware that throws 404 not found. Does not contain websocket
* middleware.
* middleware.
...
@@ -69,7 +65,7 @@ var middlewareNotFound = function(req, res, proxy) {
...
@@ -69,7 +65,7 @@ var middlewareNotFound = function(req, res, proxy) {
/**
/**
* Create server
* Create server
*/
*/
var
proxyServer
=
httpProxy
.
createServer
(
var
proxyServer
v6
=
httpProxy
.
createServer
(
// We declare our proxyByUrl middleware
// We declare our proxyByUrl middleware
proxyByUrl
(
proxyTable
),
proxyByUrl
(
proxyTable
),
// Then we add your dummy middleware, called when proxyByUrl doesn't find url.
// Then we add your dummy middleware, called when proxyByUrl doesn't find url.
...
@@ -87,42 +83,70 @@ var proxyServer = httpProxy.createServer(
...
@@ -87,42 +83,70 @@ var proxyServer = httpProxy.createServer(
)
)
},
},
source
:
{
source
:
{
host
:
listenInterface
,
host
:
listenInterface
v6
,
port
:
port
port
:
port
}}
}}
);
);
var
proxyServerv4
=
httpProxy
.
createServer
(
// We declare our proxyByUrl middleware
proxyByUrl
(
proxyTable
),
// Then we add your dummy middleware, called when proxyByUrl doesn't find url.
middlewareNotFound
,
// And we set HTTPS options for server. HTTP will be forbidden.
{
https
:
{
key
:
fs
.
readFileSync
(
sslKeyFile
,
'
utf8
'
),
cert
:
fs
.
readFileSync
(
sslCertFile
,
'
utf8
'
)
},
source
:
{
host
:
listenInterfacev4
,
port
:
port
}}
);
console
.
log
(
'
HTTPS server starting and trying to listen on
'
+
console
.
log
(
'
HTTPS server starting and trying to listen on
'
+
listenInterface
+
'
:
'
+
port
);
listenInterface
v4
+
'
:
'
+
port
);
// Release the beast.
// Release the beast.
proxyServer
.
listen
(
port
,
listenInterface
);
proxyServerv6
.
listen
(
port
,
listenInterfacev6
);
proxyServerv4
.
listen
(
port
,
listenInterfacev4
);
// Dummy HTTP server redirecting to HTTPS. Only has sense if we can use port 80
// Dummy HTTP server redirecting to HTTPS. Only has sense if we can use port 80
if
(
redirect
===
'
1
'
)
{
if
(
redirect
===
'
1
'
)
{
console
.
log
(
'
HTTP redirect server starting and trying to listen on
'
+
console
.
log
(
'
HTTP redirect server starting and trying to listen on
'
+
listenInterface
+
'
:
'
+
httpPort
);
listenInterface
+
'
:
'
+
httpPort
);
try
{
/*
var
httpPort
=
80
;
*try {
http
.
createServer
(
function
(
req
,
res
)
{
* var httpPort = 80;
var
url
;
* http.createServer(function(req, res) {
if
(
isRawIPv6
===
true
)
{
* var url;
url
=
'
https://[
'
+
listenInterface
+
'
]
'
;
* if (isRawIPv6 === true) {
}
else
{
* url = 'https://[' + listenInterface + ']';
url
=
'
https://
'
+
listenInterface
;
* } else {
}
* url = 'https://' + listenInterface;
// If non standard port : need to specify it
* }
if
(
port
!==
443
)
{
* // If non standard port : need to specify it
url
=
url
+
'
:
'
+
port
;
* if (port !== 443) {
}
* url = url + ':' + port;
// Add last part of URL
* }
url
=
url
+
req
.
url
;
* // Add last part of URL
console
.
log
(
url
);
* url = url + req.url;
// Anwser "permanently redirected"
* console.log(url);
res
.
statusCode
=
301
;
* // Anwser "permanently redirected"
res
.
setHeader
(
'
Location
'
,
url
);
* res.statusCode = 301;
res
.
end
();
* res.setHeader('Location', url);
}).
listen
(
httpPort
,
listenInterface
);
* res.end();
}
catch
(
error
)
{
* }).listen(httpPort, listenInterface);
console
.
log
(
'
Couldn
\'
t start plain HTTP redirection server :
'
+
error
)
* } catch (error) {
}
* console.log('Couldn\'t start plain HTTP redirection server : ' + error)
* }
*/
}
}
slapos/recipe/kvm_frontend/template/nodejs_run.in
View file @
561ffa48
...
@@ -2,4 +2,4 @@
...
@@ -2,4 +2,4 @@
# BEWARE: This file is operated by slapgrid
# BEWARE: This file is operated by slapgrid
# BEWARE: It will be overwritten automatically
# BEWARE: It will be overwritten automatically
export NODE_PATH=%(node_env)s
export NODE_PATH=%(node_env)s
exec %(node_path)s %(conf_path)s %(ip)s %(port)s %(key)s %(certificate)s %(map_path)s %(plain_http)s
exec %(node_path)s %(conf_path)s %(ip
v6)s %(ipv4
)s %(port)s %(key)s %(certificate)s %(map_path)s %(plain_http)s
slapos/recipe/zabbixagent/__init__.py
View file @
561ffa48
...
@@ -119,10 +119,13 @@ class Recipe(BaseSlapRecipe):
...
@@ -119,10 +119,13 @@ class Recipe(BaseSlapRecipe):
# self.cron_d is a directory, where cron jobs can be registered
# self.cron_d is a directory, where cron jobs can be registered
self
.
cron_d
=
self
.
installCrond
()
self
.
cron_d
=
self
.
installCrond
()
self
.
logrotate_d
,
self
.
logrotate_backup
=
self
.
installLogrotate
()
self
.
logrotate_d
,
self
.
logrotate_backup
=
self
.
installLogrotate
()
zabbix_agentd_conf
=
self
.
installZabbixAgentd
(
self
.
getGlobalIPv6Address
(),
zabbix_agentd_conf
=
self
.
installZabbixAgentd
(
10050
,
self
.
getGlobalIPv6Address
(),
self
.
parameter_dict
[
'hostname'
],
10050
,
self
.
parameter_dict
[
'server'
])
self
.
parameter_dict
[
'hostname'
],
self
.
parameter_dict
[
'server'
],
self
.
parameter_dict
.
get
(
'custom-user-parameter'
,
''
)
)
self
.
setConnectionDict
(
dict
(
ip
=
zabbix_agentd_conf
[
'ip'
],
self
.
setConnectionDict
(
dict
(
ip
=
zabbix_agentd_conf
[
'ip'
],
name
=
zabbix_agentd_conf
[
'hostname'
],
name
=
zabbix_agentd_conf
[
'hostname'
],
port
=
str
(
zabbix_agentd_conf
[
'port'
])))
port
=
str
(
zabbix_agentd_conf
[
'port'
])))
...
...
software/kvm/common.cfg
View file @
561ffa48
...
@@ -56,6 +56,7 @@ recipe = plone.recipe.command
...
@@ -56,6 +56,7 @@ recipe = plone.recipe.command
destination = ${buildout:parts-directory}/${:_buildout_section_name_}
destination = ${buildout:parts-directory}/${:_buildout_section_name_}
location = ${buildout:parts-directory}/${:_buildout_section_name_}
location = ${buildout:parts-directory}/${:_buildout_section_name_}
command =
command =
export HOME=${:location};
rm -fr ${:destination} &&
rm -fr ${:destination} &&
mkdir -p ${:destination} &&
mkdir -p ${:destination} &&
cd ${:destination} &&
cd ${:destination} &&
...
@@ -69,17 +70,10 @@ command =
...
@@ -69,17 +70,10 @@ command =
[template-kvm]
[template-kvm]
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-kvm.cfg.in
url = ${:_profile_base_location_}/instance-kvm.cfg.in
md5sum =
c0320447308299ec9caaeece4187bc1f
md5sum =
87197471aa93863c310204e8865b5ac1
output = ${buildout:directory}/template-kvm.cfg
output = ${buildout:directory}/template-kvm.cfg
mode = 0644
mode = 0644
[template-kvmplus]
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-kvmplus.cfg.in
md5sum = c8e92237eeda93caca1132b5202c3a02
output = ${buildout:directory}/template-kvmplus.cfg
mode = 0644
[template-nbd]
[template-nbd]
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-nbd.cfg.in
url = ${:_profile_base_location_}/instance-nbd.cfg.in
...
@@ -90,13 +84,13 @@ mode = 0644
...
@@ -90,13 +84,13 @@ mode = 0644
[template-frontend]
[template-frontend]
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance-frontend.cfg.in
url = ${:_profile_base_location_}/instance-frontend.cfg.in
md5sum =
73359b52013b1b65f75005e8698ed180
md5sum =
cdb690495e9eb007d2b7d2f8e12f5c59
output = ${buildout:directory}/template-frontend.cfg
output = ${buildout:directory}/template-frontend.cfg
mode = 0644
mode = 0644
[template]
[template]
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/instance.cfg.in
url = ${:_profile_base_location_}/instance.cfg.in
md5sum =
68788763d23f70f24b9e575871c903a8
md5sum =
0a98e34aaec7097a84066c0665e3a49a
output = ${buildout:directory}/template.cfg
output = ${buildout:directory}/template.cfg
mode = 0644
mode = 0644
software/kvm/development.cfg
View file @
561ffa48
[buildout]
[buildout]
extends =
extends =
../../git/buildout.cfg
../../
component/
git/buildout.cfg
common.cfg
common.cfg
parts +=
parts +=
slapos.cookbook-repository
slapos.cookbook-repository
slapos.core-repository
slapos.toolbox-repository
slapos.toolbox-repository
check-recipe
check-recipe
develop =
develop =
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.toolbox-repository
[slapos.cookbook-repository]
[slapos.cookbook-repository]
recipe = slapos.recipe.build:gitclone
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.git
repository = http://git.erp5.org/repos/slapos.git
branch = slaprunner
branch = kvm
git-executable = ${git:location}/bin/git
[slapos.toolbox-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.toolbox.git
branch = master
git-executable = ${git:location}/bin/git
git-executable = ${git:location}/bin/git
[check-recipe]
[check-recipe]
...
@@ -24,3 +30,4 @@ stop-on-error = true
...
@@ -24,3 +30,4 @@ stop-on-error = true
update-command = ${:command}
update-command = ${:command}
command =
command =
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.toolbox.egg-link
software/kvm/instance-frontend.cfg.in
View file @
561ffa48
...
@@ -11,7 +11,8 @@ parts =
...
@@ -11,7 +11,8 @@ parts =
cron-entry-logrotate
cron-entry-logrotate
ca-frontend
ca-frontend
certificate-authority
certificate-authority
frontend-promise
frontend-promise-ipv6
frontend-promise-ipv4
eggs-directory = ${buildout:eggs-directory}
eggs-directory = ${buildout:eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
develop-eggs-directory = ${buildout:develop-eggs-directory}
...
@@ -47,7 +48,8 @@ logrotate-entries = $${rootdirectory:etc}/logrotate.d
...
@@ -47,7 +48,8 @@ logrotate-entries = $${rootdirectory:etc}/logrotate.d
recipe = slapos.cookbook:kvm.frontend
recipe = slapos.cookbook:kvm.frontend
domain = $${ca-frontend:name}
domain = $${ca-frontend:name}
# port = $${slap-parameter:port}
# port = $${slap-parameter:port}
ip = $${slap-network-information:local-ipv4}
ipv6 = $${slap-network-information:global-ipv6}
ipv4 = $${slap-network-information:local-ipv4}
port = $${slap-parameter:port}
port = $${slap-parameter:port}
http-redirection = $${slap-parameter:http-redirection}
http-redirection = $${slap-parameter:http-redirection}
ssl-key-path = $${ca-frontend:key-file}
ssl-key-path = $${ca-frontend:key-file}
...
@@ -60,10 +62,16 @@ node-binary = ${nodejs:location}/bin/node
...
@@ -60,10 +62,16 @@ node-binary = ${nodejs:location}/bin/node
node-env = ${buildout:parts-directory}:${npm-modules:location}/node_modules
node-env = ${buildout:parts-directory}:${npm-modules:location}/node_modules
shell-path = ${dash:location}/bin/dash
shell-path = ${dash:location}/bin/dash
[frontend-promise]
[frontend-promise
-ipv6
]
recipe = slapos.cookbook:check_port_listening
recipe = slapos.cookbook:check_port_listening
path = $${basedirectory:promises}/frontend_promise
path = $${basedirectory:promises}/frontend_promise
hostname = $${frontend-instance:ip}
hostname = $${frontend-instance:ipv6}
port = $${frontend-instance:port}
[frontend-promise-ipv4]
recipe = slapos.cookbook:check_port_listening
path = $${basedirectory:promises}/frontend_promise
hostname = $${frontend-instance:ipv4}
port = $${frontend-instance:port}
port = $${frontend-instance:port}
[certificate-authority]
[certificate-authority]
...
@@ -133,6 +141,7 @@ state-file = $${rootdirectory:srv}/logrotate.status
...
@@ -133,6 +141,7 @@ state-file = $${rootdirectory:srv}/logrotate.status
# Default value if no port is specified
# Default value if no port is specified
port = 4443
port = 4443
http-redirection = 0
http-redirection = 0
slave_instance_list =
# [logrotate-entry-frontend]
# [logrotate-entry-frontend]
# <= logrotate
# <= logrotate
...
...
software/kvm/instance-kvm.cfg.in
View file @
561ffa48
...
@@ -36,7 +36,7 @@ storage-path = $${directory:srv}/mac
...
@@ -36,7 +36,7 @@ storage-path = $${directory:srv}/mac
[gen-passwd]
[gen-passwd]
recipe = slapos.cookbook:generate.password
recipe = slapos.cookbook:generate.password
storage-path = $${directory:srv}/passwd
storage-path = $${directory:srv}/passwd
bytes =
4
bytes =
8
[kvm-instance]
[kvm-instance]
# XXX-Cedric: change "KVM" recipe to simple "create wrappers". No need for this
# XXX-Cedric: change "KVM" recipe to simple "create wrappers". No need for this
...
@@ -135,7 +135,7 @@ key-file = $${slap-connection:key-file}
...
@@ -135,7 +135,7 @@ key-file = $${slap-connection:key-file}
cert-file = $${slap-connection:cert-file}
cert-file = $${slap-connection:cert-file}
computer-id = $${slap-connection:computer-id}
computer-id = $${slap-connection:computer-id}
partition-id = $${slap-connection:partition-id}
partition-id = $${slap-connection:partition-id}
name =
Slave
Frontend
name =
VNC
Frontend
software-type = $${slap-parameter:frontend-software-type}
software-type = $${slap-parameter:frontend-software-type}
slave = true
slave = true
config = host port
config = host port
...
@@ -162,7 +162,6 @@ curl_path = ${curl:location}/bin/curl
...
@@ -162,7 +162,6 @@ curl_path = ${curl:location}/bin/curl
[slap-parameter]
[slap-parameter]
# Default values if not specified
# Default values if not specified
frontend-instance-guid = SOFTINST-11031
frontend-software-type = frontend
frontend-software-type = frontend
frontend-software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.92:/software/kvm/software.cfg
frontend-software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/refs/tags/slapos-0.92:/software/kvm/software.cfg
...
@@ -175,4 +174,4 @@ ram-size = 1024
...
@@ -175,4 +174,4 @@ ram-size = 1024
disk-size = 10
disk-size = 10
disk-type = virtio
disk-type = virtio
cpu-count = 1
cpu-count = 1
\ No newline at end of file
software/kvm/instance-kvmplus.cfg.in
deleted
100644 → 0
View file @
0d105d0e
#############################
#
# Instanciate kvm+
#
#############################
# Deprecated. Just specify amount of RAM / disk you want in instance parameter.
[buildout]
extends = ${template-kvm:output}
[slap-parameter]
ram-size = 2048
disk-size = 20
\ No newline at end of file
software/kvm/instance.cfg.in
View file @
561ffa48
...
@@ -10,7 +10,6 @@ offline = true
...
@@ -10,7 +10,6 @@ offline = true
recipe = slapos.cookbook:softwaretype
recipe = slapos.cookbook:softwaretype
default = ${template-kvm:output}
default = ${template-kvm:output}
kvm = ${template-kvm:output}
kvm = ${template-kvm:output}
kvm+ = ${template-kvmplus:output}
nbd = ${template-nbd:output}
nbd = ${template-nbd:output}
frontend = ${template-frontend:output}
frontend = ${template-frontend:output}
...
...
software/kvm/software.cfg
View file @
561ffa48
...
@@ -143,4 +143,4 @@ xml-marshaller = 0.9.7
...
@@ -143,4 +143,4 @@ xml-marshaller = 0.9.7
# Required by:
# Required by:
# slapos.core==0.35.1
# slapos.core==0.35.1
zope.interface = 4.0.5
zope.interface = 4.0.5
\ No newline at end of file
software/tt-rss/development.cfg
0 → 100644
View file @
561ffa48
# Exactly the same as software.cfg, but fetch the slapos.cookbook and
# slapos.toolbox from git repository instead of fetching stable version,
# allowing to play with bleeding edge environment.
# You'll need to run buildout twice for this profile.
[buildout]
extends =
../../component/git/buildout.cfg
software.cfg
parts +=
# Development parts
slapos.cookbook-repository
slapos.core-repository
slapos.toolbox-repository
check-recipe
develop =
${:parts-directory}/slapos.cookbook-repository
${:parts-directory}/slapos.core-repository
${:parts-directory}/slapos.toolbox-repository
[slapos.toolbox-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.toolbox.git
branch = master
git-executable = ${git:location}/bin/git
[slapos.cookbook-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.git
branch = tt-rss
git-executable = ${git:location}/bin/git
[slapos.core-repository]
recipe = slapos.recipe.build:gitclone
repository = http://git.erp5.org/repos/slapos.core.git
branch = master
git-executable = ${git:location}/bin/git
[check-recipe]
recipe = plone.recipe.command
stop-on-error = true
update-command = ${:command}
command =
grep parts ${buildout:develop-eggs-directory}/slapos.cookbook.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.core.egg-link &&
grep parts ${buildout:develop-eggs-directory}/slapos.toolbox.egg-link
[versions]
slapos.cookbook =
slapos.toolbox =
slapos.core =
software/tt-rss/instance-custom.cfg.in
View file @
561ffa48
...
@@ -13,4 +13,9 @@ mysql-database = $${apache-php:mysql-database}
...
@@ -13,4 +13,9 @@ mysql-database = $${apache-php:mysql-database}
mysql-host = $${apache-php:mysql-host}
mysql-host = $${apache-php:mysql-host}
mysql-port = $${apache-php:mysql-port}
mysql-port = $${apache-php:mysql-port}
configureinstall-location = $${basedirectory:scripts}/configureInstall
configureinstall-location = $${basedirectory:scripts}/configureInstall
sql-script = ${sql-script:location}/${sql-script:filename}
sql-script = ${sql-script:location}/${sql-script:filename}
\ No newline at end of file
# Give the correct information to apache recipe to put the hostname in the
# tt-rss config file
[apache-php]
application-url = $${request-frontend:connection-site_url}
software/tt-rss/software.cfg
View file @
561ffa48
...
@@ -2,10 +2,13 @@
...
@@ -2,10 +2,13 @@
extends =
extends =
../../stack/lamp/buildout.cfg
../../stack/lamp/buildout.cfg
[versions]
slapos.cookbook =
[application]
[application]
recipe = slapos.recipe.build:download-unpacked
recipe = slapos.recipe.build:download-unpacked
url = https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.7.
5
.tar.gz
url = https://github.com/gothfox/Tiny-Tiny-RSS/archive/1.7.
8
.tar.gz
#md5sum = a81cea71701404cebf64c07b7ac6c948
md5sum = efd7eec1629db379896fb7e74bba400e
strip-top-level-dir = true
strip-top-level-dir = true
[application-template]
[application-template]
...
...
software/tt-rss/template/config.php.in
View file @
561ffa48
...
@@ -17,8 +17,7 @@
...
@@ -17,8 +17,7 @@
// *** Basic settings (important!) ***
// *** Basic settings (important!) ***
// ***********************************
// ***********************************
//FIXME set frontend URL
define
(
'SELF_URL_PATH'
,
'%(url)s'
);
define
(
'SELF_URL_PATH'
,
'http://%(ip)s:%(port)s'
);
// Full URL of your tt-rss installation. This should be set to the
// Full URL of your tt-rss installation. This should be set to the
// location of tt-rss directory, e.g. http://yourserver/tt-rss/
// location of tt-rss directory, e.g. http://yourserver/tt-rss/
// You need to set this option correctly otherwise several features
// You need to set this option correctly otherwise several features
...
...
stack/erp5/buildout.cfg
View file @
561ffa48
...
@@ -63,6 +63,7 @@ extends =
...
@@ -63,6 +63,7 @@ extends =
../../component/wget/buildout.cfg
../../component/wget/buildout.cfg
../../component/aspell/buildout.cfg
../../component/aspell/buildout.cfg
../../component/cloudooo/buildout.cfg
../../component/cloudooo/buildout.cfg
../../component/jsl/buildout.cfg
parts =
parts =
rdiff-backup
rdiff-backup
...
@@ -73,6 +74,7 @@ parts =
...
@@ -73,6 +74,7 @@ parts =
file
file
graphviz
graphviz
haproxy
haproxy
jsl
varnish-3.0
varnish-3.0
w3m
w3m
poppler
poppler
...
@@ -372,6 +374,7 @@ initialization =
...
@@ -372,6 +374,7 @@ initialization =
sys.path[:0] = sum((
sys.path[:0] = sum((
glob.glob(os.path.join(x, 'Products', '*', 'tests'))
glob.glob(os.path.join(x, 'Products', '*', 'tests'))
for x in os.getenv('INSERT_PRODUCTS_PATH', '').split(os.pathsep)), [])
for x in os.getenv('INSERT_PRODUCTS_PATH', '').split(os.pathsep)), [])
os.environ['PATH'] = '${jsl:location}/bin:%s' % os.environ['PATH']
os.environ['CGI_PATH'] = '${w3-validator:location}/httpd/cgi-bin'
os.environ['CGI_PATH'] = '${w3-validator:location}/httpd/cgi-bin'
[test_suite_runner]
[test_suite_runner]
...
...
stack/lamp/apache/instance-apache-php.cfg.in
View file @
561ffa48
...
@@ -187,6 +187,15 @@ recipe = slapos.cookbook:urlparse
...
@@ -187,6 +187,15 @@ recipe = slapos.cookbook:urlparse
url = $${request-mariadb:connection-url}
url = $${request-mariadb:connection-url}
#----------------
#--
#-- Common network parameters
[apache-network-configuration]
listening-ip = $${slap-network-information:global-ipv6}
listening-port = 8080
#----------------
#----------------
#--
#--
#-- Deploy Apache + PHP application.
#-- Deploy Apache + PHP application.
...
@@ -200,8 +209,8 @@ configuration = ${application-configuration:location}
...
@@ -200,8 +209,8 @@ configuration = ${application-configuration:location}
htdocs = $${directory:www}
htdocs = $${directory:www}
pid-file = $${basedirectory:run}/apache.pid
pid-file = $${basedirectory:run}/apache.pid
lock-file = $${basedirectory:run}/apache.lock
lock-file = $${basedirectory:run}/apache.lock
ip = $${
slap-network-information:global-ipv6
}
ip = $${
apache-network-configuration:listening-ip
}
port =
8080
port =
$${apache-network-configuration:listening-port}
url = http://[$${:ip}]:$${:port}/
url = http://[$${:ip}]:$${:port}/
error-log = $${directory:httpd-log}/error.log
error-log = $${directory:httpd-log}/error.log
access-log = $${directory:httpd-log}/access.log
access-log = $${directory:httpd-log}/access.log
...
@@ -242,7 +251,7 @@ name = Frontend
...
@@ -242,7 +251,7 @@ name = Frontend
software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
software-url = http://git.erp5.org/gitweb/slapos.git/blob_plain/HEAD:/software/apache-frontend/software.cfg
slave = true
slave = true
config = url custom_domain
config = url custom_domain
config-url = http://[$${apache-
php:ip}]:$${apache-php:
port}/
config-url = http://[$${apache-
network-configuration:listening-ip}]:$${apache-network-configuration:listening-
port}/
return = site_url
return = site_url
config-custom_domain = $${slap-parameter:domain}
config-custom_domain = $${slap-parameter:domain}
...
...
stack/lamp/buildout.cfg
View file @
561ffa48
...
@@ -74,7 +74,7 @@ mode = 0644
...
@@ -74,7 +74,7 @@ mode = 0644
recipe = slapos.recipe.template
recipe = slapos.recipe.template
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
url = ${:_profile_base_location_}/apache/instance-apache-php.cfg.in
output = ${buildout:directory}/instance-apache-php.cfg
output = ${buildout:directory}/instance-apache-php.cfg
md5sum =
296ba845c8ffe75fbc6352dd0e8ce836
md5sum =
3e2d71d3684aac3e52d2f55794df96bf
mode = 0644
mode = 0644
[instance-apache-import]
[instance-apache-import]
...
@@ -326,7 +326,7 @@ netaddr = 0.7.10
...
@@ -326,7 +326,7 @@ netaddr = 0.7.10
pycrypto = 2.6
pycrypto = 2.6
pytz = 2013b
pytz = 2013b
rdiff-backup = 1.0.5
rdiff-backup = 1.0.5
slapos.cookbook = 0.7
6
.0
slapos.cookbook = 0.7
8
.0
slapos.recipe.build = 0.11.6
slapos.recipe.build = 0.11.6
slapos.recipe.download = 1.0.dev-r4053
slapos.recipe.download = 1.0.dev-r4053
slapos.recipe.template = 2.4.2
slapos.recipe.template = 2.4.2
...
@@ -368,7 +368,7 @@ pyflakes = 0.6.1
...
@@ -368,7 +368,7 @@ pyflakes = 0.6.1
# Required by:
# Required by:
# hexagonit.recipe.download==1.6nxd002
# hexagonit.recipe.download==1.6nxd002
# slapos.cookbook==0.7
6
.0
# slapos.cookbook==0.7
8
.0
# slapos.core==0.35.1
# slapos.core==0.35.1
# slapos.toolbox==0.34.0
# slapos.toolbox==0.34.0
# supervisor==3.0b1
# supervisor==3.0b1
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment