From: Julien Cristau Date: Thu, 10 Oct 2019 19:50:29 +0000 (+0200) Subject: ud-generate: use subprocess.Popen instead of os.popen in GenCDB. X-Git-Url: https://git.adam-barratt.org.uk/?a=commitdiff_plain;h=d429d92186b039e720ecca0723fa56f44e8e65e8;hp=a7f7b439dfab562fc7997a6e5b8412752a4b46de;p=mirror%2Fuserdir-ldap.git ud-generate: use subprocess.Popen instead of os.popen in GenCDB. --- diff --git a/debian/changelog b/debian/changelog index e6df2bb..410485d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -13,6 +13,7 @@ userdir-ldap (0.3.97) UNRELEASED; urgency=medium [ Julien Cristau ] * ud-mailgate: don't let punycode through. + * ud-generate: use subprocess.Popen instead of os.popen in GenCDB. -- Peter Palfrader Sat, 06 Apr 2019 22:04:34 +0200 diff --git a/ud-generate b/ud-generate index 97d003e..adc1436 100755 --- a/ud-generate +++ b/ud-generate @@ -645,28 +645,24 @@ def GenForward(accounts, File): Done(File, F, None) def GenCDB(accounts, File, key): - Fdb = None + prefix = ["/usr/bin/eatmydata"] if os.path.exists('/usr/bin/eatmydata') else [] + # nothing else does the fsync stuff, so why do it here? + Fdb = subprocess.Popen(prefix + ["cdbmake", File, "%s.tmp" % File], + preexec_fn=lambda: os.umask(0022), + stdin=subprocess.PIPE) try: - OldMask = os.umask(0022) - # nothing else does the fsync stuff, so why do it here? - prefix = "/usr/bin/eatmydata " if os.path.exists('/usr/bin/eatmydata') else '' - Fdb = os.popen("%scdbmake %s %s.tmp"%(prefix, File, File), "w") - os.umask(OldMask) - # Write out the email address for each user for a in accounts: if not key in a: continue value = a[key] user = a['uid'] - Fdb.write("+%d,%d:%s->%s\n" % (len(user), len(value), user, value)) + Fdb.stdin.write("+%d,%d:%s->%s\n" % (len(user), len(value), user, value)) - Fdb.write("\n") - # Oops, something unspeakable happened. - except: - Fdb.close() - raise - if Fdb.close() != None: - raise "cdbmake gave an error" + Fdb.stdin.write("\n") + finally: + Fdb.stdin.close() + if Fdb.wait() != 0: + raise Exception("cdbmake gave an error") def GenDBM(accounts, File, key): Fdb = None