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
Boxiang Sun
slapos
Commits
ac2a7e45
Commit
ac2a7e45
authored
Mar 18, 2020
by
Łukasz Nowak
Browse files
Options
Browse Files
Download
Plain Diff
monitor: target Python 3
See merge request !712
parents
d2453c40
d7e9ab1c
Changes
14
Show whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
49 additions
and
89 deletions
+49
-89
component/surykatka/buildout.cfg
component/surykatka/buildout.cfg
+0
-21
component/surykatka/buildout.hash.cfg
component/surykatka/buildout.hash.cfg
+0
-17
component/surykatka/requirements.txt
component/surykatka/requirements.txt
+0
-11
software/monitor/buildout.hash.cfg
software/monitor/buildout.hash.cfg
+5
-5
software/monitor/instance-monitor-edgebot.cfg.jinja2
software/monitor/instance-monitor-edgebot.cfg.jinja2
+2
-2
software/monitor/instance-monitor-edgetest.cfg.jinja2
software/monitor/instance-monitor-edgetest.cfg.jinja2
+4
-4
software/monitor/instance.cfg
software/monitor/instance.cfg
+2
-7
software/monitor/script/collect_csv_dump.py
software/monitor/script/collect_csv_dump.py
+8
-8
software/monitor/software.cfg
software/monitor/software.cfg
+19
-1
software/monitor/surykatka.ini.jinja2
software/monitor/surykatka.ini.jinja2
+1
-1
software/monitor/test/test.py
software/monitor/test/test.py
+6
-10
software/slapos-sr-testing/software-py3.cfg
software/slapos-sr-testing/software-py3.cfg
+1
-0
software/slapos-sr-testing/software.cfg
software/slapos-sr-testing/software.cfg
+0
-1
stack/slapos.cfg
stack/slapos.cfg
+1
-1
No files found.
component/surykatka/buildout.cfg
deleted
100644 → 0
View file @
d2453c40
[buildout]
extends =
buildout.hash.cfg
../python3/buildout.cfg
parts =
surykatka
[surykatka-requirements]
recipe = slapos.recipe.build:download
url = ${:_profile_base_location_}/${:_update_hash_filename_}
[surykatka]
recipe = plone.recipe.command
command =
bash -c "${python3.7:executable} -m venv ${:location} && \
. ${:location}/bin/activate && \
pip install -r ${surykatka-requirements:target}"
location = ${buildout:parts-directory}/${:_buildout_section_name_}
stop-on-error = true
executable = ${:location}/bin/surykatka
component/surykatka/buildout.hash.cfg
deleted
100644 → 0
View file @
d2453c40
# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
# The only allowed lines here are (regexes):
# - "^#" comments, copied verbatim
# - "^[" section beginings, copied verbatim
# - lines containing an "=" sign which must fit in the following categorie.
# - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
# Copied verbatim.
# - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
# by the re-generation script.
# Re-generated.
# - other lines are copied verbatim
# Substitution (${...:...}), extension ([buildout] extends = ...) and
# section inheritance (< = ...) are NOT supported (but you should really
# not need these here).
[surykatka-requirements]
_update_hash_filename_ = requirements.txt
md5sum = c4bd35bcc5c9c25efe1edff5dd022605
component/surykatka/requirements.txt
deleted
100644 → 0
View file @
d2453c40
Click==7.0
certifi==2019.11.28
chardet==3.0.4
dnspython==1.16.0
forcediphttpsadapter==1.0.1
idna==2.8
miniupnpc==2.0.2
peewee==3.13.1
requests==2.22.0
surykatka==0.4.2
urllib3==1.25.8
software/monitor/buildout.hash.cfg
View file @
ac2a7e45
...
@@ -14,7 +14,7 @@
...
@@ -14,7 +14,7 @@
# not need these here).
# not need these here).
[template]
[template]
filename = instance.cfg
filename = instance.cfg
md5sum =
dc9770bacea2c504b92ad2162e58d222
md5sum =
07873511a15df74f0be761947819ac9b
[template-monitor]
[template-monitor]
_update_hash_filename_ = instance-monitor.cfg.jinja2
_update_hash_filename_ = instance-monitor.cfg.jinja2
...
@@ -26,11 +26,11 @@ md5sum = 2eb5596544d9c341acf653d4f7ce2680
...
@@ -26,11 +26,11 @@ md5sum = 2eb5596544d9c341acf653d4f7ce2680
[template-monitor-edgetest]
[template-monitor-edgetest]
_update_hash_filename_ = instance-monitor-edgetest.cfg.jinja2
_update_hash_filename_ = instance-monitor-edgetest.cfg.jinja2
md5sum =
9e237dbdda59e788202f0da194a57d41
md5sum =
a57106ee88ff3295b9ffce84105da79b
[template-monitor-edgebot]
[template-monitor-edgebot]
_update_hash_filename_ = instance-monitor-edgebot.cfg.jinja2
_update_hash_filename_ = instance-monitor-edgebot.cfg.jinja2
md5sum =
f28a329e830ed737d468abcb4e89e1a2
md5sum =
c535f4df6388cdc3f6c1df2a91d6dd53
[network-bench-cfg]
[network-bench-cfg]
filename = network_bench.cfg.in
filename = network_bench.cfg.in
...
@@ -38,8 +38,8 @@ md5sum = cfcbf2002b8eff5153e2bf68ed24b720
...
@@ -38,8 +38,8 @@ md5sum = cfcbf2002b8eff5153e2bf68ed24b720
[monitor-collect-csv-dump]
[monitor-collect-csv-dump]
filename = script/collect_csv_dump.py
filename = script/collect_csv_dump.py
md5sum =
cad2402bbd21907cfed6bc5af8c5d3a
b
md5sum =
d3cfa1f6760e3fa64ccd64acf213bdf
b
[template-surykatka-ini]
[template-surykatka-ini]
_update_hash_filename_ = surykatka.ini.jinja2
_update_hash_filename_ = surykatka.ini.jinja2
md5sum =
a2de719a5a65438c8c3ee5195442beb6
md5sum =
89545501f0e5bf11608978886429da3d
software/monitor/instance-monitor-edgebot.cfg.jinja2
View file @
ac2a7e45
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
{%- set extra_slave_instance_list = slapparameter_dict.get('extra_slave_instance_list') %}
{%- set extra_slave_instance_list = slapparameter_dict.get('extra_slave_instance_list') %}
{%- if extra_slave_instance_list %}
{%- if extra_slave_instance_list %}
{#- Create slaves to process with setting up defaults #}
{#- Create slaves to process with setting up defaults #}
{%- for slave in
sorted(json_module.loads(extra_slave_instance_list)
) %}
{%- for slave in
json_module.loads(extra_slave_instance_list) | sort(attribute='slave_title'
) %}
{%- if 'check-status-code' not in slave %}
{%- if 'check-status-code' not in slave %}
{%- do slave.__setitem__('check-status-code', CONFIGURATION['check-status-code']) %}
{%- do slave.__setitem__('check-status-code', CONFIGURATION['check-status-code']) %}
{%- endif %}
{%- endif %}
...
@@ -37,7 +37,7 @@
...
@@ -37,7 +37,7 @@
{%- set part_list = [] %}
{%- set part_list = [] %}
{%- for class, slave_instance_list in slave_instance_dict.items() %}
{%- for class, slave_instance_list in slave_instance_dict.items() %}
{#- class is used to separate surykatka with different timeouts #}
{#- class is used to separate surykatka with different timeouts #}
{%- for slave in s
orted(slave_instance_list
) %}
{%- for slave in s
lave_instance_list | sort(attribute='slave_title'
) %}
{%- set part_id = 'http-query-' ~ slave['slave_reference'] ~ '-promise' %}
{%- set part_id = 'http-query-' ~ slave['slave_reference'] ~ '-promise' %}
{%- do part_list.append(part_id) %}
{%- do part_list.append(part_id) %}
{%- set safe_name = part_id.replace('_', '').replace('.', '-').replace(' ', '-') %}
{%- set safe_name = part_id.replace('_', '').replace('.', '-').replace(' ', '-') %}
...
...
software/monitor/instance-monitor-edgetest.cfg.jinja2
View file @
ac2a7e45
...
@@ -27,7 +27,7 @@ extra-context =
...
@@ -27,7 +27,7 @@ extra-context =
{%- set namebase = "edgebot" %}
{%- set namebase = "edgebot" %}
{%- set authorized_slave_list = [] %}
{%- set authorized_slave_list = [] %}
{%- set monitor_base_url_dict = {} -%}
{%- set monitor_base_url_dict = {} -%}
{%- for slave in s
orted(slave_instance_list
) %}
{%- for slave in s
lave_instance_list | sort(attribute='slave_title'
) %}
{%- do authorized_slave_list.append(slave) %}
{%- do authorized_slave_list.append(slave) %}
{%- endfor %}
{%- endfor %}
{%- set monitor_base_port = int(slap_configuration['configuration.monitor-base-port']) %}
{%- set monitor_base_port = int(slap_configuration['configuration.monitor-base-port']) %}
...
@@ -56,7 +56,7 @@ software-url = ${slap-connection:software-release-url}
...
@@ -56,7 +56,7 @@ software-url = ${slap-connection:software-release-url}
software-type = {{edgebot_software_type}}
software-type = {{edgebot_software_type}}
return = monitor-base-url
return = monitor-base-url
{% for section, edgebot_request in request_dict.ite
rite
ms() %}
{% for section, edgebot_request in request_dict.items() %}
[{{section}}]
[{{section}}]
<= replicate
<= replicate
name = {{ edgebot_request.get('name') }}
name = {{ edgebot_request.get('name') }}
...
@@ -66,11 +66,11 @@ state = {{ edgebot_request.get('state') }}
...
@@ -66,11 +66,11 @@ state = {{ edgebot_request.get('state') }}
{%- set slave_configuration_dict = slapparameter_dict %}
{%- set slave_configuration_dict = slapparameter_dict %}
{%- do slave_configuration_dict.update(edgebot_request.get('config')) %}
{%- do slave_configuration_dict.update(edgebot_request.get('config')) %}
{%- do slave_configuration_dict.__setitem__(slave_list_name, json_module.dumps(authorized_slave_list)) %}
{%- do slave_configuration_dict.__setitem__(slave_list_name, json_module.dumps(authorized_slave_list)) %}
{%- for config_key, config_value in slave_configuration_dict.ite
rite
ms() %}
{%- for config_key, config_value in slave_configuration_dict.items() %}
config-{{ config_key }} = {{ dumps(config_value) }}
config-{{ config_key }} = {{ dumps(config_value) }}
{% endfor -%}
{% endfor -%}
{%- if edgebot_request.get('sla') %}
{%- if edgebot_request.get('sla') %}
{%- for parameter, value in edgebot_request.get('sla').ite
rite
ms() %}
{%- for parameter, value in edgebot_request.get('sla').items() %}
sla-{{ parameter }} = {{ value }}
sla-{{ parameter }} = {{ value }}
{%- endfor %}
{%- endfor %}
{%- else %}
{%- else %}
...
...
software/monitor/instance.cfg
View file @
ac2a7e45
...
@@ -44,17 +44,12 @@ context = import json_module json
...
@@ -44,17 +44,12 @@ context = import json_module json
raw template_json_edgetest_test ${json-test-template:target}
raw template_json_edgetest_test ${json-test-template:target}
mode = 0644
mode = 0644
[surykatka-wrapped]
recipe = slapos.cookbook:wrapper
wrapper-path = $${buildout:bin-directory}/surykatka-wrapped
command-line = ${surykatka:location}/bin/python3.7 ${surykatka:executable}
[instance-base-edgebot]
[instance-base-edgebot]
recipe = slapos.recipe.template:jinja2
recipe = slapos.recipe.template:jinja2
template = ${template-monitor-edgebot:target}
template = ${template-monitor-edgebot:target}
rendered = $${buildout:directory}/template-monitor-edgebot.cfg
rendered = $${buildout:directory}/template-monitor-edgebot.cfg
extensions = jinja2.ext.do
extensions = jinja2.ext.do
surykatka-binary = ${
surykatka:executable}
surykatka-binary = ${
buildout:bin-directory}/surykatka
template-surykatka-ini = ${template-surykatka-ini:target}
template-surykatka-ini = ${template-surykatka-ini:target}
context = import json_module json
context = import json_module json
...
@@ -64,7 +59,7 @@ context = import json_module json
...
@@ -64,7 +59,7 @@ context = import json_module json
key slapparameter_dict slap-configuration:configuration
key slapparameter_dict slap-configuration:configuration
key slap_software_type slap-configuration:slap-software-type
key slap_software_type slap-configuration:slap-software-type
raw software_type edgebot
raw software_type edgebot
key surykatka_binary
surykatka-wrapped:wrapper-path
key surykatka_binary
:surykatka-binary
key template_surykatka_ini :template-surykatka-ini
key template_surykatka_ini :template-surykatka-ini
raw buildout_bin ${buildout:bin-directory}
raw buildout_bin ${buildout:bin-directory}
raw monitor_template_output ${monitor-template:output}
raw monitor_template_output ${monitor-template:output}
...
...
software/monitor/script/collect_csv_dump.py
View file @
ac2a7e45
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#
#
##############################################################################
##############################################################################
from
__future__
import
print_function
import
os
import
os
import
argparse
import
argparse
import
csv
import
csv
...
@@ -53,15 +54,14 @@ def parseArguments():
...
@@ -53,15 +54,14 @@ def parseArguments():
return
parser
.
parse_args
()
return
parser
.
parse_args
()
def
writeFile
(
name
,
folder
,
date_scope
,
rows
):
def
writeFile
(
name
,
folder
,
date_scope
,
rows
):
if
os
.
path
.
exists
(
folder
=
os
.
path
.
join
(
folder
,
date_scope
)
os
.
path
.
join
(
folder
,
"%s/dump_%s.csv"
%
(
date_scope
,
name
))):
f
=
os
.
path
.
join
(
folder
,
"dump_%s.csv"
%
name
)
if
os
.
path
.
exists
(
f
):
# File already exists, no reason to recreate it.
# File already exists, no reason to recreate it.
return
return
mkdir_p
(
os
.
path
.
join
(
folder
,
date_scope
),
0o755
)
mkdir_p
(
folder
,
0o755
)
file_io
=
open
(
os
.
path
.
join
(
folder
,
"%s/dump_%s.csv"
%
(
date_scope
,
name
)),
"w"
)
with
open
(
f
,
"w"
)
as
file_io
:
csv_output
=
csv
.
writer
(
file_io
)
csv
.
writer
(
file_io
).
writerows
(
rows
)
csv_output
.
writerows
(
rows
)
file_io
.
close
()
def
dump_table_into_csv
(
db
,
folder
):
def
dump_table_into_csv
(
db
,
folder
):
db
.
connect
()
db
.
connect
()
...
@@ -96,6 +96,6 @@ if __name__ == "__main__":
...
@@ -96,6 +96,6 @@ if __name__ == "__main__":
if
not
os
.
path
.
exists
(
parser
.
collector_db
):
if
not
os
.
path
.
exists
(
parser
.
collector_db
):
print
"Collector database not found..."
print
(
"Collector database not found..."
)
dump_table_into_csv
(
Database
(
parser
.
collector_db
),
parser
.
output_folder
)
dump_table_into_csv
(
Database
(
parser
.
collector_db
),
parser
.
output_folder
)
software/monitor/software.cfg
View file @
ac2a7e45
...
@@ -4,9 +4,11 @@ extends =
...
@@ -4,9 +4,11 @@ extends =
buildout.hash.cfg
buildout.hash.cfg
../../component/pycurl/buildout.cfg
../../component/pycurl/buildout.cfg
../../component/python-cryptography/buildout.cfg
../../component/python-cryptography/buildout.cfg
../../component/surykatka/buildout.cfg
../../stack/monitor/buildout.cfg
../../stack/monitor/buildout.cfg
../../stack/slapos.cfg
../../stack/slapos.cfg
../../component/python3/buildout.cfg
python = python3
parts =
parts =
slapos-cookbook
slapos-cookbook
...
@@ -68,6 +70,7 @@ eggs +=
...
@@ -68,6 +70,7 @@ eggs +=
${python-cryptography:egg}
${python-cryptography:egg}
slapos.toolbox
slapos.toolbox
slapos.core
slapos.core
surykatka
scripts =
scripts =
networkbench
networkbench
...
@@ -78,6 +81,7 @@ scripts =
...
@@ -78,6 +81,7 @@ scripts =
monitor.genstatus
monitor.genstatus
monitor.configwrite
monitor.configwrite
check-computer-memory
check-computer-memory
surykatka
[monitor-eggs]
[monitor-eggs]
eggs +=
eggs +=
...
@@ -88,3 +92,17 @@ eggs +=
...
@@ -88,3 +92,17 @@ eggs +=
[versions]
[versions]
slapos.recipe.template = 4.4
slapos.recipe.template = 4.4
surykatka = 0.4.2
# For surykatka 0.4.2
click = 7.0
certifi = 2019.11.28
chardet = 3.0.4
dnspython = 1.16.0
forcediphttpsadapter = 1.0.1
idna = 2.8
miniupnpc = 2.0.2
peewee = 3.13.1
requests = 2.22.0
urllib3 = 1.25.8
software/monitor/surykatka.ini.jinja2
View file @
ac2a7e45
...
@@ -10,7 +10,7 @@ NAMESERVER =
...
@@ -10,7 +10,7 @@ NAMESERVER =
{%- endfor %}
{%- endfor %}
{% endif %}
{% endif %}
URL =
URL =
{%- for slave in s
orted(slave_instance_list
) %}
{%- for slave in s
lave_instance_list | sort(attribute='slave_title'
) %}
{%- if 'url' in slave %}
{%- if 'url' in slave %}
{{ slave['url'] }}
{{ slave['url'] }}
{%- endif -%}
{%- endif -%}
...
...
software/monitor/test/test.py
View file @
ac2a7e45
...
@@ -65,7 +65,7 @@ class ServicesTestCase(SlapOSInstanceTestCase):
...
@@ -65,7 +65,7 @@ class ServicesTestCase(SlapOSInstanceTestCase):
self
.
assertIn
(
expected_process_name
,
process_names
)
self
.
assertIn
(
expected_process_name
,
process_names
)
class
MonitorTestMixin
(
object
)
:
class
MonitorTestMixin
:
monitor_setup_url_key
=
'monitor-setup-url'
monitor_setup_url_key
=
'monitor-setup-url'
def
test_monitor_setup
(
self
):
def
test_monitor_setup
(
self
):
...
@@ -152,8 +152,7 @@ class EdgeSlaveMixin(MonitorTestMixin):
...
@@ -152,8 +152,7 @@ class EdgeSlaveMixin(MonitorTestMixin):
)
)
def
updateSurykatkaDict
(
self
):
def
updateSurykatkaDict
(
self
):
class_list
=
self
.
surykatka_dict
.
keys
()
for
class_
in
self
.
surykatka_dict
:
for
class_
in
class_list
:
update_dict
=
{}
update_dict
=
{}
update_dict
[
'ini-file'
]
=
os
.
path
.
join
(
update_dict
[
'ini-file'
]
=
os
.
path
.
join
(
self
.
bot_partition_path
,
'etc'
,
'surykatka-%s.ini'
%
(
class_
,))
self
.
bot_partition_path
,
'etc'
,
'surykatka-%s.ini'
%
(
class_
,))
...
@@ -200,7 +199,7 @@ class EdgeSlaveMixin(MonitorTestMixin):
...
@@ -200,7 +199,7 @@ class EdgeSlaveMixin(MonitorTestMixin):
set
(
set
(
glob
.
glob
(
glob
.
glob
(
os
.
path
.
join
(
self
.
bot_partition_path
,
'etc'
,
'surykatka*.ini'
))),
os
.
path
.
join
(
self
.
bot_partition_path
,
'etc'
,
'surykatka*.ini'
))),
set
([
q
[
'ini-file'
]
for
q
in
self
.
surykatka_dict
.
values
()])
{
q
[
'ini-file'
]
for
q
in
self
.
surykatka_dict
.
values
()}
)
)
for
info_dict
in
self
.
surykatka_dict
.
values
():
for
info_dict
in
self
.
surykatka_dict
.
values
():
self
.
assertEqual
(
self
.
assertEqual
(
...
@@ -243,14 +242,11 @@ class EdgeSlaveMixin(MonitorTestMixin):
...
@@ -243,14 +242,11 @@ class EdgeSlaveMixin(MonitorTestMixin):
for
info_dict
in
self
.
surykatka_dict
.
values
():
for
info_dict
in
self
.
surykatka_dict
.
values
():
if
os
.
path
.
exists
(
info_dict
[
'json-file'
]):
if
os
.
path
.
exists
(
info_dict
[
'json-file'
]):
os
.
unlink
(
info_dict
[
'json-file'
])
os
.
unlink
(
info_dict
[
'json-file'
])
env
=
os
.
environ
.
copy
()
env
.
pop
(
'PYTHONPATH'
,
None
)
try
:
try
:
subprocess
.
check_call
(
info_dict
[
'status-json'
]
,
shell
=
True
,
env
=
env
)
subprocess
.
check_call
(
info_dict
[
'status-json'
])
except
subprocess
.
CalledProcessError
as
e
:
except
subprocess
.
CalledProcessError
as
e
:
self
.
fail
(
'%s failed with code %s and message %s'
%
(
self
.
fail
(
'%s failed with code %s and message %s'
%
(
info_dict
[
'status-json'
],
e
.
returncode
,
e
.
output
))
info_dict
[
'status-json'
],
e
.
returncode
,
e
.
output
))
self
.
assertTrue
(
os
.
path
.
exists
(
info_dict
[
'json-file'
]))
with
open
(
info_dict
[
'json-file'
])
as
fh
:
with
open
(
info_dict
[
'json-file'
])
as
fh
:
status_json
=
json
.
load
(
fh
)
status_json
=
json
.
load
(
fh
)
self
.
assertIn
(
'bot_status'
,
status_json
)
self
.
assertIn
(
'bot_status'
,
status_json
)
...
@@ -680,8 +676,8 @@ INTERVAL = 120
...
@@ -680,8 +676,8 @@ INTERVAL = 120
TIMEOUT = 4
TIMEOUT = 4
SQLITE = %(db_file)s
SQLITE = %(db_file)s
URL =
URL =
https://www.erp5.
org
/
https://www.erp5.
com
/
https://www.erp5.
com
/"""
}
https://www.erp5.
org
/"""
}
}
}
@
classmethod
@
classmethod
...
...
software/slapos-sr-testing/software-py3.cfg
View file @
ac2a7e45
...
@@ -13,3 +13,4 @@ eggs -=
...
@@ -13,3 +13,4 @@ eggs -=
[template]
[template]
extra =
extra =
${slapos.test.monitor-setup:setup}
software/slapos-sr-testing/software.cfg
View file @
ac2a7e45
...
@@ -217,7 +217,6 @@ extra =
...
@@ -217,7 +217,6 @@ extra =
${slapos.test.erp5-setup:setup}
${slapos.test.erp5-setup:setup}
${slapos.test.htmlvalidatorserver-setup:setup}
${slapos.test.htmlvalidatorserver-setup:setup}
${slapos.test.slapos-master-setup:setup}
${slapos.test.slapos-master-setup:setup}
${slapos.test.monitor-setup:setup}
${slapos.test.plantuml-setup:setup}
${slapos.test.plantuml-setup:setup}
${slapos.test.powerdns-setup:setup}
${slapos.test.powerdns-setup:setup}
${slapos.test.proftpd-setup:setup}
${slapos.test.proftpd-setup:setup}
...
...
stack/slapos.cfg
View file @
ac2a7e45
...
@@ -100,7 +100,7 @@ eggs =
...
@@ -100,7 +100,7 @@ eggs =
slapos.libnetworkcache
slapos.libnetworkcache
[versions]
[versions]
setuptools = 4
0.4.3
setuptools = 4
4.0.0
# Use SlapOS patched zc.buildout
# Use SlapOS patched zc.buildout
zc.buildout = 2.7.1+slapos001
zc.buildout = 2.7.1+slapos001
# Use SlapOS patched zc.recipe.egg (zc.recipe.egg 2.x is for Buildout 2)
# Use SlapOS patched zc.recipe.egg (zc.recipe.egg 2.x is for Buildout 2)
...
...
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