python: Split "semanage import" into two transactions

First transaction applies all deletion operations, so that there are no
collisions when applying the rest of the changes.

Fixes:
  # semanage port -a -t http_cache_port_t -r s0 -p tcp 3024
  # semanage export | semanage import
  ValueError: Port tcp/3024 already defined

Signed-off-by: Vit Mojzis <vmojzis@redhat.com>
This commit is contained in:
Vit Mojzis 2022-05-30 14:20:21 +02:00 committed by James Carter
parent c8ba7968b3
commit abaf812c38

View File

@ -852,10 +852,29 @@ def handleImport(args):
trans = seobject.semanageRecords(args)
trans.start()
deleteCommands = []
commands = []
# separate commands for deletion from the rest so they can be
# applied in a separate transaction
for l in sys.stdin.readlines():
if len(l.strip()) == 0:
continue
if "-d" in l or "-D" in l:
deleteCommands.append(l)
else:
commands.append(l)
if deleteCommands:
importHelper(deleteCommands)
trans.finish()
trans.start()
importHelper(commands)
trans.finish()
def importHelper(commands):
for l in commands:
try:
commandParser = createCommandParser()
args = commandParser.parse_args(mkargv(l))
@ -869,8 +888,6 @@ def handleImport(args):
except KeyboardInterrupt:
sys.exit(0)
trans.finish()
def setupImportParser(subparsers):
importParser = subparsers.add_parser('import', help=_('Import local customizations'))