error message for ip/broadcast/netmask/network validation
authorEmmanuel Garette <egarette@cadoles.com>
Thu, 26 Sep 2013 20:27:39 +0000 (22:27 +0200)
committerEmmanuel Garette <egarette@cadoles.com>
Thu, 26 Sep 2013 20:27:39 +0000 (22:27 +0200)
tiramisu/option.py
translations/fr/tiramisu.po
translations/tiramisu.pot

index 6fd0568..cf35508 100644 (file)
@@ -782,7 +782,10 @@ class IPOption(Option):
                                        only_warning=only_warning)
 
     def _validate(self, value):
-        IP('{0}/32'.format(value))
+        try:
+            IP('{0}/32'.format(value))
+        except ValueError:
+            raise ValueError(_('invalid IP {0}').format(self._name))
 
     def _second_level_validation(self, value):
         ip = IP('{0}/32'.format(value))
@@ -868,7 +871,10 @@ class NetworkOption(Option):
     _opt_type = 'network'
 
     def _validate(self, value):
-        IP(value)
+        try:
+            IP(value)
+        except ValueError:
+            raise ValueError(_('invalid network address {0}').format(self._name))
 
     def _second_level_validation(self, value):
         ip = IP(value)
@@ -882,7 +888,10 @@ class NetmaskOption(Option):
     _opt_type = 'netmask'
 
     def _validate(self, value):
-        IP('0.0.0.0/{0}'.format(value))
+        try:
+            IP('0.0.0.0/{0}'.format(value))
+        except ValueError:
+            raise ValueError(_('invalid netmask address {0}').format(self._name))
 
     def _cons_network_netmask(self, optname, value, value_):
         #opts must be (netmask, network) options
@@ -924,7 +933,10 @@ class NetmaskOption(Option):
 
 class BroadcastOption(Option):
     def _validate(self, value):
-        IP('{0}/32'.format(value))
+        try:
+            IP('{0}/32'.format(value))
+        except ValueError:
+            raise ValueError(_('invalid broadcast address {0}').format(self._name))
 
 
 class DomainnameOption(Option):
index e1cc0b3..a81e14e 100644 (file)
@@ -2,7 +2,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-23 20:59+CEST\n"
+"POT-Creation-Date: 2013-09-26 22:24+CEST\n"
 "PO-Revision-Date: \n"
 "Last-Translator: Emmanuel Garette <egarette@cadoles.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -11,270 +11,279 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: Poedit 1.5.4\n"
 
-#: tiramisu/autolib.py:131
+#: tiramisu/autolib.py:145
 msgid ""
 "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 "impossible d'effectuer le calcul, l'option {0} a les propriétés : {1} pour : "
 "{2}"
 
-#: tiramisu/autolib.py:140
+#: tiramisu/autolib.py:154
 msgid ""
 "unable to carry out a calculation, option value with multi types must have "
 "same length for: {0}"
 msgstr ""
-"impossible d'effectuer le calcul, la valeur d'une option avec le type multi doit "
-"avoir la même longueur pour : {0}"
+"impossible d'effectuer le calcul, la valeur d'une option avec le type multi "
+"doit avoir la même longueur pour : {0}"
 
-#: tiramisu/config.py:48
+#: tiramisu/config.py:52
 msgid "descr must be an optiondescription, not {0}"
 msgstr "descr doit être une optiondescription pas un {0}"
 
-#: tiramisu/config.py:122
+#: tiramisu/config.py:127
 msgid "unknown group_type: {0}"
 msgstr "group_type inconnu: {0}"
 
-#: tiramisu/config.py:158
+#: tiramisu/config.py:163
 msgid ""
 "no option description found for this config (may be metaconfig without meta)"
 msgstr ""
-"pas d'option description trouvé pour cette config (peut être une metaconfig sans "
-"meta)"
+"pas d'option description trouvé pour cette config (peut être une metaconfig "
+"sans meta)"
 
-#: tiramisu/config.py:313
+#: tiramisu/config.py:318
 msgid "unknown type_ type {0}for _find"
 msgstr "type_ type {0} pour _find inconnu"
 
-#: tiramisu/config.py:352
+#: tiramisu/config.py:357
 msgid "no option found in config with these criteria"
 msgstr "aucune option trouvée dans la config avec ces critères"
 
-#: tiramisu/config.py:402
+#: tiramisu/config.py:407
 msgid "make_dict can't filtering with value without option"
 msgstr "make_dict ne peut filtrer sur une valeur mais sans option"
 
-#: tiramisu/config.py:423
+#: tiramisu/config.py:428
 msgid "unexpected path {0}, should start with {1}"
 msgstr "chemin imprévu {0}, devrait commencer par {1}"
 
