Petr Lautrbach 577b79d
From abaf812c3877f6b595eb8643582eacef2dd4df3f Mon Sep 17 00:00:00 2001
2a7fa6a
From: Vit Mojzis <vmojzis@redhat.com>
2a7fa6a
Date: Mon, 30 May 2022 14:20:21 +0200
2a7fa6a
Subject: [PATCH] python: Split "semanage import" into two transactions
2a7fa6a
Content-type: text/plain
2a7fa6a
2a7fa6a
First transaction applies all deletion operations, so that there are no
2a7fa6a
collisions when applying the rest of the changes.
2a7fa6a
2a7fa6a
Fixes:
2a7fa6a
  # semanage port -a -t http_cache_port_t -r s0 -p tcp 3024
2a7fa6a
  # semanage export | semanage import
2a7fa6a
  ValueError: Port tcp/3024 already defined
2a7fa6a
2a7fa6a
Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
2a7fa6a
---
2a7fa6a
 python/semanage/semanage | 21 +++++++++++++++++++--
2a7fa6a
 1 file changed, 19 insertions(+), 2 deletions(-)
2a7fa6a
2a7fa6a
diff --git a/python/semanage/semanage b/python/semanage/semanage
Petr Lautrbach 577b79d
index 8f4e44a7a9cd..1d8281281d05 100644
2a7fa6a
--- a/python/semanage/semanage
2a7fa6a
+++ b/python/semanage/semanage
Petr Lautrbach 577b79d
@@ -852,10 +852,29 @@ def handleImport(args):
2a7fa6a
     trans = seobject.semanageRecords(args)
2a7fa6a
     trans.start()
2a7fa6a
 
2a7fa6a
+    deleteCommands = []
2a7fa6a
+    commands = []
2a7fa6a
+    # separate commands for deletion from the rest so they can be
2a7fa6a
+    # applied in a separate transaction
2a7fa6a
     for l in sys.stdin.readlines():
2a7fa6a
         if len(l.strip()) == 0:
2a7fa6a
             continue
2a7fa6a
+        if "-d" in l or "-D" in l:
2a7fa6a
+            deleteCommands.append(l)
2a7fa6a
+        else:
2a7fa6a
+            commands.append(l)
2a7fa6a
+
2a7fa6a
+    if deleteCommands:
2a7fa6a
+        importHelper(deleteCommands)
2a7fa6a
+        trans.finish()
2a7fa6a
+        trans.start()
2a7fa6a
+
2a7fa6a
+    importHelper(commands)
2a7fa6a
+    trans.finish()
2a7fa6a
 
2a7fa6a
+
2a7fa6a
+def importHelper(commands):
2a7fa6a
+    for l in commands:
2a7fa6a
         try:
2a7fa6a
             commandParser = createCommandParser()
2a7fa6a
             args = commandParser.parse_args(mkargv(l))
Petr Lautrbach 577b79d
@@ -869,8 +888,6 @@ def handleImport(args):
2a7fa6a
         except KeyboardInterrupt:
2a7fa6a
             sys.exit(0)
2a7fa6a
 
2a7fa6a
-    trans.finish()
2a7fa6a
-
2a7fa6a
 
2a7fa6a
 def setupImportParser(subparsers):
2a7fa6a
     importParser = subparsers.add_parser('import', help=_('Import local customizations'))
2a7fa6a
-- 
Petr Lautrbach 577b79d
2.38.1
2a7fa6a