Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
slapos-caddy
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
Guillaume Hervier
slapos-caddy
Commits
bb6746ed
Commit
bb6746ed
authored
Apr 30, 2013
by
Kazuhiko Shiozaki
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'erp5-component' into erp5
parents
d48aa7e7
87d0d1aa
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 @
bb6746ed
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 @
bb6746ed
...
@@ -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 @
bb6746ed
# 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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
[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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
d48aa7e7
#############################
#
# 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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
# 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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -64,6 +64,7 @@ extends =
...
@@ -64,6 +64,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
...
@@ -74,6 +75,7 @@ parts =
...
@@ -74,6 +75,7 @@ parts =
file
file
graphviz
graphviz
haproxy
haproxy
jsl
varnish-3.0
varnish-3.0
w3m
w3m
poppler
poppler
...
@@ -392,6 +394,7 @@ initialization =
...
@@ -392,6 +394,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 @
bb6746ed
...
@@ -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 @
bb6746ed
...
@@ -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