-#: tiramisu/config.py:483
+#: tiramisu/config.py:488
 msgid "opt in getowner must be an option not {0}"
 msgstr "opt dans getowner doit être une option pas {0}"
 
-#: tiramisu/option.py:69
+#: tiramisu/option.py:70
 msgid "invalid name: {0} for option"
 msgstr "nom invalide : {0} pour l'option"
 
-#: tiramisu/option.py:79
+#: tiramisu/option.py:80
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr "type des properties invalide {0} pour {1}, doit être un tuple"
 
-#: tiramisu/option.py:121
+#: tiramisu/option.py:122
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr "l'attribut {2} de l'objet '{0}' ({1}) est en lecture seule"
 
-#: tiramisu/option.py:148 tiramisu/value.py:361
+#: tiramisu/option.py:149 tiramisu/value.py:362
 msgid "information's item not found: {0}"
 msgstr "aucune config spécifié alors que c'est nécessaire"
 
-#: tiramisu/option.py:265
+#: tiramisu/option.py:266
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr "ne peut serialiser une Option, seulement via une OptionDescription"
 
-#: tiramisu/option.py:364
+#: tiramisu/option.py:367
 msgid "a default_multi is set whereas multi is False in option: {0}"
 msgstr ""
-"une default_multi est renseignée alors que multi est False dans l'option : {0}"
+"une default_multi est renseignée alors que multi est False dans l'option : "
+"{0}"
 
-#: tiramisu/option.py:370
+#: tiramisu/option.py:373
 msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr "la valeur default_multi est invalide {0} pour l'option {1} : {2}"
 
-#: tiramisu/option.py:375
+#: tiramisu/option.py:378
 msgid "default value not allowed if option: {0} is calculated"
 msgstr "la valeur par défaut n'est pas possible si l'option {0} est calculée"
 
-#: tiramisu/option.py:378
+#: tiramisu/option.py:381
 msgid ""
 "params defined for a callback function but no callback defined yet for "
 "option {0}"
 msgstr ""
-"params définis pour une fonction callback mais par de callback encore définis "
-"pour l'option {0}"
-
-#: tiramisu/option.py:463
-msgid "validator should return a boolean, not {0}"
-msgstr "le validator devrait retourner un boolean, pas un {0}"
+"params définis pour une fonction callback mais par de callback encore "
+"définis pour l'option {0}"
 
-#: tiramisu/option.py:473
-msgid "invalid value {0} for option {1} for object {2}"
-msgstr "valeur invalide {0} pour l'option {1} pour l'objet {2}"
-
-#: tiramisu/option.py:481 tiramisu/value.py:542
+#: tiramisu/option.py:486 tiramisu/value.py:547
 msgid "invalid value {0} for option {1}: {2}"
 msgstr "valeur invalide {0} pour l'option {1} : {2}"
 
-#: tiramisu/option.py:493
+#: tiramisu/option.py:506
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr "valeur invalide {0} pour l'option {1} qui doit être une liste"
 
-#: tiramisu/option.py:562
+#: tiramisu/option.py:577
 msgid "invalid value {0} for option {1} must be different as {2} option"
 msgstr ""
 "valeur invalide {0} pour l'option {1} doit être différente de l'option {2}"
 
-#: tiramisu/option.py:618
+#: tiramisu/option.py:636
 msgid "values must be a tuple for {0}"
 msgstr "values doit être un tuple pour {0}"
 
-#: tiramisu/option.py:621
+#: tiramisu/option.py:639
 msgid "open_values must be a boolean for {0}"
 msgstr "open_values doit être un booléen pour {0}"
 
-#: tiramisu/option.py:642
+#: tiramisu/option.py:661
 msgid "value {0} is not permitted, only {1} is allowed"
 msgstr "valeur {0} n'est pas permis, seules {1} sont autorisées"
 
-#: tiramisu/option.py:654
+#: tiramisu/option.py:673
 msgid "value must be a boolean"
 msgstr "valeur doit être un booléen"
 
-#: tiramisu/option.py:664
+#: tiramisu/option.py:683
 msgid "value must be an integer"
 msgstr "valeur doit être un nombre entier"
 
-#: tiramisu/option.py:674
+#: tiramisu/option.py:693
 msgid "value must be a float"
 msgstr "valeur doit être un nombre flottant"
 
-#: tiramisu/option.py:684
+#: tiramisu/option.py:703
 msgid "value must be a string, not {0}"
 msgstr "valeur doit être une chaîne, pas {0}"
 
-#: tiramisu/option.py:702
+#: tiramisu/option.py:721
 msgid "value must be an unicode"
 msgstr "valeur doit être une valeur unicode"
 
-#: tiramisu/option.py:714
+#: tiramisu/option.py:733
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr "symlinkoption mal formé, doit être une option pour symlink {0}"
 
-#: tiramisu/option.py:766
+#: tiramisu/option.py:788
+msgid "invalid IP {0}"
+msgstr "adresse IP invalide {0}"
+
+#: tiramisu/option.py:793
 msgid "IP mustn't not be in reserved class"
 msgstr "IP ne doit pas être d'une classe reservée"
 
-#: tiramisu/option.py:768
+#: tiramisu/option.py:795
 msgid "IP must be in private class"
 msgstr "IP doit être dans la classe privée"
 
-#: tiramisu/option.py:806
+#: tiramisu/option.py:833
 msgid "inconsistency in allowed range"
 msgstr "inconsistence dans la plage autorisée"
 
-#: tiramisu/option.py:811
+#: tiramisu/option.py:838
 msgid "max value is empty"
 msgstr "la valeur maximum est vide"
 
-#: tiramisu/option.py:848
+#: tiramisu/option.py:877
+msgid "invalid network address {0}"
+msgstr "adresse réseau invalide {0}"
+
+#: tiramisu/option.py:882
 msgid "network shall not be in reserved class"
 msgstr "le réseau ne doit pas être dans la classe reservée"
 
-#: tiramisu/option.py:880
+#: tiramisu/option.py:894
+msgid "invalid netmask address {0}"
+msgstr "masque de sous-réseau invalide {0}"
+
+#: tiramisu/option.py:916
 msgid "invalid network {0} ({1}) with netmask {2} ({3}), this network is an IP"
 msgstr "réseau invalide {0} ({1}) avec masque {2} ({3}), ce réseau est une IP"
 
-#: tiramisu/option.py:885
+#: tiramisu/option.py:921
 msgid "invalid IP {0} ({1}) with netmask {2} ({3}), this IP is a network"
 msgstr "IP invalide {0} ({1}) avec masque {2} ({3}), cette IP est un réseau"
 
-#: tiramisu/option.py:890
+#: tiramisu/option.py:926
 msgid "invalid IP {0} ({1}) with netmask {2} ({3})"
 msgstr "IP invalide {0} ({1}) avec masque {2} ({3})"
 
-#: tiramisu/option.py:892
+#: tiramisu/option.py:928
 msgid "invalid network {0} ({1}) with netmask {2} ({3})"
 msgstr "réseau invalide {0} ({1}) avec masque {2} ({3})"
 
-#: tiramisu/option.py:912
+#: tiramisu/option.py:939
+msgid "invalid broadcast address {0}"
+msgstr "adresse de broadcast invalide {0}"
+
+#: tiramisu/option.py:957
 msgid "unknown type_ {0} for hostname"
 msgstr "type_ inconnu {0} pour le nom d'hôte"
 
-#: tiramisu/option.py:915
+#: tiramisu/option.py:960
 msgid "allow_ip must be a boolean"
 msgstr "allow_ip doit être un booléen"
 
-#: tiramisu/option.py:944
+#: tiramisu/option.py:990
 msgid "invalid value for {0}, must have dot"
 msgstr "valeur invalide pour {0}, doit avoir un point"
 
-#: tiramisu/option.py:947
+#: tiramisu/option.py:993
 msgid "invalid domainname's length for {0} (max {1})"
 msgstr "longueur du nom de domaine invalide pour {0} (maximum {1})"
 
-#: tiramisu/option.py:950
+#: tiramisu/option.py:996
 msgid "invalid domainname's length for {0} (min 2)"
 msgstr "longueur du nom de domaine invalide pour {0} (minimum 2)"
 
-#: tiramisu/option.py:954
+#: tiramisu/option.py:1000
 msgid "invalid domainname"
 msgstr "nom de domaine invalide"
 
-#: tiramisu/option.py:981
+#: tiramisu/option.py:1027
 msgid "duplicate option name: {0}"
 msgstr "nom de l'option dupliqué : {0}"
 
-#: tiramisu/option.py:998
+#: tiramisu/option.py:1044
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr "Option {0} inconnue pour l'OptionDescription {1}"
 
-#: tiramisu/option.py:1049
+#: tiramisu/option.py:1095
 msgid "duplicate option: {0}"
 msgstr "option dupliquée : {0}"
 
-#: tiramisu/option.py:1083
+#: tiramisu/option.py:1129
 msgid "no option for path {0}"
 msgstr "pas d'option pour le chemin {0}"
 
