import os.path
import time
from acquisition import AcquisitionStep
from mfutil import mkdir_p_or_die, mkdir_p, get_unique_hexa_identifier
from xattrfile import XattrFile
[docs]class AcquisitionArchiveStep(AcquisitionStep):
"""
Class to describe an archive acquisition step.
Attributes:
archive_dir (string): the root directory where files will be archived
keep_tags (boolean): keep tags into another file ?
keep_tags_suffix (string): suffix to add to the filename to keep tags
strftime_template (string): template to define the sub-directory
inside archive directory
"""
archive_dir = None
keep_tags = True
keep_tags_suffix = None
strftime_template = None
[docs] def init(self):
if self.args.dest_dir is None:
module_runtime_home = os.environ.get('MODULE_RUNTIME_HOME', '/tmp')
self.archive_dir = os.path.join(module_runtime_home,
'var', 'archive')
else:
self.archive_dir = self.args.dest_dir
self.strftime_template = self.args.strftime_template
self.keep_tags = self.args.keep_tags
self.keep_tags_suffix = self.args.keep_tags_suffix
mkdir_p_or_die(self.archive_dir)
[docs] def process(self, xaf):
original_dirname = self.get_original_dirname(xaf)
original_basename = self.get_original_basename(xaf)
original_uid = self.get_original_uid(xaf)
random_basename = get_unique_hexa_identifier()
step_counter = self._get_counter_tag_value(xaf, not_found_value='999')
if step_counter != 999 and step_counter != 0:
step_counter_minus_1 = step_counter - 1
else:
step_counter_minus_1 = step_counter
rendered_template = os.path.join(self.archive_dir,
self.strftime_template)
rendered_template = rendered_template.replace('{RANDOM_ID}',
random_basename)
rendered_template = rendered_template.replace('{ORIGINAL_BASENAME}',
original_basename)
rendered_template = rendered_template.replace('{ORIGINAL_UID}',
original_uid)
rendered_template = rendered_template.replace('{ORIGINAL_DIRNAME}',
original_dirname)
rendered_template = rendered_template.replace('{STEP_COUNTER}',
str(step_counter))
rendered_template = \
rendered_template.replace('{STEP_COUNTER_MINUS_1}',
str(step_counter_minus_1))
new_filepath = time.strftime(rendered_template)
dirname = os.path.dirname(new_filepath)
res = mkdir_p(dirname)
if not res:
self.warning("can't mkdir %s" % dirname)
return False
# Store old xaf filepath to display in the logs
old_filepath = xaf.filepath
success, moved = xaf.move_or_copy(new_filepath)
if success:
if moved:
self.info("%s moved into %s", old_filepath, new_filepath)
else:
self.info("%s copied into %s", xaf.filepath, new_filepath)
if self.keep_tags:
tags_filepath = new_filepath + self.keep_tags_suffix
xaf.write_tags_in_a_file(tags_filepath)
XattrFile(new_filepath).clear_tags()
return True
else:
self.warning("Can't move/copy %s to %s", xaf.filepath,
new_filepath)
return False