summaryrefslogtreecommitdiffstats
path: root/ipaserver/install/ipa_restore.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipaserver/install/ipa_restore.py')
-rw-r--r--ipaserver/install/ipa_restore.py36
1 files changed, 35 insertions, 1 deletions
diff --git a/ipaserver/install/ipa_restore.py b/ipaserver/install/ipa_restore.py
index 032cca9a9..c75760550 100644
--- a/ipaserver/install/ipa_restore.py
+++ b/ipaserver/install/ipa_restore.py
@@ -24,6 +24,7 @@ import tempfile
import time
import pwd
from ConfigParser import SafeConfigParser
+import ldif
from ipalib import api, errors
from ipapython import version, ipautil, certdb, dogtag
@@ -93,6 +94,32 @@ def decrypt_file(tmpdir, filename, keyring):
return dest
+class RemoveRUVParser(ldif.LDIFParser):
+ def __init__(self, input_file, writer, logger):
+ ldif.LDIFParser.__init__(self, input_file)
+ self.writer = writer
+ self.log = logger
+
+ def handle(self, dn, entry):
+ objectclass = None
+ nsuniqueid = None
+
+ for name, value in entry.iteritems():
+ name = name.lower()
+ if name == 'objectclass':
+ objectclass = [x.lower() for x in value]
+ elif name == 'nsuniqueid':
+ nsuniqueid = [x.lower() for x in value]
+
+ if (objectclass and nsuniqueid and
+ 'nstombstone' in objectclass and
+ 'ffffffff-ffffffff-ffffffff-ffffffff' in nsuniqueid):
+ self.log.debug("Removing RUV entry %s", dn)
+ return
+
+ self.writer.unparse(dn, entry)
+
+
class Restore(admintool.AdminTool):
command_name = 'ipa-restore'
log_file_name = paths.IPARESTORE_LOG
@@ -446,7 +473,14 @@ class Restore(admintool.AdminTool):
dn = DN(('cn', cn), ('cn', 'import'), ('cn', 'tasks'), ('cn', 'config'))
ldifname = '%s-%s.ldif' % (instance, backend)
- ldiffile = os.path.join(self.dir, ldifname)
+ srcldiffile = os.path.join(self.dir, ldifname)
+ ldiffile = '%s.noruv' % srcldiffile
+
+ with open(ldiffile, 'wb') as out_file:
+ ldif_writer = ldif.LDIFWriter(out_file)
+ with open(srcldiffile, 'rb') as in_file:
+ ldif_parser = RemoveRUVParser(in_file, ldif_writer, self.log)
+ ldif_parser.parse()
if online:
conn = self.get_connection()