-#: tiramisu/option.py:1089
+#: tiramisu/option.py:1135
 msgid "no option {0} found"
 msgstr "pas d'option {0} trouvée"
 
-#: tiramisu/option.py:1099
+#: tiramisu/option.py:1145
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr "ne peut changer group_type si déjà spécifié (ancien {0}, nouveau {1})"
 
-#: tiramisu/option.py:1112
+#: tiramisu/option.py:1158
 msgid "master group {0} shall not have a subgroup"
 msgstr "groupe maître {0} ne doit pas avoir de sous-groupe"
 
-#: tiramisu/option.py:1115
+#: tiramisu/option.py:1161
 msgid "master group {0} shall not have a symlinkoption"
 msgstr "groupe maître {0} ne doit pas avoir de symlinkoption"
 
-#: tiramisu/option.py:1118
+#: tiramisu/option.py:1164
 msgid "not allowed option {0} in group {1}: this option is not a multi"
 msgstr ""
 "option non autorisée {0} dans le groupe {1} : cette option n'est pas une "
 "multi"
 
-#: tiramisu/option.py:1129
+#: tiramisu/option.py:1175
 msgid "master group with wrong master name for {0}"
 msgstr "le groupe maître avec un nom de maître érroné pour {0}"
 
-#: tiramisu/option.py:1138
+#: tiramisu/option.py:1184
 msgid "no child has same nom has master group for: {0}"
 msgstr "pas d'enfant avec le nom du groupe maître pour {0} "
 
-#: tiramisu/option.py:1141
+#: tiramisu/option.py:1187
 msgid "group_type: {0} not allowed"
 msgstr "group_type : {0} non autorisé"
 
-#: tiramisu/option.py:1231
+#: tiramisu/option.py:1277
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 "type requirements malformé pour l'option : {0}, doit être un dictionnaire"
 
-#: tiramisu/option.py:1248
+#: tiramisu/option.py:1294
 msgid ""
 "malformed requirements for option: {0} require must have option, expected "
 "and action keys"
@@ -282,64 +291,66 @@ msgstr ""
 "requirements malformé pour l'option : {0} l'exigence doit avoir les clefs "
 "option, expected et action"
 
-#: tiramisu/option.py:1253
+#: tiramisu/option.py:1299
 msgid "malformed requirements for option: {0} inverse must be boolean"
-msgstr "requirements mal formés pour l'option : {0} inverse doit être un booléen"
+msgstr ""
+"requirements mal formés pour l'option : {0} inverse doit être un booléen"
 
-#: tiramisu/option.py:1257
+#: tiramisu/option.py:1303
 msgid "malformed requirements for option: {0} transitive must be boolean"
-msgstr "requirements mal formés pour l'option : {0} transitive doit être booléen"
+msgstr ""
+"requirements mal formés pour l'option : {0} transitive doit être booléen"
 
-#: tiramisu/option.py:1261
+#: tiramisu/option.py:1307
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 "requirements mal formés pour l'option : {0} same_action doit être un booléen"
 
-#: tiramisu/option.py:1265
+#: tiramisu/option.py:1311
 msgid "malformed requirements must be an option in option {0}"
 msgstr "requirements mal formés doit être une option dans l'option {0}"
 
-#: tiramisu/option.py:1268
+#: tiramisu/option.py:1314
 msgid "malformed requirements option {0} should not be a multi"
 msgstr "requirements mal formés l'option {0} ne doit pas être une multi"
 
-#: tiramisu/option.py:1274
+#: tiramisu/option.py:1320
 msgid ""
 "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
-"requirements mal formés deuxième argument doit être valide pour l'option {0} : "
-"{1}"
+"requirements mal formés deuxième argument doit être valide pour l'option "
+"{0} : {1}"
 
-#: tiramisu/option.py:1279
+#: tiramisu/option.py:1325
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr "incohérence dans les types action pour l'option : {0} action {1}"
 
-#: tiramisu/option.py:1304
+#: tiramisu/option.py:1350
 msgid "{0} should be a function"
 msgstr "{0} doit être une fonction"
 
-#: tiramisu/option.py:1307
+#: tiramisu/option.py:1353
 msgid "{0}_params should be a dict"
 msgstr "{0}_params devrait être un dict"
 
-#: tiramisu/option.py:1310
+#: tiramisu/option.py:1356
 msgid "{0}_params with key {1} should not have length different to 1"
 msgstr ""
 "{0}_params avec la clef {1} devrait ne pas avoir une longueur différent de 1"
 
