django_airavata/apps/admin/management/commands/unarchive_user_data.py (31 lines of code) (raw):
import os
import pathlib
import tarfile
from django.core.management.base import BaseCommand
from django_airavata.apps.admin import models
class Command(BaseCommand):
help = "Unarchive a user data archive"
def add_arguments(self, parser):
parser.add_argument('archive_file',
help="Archive file (ending in .tgz) that was created by the archive_user_data")
parser.add_argument('-m', '--reset-modification',
help="Set modification timestamp to current time for all entries in archive",
action="store_true")
def handle(self, *args, **options):
with tarfile.open(options["archive_file"]) as tf:
tf.extractall(path="/")
# mark archive as rolled back
archive_name = os.path.basename(options["archive_file"])
try:
archive = models.UserDataArchive.objects.get(archive_name=archive_name)
archive.rolled_back = True
archive.save()
except models.UserDataArchive.DoesNotExist:
self.stdout.write(self.style.ERROR(f"Could not find UserDataArchive database record for {archive_name}"))
if options["reset_modification"]:
root = pathlib.Path('/')
with tarfile.open(options["archive_file"]) as tf:
for tarinfo in tf:
path = root / tarinfo.path
path.touch()
self.stdout.write("Updated modification timestamps for all entries")
self.stdout.write(self.style.SUCCESS(f"Successfully unarchived {options['archive_file']}"))