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@xxxxxxxxxx> --- python/semanage/semanage | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/python/semanage/semanage b/python/semanage/semanage index 8f4e44a7..1d828128 100644 --- a/python/semanage/semanage +++ b/python/semanage/semanage @@ -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')) -- 2.35.1