-#: tiramisu/option.py:1314
+#: tiramisu/option.py:1360
 msgid "{0}_params should be tuple for key \"{1}\""
 msgstr "{0}_params devrait être un tuple pour la clef \"{1}\""
 
-#: tiramisu/option.py:1320
+#: tiramisu/option.py:1366
 msgid "validator not support tuple"
 msgstr "validator n'accepte pas de tuple"
 
-#: tiramisu/option.py:1323
+#: tiramisu/option.py:1369
 msgid "{0}_params should have an option not a {0} for first argument"
 msgstr "{0}_params devrait avoir une option pas un {0} pour premier argument"
 
-#: tiramisu/option.py:1327
+#: tiramisu/option.py:1373
 msgid "{0}_params should have a boolean not a {0} for second argument"
 msgstr "{0}_params devrait avoir un boolean pas un {0} pour second argument"
 
@@ -379,7 +390,7 @@ msgstr "tentative d'accès à une option nommée : {0} avec les propriétés {1}
 msgid "permissive must be a tuple"
 msgstr "permissive doit être un tuple"
 
-#: tiramisu/setting.py:471 tiramisu/value.py:300
+#: tiramisu/setting.py:471 tiramisu/value.py:301
 msgid "invalid generic owner {0}"
 msgstr "invalide owner générique {0}"
 
@@ -416,48 +427,54 @@ msgstr "session déjà utilisée"
 msgid "a dictionary cannot be persistent"
 msgstr "un espace de stockage dictionary ne peut être persistant"
 
-#: tiramisu/value.py:307
+#: tiramisu/value.py:308
 msgid "no value for {0} cannot change owner to {1}"
 msgstr "pas de valeur pour {0} ne peut changer d'utilisateur pour {1}"
 
-#: tiramisu/value.py:414
+#: tiramisu/value.py:416
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr "longueur invalide pour une esclave : {0} qui a {1} comme maître"
 
-#: tiramisu/value.py:438
+#: tiramisu/value.py:440
 msgid "invalid len for the master: {0} which has {1} as slave with greater len"
 msgstr ""
 "longueur invalide pour un maître : {0} qui a {1} une esclave avec une plus "
 "grande longueur"
 
-#: tiramisu/value.py:468
+#: tiramisu/value.py:470
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr "ne peut ajouter une valeur sur l'option multi {0} qui est une esclave"
 
-#: tiramisu/value.py:503
+#: tiramisu/value.py:507
 msgid "cannot sort multi option {0} if master or slave"
 msgstr "ne peut trier une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:507
+#: tiramisu/value.py:511
 msgid "cmp is not permitted in python v3 or greater"
 msgstr "cmp n'est pas permis en python v3 ou supérieure"
 
-#: tiramisu/value.py:516
+#: tiramisu/value.py:520
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr "ne peut inverser une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:524
+#: tiramisu/value.py:528
 msgid "cannot insert multi option {0} if master or slave"
 msgstr "ne peut insérer une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:532
+#: tiramisu/value.py:536
 msgid "cannot extend multi option {0} if master or slave"
 msgstr "ne peut étendre une option multi {0} pour une maître ou une esclave"
 
-#: tiramisu/value.py:559
+#: tiramisu/value.py:564
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr "ne peut supprimer une valeur dans l'option multi {0} qui est esclave"
 
+#~ msgid "validator should return a boolean, not {0}"
+#~ msgstr "le validator devrait retourner un boolean, pas un {0}"
+
+#~ msgid "invalid value {0} for option {1} for object {2}"
+#~ msgstr "valeur invalide {0} pour l'option {1} pour l'objet {2}"
+
 #~ msgid "no config specified but needed"
 #~ msgstr "aucune config spécifié alors que c'est nécessaire"
 
index 8b37d6a..7304c9f 100644 (file)
@@ -5,7 +5,7 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
-"POT-Creation-Date: 2013-09-23 20:59+CEST\n"
+"POT-Creation-Date: 2013-09-26 22:24+CEST\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -15,307 +15,315 @@ msgstr ""
 "Generated-By: pygettext.py 1.5\n"
 
 
-#: tiramisu/autolib.py:131
+#: tiramisu/autolib.py:145
 msgid "unable to carry out a calculation, option {0} has properties: {1} for: {2}"
 msgstr ""
 
-#: tiramisu/autolib.py:140
+#: tiramisu/autolib.py:154
 msgid "unable to carry out a calculation, option value with multi types must have same length for: {0}"
 msgstr ""
 
-#: tiramisu/config.py:48
+#: tiramisu/config.py:52
 msgid "descr must be an optiondescription, not {0}"
 msgstr ""
 
