diff --git a/0015-python-improve-format-strings-for-proper-localizatio.patch b/0015-python-improve-format-strings-for-proper-localizatio.patch new file mode 100644 index 0000000..79f1193 --- /dev/null +++ b/0015-python-improve-format-strings-for-proper-localizatio.patch @@ -0,0 +1,455 @@ +From d55f376b3cdff4e4159db32039175f9a5ea105db Mon Sep 17 00:00:00 2001 +From: Petr Lautrbach +Date: Tue, 16 May 2023 15:45:05 +0200 +Subject: [PATCH] python: improve format strings for proper localization +Content-type: text/plain + +If a string contains more than one unnamed argument it's hard for +translators to proper localize as they don't know which value is +represented by a unnamed argument. It also blocks them to use a +different order of arguments which would make better sense in other +languages. + +Fixes: + + $ xgettext --default-domain=python -L Python --keyword=_ --keyword=N_ ../audit2allow/audit2allow ../chcat/chcat ../semanage/semanage ../semanage/seobject.py ../sepolgen/src/sepolgen/interfaces.py ../sepolicy/sepolicy/generate.py ../sepolicy/sepolicy/gui.py ../sepolicy/sepolicy/__init__.py ../sepolicy/sepolicy/interface.py ../sepolicy/sepolicy.py + ../chcat/chcat:220: warning: 'msgid' format string with unnamed arguments cannot be properly localized: + The translator cannot reorder the arguments. + Please consider using a format string with named arguments, + and a mapping instead of a tuple for the arguments. + ../semanage/seobject.py:1178: warning: 'msgid' format string with unnamed arguments cannot be properly localized: + The translator cannot reorder the arguments. + Please consider using a format string with named arguments, + and a mapping instead of a tuple for the arguments. + ... + +Signed-off-by: Petr Lautrbach +--- + python/chcat/chcat | 6 +- + python/semanage/seobject.py | 130 ++++++++++++++++++------------------ + 2 files changed, 68 insertions(+), 68 deletions(-) + +diff --git a/python/chcat/chcat b/python/chcat/chcat +index 68718ec5f102..c4f592291821 100755 +--- a/python/chcat/chcat ++++ b/python/chcat/chcat +@@ -125,7 +125,7 @@ def chcat_add(orig, newcat, objects, login_ind): + + if len(clist) > 1: + if cat in clist[1:]: +- print(_("%s is already in %s") % (f, orig)) ++ print(_("{target} is already in {category}").format(target=f, category=orig)) + continue + clist.append(cat) + cats = clist[1:] +@@ -207,7 +207,7 @@ def chcat_remove(orig, newcat, objects, login_ind): + + if len(clist) > 1: + if cat not in clist[1:]: +- print(_("%s is not in %s") % (f, orig)) ++ print(_("{target} is not in {category}").format(target=f, category=orig)) + continue + clist.remove(cat) + if len(clist) > 1: +@@ -217,7 +217,7 @@ def chcat_remove(orig, newcat, objects, login_ind): + else: + cat = "" + else: +- print(_("%s is not in %s") % (f, orig)) ++ print(_("{target} is not in {category}").format(target=f, category=orig)) + continue + + if len(cat) == 0: +diff --git a/python/semanage/seobject.py b/python/semanage/seobject.py +index d82da4942987..2b1eb44ce8a3 100644 +--- a/python/semanage/seobject.py ++++ b/python/semanage/seobject.py +@@ -843,7 +843,7 @@ class seluserRecords(semanageRecords): + for r in roles: + rc = semanage_user_add_role(self.sh, u, r) + if rc < 0: +- raise ValueError(_("Could not add role %s for %s") % (r, name)) ++ raise ValueError(_("Could not add role {role} for {name}").format(role=r, name=name)) + + if is_mls_enabled == 1: + rc = semanage_user_set_mlsrange(self.sh, u, serange) +@@ -855,7 +855,7 @@ class seluserRecords(semanageRecords): + raise ValueError(_("Could not set MLS level for %s") % name) + rc = semanage_user_set_prefix(self.sh, u, prefix) + if rc < 0: +- raise ValueError(_("Could not add prefix %s for %s") % (r, prefix)) ++ raise ValueError(_("Could not add prefix {prefix} for {role}").format(role=r, prefix=prefix)) + (rc, key) = semanage_user_key_extract(self.sh, u) + if rc < 0: + raise ValueError(_("Could not extract key for %s") % name) +@@ -1088,7 +1088,7 @@ class portRecords(semanageRecords): + + (rc, k) = semanage_port_key_create(self.sh, low, high, proto_d) + if rc < 0: +- raise ValueError(_("Could not create a key for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not create a key for {proto}/{port}").format(proto=proto, port=port)) + return (k, proto_d, low, high) + + def __add(self, port, proto, serange, type): +@@ -1110,44 +1110,44 @@ class portRecords(semanageRecords): + + (rc, exists) = semanage_port_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if port %s/%s is defined") % (proto, port)) ++ raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) + if exists: +- raise ValueError(_("Port %s/%s already defined") % (proto, port)) ++ raise ValueError(_("Port {proto}/{port} already defined").format(proto=proto, port=port)) + + (rc, p) = semanage_port_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create port for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not create port for {proto}/{port}").format(proto=proto, port=port)) + + semanage_port_set_proto(p, proto_d) + semanage_port_set_range(p, low, high) + (rc, con) = semanage_context_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not create context for {proto}/{port}").format(proto=proto, port=port)) + + rc = semanage_context_set_user(self.sh, con, "system_u") + if rc < 0: +- raise ValueError(_("Could not set user in port context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not set user in port context for {proto}/{port}").format(proto=proto, port=port)) + + rc = semanage_context_set_role(self.sh, con, "object_r") + if rc < 0: +- raise ValueError(_("Could not set role in port context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not set role in port context for {proto}/{port}").format(proto=proto, port=port)) + + rc = semanage_context_set_type(self.sh, con, type) + if rc < 0: +- raise ValueError(_("Could not set type in port context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not set type in port context for {proto}/{port}").format(proto=proto, port=port)) + + if (is_mls_enabled == 1) and (serange != ""): + rc = semanage_context_set_mls(self.sh, con, serange) + if rc < 0: +- raise ValueError(_("Could not set mls fields in port context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not set mls fields in port context for {proto}/{port}").format(proto=proto, port=port)) + + rc = semanage_port_set_con(self.sh, p, con) + if rc < 0: +- raise ValueError(_("Could not set port context for %s/%s") % (proto, port)) ++ raise ValueError(_("Could not set port context for {proto}/{port}").format(proto=proto, port=port)) + + rc = semanage_port_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not add port %s/%s") % (proto, port)) ++ raise ValueError(_("Could not add port {proto}/{port}").format(proto=proto, port=port)) + + semanage_context_free(con) + semanage_port_key_free(k) +@@ -1175,13 +1175,13 @@ class portRecords(semanageRecords): + + (rc, exists) = semanage_port_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if port %s/%s is defined") % (proto, port)) ++ raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) + if not exists: +- raise ValueError(_("Port %s/%s is not defined") % (proto, port)) ++ raise ValueError(_("Port {proto}/{port} is not defined").format(proto=proto, port=port)) + + (rc, p) = semanage_port_query(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not query port %s/%s") % (proto, port)) ++ raise ValueError(_("Could not query port {proto}/{port}").format(proto=proto, port=port)) + + con = semanage_port_get_con(p) + +@@ -1195,7 +1195,7 @@ class portRecords(semanageRecords): + + rc = semanage_port_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not modify port %s/%s") % (proto, port)) ++ raise ValueError(_("Could not modify port {proto}/{port}").format(proto=proto, port=port)) + + semanage_port_key_free(k) + semanage_port_free(p) +@@ -1241,19 +1241,19 @@ class portRecords(semanageRecords): + (k, proto_d, low, high) = self.__genkey(port, proto) + (rc, exists) = semanage_port_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if port %s/%s is defined") % (proto, port)) ++ raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) + if not exists: +- raise ValueError(_("Port %s/%s is not defined") % (proto, port)) ++ raise ValueError(_("Port {proto}/{port} is not defined").format(proto=proto, port=port)) + + (rc, exists) = semanage_port_exists_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if port %s/%s is defined") % (proto, port)) ++ raise ValueError(_("Could not check if port {proto}/{port} is defined").format(proto=proto, port=port)) + if not exists: +- raise ValueError(_("Port %s/%s is defined in policy, cannot be deleted") % (proto, port)) ++ raise ValueError(_("Port {proto}/{port} is defined in policy, cannot be deleted").format(proto=proto, port=port)) + + rc = semanage_port_del_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not delete port %s/%s") % (proto, port)) ++ raise ValueError(_("Could not delete port {proto}/{port}").format(proto=proto, port=port)) + + semanage_port_key_free(k) + +@@ -1362,7 +1362,7 @@ class ibpkeyRecords(semanageRecords): + + (rc, k) = semanage_ibpkey_key_create(self.sh, subnet_prefix, low, high) + if rc < 0: +- raise ValueError(_("Could not create a key for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not create a key for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + return (k, subnet_prefix, low, high) + + def __add(self, pkey, subnet_prefix, serange, type): +@@ -1384,44 +1384,44 @@ class ibpkeyRecords(semanageRecords): + + (rc, exists) = semanage_ibpkey_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibpkey %s/%s is defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").formnat(subnet_prefix=subnet_prefix, pkey=pkey)) + if exists: +- raise ValueError(_("ibpkey %s/%s already defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("ibpkey {subnet_prefix}/{pkey} already defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + (rc, p) = semanage_ibpkey_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create ibpkey for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not create ibpkey for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + semanage_ibpkey_set_subnet_prefix(self.sh, p, subnet_prefix) + semanage_ibpkey_set_range(p, low, high) + (rc, con) = semanage_context_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not create context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_context_set_user(self.sh, con, "system_u") + if rc < 0: +- raise ValueError(_("Could not set user in ibpkey context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not set user in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_context_set_role(self.sh, con, "object_r") + if rc < 0: +- raise ValueError(_("Could not set role in ibpkey context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not set role in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_context_set_type(self.sh, con, type) + if rc < 0: +- raise ValueError(_("Could not set type in ibpkey context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not set type in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + if (is_mls_enabled == 1) and (serange != ""): + rc = semanage_context_set_mls(self.sh, con, serange) + if rc < 0: +- raise ValueError(_("Could not set mls fields in ibpkey context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not set mls fields in ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_ibpkey_set_con(self.sh, p, con) + if rc < 0: +- raise ValueError(_("Could not set ibpkey context for %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not set ibpkey context for {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_ibpkey_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not add ibpkey %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not add ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + semanage_context_free(con) + semanage_ibpkey_key_free(k) +@@ -1448,13 +1448,13 @@ class ibpkeyRecords(semanageRecords): + + (rc, exists) = semanage_ibpkey_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibpkey %s/%s is defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + if not exists: +- raise ValueError(_("ibpkey %s/%s is not defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is not defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + (rc, p) = semanage_ibpkey_query(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not query ibpkey %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not query ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + con = semanage_ibpkey_get_con(p) + +@@ -1465,7 +1465,7 @@ class ibpkeyRecords(semanageRecords): + + rc = semanage_ibpkey_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not modify ibpkey %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not modify ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + semanage_ibpkey_key_free(k) + semanage_ibpkey_free(p) +@@ -1502,19 +1502,19 @@ class ibpkeyRecords(semanageRecords): + (k, subnet_prefix, low, high) = self.__genkey(pkey, subnet_prefix) + (rc, exists) = semanage_ibpkey_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibpkey %s/%s is defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + if not exists: +- raise ValueError(_("ibpkey %s/%s is not defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is not defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + (rc, exists) = semanage_ibpkey_exists_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibpkey %s/%s is defined") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not check if ibpkey {subnet_prefix}/{pkey} is defined").format(subnet_prefix=subnet_prefix, pkey=pkey)) + if not exists: +- raise ValueError(_("ibpkey %s/%s is defined in policy, cannot be deleted") % (subnet_prefix, pkey)) ++ raise ValueError(_("ibpkey {subnet_prefix}/{pkey} is defined in policy, cannot be deleted").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + rc = semanage_ibpkey_del_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not delete ibpkey %s/%s") % (subnet_prefix, pkey)) ++ raise ValueError(_("Could not delete ibpkey {subnet_prefix}/{pkey}").format(subnet_prefix=subnet_prefix, pkey=pkey)) + + semanage_ibpkey_key_free(k) + +@@ -1617,7 +1617,7 @@ class ibendportRecords(semanageRecords): + + (rc, k) = semanage_ibendport_key_create(self.sh, ibdev_name, port) + if rc < 0: +- raise ValueError(_("Could not create a key for ibendport %s/%s") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not create a key for ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) + return (k, ibdev_name, port) + + def __add(self, ibendport, ibdev_name, serange, type): +@@ -1638,44 +1638,44 @@ class ibendportRecords(semanageRecords): + + (rc, exists) = semanage_ibendport_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibendport %s/%s is defined") % (ibdev_name, port)) ++ raise ValueError(_("Could not check if ibendport {ibdev_name}/{port} is defined").format(ibdev_name=ibdev_name, port=port)) + if exists: +- raise ValueError(_("ibendport %s/%s already defined") % (ibdev_name, port)) ++ raise ValueError(_("ibendport {ibdev_name}/{port} already defined").format(ibdev_name=ibdev_name, port=port)) + + (rc, p) = semanage_ibendport_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create ibendport for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not create ibendport for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + semanage_ibendport_set_ibdev_name(self.sh, p, ibdev_name) + semanage_ibendport_set_port(p, port) + (rc, con) = semanage_context_create(self.sh) + if rc < 0: +- raise ValueError(_("Could not create context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not create context for {ibendport}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_context_set_user(self.sh, con, "system_u") + if rc < 0: +- raise ValueError(_("Could not set user in ibendport context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not set user in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_context_set_role(self.sh, con, "object_r") + if rc < 0: +- raise ValueError(_("Could not set role in ibendport context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not set role in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_context_set_type(self.sh, con, type) + if rc < 0: +- raise ValueError(_("Could not set type in ibendport context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not set type in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + if (is_mls_enabled == 1) and (serange != ""): + rc = semanage_context_set_mls(self.sh, con, serange) + if rc < 0: +- raise ValueError(_("Could not set mls fields in ibendport context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not set mls fields in ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_ibendport_set_con(self.sh, p, con) + if rc < 0: +- raise ValueError(_("Could not set ibendport context for %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not set ibendport context for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_ibendport_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not add ibendport %s/%s") % (ibdev_name, port)) ++ raise ValueError(_("Could not add ibendport {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + semanage_context_free(con) + semanage_ibendport_key_free(k) +@@ -1702,13 +1702,13 @@ class ibendportRecords(semanageRecords): + + (rc, exists) = semanage_ibendport_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibendport %s/%s is defined") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) + if not exists: +- raise ValueError(_("ibendport %s/%s is not defined") % (ibdev_name, ibendport)) ++ raise ValueError(_("ibendport {ibdev_name}/{ibendport} is not defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + (rc, p) = semanage_ibendport_query(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not query ibendport %s/%s") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not query ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + con = semanage_ibendport_get_con(p) + +@@ -1719,7 +1719,7 @@ class ibendportRecords(semanageRecords): + + rc = semanage_ibendport_modify_local(self.sh, k, p) + if rc < 0: +- raise ValueError(_("Could not modify ibendport %s/%s") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not modify ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + semanage_ibendport_key_free(k) + semanage_ibendport_free(p) +@@ -1741,11 +1741,11 @@ class ibendportRecords(semanageRecords): + port = semanage_ibendport_get_port(ibendport) + (k, ibdev_name, port) = self.__genkey(str(port), ibdev_name) + if rc < 0: +- raise ValueError(_("Could not create a key for %s/%d") % (ibdevname, port)) ++ raise ValueError(_("Could not create a key for {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + + rc = semanage_ibendport_del_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not delete the ibendport %s/%d") % (ibdev_name, port)) ++ raise ValueError(_("Could not delete the ibendport {ibdev_name}/{port}").format(ibdev_name=ibdev_name, port=port)) + semanage_ibendport_key_free(k) + + self.commit() +@@ -1754,19 +1754,19 @@ class ibendportRecords(semanageRecords): + (k, ibdev_name, port) = self.__genkey(ibendport, ibdev_name) + (rc, exists) = semanage_ibendport_exists(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibendport %s/%s is defined") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) + if not exists: +- raise ValueError(_("ibendport %s/%s is not defined") % (ibdev_name, ibendport)) ++ raise ValueError(_("ibendport {ibdev_name}/{ibendport} is not defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + (rc, exists) = semanage_ibendport_exists_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not check if ibendport %s/%s is defined") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not check if ibendport {ibdev_name}/{ibendport} is defined").format(ibdev_name=ibdev_name, ibendport=ibendport)) + if not exists: +- raise ValueError(_("ibendport %s/%s is defined in policy, cannot be deleted") % (ibdev_name, ibendport)) ++ raise ValueError(_("ibendport {ibdev_name}/{ibendport} is defined in policy, cannot be deleted").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + rc = semanage_ibendport_del_local(self.sh, k) + if rc < 0: +- raise ValueError(_("Could not delete ibendport %s/%s") % (ibdev_name, ibendport)) ++ raise ValueError(_("Could not delete ibendport {ibdev_name}/{ibendport}").format(ibdev_name=ibdev_name, ibendport=ibendport)) + + semanage_ibendport_key_free(k) + +@@ -2765,7 +2765,7 @@ class booleanRecords(semanageRecords): + try: + boolname, val = b.split("=") + except ValueError: +- raise ValueError(_("Bad format %s: Record %s" % (name, b))) ++ raise ValueError(_("Bad format {filename}: Record {record}").format(filename=name, record=b)) + self.__mod(boolname.strip(), val.strip()) + fd.close() + else: +-- +2.41.0 + diff --git a/0016-python-Drop-hard-formating-from-localized-strings.patch b/0016-python-Drop-hard-formating-from-localized-strings.patch new file mode 100644 index 0000000..612a03b --- /dev/null +++ b/0016-python-Drop-hard-formating-from-localized-strings.patch @@ -0,0 +1,148 @@ +From 9de7df951d5c54de2a58e728a2089a0837f0c72e Mon Sep 17 00:00:00 2001 +From: Petr Lautrbach +Date: Wed, 17 May 2023 12:18:54 +0200 +Subject: [PATCH] python: Drop hard formating from localized strings +Content-type: text/plain + +It confuses translators and new lines are dropped by parser module anyway. + +Signed-off-by: Petr Lautrbach +--- + python/audit2allow/audit2allow | 14 ++++++-- + python/semanage/semanage | 60 +++++++++++++--------------------- + 2 files changed, 34 insertions(+), 40 deletions(-) + +diff --git a/python/audit2allow/audit2allow b/python/audit2allow/audit2allow +index 5587a2dbb006..35b0b151ac86 100644 +--- a/python/audit2allow/audit2allow ++++ b/python/audit2allow/audit2allow +@@ -234,9 +234,17 @@ class AuditToPolicy: + print(e) + sys.exit(1) + +- sys.stdout.write(_("******************** IMPORTANT ***********************\n")) +- sys.stdout.write((_("To make this policy package active, execute:" + +- "\n\nsemodule -i %s\n\n") % packagename)) ++ sys.stdout.write( ++"""******************** {important} *********************** ++{text} ++ ++semodule -i {packagename} ++ ++""".format( ++ important=_("IMPORTANT"), ++ text=_("To make this policy package active, execute:"), ++ packagename=packagename ++)) + + def __output_audit2why(self): + import selinux +diff --git a/python/semanage/semanage b/python/semanage/semanage +index e0bd98a95c77..4fdb490f7df4 100644 +--- a/python/semanage/semanage ++++ b/python/semanage/semanage +@@ -238,30 +238,22 @@ def parser_add_level(parser, name): + + + def parser_add_range(parser, name): +- parser.add_argument('-r', '--range', default='', +- help=_(''' +-MLS/MCS Security Range (MLS/MCS Systems only) +-SELinux Range for SELinux login mapping +-defaults to the SELinux user record range. +-SELinux Range for SELinux user defaults to s0. +-''')) ++ parser.add_argument('-r', '--range', default='', help=_( ++ "MLS/MCS Security Range (MLS/MCS Systems only) SELinux Range for SELinux login mapping defaults to the SELinux user record range. \ ++SELinux Range for SELinux user defaults to s0." ++ )) + + + def parser_add_proto(parser, name): +- parser.add_argument('-p', '--proto', help=_(''' +- Protocol for the specified port (tcp|udp|dccp|sctp) or internet protocol +- version for the specified node (ipv4|ipv6). +-''')) ++ parser.add_argument('-p', '--proto', help=_( ++ "Protocol for the specified port (tcp|udp|dccp|sctp) or internet protocol version for the specified node (ipv4|ipv6)." ++ )) + + def parser_add_subnet_prefix(parser, name): +- parser.add_argument('-x', '--subnet_prefix', help=_(''' +- Subnet prefix for the specified infiniband ibpkey. +-''')) ++ parser.add_argument('-x', '--subnet_prefix', help=_('Subnet prefix for the specified infiniband ibpkey.')) + + def parser_add_ibdev_name(parser, name): +- parser.add_argument('-z', '--ibdev_name', help=_(''' +- Name for the specified infiniband end port. +-''')) ++ parser.add_argument('-z', '--ibdev_name', help=_("Name for the specified infiniband end port.")) + + def parser_add_modify(parser, name): + parser.add_argument('-m', '--modify', dest='action', action='store_const', const='modify', help=_("Modify a record of the %s object type") % name) +@@ -348,15 +340,6 @@ def handleFcontext(args): + + + def setupFcontextParser(subparsers): +- ftype_help = ''' +-File Type. This is used with fcontext. Requires a file type +-as shown in the mode field by ls, e.g. use d to match only +-directories or f to match only regular files. The following +-file type options can be passed: +-f (regular file),d (directory),c (character device), +-b (block device),s (socket),l (symbolic link),p (named pipe) +-If you do not specify a file type, the file type will default to "all files". +-''' + generate_usage = generate_custom_usage(usage_fcontext, usage_fcontext_dict) + fcontextParser = subparsers.add_parser('fcontext', usage=generate_usage, help=_("Manage file context mapping definitions")) + parser_add_locallist(fcontextParser, "fcontext") +@@ -372,11 +355,16 @@ If you do not specify a file type, the file type will default to "all files". + parser_add_extract(fcontext_action, "fcontext") + parser_add_deleteall(fcontext_action, "fcontext") + +- fcontextParser.add_argument('-e', '--equal', help=_('''Substitute target path with sourcepath when generating default +- label. This is used with fcontext. Requires source and target +- path arguments. The context labeling for the target subtree is +- made equivalent to that defined for the source.''')) +- fcontextParser.add_argument('-f', '--ftype', default="", choices=["a", "f", "d", "c", "b", "s", "l", "p"], help=_(ftype_help)) ++ fcontextParser.add_argument('-e', '--equal', help=_( ++ 'Substitute target path with sourcepath when generating default label. This is used with fcontext. Requires source and target \ ++path arguments. The context labeling for the target subtree is made equivalent to that defined for the source.' ++ )) ++ fcontextParser.add_argument('-f', '--ftype', default="", choices=["a", "f", "d", "c", "b", "s", "l", "p"], help=_( ++ 'File Type. This is used with fcontext. Requires a file type as shown in the mode field by ls, e.g. use d to match only \ ++directories or f to match only regular files. The following file type options can be passed: f (regular file), d (directory), \ ++c (character device), b (block device), s (socket), l (symbolic link), p (named pipe). \ ++If you do not specify a file type, the file type will default to "all files".' ++ )) + parser_add_seuser(fcontextParser, "fcontext") + parser_add_type(fcontextParser, "fcontext") + parser_add_range(fcontextParser, "fcontext") +@@ -426,9 +414,7 @@ def setupUserParser(subparsers): + parser_add_range(userParser, "user") + userParser.add_argument('-R', '--roles', default=[], + action=CheckRole, +- help=_(''' +-SELinux Roles. You must enclose multiple roles within quotes, separate by spaces. Or specify -R multiple times. +-''')) ++ help=_("SELinux Roles. You must enclose multiple roles within quotes, separate by spaces. Or specify -R multiple times.")) + userParser.add_argument('-P', '--prefix', default="user", help=argparse.SUPPRESS) + userParser.add_argument('selinux_name', nargs='?', default=None, help=_('selinux_name')) + userParser.set_defaults(func=handleUser) +@@ -901,9 +887,9 @@ def setupImportParser(subparsers): + def createCommandParser(): + commandParser = seParser(prog='semanage', + formatter_class=argparse.ArgumentDefaultsHelpFormatter, +- description='''semanage is used to configure certain elements +- of SELinux policy with-out requiring modification +- to or recompilation from policy source.''') ++ description=_( ++ "semanage is used to configure certain elements of SELinux policy with-out requiring modification or recompilation from policy source." ++ )) + + #To add a new subcommand define the parser for it in a function above and call it here. + subparsers = commandParser.add_subparsers(dest='subcommand') +-- +2.41.0 + diff --git a/0017-semanage-Drop-unnecessary-import-from-seobject.patch b/0017-semanage-Drop-unnecessary-import-from-seobject.patch new file mode 100644 index 0000000..03fb543 --- /dev/null +++ b/0017-semanage-Drop-unnecessary-import-from-seobject.patch @@ -0,0 +1,32 @@ +From 74b849c9405f1b751e696c7fb2e419fcbd491fab Mon Sep 17 00:00:00 2001 +From: Petr Lautrbach +Date: Wed, 17 May 2023 13:09:58 +0200 +Subject: [PATCH] semanage: Drop unnecessary import from seobject +Content-type: text/plain + +sepolgen.module is not used for permissive domains + +Signed-off-by: Petr Lautrbach +--- + python/semanage/seobject.py | 5 ----- + 1 file changed, 5 deletions(-) + +diff --git a/python/semanage/seobject.py b/python/semanage/seobject.py +index 2b1eb44ce8a3..361205d11c10 100644 +--- a/python/semanage/seobject.py ++++ b/python/semanage/seobject.py +@@ -504,11 +504,6 @@ class permissiveRecords(semanageRecords): + print(t) + + def add(self, type): +- try: +- import sepolgen.module as module +- except ImportError: +- raise ValueError(_("The sepolgen python module is required to setup permissive domains.\nIn some distributions it is included in the policycoreutils-devel package.\n# yum install policycoreutils-devel\nOr similar for your distro.")) +- + name = "permissive_%s" % type + modtxt = "(typepermissive %s)" % type + +-- +2.41.0 + diff --git a/0018-python-update-python.pot.patch b/0018-python-update-python.pot.patch new file mode 100644 index 0000000..e928a89 --- /dev/null +++ b/0018-python-update-python.pot.patch @@ -0,0 +1,2009 @@ +From 7f00d6b53f73ee501fa4c6e48f85e641841efcc1 Mon Sep 17 00:00:00 2001 +From: Petr Lautrbach +Date: Wed, 17 May 2023 13:52:22 +0200 +Subject: [PATCH] python: update python.pot +Content-type: text/plain + +Signed-off-by: Petr Lautrbach +--- + python/po/python.pot | 963 ++++++++++++++++++++++--------------------- + 1 file changed, 487 insertions(+), 476 deletions(-) + +diff --git a/python/po/python.pot b/python/po/python.pot +index 16d04eb0f18e..435a1b764e34 100644 +--- a/python/po/python.pot ++++ b/python/po/python.pot +@@ -8,7 +8,7 @@ msgid "" + msgstr "" + "Project-Id-Version: PACKAGE VERSION\n" + "Report-Msgid-Bugs-To: \n" +-"POT-Creation-Date: 2023-01-18 11:57+0100\n" ++"POT-Creation-Date: 2023-06-12 18:13+0200\n" + "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" + "Last-Translator: FULL NAME \n" + "Language-Team: LANGUAGE \n" +@@ -17,17 +17,12 @@ msgstr "" + "Content-Type: text/plain; charset=UTF-8\n" + "Content-Transfer-Encoding: 8bit\n" + +-#: ../audit2allow/audit2allow:239 +-msgid "******************** IMPORTANT ***********************\n" ++#: ../audit2allow/audit2allow:244 ++msgid "IMPORTANT" + msgstr "" + +-#: ../audit2allow/audit2allow:240 +-#, python-format +-msgid "" +-"To make this policy package active, execute:\n" +-"\n" +-"semodule -i %s\n" +-"\n" ++#: ../audit2allow/audit2allow:245 ++msgid "To make this policy package active, execute:" + msgstr "" + + #: ../chcat/chcat:111 ../chcat/chcat:191 +@@ -40,13 +35,13 @@ msgid "Can not modify sensitivity levels using '+' on %s" + msgstr "" + + #: ../chcat/chcat:128 +-#, python-format +-msgid "%s is already in %s" ++#, python-brace-format ++msgid "{target} is already in {category}" + msgstr "" + + #: ../chcat/chcat:210 ../chcat/chcat:220 +-#, python-format +-msgid "%s is not in %s" ++#, python-brace-format ++msgid "{target} is not in {category}" + msgstr "" + + #: ../chcat/chcat:291 ../chcat/chcat:296 +@@ -152,218 +147,222 @@ msgstr "" + + #: ../semanage/semanage:242 + msgid "" +-"\n" +-"MLS/MCS Security Range (MLS/MCS Systems only)\n" +-"SELinux Range for SELinux login mapping\n" +-"defaults to the SELinux user record range.\n" +-"SELinux Range for SELinux user defaults to s0.\n" ++"MLS/MCS Security Range (MLS/MCS Systems only) SELinux Range for SELinux " ++"login mapping defaults to the SELinux user record range. SELinux Range for " ++"SELinux user defaults to s0." + msgstr "" + +-#: ../semanage/semanage:251 ++#: ../semanage/semanage:249 + msgid "" +-"\n" +-" Protocol for the specified port (tcp|udp|dccp|sctp) or internet " +-"protocol\n" +-" version for the specified node (ipv4|ipv6).\n" ++"Protocol for the specified port (tcp|udp|dccp|sctp) or internet protocol " ++"version for the specified node (ipv4|ipv6)." + msgstr "" + +-#: ../semanage/semanage:257 +-msgid "" +-"\n" +-" Subnet prefix for the specified infiniband ibpkey.\n" ++#: ../semanage/semanage:253 ++msgid "Subnet prefix for the specified infiniband ibpkey." + msgstr "" + +-#: ../semanage/semanage:262 +-msgid "" +-"\n" +-" Name for the specified infiniband end port.\n" ++#: ../semanage/semanage:256 ++msgid "Name for the specified infiniband end port." + msgstr "" + +-#: ../semanage/semanage:267 ++#: ../semanage/semanage:259 + #, python-format + msgid "Modify a record of the %s object type" + msgstr "" + +-#: ../semanage/semanage:271 ++#: ../semanage/semanage:263 + #, python-format + msgid "List records of the %s object type" + msgstr "" + +-#: ../semanage/semanage:275 ++#: ../semanage/semanage:267 + #, python-format + msgid "Delete a record of the %s object type" + msgstr "" + +-#: ../semanage/semanage:279 ++#: ../semanage/semanage:271 + msgid "Extract customizable commands, for use within a transaction" + msgstr "" + +-#: ../semanage/semanage:283 ++#: ../semanage/semanage:275 + #, python-format + msgid "Remove all %s objects local customizations" + msgstr "" + +-#: ../semanage/semanage:287 ++#: ../semanage/semanage:279 + msgid "SELinux user name" + msgstr "" + +-#: ../semanage/semanage:292 ++#: ../semanage/semanage:284 + msgid "Manage login mappings between linux users and SELinux confined users" + msgstr "" + +-#: ../semanage/semanage:309 ++#: ../semanage/semanage:301 + #, python-format + msgid "login_name | %%groupname" + msgstr "" + +-#: ../semanage/semanage:361 ++#: ../semanage/semanage:344 + msgid "Manage file context mapping definitions" + msgstr "" + +-#: ../semanage/semanage:375 ++#: ../semanage/semanage:359 ++msgid "" ++"Substitute target path with sourcepath when generating default label. This " ++"is used with fcontext. Requires source and target path arguments. The " ++"context labeling for the target subtree is made equivalent to that defined " ++"for the source." ++msgstr "" ++ ++#: ../semanage/semanage:363 + msgid "" +-"Substitute target path with sourcepath when generating default\n" +-" label. " +-"This is used with fcontext. Requires source and target\n" +-" path " +-"arguments. The context labeling for the target subtree is\n" +-" made " +-"equivalent to that defined for the source." ++"File Type. This is used with fcontext. Requires a file type as shown in the " ++"mode field by ls, e.g. use d to match only directories or f to match only " ++"regular files. The following file type options can be passed: f (regular " ++"file), d (directory), c (character device), b (block device), s (socket), l " ++"(symbolic link), p (named pipe). If you do not specify a file type, the file " ++"type will default to \"all files\"." + msgstr "" + +-#: ../semanage/semanage:383 ++#: ../semanage/semanage:371 + msgid "" + "Path to be labeled (may be in the form of a Perl compatible regular " + "expression)" + msgstr "" + +-#: ../semanage/semanage:411 ++#: ../semanage/semanage:399 + msgid "Manage SELinux confined users (Roles and levels for an SELinux user)" + msgstr "" + +-#: ../semanage/semanage:429 ++#: ../semanage/semanage:417 + msgid "" +-"\n" +-"SELinux Roles. You must enclose multiple roles within quotes, separate by " +-"spaces. Or specify -R multiple times.\n" ++"SELinux Roles. You must enclose multiple roles within quotes, separate by " ++"spaces. Or specify -R multiple times." + msgstr "" + +-#: ../semanage/semanage:433 ++#: ../semanage/semanage:419 + msgid "selinux_name" + msgstr "" + +-#: ../semanage/semanage:461 ++#: ../semanage/semanage:447 + msgid "Manage network port type definitions" + msgstr "" + +-#: ../semanage/semanage:477 ++#: ../semanage/semanage:463 + msgid "port | port_range" + msgstr "" + +-#: ../semanage/semanage:506 ++#: ../semanage/semanage:492 + msgid "Manage infiniband ibpkey type definitions" + msgstr "" + +-#: ../semanage/semanage:522 ++#: ../semanage/semanage:508 + msgid "pkey | pkey_range" + msgstr "" + +-#: ../semanage/semanage:549 ++#: ../semanage/semanage:535 + msgid "Manage infiniband end port type definitions" + msgstr "" + +-#: ../semanage/semanage:565 ++#: ../semanage/semanage:551 + msgid "ibendport" + msgstr "" + +-#: ../semanage/semanage:592 ++#: ../semanage/semanage:578 + msgid "Manage network interface type definitions" + msgstr "" + +-#: ../semanage/semanage:607 ++#: ../semanage/semanage:593 + msgid "interface_spec" + msgstr "" + +-#: ../semanage/semanage:631 ++#: ../semanage/semanage:617 + msgid "Manage SELinux policy modules" + msgstr "" + +-#: ../semanage/semanage:642 ++#: ../semanage/semanage:628 + msgid "Add a module" + msgstr "" + +-#: ../semanage/semanage:643 ++#: ../semanage/semanage:629 + msgid "Remove a module" + msgstr "" + +-#: ../semanage/semanage:644 ++#: ../semanage/semanage:630 + msgid "Disable a module" + msgstr "" + +-#: ../semanage/semanage:645 ++#: ../semanage/semanage:631 + msgid "Enable a module" + msgstr "" + +-#: ../semanage/semanage:672 ++#: ../semanage/semanage:658 + msgid "Manage network node type definitions" + msgstr "" + +-#: ../semanage/semanage:686 ++#: ../semanage/semanage:672 + msgid "Network Mask" + msgstr "" + +-#: ../semanage/semanage:690 ++#: ../semanage/semanage:676 + msgid "node" + msgstr "" + +-#: ../semanage/semanage:715 ++#: ../semanage/semanage:701 + msgid "Manage booleans to selectively enable functionality" + msgstr "" + +-#: ../semanage/semanage:720 ++#: ../semanage/semanage:706 + msgid "boolean" + msgstr "" + +-#: ../semanage/semanage:730 ++#: ../semanage/semanage:716 + msgid "Enable the boolean" + msgstr "" + +-#: ../semanage/semanage:731 ++#: ../semanage/semanage:717 + msgid "Disable the boolean" + msgstr "" + +-#: ../semanage/semanage:752 ++#: ../semanage/semanage:738 + msgid "semanage permissive: error: the following argument is required: type\n" + msgstr "" + +-#: ../semanage/semanage:756 ++#: ../semanage/semanage:742 + msgid "Manage process type enforcement mode" + msgstr "" + +-#: ../semanage/semanage:768 ../semanage/seobject.py:2677 ++#: ../semanage/semanage:754 ../semanage/seobject.py:2672 + msgid "type" + msgstr "" + +-#: ../semanage/semanage:779 ++#: ../semanage/semanage:765 + msgid "Disable/Enable dontaudit rules in policy" + msgstr "" + +-#: ../semanage/semanage:799 ++#: ../semanage/semanage:785 + msgid "Output local customizations" + msgstr "" + +-#: ../semanage/semanage:801 ++#: ../semanage/semanage:787 + msgid "Output file" + msgstr "" + +-#: ../semanage/semanage:894 ++#: ../semanage/semanage:880 + msgid "Import local customizations" + msgstr "" + +-#: ../semanage/semanage:897 ++#: ../semanage/semanage:883 + msgid "Input file" + msgstr "" + ++#: ../semanage/semanage:891 ++msgid "" ++"semanage is used to configure certain elements of SELinux policy with-out " ++"requiring modification or recompilation from policy source." ++msgstr "" ++ + #: ../semanage/seobject.py:279 + msgid "Could not create semanage handle" + msgstr "" +@@ -485,123 +484,115 @@ msgstr "" + msgid "Customized Permissive Types" + msgstr "" + +-#: ../semanage/seobject.py:510 +-msgid "" +-"The sepolgen python module is required to setup permissive domains.\n" +-"In some distributions it is included in the policycoreutils-devel package.\n" +-"# yum install policycoreutils-devel\n" +-"Or similar for your distro." +-msgstr "" +- +-#: ../semanage/seobject.py:520 ++#: ../semanage/seobject.py:515 + #, python-format + msgid "Could not set permissive domain %s (module installation failed)" + msgstr "" + +-#: ../semanage/seobject.py:526 ++#: ../semanage/seobject.py:521 + #, python-format + msgid "Could not remove permissive domain %s (remove failed)" + msgstr "" + +-#: ../semanage/seobject.py:563 ../semanage/seobject.py:633 +-#: ../semanage/seobject.py:678 ../semanage/seobject.py:797 +-#: ../semanage/seobject.py:827 ../semanage/seobject.py:892 +-#: ../semanage/seobject.py:948 ../semanage/seobject.py:1226 +-#: ../semanage/seobject.py:1492 ../semanage/seobject.py:2502 +-#: ../semanage/seobject.py:2575 ../semanage/seobject.py:2599 +-#: ../semanage/seobject.py:2730 ../semanage/seobject.py:2781 ++#: ../semanage/seobject.py:558 ../semanage/seobject.py:628 ++#: ../semanage/seobject.py:673 ../semanage/seobject.py:792 ++#: ../semanage/seobject.py:822 ../semanage/seobject.py:887 ++#: ../semanage/seobject.py:943 ../semanage/seobject.py:1221 ++#: ../semanage/seobject.py:1487 ../semanage/seobject.py:2497 ++#: ../semanage/seobject.py:2570 ../semanage/seobject.py:2594 ++#: ../semanage/seobject.py:2725 ../semanage/seobject.py:2776 + #, python-format + msgid "Could not create a key for %s" + msgstr "" + +-#: ../semanage/seobject.py:567 ../semanage/seobject.py:637 +-#: ../semanage/seobject.py:682 ../semanage/seobject.py:688 ++#: ../semanage/seobject.py:562 ../semanage/seobject.py:632 ++#: ../semanage/seobject.py:677 ../semanage/seobject.py:683 + #, python-format + msgid "Could not check if login mapping for %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:569 ++#: ../semanage/seobject.py:564 + #, python-format + msgid "Login mapping for %s is already defined" + msgstr "" + +-#: ../semanage/seobject.py:574 ++#: ../semanage/seobject.py:569 + #, python-format + msgid "Linux Group %s does not exist" + msgstr "" + +-#: ../semanage/seobject.py:579 ++#: ../semanage/seobject.py:574 + #, python-format + msgid "Linux User %s does not exist" + msgstr "" + +-#: ../semanage/seobject.py:583 ++#: ../semanage/seobject.py:578 + #, python-format + msgid "Could not create login mapping for %s" + msgstr "" + +-#: ../semanage/seobject.py:587 ../semanage/seobject.py:841 ++#: ../semanage/seobject.py:582 ../semanage/seobject.py:836 + #, python-format + msgid "Could not set name for %s" + msgstr "" + +-#: ../semanage/seobject.py:592 ../semanage/seobject.py:851 ++#: ../semanage/seobject.py:587 ../semanage/seobject.py:846 + #, python-format + msgid "Could not set MLS range for %s" + msgstr "" + +-#: ../semanage/seobject.py:596 ++#: ../semanage/seobject.py:591 + #, python-format + msgid "Could not set SELinux user for %s" + msgstr "" + +-#: ../semanage/seobject.py:600 ++#: ../semanage/seobject.py:595 + #, python-format + msgid "Could not add login mapping for %s" + msgstr "" + +-#: ../semanage/seobject.py:616 ++#: ../semanage/seobject.py:611 + msgid "Requires seuser or serange" + msgstr "" + +-#: ../semanage/seobject.py:639 ../semanage/seobject.py:684 ++#: ../semanage/seobject.py:634 ../semanage/seobject.py:679 + #, python-format + msgid "Login mapping for %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:643 ++#: ../semanage/seobject.py:638 + #, python-format + msgid "Could not query seuser for %s" + msgstr "" + +-#: ../semanage/seobject.py:658 ++#: ../semanage/seobject.py:653 + #, python-format + msgid "Could not modify login mapping for %s" + msgstr "" + +-#: ../semanage/seobject.py:690 ++#: ../semanage/seobject.py:685 + #, python-format + msgid "Login mapping for %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:694 ++#: ../semanage/seobject.py:689 + #, python-format + msgid "Could not delete login mapping for %s" + msgstr "" + +-#: ../semanage/seobject.py:713 ../semanage/seobject.py:745 +-#: ../semanage/seobject.py:991 ++#: ../semanage/seobject.py:708 ../semanage/seobject.py:740 ++#: ../semanage/seobject.py:986 + msgid "Could not list login mappings" + msgstr "" + +-#: ../semanage/seobject.py:772 ../semanage/seobject.py:784 ++#: ../semanage/seobject.py:767 ../semanage/seobject.py:779 + #: ../sepolicy/sepolicy/sepolicy.glade:1156 + #: ../sepolicy/sepolicy/sepolicy.glade:3138 + msgid "Login Name" + msgstr "" + +-#: ../semanage/seobject.py:772 ../semanage/seobject.py:784 +-#: ../semanage/seobject.py:1041 ../semanage/seobject.py:1046 ++#: ../semanage/seobject.py:767 ../semanage/seobject.py:779 ++#: ../semanage/seobject.py:1036 ../semanage/seobject.py:1041 + #: ../sepolicy/sepolicy/sepolicy.glade:1182 + #: ../sepolicy/sepolicy/sepolicy.glade:3156 + #: ../sepolicy/sepolicy/sepolicy.glade:3242 +@@ -609,938 +600,958 @@ msgstr "" + msgid "SELinux User" + msgstr "" + +-#: ../semanage/seobject.py:772 ++#: ../semanage/seobject.py:767 + msgid "MLS/MCS Range" + msgstr "" + +-#: ../semanage/seobject.py:772 ++#: ../semanage/seobject.py:767 + msgid "Service" + msgstr "" + +-#: ../semanage/seobject.py:800 ../semanage/seobject.py:831 +-#: ../semanage/seobject.py:896 ../semanage/seobject.py:952 +-#: ../semanage/seobject.py:958 ++#: ../semanage/seobject.py:795 ../semanage/seobject.py:826 ++#: ../semanage/seobject.py:891 ../semanage/seobject.py:947 ++#: ../semanage/seobject.py:953 + #, python-format + msgid "Could not check if SELinux user %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:803 ../semanage/seobject.py:902 +-#: ../semanage/seobject.py:964 ++#: ../semanage/seobject.py:798 ../semanage/seobject.py:897 ++#: ../semanage/seobject.py:959 + #, python-format + msgid "Could not query user for %s" + msgstr "" + +-#: ../semanage/seobject.py:823 ++#: ../semanage/seobject.py:818 + #, python-format + msgid "You must add at least one role for %s" + msgstr "" + +-#: ../semanage/seobject.py:833 ++#: ../semanage/seobject.py:828 + #, python-format + msgid "SELinux user %s is already defined" + msgstr "" + +-#: ../semanage/seobject.py:837 ++#: ../semanage/seobject.py:832 + #, python-format + msgid "Could not create SELinux user for %s" + msgstr "" + +-#: ../semanage/seobject.py:846 +-#, python-format +-msgid "Could not add role %s for %s" ++#: ../semanage/seobject.py:841 ++#, python-brace-format ++msgid "Could not add role {role} for {name}" + msgstr "" + +-#: ../semanage/seobject.py:855 ++#: ../semanage/seobject.py:850 + #, python-format + msgid "Could not set MLS level for %s" + msgstr "" + +-#: ../semanage/seobject.py:858 +-#, python-format +-msgid "Could not add prefix %s for %s" ++#: ../semanage/seobject.py:853 ++#, python-brace-format ++msgid "Could not add prefix {prefix} for {role}" + msgstr "" + +-#: ../semanage/seobject.py:861 ++#: ../semanage/seobject.py:856 + #, python-format + msgid "Could not extract key for %s" + msgstr "" + +-#: ../semanage/seobject.py:865 ++#: ../semanage/seobject.py:860 + #, python-format + msgid "Could not add SELinux user %s" + msgstr "" + +-#: ../semanage/seobject.py:886 ++#: ../semanage/seobject.py:881 + msgid "Requires prefix, roles, level or range" + msgstr "" + +-#: ../semanage/seobject.py:888 ++#: ../semanage/seobject.py:883 + msgid "Requires prefix or roles" + msgstr "" + +-#: ../semanage/seobject.py:898 ../semanage/seobject.py:954 ++#: ../semanage/seobject.py:893 ../semanage/seobject.py:949 + #, python-format + msgid "SELinux user %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:927 ++#: ../semanage/seobject.py:922 + #, python-format + msgid "Could not modify SELinux user %s" + msgstr "" + +-#: ../semanage/seobject.py:960 ++#: ../semanage/seobject.py:955 + #, python-format + msgid "SELinux user %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:971 ++#: ../semanage/seobject.py:966 + #, python-format + msgid "Could not delete SELinux user %s" + msgstr "" + +-#: ../semanage/seobject.py:1009 ++#: ../semanage/seobject.py:1004 + msgid "Could not list SELinux users" + msgstr "" + +-#: ../semanage/seobject.py:1015 ++#: ../semanage/seobject.py:1010 + #, python-format + msgid "Could not list roles for user %s" + msgstr "" + +-#: ../semanage/seobject.py:1040 ++#: ../semanage/seobject.py:1035 + msgid "Labeling" + msgstr "" + +-#: ../semanage/seobject.py:1040 ++#: ../semanage/seobject.py:1035 + msgid "MLS/" + msgstr "" + +-#: ../semanage/seobject.py:1041 ++#: ../semanage/seobject.py:1036 + msgid "Prefix" + msgstr "" + +-#: ../semanage/seobject.py:1041 ++#: ../semanage/seobject.py:1036 + msgid "MCS Level" + msgstr "" + +-#: ../semanage/seobject.py:1041 ++#: ../semanage/seobject.py:1036 + msgid "MCS Range" + msgstr "" + +-#: ../semanage/seobject.py:1041 ../semanage/seobject.py:1046 ++#: ../semanage/seobject.py:1036 ../semanage/seobject.py:1041 + #: ../sepolicy/sepolicy/sepolicy.glade:3262 + #: ../sepolicy/sepolicy/sepolicy.glade:5233 + #: ../sepolicy/sepolicy/sepolicy.glade:5382 + msgid "SELinux Roles" + msgstr "" + +-#: ../semanage/seobject.py:1071 ++#: ../semanage/seobject.py:1066 + msgid "Protocol has to be one of udp, tcp, dccp or sctp" + msgstr "" + +-#: ../semanage/seobject.py:1073 ++#: ../semanage/seobject.py:1068 + msgid "Port is required" + msgstr "" + +-#: ../semanage/seobject.py:1087 ++#: ../semanage/seobject.py:1082 + msgid "Invalid Port" + msgstr "" + +-#: ../semanage/seobject.py:1091 ../semanage/seobject.py:1365 +-#, python-format +-msgid "Could not create a key for %s/%s" ++#: ../semanage/seobject.py:1086 ++#, python-brace-format ++msgid "Could not create a key for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1102 ../semanage/seobject.py:1376 +-#: ../semanage/seobject.py:1631 ++#: ../semanage/seobject.py:1097 ../semanage/seobject.py:1371 ++#: ../semanage/seobject.py:1626 + msgid "Type is required" + msgstr "" + +-#: ../semanage/seobject.py:1107 ../semanage/seobject.py:1172 ++#: ../semanage/seobject.py:1102 ../semanage/seobject.py:1167 + #, python-format + msgid "Type %s is invalid, must be a port type" + msgstr "" + +-#: ../semanage/seobject.py:1113 ../semanage/seobject.py:1178 +-#: ../semanage/seobject.py:1244 ../semanage/seobject.py:1250 +-#, python-format +-msgid "Could not check if port %s/%s is defined" ++#: ../semanage/seobject.py:1108 ../semanage/seobject.py:1173 ++#: ../semanage/seobject.py:1239 ../semanage/seobject.py:1245 ++#, python-brace-format ++msgid "Could not check if port {proto}/{port} is defined" + msgstr "" + +-#: ../semanage/seobject.py:1115 +-#, python-format +-msgid "Port %s/%s already defined" ++#: ../semanage/seobject.py:1110 ++#, python-brace-format ++msgid "Port {proto}/{port} already defined" + msgstr "" + +-#: ../semanage/seobject.py:1119 +-#, python-format +-msgid "Could not create port for %s/%s" ++#: ../semanage/seobject.py:1114 ++#, python-brace-format ++msgid "Could not create port for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1125 ../semanage/seobject.py:1399 +-#: ../semanage/seobject.py:1653 +-#, python-format +-msgid "Could not create context for %s/%s" ++#: ../semanage/seobject.py:1120 ++#, python-brace-format ++msgid "Could not create context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1129 +-#, python-format +-msgid "Could not set user in port context for %s/%s" ++#: ../semanage/seobject.py:1124 ++#, python-brace-format ++msgid "Could not set user in port context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1133 +-#, python-format +-msgid "Could not set role in port context for %s/%s" ++#: ../semanage/seobject.py:1128 ++#, python-brace-format ++msgid "Could not set role in port context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1137 +-#, python-format +-msgid "Could not set type in port context for %s/%s" ++#: ../semanage/seobject.py:1132 ++#, python-brace-format ++msgid "Could not set type in port context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1142 +-#, python-format +-msgid "Could not set mls fields in port context for %s/%s" ++#: ../semanage/seobject.py:1137 ++#, python-brace-format ++msgid "Could not set mls fields in port context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1146 +-#, python-format +-msgid "Could not set port context for %s/%s" ++#: ../semanage/seobject.py:1141 ++#, python-brace-format ++msgid "Could not set port context for {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1150 +-#, python-format +-msgid "Could not add port %s/%s" ++#: ../semanage/seobject.py:1145 ++#, python-brace-format ++msgid "Could not add port {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1166 ../semanage/seobject.py:1438 +-#: ../semanage/seobject.py:1692 ../semanage/seobject.py:1970 +-#: ../semanage/seobject.py:2176 ++#: ../semanage/seobject.py:1161 ../semanage/seobject.py:1433 ++#: ../semanage/seobject.py:1687 ../semanage/seobject.py:1965 ++#: ../semanage/seobject.py:2171 + msgid "Requires setype or serange" + msgstr "" + +-#: ../semanage/seobject.py:1168 ../semanage/seobject.py:1440 +-#: ../semanage/seobject.py:1694 ++#: ../semanage/seobject.py:1163 ../semanage/seobject.py:1435 ++#: ../semanage/seobject.py:1689 + msgid "Requires setype" + msgstr "" + +-#: ../semanage/seobject.py:1180 ../semanage/seobject.py:1246 +-#, python-format +-msgid "Port %s/%s is not defined" ++#: ../semanage/seobject.py:1175 ../semanage/seobject.py:1241 ++#, python-brace-format ++msgid "Port {proto}/{port} is not defined" + msgstr "" + +-#: ../semanage/seobject.py:1184 +-#, python-format +-msgid "Could not query port %s/%s" ++#: ../semanage/seobject.py:1179 ++#, python-brace-format ++msgid "Could not query port {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1198 +-#, python-format +-msgid "Could not modify port %s/%s" ++#: ../semanage/seobject.py:1193 ++#, python-brace-format ++msgid "Could not modify port {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1213 ++#: ../semanage/seobject.py:1208 + msgid "Could not list the ports" + msgstr "" + +-#: ../semanage/seobject.py:1230 ++#: ../semanage/seobject.py:1225 + #, python-format + msgid "Could not delete the port %s" + msgstr "" + +-#: ../semanage/seobject.py:1252 +-#, python-format +-msgid "Port %s/%s is defined in policy, cannot be deleted" ++#: ../semanage/seobject.py:1247 ++#, python-brace-format ++msgid "Port {proto}/{port} is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:1256 +-#, python-format +-msgid "Could not delete port %s/%s" ++#: ../semanage/seobject.py:1251 ++#, python-brace-format ++msgid "Could not delete port {proto}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1274 ../semanage/seobject.py:1294 ++#: ../semanage/seobject.py:1269 ../semanage/seobject.py:1289 + msgid "Could not list ports" + msgstr "" + +-#: ../semanage/seobject.py:1329 ../sepolicy/sepolicy/sepolicy.glade:2668 ++#: ../semanage/seobject.py:1324 ../sepolicy/sepolicy/sepolicy.glade:2668 + #: ../sepolicy/sepolicy/sepolicy.glade:2766 + #: ../sepolicy/sepolicy/sepolicy.glade:4630 + msgid "SELinux Port Type" + msgstr "" + +-#: ../semanage/seobject.py:1329 ++#: ../semanage/seobject.py:1324 + msgid "Proto" + msgstr "" + +-#: ../semanage/seobject.py:1329 ../semanage/seobject.py:1835 ++#: ../semanage/seobject.py:1324 ../semanage/seobject.py:1830 + #: ../sepolicy/sepolicy/sepolicy.glade:1407 + msgid "Port Number" + msgstr "" + +-#: ../semanage/seobject.py:1351 ++#: ../semanage/seobject.py:1346 + msgid "Subnet Prefix is required" + msgstr "" + +-#: ../semanage/seobject.py:1361 ++#: ../semanage/seobject.py:1356 + msgid "Invalid Pkey" + msgstr "" + +-#: ../semanage/seobject.py:1381 ../semanage/seobject.py:1445 ++#: ../semanage/seobject.py:1360 ++#, python-brace-format ++msgid "Could not create a key for {subnet_prefix}/{pkey}" ++msgstr "" ++ ++#: ../semanage/seobject.py:1376 ../semanage/seobject.py:1440 + #, python-format + msgid "Type %s is invalid, must be a ibpkey type" + msgstr "" + +-#: ../semanage/seobject.py:1387 ../semanage/seobject.py:1451 +-#: ../semanage/seobject.py:1505 ../semanage/seobject.py:1511 +-#, python-format +-msgid "Could not check if ibpkey %s/%s is defined" ++#: ../semanage/seobject.py:1382 ../semanage/seobject.py:1446 ++#: ../semanage/seobject.py:1500 ../semanage/seobject.py:1506 ++#, python-brace-format ++msgid "Could not check if ibpkey {subnet_prefix}/{pkey} is defined" + msgstr "" + +-#: ../semanage/seobject.py:1389 +-#, python-format +-msgid "ibpkey %s/%s already defined" ++#: ../semanage/seobject.py:1384 ++#, python-brace-format ++msgid "ibpkey {subnet_prefix}/{pkey} already defined" + msgstr "" + +-#: ../semanage/seobject.py:1393 +-#, python-format +-msgid "Could not create ibpkey for %s/%s" ++#: ../semanage/seobject.py:1388 ++#, python-brace-format ++msgid "Could not create ibpkey for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1403 +-#, python-format +-msgid "Could not set user in ibpkey context for %s/%s" ++#: ../semanage/seobject.py:1394 ++#, python-brace-format ++msgid "Could not create context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1407 +-#, python-format +-msgid "Could not set role in ibpkey context for %s/%s" ++#: ../semanage/seobject.py:1398 ++#, python-brace-format ++msgid "Could not set user in ibpkey context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1411 +-#, python-format +-msgid "Could not set type in ibpkey context for %s/%s" ++#: ../semanage/seobject.py:1402 ++#, python-brace-format ++msgid "Could not set role in ibpkey context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1416 +-#, python-format +-msgid "Could not set mls fields in ibpkey context for %s/%s" ++#: ../semanage/seobject.py:1406 ++#, python-brace-format ++msgid "Could not set type in ibpkey context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1420 +-#, python-format +-msgid "Could not set ibpkey context for %s/%s" ++#: ../semanage/seobject.py:1411 ++#, python-brace-format ++msgid "Could not set mls fields in ibpkey context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1424 +-#, python-format +-msgid "Could not add ibpkey %s/%s" ++#: ../semanage/seobject.py:1415 ++#, python-brace-format ++msgid "Could not set ibpkey context for {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1453 ../semanage/seobject.py:1507 +-#, python-format +-msgid "ibpkey %s/%s is not defined" ++#: ../semanage/seobject.py:1419 ++#, python-brace-format ++msgid "Could not add ibpkey {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1457 +-#, python-format +-msgid "Could not query ibpkey %s/%s" ++#: ../semanage/seobject.py:1448 ../semanage/seobject.py:1502 ++#, python-brace-format ++msgid "ibpkey {subnet_prefix}/{pkey} is not defined" + msgstr "" + +-#: ../semanage/seobject.py:1468 +-#, python-format +-msgid "Could not modify ibpkey %s/%s" ++#: ../semanage/seobject.py:1452 ++#, python-brace-format ++msgid "Could not query ibpkey {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1481 ++#: ../semanage/seobject.py:1463 ++#, python-brace-format ++msgid "Could not modify ibpkey {subnet_prefix}/{pkey}" ++msgstr "" ++ ++#: ../semanage/seobject.py:1476 + msgid "Could not list the ibpkeys" + msgstr "" + +-#: ../semanage/seobject.py:1496 ++#: ../semanage/seobject.py:1491 + #, python-format + msgid "Could not delete the ibpkey %s" + msgstr "" + +-#: ../semanage/seobject.py:1513 +-#, python-format +-msgid "ibpkey %s/%s is defined in policy, cannot be deleted" ++#: ../semanage/seobject.py:1508 ++#, python-brace-format ++msgid "ibpkey {subnet_prefix}/{pkey} is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:1517 +-#, python-format +-msgid "Could not delete ibpkey %s/%s" ++#: ../semanage/seobject.py:1512 ++#, python-brace-format ++msgid "Could not delete ibpkey {subnet_prefix}/{pkey}" + msgstr "" + +-#: ../semanage/seobject.py:1533 ../semanage/seobject.py:1554 ++#: ../semanage/seobject.py:1528 ../semanage/seobject.py:1549 + msgid "Could not list ibpkeys" + msgstr "" + +-#: ../semanage/seobject.py:1589 ++#: ../semanage/seobject.py:1584 + msgid "SELinux IB Pkey Type" + msgstr "" + +-#: ../semanage/seobject.py:1589 ++#: ../semanage/seobject.py:1584 + msgid "Subnet_Prefix" + msgstr "" + +-#: ../semanage/seobject.py:1589 ++#: ../semanage/seobject.py:1584 + msgid "Pkey Number" + msgstr "" + +-#: ../semanage/seobject.py:1611 ++#: ../semanage/seobject.py:1606 + msgid "IB device name is required" + msgstr "" + +-#: ../semanage/seobject.py:1616 ++#: ../semanage/seobject.py:1611 + msgid "Invalid Port Number" + msgstr "" + +-#: ../semanage/seobject.py:1620 +-#, python-format +-msgid "Could not create a key for ibendport %s/%s" ++#: ../semanage/seobject.py:1615 ++#, python-brace-format ++msgid "Could not create a key for ibendport {ibdev_name}/{ibendport}" + msgstr "" + +-#: ../semanage/seobject.py:1636 ../semanage/seobject.py:1699 ++#: ../semanage/seobject.py:1631 ../semanage/seobject.py:1694 + #, python-format + msgid "Type %s is invalid, must be an ibendport type" + msgstr "" + +-#: ../semanage/seobject.py:1641 ../semanage/seobject.py:1705 +-#: ../semanage/seobject.py:1757 ../semanage/seobject.py:1763 +-#, python-format +-msgid "Could not check if ibendport %s/%s is defined" ++#: ../semanage/seobject.py:1636 ++#, python-brace-format ++msgid "Could not check if ibendport {ibdev_name}/{port} is defined" + msgstr "" + +-#: ../semanage/seobject.py:1643 +-#, python-format +-msgid "ibendport %s/%s already defined" ++#: ../semanage/seobject.py:1638 ++#, python-brace-format ++msgid "ibendport {ibdev_name}/{port} already defined" + msgstr "" + +-#: ../semanage/seobject.py:1647 +-#, python-format +-msgid "Could not create ibendport for %s/%s" ++#: ../semanage/seobject.py:1642 ++#, python-brace-format ++msgid "Could not create ibendport for {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1657 +-#, python-format +-msgid "Could not set user in ibendport context for %s/%s" ++#: ../semanage/seobject.py:1648 ++#, python-brace-format ++msgid "Could not create context for {ibendport}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1661 +-#, python-format +-msgid "Could not set role in ibendport context for %s/%s" ++#: ../semanage/seobject.py:1652 ++#, python-brace-format ++msgid "Could not set user in ibendport context for {ibdev_name}/{port}" ++msgstr "" ++ ++#: ../semanage/seobject.py:1656 ++#, python-brace-format ++msgid "Could not set role in ibendport context for {ibdev_name}/{port}" ++msgstr "" ++ ++#: ../semanage/seobject.py:1660 ++#, python-brace-format ++msgid "Could not set type in ibendport context for {ibdev_name}/{port}" + msgstr "" + + #: ../semanage/seobject.py:1665 +-#, python-format +-msgid "Could not set type in ibendport context for %s/%s" ++#, python-brace-format ++msgid "Could not set mls fields in ibendport context for {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1670 +-#, python-format +-msgid "Could not set mls fields in ibendport context for %s/%s" ++#: ../semanage/seobject.py:1669 ++#, python-brace-format ++msgid "Could not set ibendport context for {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1674 +-#, python-format +-msgid "Could not set ibendport context for %s/%s" ++#: ../semanage/seobject.py:1673 ++#, python-brace-format ++msgid "Could not add ibendport {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1678 +-#, python-format +-msgid "Could not add ibendport %s/%s" ++#: ../semanage/seobject.py:1700 ../semanage/seobject.py:1752 ++#: ../semanage/seobject.py:1758 ++#, python-brace-format ++msgid "Could not check if ibendport {ibdev_name}/{ibendport} is defined" + msgstr "" + +-#: ../semanage/seobject.py:1707 ../semanage/seobject.py:1759 +-#, python-format +-msgid "ibendport %s/%s is not defined" ++#: ../semanage/seobject.py:1702 ../semanage/seobject.py:1754 ++#, python-brace-format ++msgid "ibendport {ibdev_name}/{ibendport} is not defined" + msgstr "" + +-#: ../semanage/seobject.py:1711 +-#, python-format +-msgid "Could not query ibendport %s/%s" ++#: ../semanage/seobject.py:1706 ++#, python-brace-format ++msgid "Could not query ibendport {ibdev_name}/{ibendport}" + msgstr "" + +-#: ../semanage/seobject.py:1722 +-#, python-format +-msgid "Could not modify ibendport %s/%s" ++#: ../semanage/seobject.py:1717 ++#, python-brace-format ++msgid "Could not modify ibendport {ibdev_name}/{ibendport}" + msgstr "" + +-#: ../semanage/seobject.py:1735 ++#: ../semanage/seobject.py:1730 + msgid "Could not list the ibendports" + msgstr "" + +-#: ../semanage/seobject.py:1744 +-#, python-format +-msgid "Could not create a key for %s/%d" ++#: ../semanage/seobject.py:1739 ++#, python-brace-format ++msgid "Could not create a key for {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1748 +-#, python-format +-msgid "Could not delete the ibendport %s/%d" ++#: ../semanage/seobject.py:1743 ++#, python-brace-format ++msgid "Could not delete the ibendport {ibdev_name}/{port}" + msgstr "" + +-#: ../semanage/seobject.py:1765 +-#, python-format +-msgid "ibendport %s/%s is defined in policy, cannot be deleted" ++#: ../semanage/seobject.py:1760 ++#, python-brace-format ++msgid "" ++"ibendport {ibdev_name}/{ibendport} is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:1769 +-#, python-format +-msgid "Could not delete ibendport %s/%s" ++#: ../semanage/seobject.py:1764 ++#, python-brace-format ++msgid "Could not delete ibendport {ibdev_name}/{ibendport}" + msgstr "" + +-#: ../semanage/seobject.py:1785 ../semanage/seobject.py:1805 ++#: ../semanage/seobject.py:1780 ../semanage/seobject.py:1800 + msgid "Could not list ibendports" + msgstr "" + +-#: ../semanage/seobject.py:1835 ++#: ../semanage/seobject.py:1830 + msgid "SELinux IB End Port Type" + msgstr "" + +-#: ../semanage/seobject.py:1835 ++#: ../semanage/seobject.py:1830 + msgid "IB Device Name" + msgstr "" + +-#: ../semanage/seobject.py:1861 ++#: ../semanage/seobject.py:1856 + msgid "Node Address is required" + msgstr "" + +-#: ../semanage/seobject.py:1873 ../semanage/seobject.py:1885 ++#: ../semanage/seobject.py:1868 ../semanage/seobject.py:1880 + msgid "Unknown or missing protocol" + msgstr "" + +-#: ../semanage/seobject.py:1899 ++#: ../semanage/seobject.py:1894 + msgid "SELinux node type is required" + msgstr "" + +-#: ../semanage/seobject.py:1904 ../semanage/seobject.py:1975 ++#: ../semanage/seobject.py:1899 ../semanage/seobject.py:1970 + #, python-format + msgid "Type %s is invalid, must be a node type" + msgstr "" + +-#: ../semanage/seobject.py:1908 ../semanage/seobject.py:1979 +-#: ../semanage/seobject.py:2016 ../semanage/seobject.py:2117 +-#: ../semanage/seobject.py:2180 ../semanage/seobject.py:2216 +-#: ../semanage/seobject.py:2435 ++#: ../semanage/seobject.py:1903 ../semanage/seobject.py:1974 ++#: ../semanage/seobject.py:2011 ../semanage/seobject.py:2112 ++#: ../semanage/seobject.py:2175 ../semanage/seobject.py:2211 ++#: ../semanage/seobject.py:2430 + #, python-format + msgid "Could not create key for %s" + msgstr "" + +-#: ../semanage/seobject.py:1912 ../semanage/seobject.py:1983 +-#: ../semanage/seobject.py:2020 ../semanage/seobject.py:2026 ++#: ../semanage/seobject.py:1907 ../semanage/seobject.py:1978 ++#: ../semanage/seobject.py:2015 ../semanage/seobject.py:2021 + #, python-format + msgid "Could not check if addr %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:1914 ++#: ../semanage/seobject.py:1909 + #, python-format + msgid "Addr %s already defined" + msgstr "" + +-#: ../semanage/seobject.py:1918 ++#: ../semanage/seobject.py:1913 + #, python-format + msgid "Could not create addr for %s" + msgstr "" + +-#: ../semanage/seobject.py:1924 ../semanage/seobject.py:2132 +-#: ../semanage/seobject.py:2389 ++#: ../semanage/seobject.py:1919 ../semanage/seobject.py:2127 ++#: ../semanage/seobject.py:2384 + #, python-format + msgid "Could not create context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1928 ++#: ../semanage/seobject.py:1923 + #, python-format + msgid "Could not set mask for %s" + msgstr "" + +-#: ../semanage/seobject.py:1932 ++#: ../semanage/seobject.py:1927 + #, python-format + msgid "Could not set user in addr context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1936 ++#: ../semanage/seobject.py:1931 + #, python-format + msgid "Could not set role in addr context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1940 ++#: ../semanage/seobject.py:1935 + #, python-format + msgid "Could not set type in addr context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1945 ++#: ../semanage/seobject.py:1940 + #, python-format + msgid "Could not set mls fields in addr context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1949 ++#: ../semanage/seobject.py:1944 + #, python-format + msgid "Could not set addr context for %s" + msgstr "" + +-#: ../semanage/seobject.py:1953 ++#: ../semanage/seobject.py:1948 + #, python-format + msgid "Could not add addr %s" + msgstr "" + +-#: ../semanage/seobject.py:1985 ../semanage/seobject.py:2022 ++#: ../semanage/seobject.py:1980 ../semanage/seobject.py:2017 + #, python-format + msgid "Addr %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:1989 ++#: ../semanage/seobject.py:1984 + #, python-format + msgid "Could not query addr %s" + msgstr "" + +-#: ../semanage/seobject.py:1999 ++#: ../semanage/seobject.py:1994 + #, python-format + msgid "Could not modify addr %s" + msgstr "" + +-#: ../semanage/seobject.py:2028 ++#: ../semanage/seobject.py:2023 + #, python-format + msgid "Addr %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:2032 ++#: ../semanage/seobject.py:2027 + #, python-format + msgid "Could not delete addr %s" + msgstr "" + +-#: ../semanage/seobject.py:2046 ++#: ../semanage/seobject.py:2041 + msgid "Could not deleteall node mappings" + msgstr "" + +-#: ../semanage/seobject.py:2060 ++#: ../semanage/seobject.py:2055 + msgid "Could not list addrs" + msgstr "" + +-#: ../semanage/seobject.py:2113 ../semanage/seobject.py:2426 ++#: ../semanage/seobject.py:2108 ../semanage/seobject.py:2421 + msgid "SELinux Type is required" + msgstr "" + +-#: ../semanage/seobject.py:2121 ../semanage/seobject.py:2184 +-#: ../semanage/seobject.py:2220 ../semanage/seobject.py:2226 ++#: ../semanage/seobject.py:2116 ../semanage/seobject.py:2179 ++#: ../semanage/seobject.py:2215 ../semanage/seobject.py:2221 + #, python-format + msgid "Could not check if interface %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:2123 ++#: ../semanage/seobject.py:2118 + #, python-format + msgid "Interface %s already defined" + msgstr "" + +-#: ../semanage/seobject.py:2127 ++#: ../semanage/seobject.py:2122 + #, python-format + msgid "Could not create interface for %s" + msgstr "" + +-#: ../semanage/seobject.py:2136 ++#: ../semanage/seobject.py:2131 + #, python-format + msgid "Could not set user in interface context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2140 ++#: ../semanage/seobject.py:2135 + #, python-format + msgid "Could not set role in interface context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2144 ++#: ../semanage/seobject.py:2139 + #, python-format + msgid "Could not set type in interface context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2149 ++#: ../semanage/seobject.py:2144 + #, python-format + msgid "Could not set mls fields in interface context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2153 ++#: ../semanage/seobject.py:2148 + #, python-format + msgid "Could not set interface context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2157 ++#: ../semanage/seobject.py:2152 + #, python-format + msgid "Could not set message context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2161 ++#: ../semanage/seobject.py:2156 + #, python-format + msgid "Could not add interface %s" + msgstr "" + +-#: ../semanage/seobject.py:2186 ../semanage/seobject.py:2222 ++#: ../semanage/seobject.py:2181 ../semanage/seobject.py:2217 + #, python-format + msgid "Interface %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:2190 ++#: ../semanage/seobject.py:2185 + #, python-format + msgid "Could not query interface %s" + msgstr "" + +-#: ../semanage/seobject.py:2201 ++#: ../semanage/seobject.py:2196 + #, python-format + msgid "Could not modify interface %s" + msgstr "" + +-#: ../semanage/seobject.py:2228 ++#: ../semanage/seobject.py:2223 + #, python-format + msgid "Interface %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:2232 ++#: ../semanage/seobject.py:2227 + #, python-format + msgid "Could not delete interface %s" + msgstr "" + +-#: ../semanage/seobject.py:2246 ++#: ../semanage/seobject.py:2241 + msgid "Could not delete all interface mappings" + msgstr "" + +-#: ../semanage/seobject.py:2260 ++#: ../semanage/seobject.py:2255 + msgid "Could not list interfaces" + msgstr "" + +-#: ../semanage/seobject.py:2285 ++#: ../semanage/seobject.py:2280 + msgid "SELinux Interface" + msgstr "" + +-#: ../semanage/seobject.py:2285 ../semanage/seobject.py:2677 ++#: ../semanage/seobject.py:2280 ../semanage/seobject.py:2672 + msgid "Context" + msgstr "" + +-#: ../semanage/seobject.py:2355 ++#: ../semanage/seobject.py:2350 + #, python-format + msgid "Target %s is not valid. Target is not allowed to end with '/'" + msgstr "" + +-#: ../semanage/seobject.py:2358 ++#: ../semanage/seobject.py:2353 + #, python-format + msgid "Substitute %s is not valid. Substitute is not allowed to end with '/'" + msgstr "" + +-#: ../semanage/seobject.py:2361 ++#: ../semanage/seobject.py:2356 + #, python-format + msgid "Equivalence class for %s already exists" + msgstr "" + +-#: ../semanage/seobject.py:2367 ++#: ../semanage/seobject.py:2362 + #, python-format + msgid "File spec %s conflicts with equivalency rule '%s %s'" + msgstr "" + +-#: ../semanage/seobject.py:2378 ++#: ../semanage/seobject.py:2373 + #, python-format + msgid "Equivalence class for %s does not exist" + msgstr "" + +-#: ../semanage/seobject.py:2395 ++#: ../semanage/seobject.py:2390 + #, python-format + msgid "Could not set user in file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2399 ++#: ../semanage/seobject.py:2394 + #, python-format + msgid "Could not set role in file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2404 ../semanage/seobject.py:2464 ++#: ../semanage/seobject.py:2399 ../semanage/seobject.py:2459 + #, python-format + msgid "Could not set mls fields in file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2410 ++#: ../semanage/seobject.py:2405 + msgid "Invalid file specification" + msgstr "" + +-#: ../semanage/seobject.py:2412 ++#: ../semanage/seobject.py:2407 + msgid "File specification can not include spaces" + msgstr "" + +-#: ../semanage/seobject.py:2417 ++#: ../semanage/seobject.py:2412 + #, python-format + msgid "" + "File spec %s conflicts with equivalency rule '%s %s'; Try adding '%s' instead" + msgstr "" + +-#: ../semanage/seobject.py:2431 ../semanage/seobject.py:2496 ++#: ../semanage/seobject.py:2426 ../semanage/seobject.py:2491 + #, python-format + msgid "Type %s is invalid, must be a file or device type" + msgstr "" + +-#: ../semanage/seobject.py:2439 ../semanage/seobject.py:2444 +-#: ../semanage/seobject.py:2506 ../semanage/seobject.py:2515 +-#: ../semanage/seobject.py:2603 ../semanage/seobject.py:2607 ++#: ../semanage/seobject.py:2434 ../semanage/seobject.py:2439 ++#: ../semanage/seobject.py:2501 ../semanage/seobject.py:2510 ++#: ../semanage/seobject.py:2598 ../semanage/seobject.py:2602 + #, python-format + msgid "Could not check if file context for %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:2447 ++#: ../semanage/seobject.py:2442 + #, python-format + msgid "File context for %s already defined" + msgstr "" + +-#: ../semanage/seobject.py:2451 ++#: ../semanage/seobject.py:2446 + #, python-format + msgid "Could not create file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2459 ++#: ../semanage/seobject.py:2454 + #, python-format + msgid "Could not set type in file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2467 ../semanage/seobject.py:2539 +-#: ../semanage/seobject.py:2543 ++#: ../semanage/seobject.py:2462 ../semanage/seobject.py:2534 ++#: ../semanage/seobject.py:2538 + #, python-format + msgid "Could not set file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2473 ++#: ../semanage/seobject.py:2468 + #, python-format + msgid "Could not add file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2492 ++#: ../semanage/seobject.py:2487 + msgid "Requires setype, serange or seuser" + msgstr "" + +-#: ../semanage/seobject.py:2511 ../semanage/seobject.py:2521 ++#: ../semanage/seobject.py:2506 ../semanage/seobject.py:2516 + #, python-format + msgid "Could not query file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2517 ../semanage/seobject.py:2611 ++#: ../semanage/seobject.py:2512 ../semanage/seobject.py:2606 + #, python-format + msgid "File context for %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:2547 ++#: ../semanage/seobject.py:2542 + #, python-format + msgid "Could not modify file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2565 ++#: ../semanage/seobject.py:2560 + msgid "Could not list the file contexts" + msgstr "" + +-#: ../semanage/seobject.py:2579 ++#: ../semanage/seobject.py:2574 + #, python-format + msgid "Could not delete the file context %s" + msgstr "" + +-#: ../semanage/seobject.py:2609 ++#: ../semanage/seobject.py:2604 + #, python-format + msgid "File context for %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:2615 ++#: ../semanage/seobject.py:2610 + #, python-format + msgid "Could not delete file context for %s" + msgstr "" + +-#: ../semanage/seobject.py:2632 ++#: ../semanage/seobject.py:2627 + msgid "Could not list file contexts" + msgstr "" + +-#: ../semanage/seobject.py:2636 ++#: ../semanage/seobject.py:2631 + msgid "Could not list file contexts for home directories" + msgstr "" + +-#: ../semanage/seobject.py:2640 ++#: ../semanage/seobject.py:2635 + msgid "Could not list local file contexts" + msgstr "" + +-#: ../semanage/seobject.py:2677 ++#: ../semanage/seobject.py:2672 + msgid "SELinux fcontext" + msgstr "" + +-#: ../semanage/seobject.py:2690 ++#: ../semanage/seobject.py:2685 + msgid "" + "\n" + "SELinux Distribution fcontext Equivalence \n" + msgstr "" + +-#: ../semanage/seobject.py:2695 ++#: ../semanage/seobject.py:2690 + msgid "" + "\n" + "SELinux Local fcontext Equivalence \n" + msgstr "" + +-#: ../semanage/seobject.py:2733 ../semanage/seobject.py:2784 +-#: ../semanage/seobject.py:2790 ++#: ../semanage/seobject.py:2728 ../semanage/seobject.py:2779 ++#: ../semanage/seobject.py:2785 + #, python-format + msgid "Could not check if boolean %s is defined" + msgstr "" + +-#: ../semanage/seobject.py:2735 ../semanage/seobject.py:2786 ++#: ../semanage/seobject.py:2730 ../semanage/seobject.py:2781 + #, python-format + msgid "Boolean %s is not defined" + msgstr "" + +-#: ../semanage/seobject.py:2739 ++#: ../semanage/seobject.py:2734 + #, python-format + msgid "Could not query file context %s" + msgstr "" + +-#: ../semanage/seobject.py:2744 ++#: ../semanage/seobject.py:2739 + #, python-format + msgid "You must specify one of the following values: %s" + msgstr "" + +-#: ../semanage/seobject.py:2749 ++#: ../semanage/seobject.py:2744 + #, python-format + msgid "Could not set active value of boolean %s" + msgstr "" + +-#: ../semanage/seobject.py:2752 ++#: ../semanage/seobject.py:2747 + #, python-format + msgid "Could not modify boolean %s" + msgstr "" + +-#: ../semanage/seobject.py:2768 +-#, python-format +-msgid "Bad format %s: Record %s" ++#: ../semanage/seobject.py:2763 ++#, python-brace-format ++msgid "Bad format {filename}: Record {record}" + msgstr "" + +-#: ../semanage/seobject.py:2792 ++#: ../semanage/seobject.py:2787 + #, python-format + msgid "Boolean %s is defined in policy, cannot be deleted" + msgstr "" + +-#: ../semanage/seobject.py:2796 ++#: ../semanage/seobject.py:2791 + #, python-format + msgid "Could not delete boolean %s" + msgstr "" + +-#: ../semanage/seobject.py:2808 ../semanage/seobject.py:2825 ++#: ../semanage/seobject.py:2803 ../semanage/seobject.py:2820 + msgid "Could not list booleans" + msgstr "" + +-#: ../semanage/seobject.py:2858 ++#: ../semanage/seobject.py:2853 + msgid "off" + msgstr "" + +-#: ../semanage/seobject.py:2858 ++#: ../semanage/seobject.py:2853 + msgid "on" + msgstr "" + +-#: ../semanage/seobject.py:2870 ++#: ../semanage/seobject.py:2865 + msgid "SELinux boolean" + msgstr "" + +-#: ../semanage/seobject.py:2870 ++#: ../semanage/seobject.py:2865 + msgid "State" + msgstr "" + +-#: ../semanage/seobject.py:2870 ++#: ../semanage/seobject.py:2865 + msgid "Default" + msgstr "" + +-#: ../semanage/seobject.py:2870 ../sepolicy/sepolicy/sepolicy.glade:2140 ++#: ../semanage/seobject.py:2865 ../sepolicy/sepolicy/sepolicy.glade:2140 + #: ../sepolicy/sepolicy/sepolicy.glade:2510 + #: ../sepolicy/sepolicy/sepolicy.glade:5099 + msgid "Description" +@@ -1555,151 +1566,151 @@ msgstr "" + msgid "Missing interface definition for %s" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:140 ++#: ../sepolicy/sepolicy/generate.py:138 + msgid "Standard Init Daemon" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:141 ++#: ../sepolicy/sepolicy/generate.py:139 + msgid "DBUS System Daemon" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:142 ++#: ../sepolicy/sepolicy/generate.py:140 + msgid "Internet Services Daemon" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:143 ++#: ../sepolicy/sepolicy/generate.py:141 + msgid "Web Application/Script (CGI)" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:144 ++#: ../sepolicy/sepolicy/generate.py:142 + msgid "Sandbox" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:145 ++#: ../sepolicy/sepolicy/generate.py:143 + msgid "User Application" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:146 ++#: ../sepolicy/sepolicy/generate.py:144 + msgid "Existing Domain Type" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:147 ++#: ../sepolicy/sepolicy/generate.py:145 + msgid "Minimal Terminal Login User Role" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:148 ++#: ../sepolicy/sepolicy/generate.py:146 + msgid "Minimal X Windows Login User Role" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:149 ++#: ../sepolicy/sepolicy/generate.py:147 + msgid "Desktop Login User Role" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:150 ++#: ../sepolicy/sepolicy/generate.py:148 + msgid "Administrator Login User Role" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:151 ++#: ../sepolicy/sepolicy/generate.py:149 + msgid "Confined Root Administrator Role" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:152 ++#: ../sepolicy/sepolicy/generate.py:150 + msgid "Module information for a new type" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:158 ++#: ../sepolicy/sepolicy/generate.py:156 + msgid "Valid Types:\n" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:193 ++#: ../sepolicy/sepolicy/generate.py:191 + #, python-format + msgid "Ports must be numbers or ranges of numbers from 1 to %d " + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:205 ++#: ../sepolicy/sepolicy/generate.py:203 + msgid "You must enter a valid policy type" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:208 ++#: ../sepolicy/sepolicy/generate.py:206 + #, python-format + msgid "You must enter a name for your policy module for your '%s'." + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:346 ++#: ../sepolicy/sepolicy/generate.py:344 + msgid "" + "Name must be alphanumeric with no spaces. Consider using option \"-n " + "MODULENAME\"" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:438 ++#: ../sepolicy/sepolicy/generate.py:436 + msgid "User Role types can not be assigned executables." + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:444 ++#: ../sepolicy/sepolicy/generate.py:442 + msgid "Only Daemon apps can use an init script." + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:462 ++#: ../sepolicy/sepolicy/generate.py:460 + msgid "use_resolve must be a boolean value " + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:468 ++#: ../sepolicy/sepolicy/generate.py:466 + msgid "use_syslog must be a boolean value " + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:474 ++#: ../sepolicy/sepolicy/generate.py:472 + msgid "use_kerberos must be a boolean value " + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:480 ++#: ../sepolicy/sepolicy/generate.py:478 + msgid "manage_krb5_rcache must be a boolean value " + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:510 ++#: ../sepolicy/sepolicy/generate.py:508 + msgid "USER Types automatically get a tmp type" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:847 ++#: ../sepolicy/sepolicy/generate.py:845 + #, python-format + msgid "'%s' policy modules require existing domains" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:872 ++#: ../sepolicy/sepolicy/generate.py:870 + msgid "Type field required" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:885 ++#: ../sepolicy/sepolicy/generate.py:883 + #, python-format + msgid "" + "You need to define a new type which ends with: \n" + " %s" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1113 ++#: ../sepolicy/sepolicy/generate.py:1111 + msgid "You must enter the executable path for your confined process" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1378 ++#: ../sepolicy/sepolicy/generate.py:1376 + msgid "Created the following files:\n" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1379 ++#: ../sepolicy/sepolicy/generate.py:1377 + msgid "Type Enforcement file" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1380 ++#: ../sepolicy/sepolicy/generate.py:1378 + msgid "Interface file" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1381 ++#: ../sepolicy/sepolicy/generate.py:1379 + msgid "File Contexts file" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1383 ++#: ../sepolicy/sepolicy/generate.py:1381 + msgid "Spec file" + msgstr "" + +-#: ../sepolicy/sepolicy/generate.py:1384 ++#: ../sepolicy/sepolicy/generate.py:1382 + msgid "Setup Script" + msgstr "" + +@@ -2367,29 +2378,29 @@ msgstr "" + msgid "named pipe" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:148 ++#: ../sepolicy/sepolicy/__init__.py:149 + msgid "No SELinux Policy installed" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:184 ++#: ../sepolicy/sepolicy/__init__.py:185 + #, python-format + msgid "Failed to read %s policy file" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:470 ++#: ../sepolicy/sepolicy/__init__.py:471 + #, python-format + msgid "-- Allowed %s [ %s ]" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:896 ++#: ../sepolicy/sepolicy/__init__.py:897 + msgid "You must regenerate interface info by running /usr/bin/sepolgen-ifgen" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:1221 ++#: ../sepolicy/sepolicy/__init__.py:1230 + msgid "unknown" + msgstr "" + +-#: ../sepolicy/sepolicy/__init__.py:1230 ++#: ../sepolicy/sepolicy/__init__.py:1239 + #, python-brace-format + msgid "Allow {subject} to {rest}" + msgstr "" +-- +2.41.0 + diff --git a/0019-sepolicy-port-to-dnf4-python-API.patch b/0019-sepolicy-port-to-dnf4-python-API.patch new file mode 100644 index 0000000..bc62ff3 --- /dev/null +++ b/0019-sepolicy-port-to-dnf4-python-API.patch @@ -0,0 +1,84 @@ +From d925b00da35384331df9bf31935398c37117f895 Mon Sep 17 00:00:00 2001 +From: Petr Lautrbach +Date: Sat, 29 Jul 2023 20:33:06 +0200 +Subject: [PATCH] sepolicy: port to dnf4 python API +Content-type: text/plain + +yum module is not available since RHEL 7. + +Drop -systemd related code as it's obsoleted these days - only 2 +packages ship their .service in -systemd subpackage + +Signed-off-by: Petr Lautrbach +--- + python/sepolicy/sepolicy/generate.py | 38 ++++++++++++---------------- + 1 file changed, 16 insertions(+), 22 deletions(-) + +diff --git a/python/sepolicy/sepolicy/generate.py b/python/sepolicy/sepolicy/generate.py +index 36a3ea1196b1..48602a736953 100644 +--- a/python/sepolicy/sepolicy/generate.py ++++ b/python/sepolicy/sepolicy/generate.py +@@ -1264,13 +1264,20 @@ allow %s_t %s_t:%s_socket name_%s; + return fcfile + + def __extract_rpms(self): +- import yum +- yb = yum.YumBase() +- yb.setCacheDir() ++ import dnf + +- for pkg in yb.rpmdb.searchProvides(self.program): ++ base = dnf.Base() ++ base.read_all_repos() ++ base.fill_sack(load_system_repo=True) ++ ++ query = base.sack.query() ++ ++ pq = query.available() ++ pq = pq.filter(file=self.program) ++ ++ for pkg in pq: + self.rpms.append(pkg.name) +- for fname in pkg.dirlist + pkg.filelist + pkg.ghostlist: ++ for fname in pkg.files: + for b in self.DEFAULT_DIRS: + if b == "/etc": + continue +@@ -1279,9 +1286,10 @@ allow %s_t %s_t:%s_socket name_%s; + self.add_file(fname) + else: + self.add_dir(fname) +- +- for bpkg in yb.rpmdb.searchNames([pkg.base_package_name]): +- for fname in bpkg.dirlist + bpkg.filelist + bpkg.ghostlist: ++ sq = query.available() ++ sq = sq.filter(provides=pkg.source_name) ++ for bpkg in sq: ++ for fname in bpkg.files: + for b in self.DEFAULT_DIRS: + if b == "/etc": + continue +@@ -1291,20 +1299,6 @@ allow %s_t %s_t:%s_socket name_%s; + else: + self.add_dir(fname) + +- # some packages have own systemd subpackage +- # tor-systemd for example +- binary_name = self.program.split("/")[-1] +- for bpkg in yb.rpmdb.searchNames(["%s-systemd" % binary_name]): +- for fname in bpkg.filelist + bpkg.ghostlist + bpkg.dirlist: +- for b in self.DEFAULT_DIRS: +- if b == "/etc": +- continue +- if fname.startswith(b): +- if os.path.isfile(fname): +- self.add_file(fname) +- else: +- self.add_dir(fname) +- + def gen_writeable(self): + try: + self.__extract_rpms() +-- +2.41.0 + diff --git a/policycoreutils.spec b/policycoreutils.spec index 39cb285..fb54f95 100644 --- a/policycoreutils.spec +++ b/policycoreutils.spec @@ -11,7 +11,7 @@ Summary: SELinux policy core utilities Name: policycoreutils Version: 3.5 -Release: 6%{?dist} +Release: 7%{?dist} License: GPL-2.0-or-later # https://github.com/SELinuxProject/selinux/wiki/Releases Source0: https://github.com/SELinuxProject/selinux/releases/download/3.5/selinux-3.5.tar.gz @@ -45,6 +45,11 @@ Patch0011: 0011-python-sepolicy-Improve-man-pages.patch Patch0012: 0012-sandbox-Add-examples-to-man-pages.patch Patch0013: 0013-python-sepolicy-Fix-template-for-confined-user-polic.patch Patch0014: 0014-python-sepolicy-Fix-spec-file-dependencies.patch +Patch0015: 0015-python-improve-format-strings-for-proper-localizatio.patch +Patch0016: 0016-python-Drop-hard-formating-from-localized-strings.patch +Patch0017: 0017-semanage-Drop-unnecessary-import-from-seobject.patch +Patch0018: 0018-python-update-python.pot.patch +Patch0019: 0019-sepolicy-port-to-dnf4-python-API.patch # Patch list end Obsoletes: policycoreutils < 2.0.61-2 @@ -250,7 +255,7 @@ by python 3 in an SELinux environment. %package devel Summary: SELinux policy core policy devel utilities Requires: policycoreutils-python-utils = %{version}-%{release} -Requires: /usr/bin/make dnf +Requires: /usr/bin/make python3-dnf Requires: (selinux-policy-devel if selinux-policy) %description devel @@ -452,6 +457,11 @@ The policycoreutils-restorecond package contains the restorecond service. %systemd_postun_with_restart restorecond.service %changelog +* Tue Aug 1 2023 Petr Lautrbach - 3.5-7 +- python: improve format strings for proper localization +- python: Drop hard formating from localized strings +- sepolicy: port to dnf4 python API (rhbz#2209404) + * Fri Jul 21 2023 Fedora Release Engineering - 3.5-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild