diff --git a/doc/service/service.md b/doc/service/service.md
index 06473ea80..de1efbaf0 100644
--- a/doc/service/service.md
+++ b/doc/service/service.md
@@ -29,6 +29,16 @@ Un service non géré ne peut conteneur que des fichiers.
## Désactiver la génération d'un service
+Il est possible de désactiver un service. Pour cela il faut rajouter l'attribut "disabled" à True :
+
+```
+
+
+
+```
+
+Dans ce cas, tous les services et les éléments qu'il compose ([fichier](file.md), ...) seront désactivés.
+
Il est possible de définir une [condition](../condition/README.md) de type "disabled_if_in" ou "disabled_if_not_in" sur une balise service :
```
diff --git a/src/rougail/annotator/service.py b/src/rougail/annotator/service.py
index de14cf9b4..69158b864 100644
--- a/src/rougail/annotator/service.py
+++ b/src/rougail/annotator/service.py
@@ -76,10 +76,11 @@ class Annotator:
None,
None,
'activate',
- True,
+ not service.disabled,
service,
'.'.join(['services', normalize_family(service_name), 'activate']),
)
+ service.disabled = None
for elttype, values in dict(vars(service)).items():
if elttype == 'servicelist':
self.objectspace.list_conditions.setdefault('servicelist',
diff --git a/src/rougail/data/rougail.dtd b/src/rougail/data/rougail.dtd
index df58c72e9..1e8c61711 100644
--- a/src/rougail/data/rougail.dtd
+++ b/src/rougail/data/rougail.dtd
@@ -50,6 +50,7 @@
+
diff --git a/tests/dictionaries/70service_disabled/00-base.xml b/tests/dictionaries/70service_disabled/00-base.xml
new file mode 100644
index 000000000..f39bcf44d
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/00-base.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+ no
+
+
+
diff --git a/tests/dictionaries/70service_disabled/__init__.py b/tests/dictionaries/70service_disabled/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/70service_disabled/makedict/after.json b/tests/dictionaries/70service_disabled/makedict/after.json
new file mode 100644
index 000000000..08915df9e
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/makedict/after.json
@@ -0,0 +1,14 @@
+{
+ "rougail.condition": {
+ "owner": "default",
+ "value": "no"
+ },
+ "services.test.activate": {
+ "owner": "default",
+ "value": false
+ },
+ "services.test.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/70service_disabled/makedict/base.json b/tests/dictionaries/70service_disabled/makedict/base.json
new file mode 100644
index 000000000..393b57d76
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/makedict/base.json
@@ -0,0 +1,5 @@
+{
+ "rougail.condition": "no",
+ "services.test.activate": false,
+ "services.test.manage": true
+}
diff --git a/tests/dictionaries/70service_disabled/makedict/before.json b/tests/dictionaries/70service_disabled/makedict/before.json
new file mode 100644
index 000000000..08915df9e
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/makedict/before.json
@@ -0,0 +1,14 @@
+{
+ "rougail.condition": {
+ "owner": "default",
+ "value": "no"
+ },
+ "services.test.activate": {
+ "owner": "default",
+ "value": false
+ },
+ "services.test.manage": {
+ "owner": "default",
+ "value": true
+ }
+}
diff --git a/tests/dictionaries/70service_disabled/result/systemd/system/test.service b/tests/dictionaries/70service_disabled/result/systemd/system/test.service
new file mode 120000
index 000000000..dc1dc0cde
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/result/systemd/system/test.service
@@ -0,0 +1 @@
+/dev/null
\ No newline at end of file
diff --git a/tests/dictionaries/70service_disabled/result/tmpfiles.d/rougail.conf b/tests/dictionaries/70service_disabled/result/tmpfiles.d/rougail.conf
new file mode 100644
index 000000000..e69de29bb
diff --git a/tests/dictionaries/70service_disabled/tiramisu/base.py b/tests/dictionaries/70service_disabled/tiramisu/base.py
new file mode 100644
index 000000000..5a8302583
--- /dev/null
+++ b/tests/dictionaries/70service_disabled/tiramisu/base.py
@@ -0,0 +1,20 @@
+from importlib.machinery import SourceFileLoader
+from importlib.util import spec_from_loader, module_from_spec
+loader = SourceFileLoader('func', 'tests/dictionaries/../eosfunc/test.py')
+spec = spec_from_loader(loader.name, loader)
+func = module_from_spec(spec)
+loader.exec_module(func)
+for key, value in dict(locals()).items():
+ if key != ['SourceFileLoader', 'func']:
+ setattr(func, key, value)
+try:
+ from tiramisu3 import *
+except:
+ from tiramisu import *
+option_2 = StrOption(name="condition", doc="condition", default="no", properties=frozenset({"mandatory", "normal"}))
+option_1 = OptionDescription(name="rougail", doc="rougail", children=[option_2])
+option_5 = BoolOption(name="activate", doc="activate", default=False)
+option_6 = BoolOption(name="manage", doc="manage", default=True)
+option_4 = OptionDescription(name="test", doc="test", children=[option_5, option_6])
+option_3 = OptionDescription(name="services", doc="services", children=[option_4], properties=frozenset({"hidden"}))
+option_0 = OptionDescription(name="baseoption", doc="baseoption", children=[option_1, option_3])