-#: tiramisu/config.py:122
+#: tiramisu/config.py:127
 msgid "unknown group_type: {0}"
 msgstr ""
 
-#: tiramisu/config.py:158
+#: tiramisu/config.py:163
 msgid "no option description found for this config (may be metaconfig without meta)"
 msgstr ""
 
-#: tiramisu/config.py:313
+#: tiramisu/config.py:318
 msgid "unknown type_ type {0}for _find"
 msgstr ""
 
-#: tiramisu/config.py:352
+#: tiramisu/config.py:357
 msgid "no option found in config with these criteria"
 msgstr ""
 
-#: tiramisu/config.py:402
+#: tiramisu/config.py:407
 msgid "make_dict can't filtering with value without option"
 msgstr ""
 
-#: tiramisu/config.py:423
+#: tiramisu/config.py:428
 msgid "unexpected path {0}, should start with {1}"
 msgstr ""
 
-#: tiramisu/config.py:483
+#: tiramisu/config.py:488
 msgid "opt in getowner must be an option not {0}"
 msgstr ""
 
-#: tiramisu/option.py:69
+#: tiramisu/option.py:70
 msgid "invalid name: {0} for option"
 msgstr ""
 
-#: tiramisu/option.py:79
+#: tiramisu/option.py:80
 msgid "invalid properties type {0} for {1}, must be a tuple"
 msgstr ""
 
-#: tiramisu/option.py:121
+#: tiramisu/option.py:122
 msgid "'{0}' ({1}) object attribute '{2}' is read-only"
 msgstr ""
 
-#: tiramisu/option.py:148 tiramisu/value.py:361
+#: tiramisu/option.py:149 tiramisu/value.py:362
 msgid "information's item not found: {0}"
 msgstr ""
 
-#: tiramisu/option.py:265
+#: tiramisu/option.py:266
 msgid "cannot serialize Option, only in OptionDescription"
 msgstr ""
 
-#: tiramisu/option.py:364
+#: tiramisu/option.py:367
 msgid "a default_multi is set whereas multi is False in option: {0}"
 msgstr ""
 
-#: tiramisu/option.py:370
+#: tiramisu/option.py:373
 msgid "invalid default_multi value {0} for option {1}: {2}"
 msgstr ""
 
-#: tiramisu/option.py:375
+#: tiramisu/option.py:378
 msgid "default value not allowed if option: {0} is calculated"
 msgstr ""
 
-#: tiramisu/option.py:378
+#: tiramisu/option.py:381
 msgid "params defined for a callback function but no callback defined yet for option {0}"
 msgstr ""
 
-#: tiramisu/option.py:463
-msgid "validator should return a boolean, not {0}"
-msgstr ""
-
-#: tiramisu/option.py:473
-msgid "invalid value {0} for option {1} for object {2}"
-msgstr ""
-
-#: tiramisu/option.py:481 tiramisu/value.py:542
+#: tiramisu/option.py:486 tiramisu/value.py:547
 msgid "invalid value {0} for option {1}: {2}"
 msgstr ""
 
-#: tiramisu/option.py:493
+#: tiramisu/option.py:506
 msgid "invalid value {0} for option {1} which must be a list"
 msgstr ""
 
-#: tiramisu/option.py:562
+#: tiramisu/option.py:577
 msgid "invalid value {0} for option {1} must be different as {2} option"
 msgstr ""
 
-#: tiramisu/option.py:618
+#: tiramisu/option.py:636
 msgid "values must be a tuple for {0}"
 msgstr ""
 
-#: tiramisu/option.py:621
+#: tiramisu/option.py:639
 msgid "open_values must be a boolean for {0}"
 msgstr ""
 
-#: tiramisu/option.py:642
+#: tiramisu/option.py:661
 msgid "value {0} is not permitted, only {1} is allowed"
 msgstr ""
 
-#: tiramisu/option.py:654
+#: tiramisu/option.py:673
 msgid "value must be a boolean"
 msgstr ""
 
-#: tiramisu/option.py:664
+#: tiramisu/option.py:683
 msgid "value must be an integer"
 msgstr ""
 
-#: tiramisu/option.py:674
+#: tiramisu/option.py:693
 msgid "value must be a float"
 msgstr ""
 
-#: tiramisu/option.py:684
+#: tiramisu/option.py:703
 msgid "value must be a string, not {0}"
 msgstr ""
 
-#: tiramisu/option.py:702
+#: tiramisu/option.py:721
 msgid "value must be an unicode"
 msgstr ""
 
-#: tiramisu/option.py:714
+#: tiramisu/option.py:733
 msgid "malformed symlinkoption must be an option for symlink {0}"
 msgstr ""
 
