Skip to content

Commit 092c982

Browse files
committed
WIP first swing at cleaning up the tempfile creation
1 parent 9b80b3e commit 092c982

3 files changed

Lines changed: 37 additions & 47 deletions

File tree

common/gratia/common/sandbox_mgmt.py

Lines changed: 22 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import glob
66
import time
77
import shutil
8+
import tempfile
89
import tarfile
910

1011
from gratia.common.config import ConfigProxy
@@ -409,18 +410,8 @@ def SearchOutstandingRecord():
409410

410411
def GenerateFilename(prefix, current_dir):
411412
'''Generate a filename of the for current_dir/prefix.$pid.ConfigFragment.gratia.xml__Unique'''
412-
filename = prefix + str(global_state.RecordPid) + '.' + Config.get_GratiaExtension() \
413-
+ '__XXXXXXXXXX'
414-
filename = os.path.join(current_dir, filename)
415-
mktemp_pipe = os.popen('mktemp -q "' + filename + '"')
416-
if mktemp_pipe != None:
417-
filename = mktemp_pipe.readline()
418-
mktemp_pipe.close()
419-
filename = filename.strip()
420-
if filename != r'':
421-
return filename
422-
423-
raise IOError
413+
fn_prefix = f'{prefix}.{global_state.RecordPid}.{Config.get_GratiaExtension()}__'
414+
return tempfile.NamedTemporaryFile(prefix=fn_prefix, dir=current_dir, delete=False, mode='w')
424415

425416
def UncompressOutbox(staging_name, target_dir):
426417

@@ -487,20 +478,21 @@ def CompressOutbox(probe_dir, outbox, outfiles):
487478
DebugPrint(0, msg + ':' + exc)
488479
raise InternalError(msg) from exc
489480

490-
staging_name = GenerateFilename('tz.', staged_store)
491-
DebugPrint(1, 'Compressing outbox in tar.bz2 file: ' + staging_name)
481+
with GenerateFilename('tz', staged_store) as temp_tarfile:
482+
staging_name = temp_tarfile.name
483+
DebugPrint(1, 'Compressing outbox in tar.bz2 file: ' + staging_name)
492484

493-
try:
494-
tar = tarfile.open(staging_name, 'w:bz2')
495-
except KeyboardInterrupt:
496-
raise
497-
except SystemExit:
498-
raise
499-
except Exception as e:
500-
DebugPrint(0, 'Warning: Exception caught while opening tar.bz2 file: ' + staging_name + ':')
501-
DebugPrint(0, 'Caught exception: ', e)
502-
DebugPrintTraceback()
503-
return False
485+
try:
486+
tar = tarfile.open(staging_name, 'w:bz2')
487+
except KeyboardInterrupt:
488+
raise
489+
except SystemExit:
490+
raise
491+
except Exception as e:
492+
DebugPrint(0, 'Warning: Exception caught while opening tar.bz2 file: ' + staging_name + ':')
493+
DebugPrint(0, 'Caught exception: ', e)
494+
DebugPrintTraceback()
495+
return False
504496

505497
try:
506498
for f in outfiles:
@@ -599,12 +591,11 @@ def OpenNewRecordFile(dirIndex):
599591
raise InternalError(msg) from exc
600592

601593
try:
602-
filename = GenerateFilename('r.', working_dir)
603-
DebugPrint(3, 'Creating file:', filename)
604-
outstandingRecordCount += 1
605-
f = open(filename, 'w')
606-
dirIndex = index
607-
return (f, dirIndex)
594+
with GenerateFilename('r', working_dir) as recordfile:
595+
DebugPrint(3, 'Creating file:', recordfile.name)
596+
outstandingRecordCount += 1
597+
dirIndex = index
598+
return (recordfile, dirIndex)
608599
except Exception as exc:
609600
msg = 'ERROR: Caught exception while creating file'
610601
DebugPrint(0, msg + ': ', exc)

common/gratia/common/xml_utils.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,8 @@ def UsageCheckXmldoc(xmlDoc, external, resourceType=None):
280280
subdir = os.path.join(Config.get_DataFolder(), "quarantine", 'subdir.' + Config.getFilenameFragment())
281281
if not os.path.exists(subdir):
282282
os.mkdir(subdir)
283-
fn = sandbox_mgmt.GenerateFilename("r.", subdir)
284-
writer = open(fn, 'w')
285-
usageRecord.writexml(writer)
286-
writer.close()
283+
with sandbox_mgmt.GenerateFilename("r", subdir) as writer:
284+
usageRecord.writexml(writer)
287285
usageRecord.unlink()
288286
continue
289287

test/test_sandbox_mgmt.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,22 +12,23 @@ class SandboxMgmtTests(unittest.TestCase):
1212
def test_GenerateFilename(self, mock_config):
1313
"""GenerateFilename creates a temporary file and returns the path to the file
1414
"""
15-
prefix = 'test-prefix.'
15+
prefix = 'test-prefix'
1616
temp_dir = '/tmp'
1717

1818
try:
19-
filename = sandbox_mgmt.GenerateFilename(prefix, temp_dir)
20-
self.assertTrue(os.path.exists(filename),
21-
f'Failed to create temporary file ({filename})')
22-
self.assertEqual(temp_dir.rstrip('/'),
23-
os.path.dirname(filename),
24-
f'Temporary file {filename} placed in the wrong directory')
25-
self.assertRegex(filename,
26-
rf'{temp_dir}/*{prefix}\d+\.{mock_config.return_value}__\w+',
27-
'Unexpected file name format')
19+
with sandbox_mgmt.GenerateFilename(prefix, temp_dir) as filename:
20+
self.assertTrue(os.path.exists(filename.name),
21+
f'Failed to create temporary file ({filename.name})')
22+
self.assertEqual(temp_dir.rstrip('/'),
23+
os.path.dirname(filename.name),
24+
f'Temporary file {filename.name} placed in the wrong directory')
25+
self.assertRegex(filename.name,
26+
rf'{temp_dir}/*{prefix}\.\d+\.{mock_config.return_value}__\w+',
27+
'Unexpected file name format')
2828
finally:
2929
try:
30-
os.remove(filename)
31-
except FileNotFoundError:
30+
filename.close()
31+
os.remove(filename.name)
32+
except (FileNotFoundError, NameError):
3233
# don't need to clean up what's not there
3334
pass

0 commit comments

Comments
 (0)