~james-page/charm-helpers/follow-symlinks

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import os
import tarfile
import zipfile

from charmhelpers.core import (
    host,
    hookenv
)

class ArchiveError(Exception):
    pass

def get_archive_handler(archive_name):
    if os.path.isfile(archive_name):
        if tarfile.is_tarfile(archive_name):
            return extract_tarfile
        elif zipfile.is_zipfile(archive_name):
            return extract_zipfile
    else:
        # look at the file name
        for ext in ('.tar.gz', '.tgz', 'tar.bz2', '.tbz2', '.tbz'):
            if archive_name.endswith(ext):
                return extract_tarfile
        for ext in ('.zip','.jar'):
            if archive_name.endswith(ext):
                return extract_zipfile

def archive_dest_default(archive_name):
    return os.path.join(hookenv.charm_dir(), "archives", archive_name)


def extract(archive_name, destpath=None):
    handler = get_archive_handler(archive_name)
    if handler:
        if not destpath:
            destpath = archive_dest_default(archive_name)
        if not os.path.isdir(destpath):
            host.mkdir(destpath)
        get_archive_handler(archive_name)(archive_name, destpath)
    else:
        raise ArchiveError("No handler for archive")


def extract_archive(archive_class, archive_name, destpath):
    archive = archive_class(archive_name)
    archive.extract_all(destpath)


def extract_tarfile(archive_name, destpath):
    "Unpack a tar archive, optionally compressed"
    extract_archive(tarfile.TarFile, archive_name, destpath)


def extract_zipfile(archive_name, destpath):
    "Unpack a zip file"
    extract_archive(zipfile.ZipFile, archive_name, destpath)