-#: tiramisu/option.py:766
+#: tiramisu/option.py:788
+msgid "invalid IP {0}"
+msgstr ""
+
+#: tiramisu/option.py:793
 msgid "IP mustn't not be in reserved class"
 msgstr ""
 
-#: tiramisu/option.py:768
+#: tiramisu/option.py:795
 msgid "IP must be in private class"
 msgstr ""
 
-#: tiramisu/option.py:806
+#: tiramisu/option.py:833
 msgid "inconsistency in allowed range"
 msgstr ""
 
-#: tiramisu/option.py:811
+#: tiramisu/option.py:838
 msgid "max value is empty"
 msgstr ""
 
-#: tiramisu/option.py:848
+#: tiramisu/option.py:877
+msgid "invalid network address {0}"
+msgstr ""
+
+#: tiramisu/option.py:882
 msgid "network shall not be in reserved class"
 msgstr ""
 
-#: tiramisu/option.py:880
+#: tiramisu/option.py:894
+msgid "invalid netmask address {0}"
+msgstr ""
+
+#: tiramisu/option.py:916
 msgid "invalid network {0} ({1}) with netmask {2} ({3}), this network is an IP"
 msgstr ""
 
-#: tiramisu/option.py:885
+#: tiramisu/option.py:921
 msgid "invalid IP {0} ({1}) with netmask {2} ({3}), this IP is a network"
 msgstr ""
 
-#: tiramisu/option.py:890
+#: tiramisu/option.py:926
 msgid "invalid IP {0} ({1}) with netmask {2} ({3})"
 msgstr ""
 
-#: tiramisu/option.py:892
+#: tiramisu/option.py:928
 msgid "invalid network {0} ({1}) with netmask {2} ({3})"
 msgstr ""
 
-#: tiramisu/option.py:912
+#: tiramisu/option.py:939
+msgid "invalid broadcast address {0}"
+msgstr ""
+
+#: tiramisu/option.py:957
 msgid "unknown type_ {0} for hostname"
 msgstr ""
 
-#: tiramisu/option.py:915
+#: tiramisu/option.py:960
 msgid "allow_ip must be a boolean"
 msgstr ""
 
-#: tiramisu/option.py:944
+#: tiramisu/option.py:990
 msgid "invalid value for {0}, must have dot"
 msgstr ""
 
-#: tiramisu/option.py:947
+#: tiramisu/option.py:993
 msgid "invalid domainname's length for {0} (max {1})"
 msgstr ""
 
-#: tiramisu/option.py:950
+#: tiramisu/option.py:996
 msgid "invalid domainname's length for {0} (min 2)"
 msgstr ""
 
-#: tiramisu/option.py:954
+#: tiramisu/option.py:1000
 msgid "invalid domainname"
 msgstr ""
 
-#: tiramisu/option.py:981
+#: tiramisu/option.py:1027
 msgid "duplicate option name: {0}"
 msgstr ""
 
-#: tiramisu/option.py:998
+#: tiramisu/option.py:1044
 msgid "unknown Option {0} in OptionDescription {1}"
 msgstr ""
 
-#: tiramisu/option.py:1049
+#: tiramisu/option.py:1095
 msgid "duplicate option: {0}"
 msgstr ""
 
-#: tiramisu/option.py:1083
+#: tiramisu/option.py:1129
 msgid "no option for path {0}"
 msgstr ""
 
-#: tiramisu/option.py:1089
+#: tiramisu/option.py:1135
 msgid "no option {0} found"
 msgstr ""
 
-#: tiramisu/option.py:1099
+#: tiramisu/option.py:1145
 msgid "cannot change group_type if already set (old {0}, new {1})"
 msgstr ""
 
-#: tiramisu/option.py:1112
+#: tiramisu/option.py:1158
 msgid "master group {0} shall not have a subgroup"
 msgstr ""
 
-#: tiramisu/option.py:1115
+#: tiramisu/option.py:1161
 msgid "master group {0} shall not have a symlinkoption"
 msgstr ""
 
-#: tiramisu/option.py:1118
+#: tiramisu/option.py:1164
 msgid "not allowed option {0} in group {1}: this option is not a multi"
 msgstr ""
 
-#: tiramisu/option.py:1129
+#: tiramisu/option.py:1175
 msgid "master group with wrong master name for {0}"
 msgstr ""
 
-#: tiramisu/option.py:1138
+#: tiramisu/option.py:1184
 msgid "no child has same nom has master group for: {0}"
 msgstr ""
 
-#: tiramisu/option.py:1141
+#: tiramisu/option.py:1187
 msgid "group_type: {0} not allowed"
 msgstr ""
 
-#: tiramisu/option.py:1231
+#: tiramisu/option.py:1277
 msgid "malformed requirements type for option: {0}, must be a dict"
 msgstr ""
 
-#: tiramisu/option.py:1248
+#: tiramisu/option.py:1294
 msgid "malformed requirements for option: {0} require must have option, expected and action keys"
 msgstr ""
 
-#: tiramisu/option.py:1253
+#: tiramisu/option.py:1299
 msgid "malformed requirements for option: {0} inverse must be boolean"
 msgstr ""
 
-#: tiramisu/option.py:1257
+#: tiramisu/option.py:1303
 msgid "malformed requirements for option: {0} transitive must be boolean"
 msgstr ""
 
-#: tiramisu/option.py:1261
+#: tiramisu/option.py:1307
 msgid "malformed requirements for option: {0} same_action must be boolean"
 msgstr ""
 
-#: tiramisu/option.py:1265
+#: tiramisu/option.py:1311
 msgid "malformed requirements must be an option in option {0}"
 msgstr ""
 
-#: tiramisu/option.py:1268
+#: tiramisu/option.py:1314
 msgid "malformed requirements option {0} should not be a multi"
 msgstr ""
 
-#: tiramisu/option.py:1274
+#: tiramisu/option.py:1320
 msgid "malformed requirements second argument must be valid for option {0}: {1}"
 msgstr ""
 
-#: tiramisu/option.py:1279
+#: tiramisu/option.py:1325
 msgid "inconsistency in action types for option: {0} action: {1}"
 msgstr ""
 
-#: tiramisu/option.py:1304
+#: tiramisu/option.py:1350
 msgid "{0} should be a function"
 msgstr ""
 
-#: tiramisu/option.py:1307
+#: tiramisu/option.py:1353
 msgid "{0}_params should be a dict"
 msgstr ""
 
-#: tiramisu/option.py:1310
+#: tiramisu/option.py:1356
 msgid "{0}_params with key {1} should not have length different to 1"
 msgstr ""
 
-#: tiramisu/option.py:1314
+#: tiramisu/option.py:1360
 msgid "{0}_params should be tuple for key \"{1}\""
 msgstr ""
 
-#: tiramisu/option.py:1320
+#: tiramisu/option.py:1366
 msgid "validator not support tuple"
 msgstr ""
 
-#: tiramisu/option.py:1323
+#: tiramisu/option.py:1369
 msgid "{0}_params should have an option not a {0} for first argument"
 msgstr ""
 
-#: tiramisu/option.py:1327
+#: tiramisu/option.py:1373
 msgid "{0}_params should have a boolean not a {0} for second argument"
 msgstr ""
 
@@ -351,7 +359,7 @@ msgstr ""
 msgid "permissive must be a tuple"
 msgstr ""
 
-#: tiramisu/setting.py:471 tiramisu/value.py:300
+#: tiramisu/setting.py:471 tiramisu/value.py:301
 msgid "invalid generic owner {0}"
 msgstr ""
 
@@ -383,43 +391,43 @@ msgstr ""
 msgid "a dictionary cannot be persistent"
 msgstr ""
 
-#: tiramisu/value.py:307
+#: tiramisu/value.py:308
 msgid "no value for {0} cannot change owner to {1}"
 msgstr ""
 
-#: tiramisu/value.py:414
+#: tiramisu/value.py:416
 msgid "invalid len for the slave: {0} which has {1} as master"
 msgstr ""
 
-#: tiramisu/value.py:438
+#: tiramisu/value.py:440
 msgid "invalid len for the master: {0} which has {1} as slave with greater len"
 msgstr ""
 
-#: tiramisu/value.py:468
+#: tiramisu/value.py:470
 msgid "cannot append a value on a multi option {0} which is a slave"
 msgstr ""
 
-#: tiramisu/value.py:503
+#: tiramisu/value.py:507
 msgid "cannot sort multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:507
+#: tiramisu/value.py:511
 msgid "cmp is not permitted in python v3 or greater"
 msgstr ""
 
-#: tiramisu/value.py:516
+#: tiramisu/value.py:520
 msgid "cannot reverse multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:524
+#: tiramisu/value.py:528
 msgid "cannot insert multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:532
+#: tiramisu/value.py:536
 msgid "cannot extend multi option {0} if master or slave"
 msgstr ""
 
-#: tiramisu/value.py:559
+#: tiramisu/value.py:564
 msgid "cannot pop a value on a multi option {0} which is a slave"
 msgstr ""