Пример #1
0
def extracted(name, source, archive_format, tar_options=None, source_hash=None, if_missing=None, if_absent=None):
    """
    State that make sure an archive is extracted in a directory.
    The downloaded archive is erased if succesfully extracted.
    The archive is downloaded only if necessary.

    .. code-block:: yaml

        graylog2-server:
          archive:
            - extracted
            - name: /opt/
            - source: https://github.com/downloads/Graylog2/graylog2-server/graylog2-server-0.9.6p1.tar.gz
            - source_hash: md5=499ae16dcae71eeb7c3a30c75ea7a1a6
            - archive_format: tar
            - tar_options: z
            - if_missing: /opt/graylog2-server-0.9.6p1/

    name
        Directory name where to extract the archive

    source
        Archive source, same syntax as file.managed source argument.

    archive_format
        tar, zip or rar

    if_missing
        Some archive, such as tar, extract themself in a subfolder.
        This directive can be used to validate if the archive had been
        previously extracted.

    if_absent
        Extract the archive only if none of the specified paths exist.

    tar_options
        Only used for tar format, it need to be the tar argument specific to
        this archive, such as 'j' for bzip2, 'z' for gzip, '' for uncompressed
        tar, 'J' for LZMA.
    """
    ret = {"name": name, "result": None, "changes": {}, "comment": ""}
    valid_archives = ("tar", "rar", "zip")

    if archive_format not in valid_archives:
        ret["result"] = False
        ret["comment"] = "{0} is not supported, valids: {1}".format(name, ",".join(valid_archives))
        return ret

    if archive_format == "tar" and tar_options is None:
        ret["result"] = False
        ret["comment"] = "tar archive need argument tar_options"
        return ret

    # if if_missing is None:
    #     if_missing = name
    # if (__salt__['file.directory_exists'](if_missing) or
    #     __salt__['file.file_exists'](if_missing)):
    #     ret['result'] = True
    #     ret['comment'] = '{0} already exists'.format(if_missing)
    #     return ret

    log.debug("Input seem valid so far")
    filename = os.path.join(__opts__["cachedir"], source.split("/")[-1])

    #########################################################################
    # check whether special paths are absent
    if if_absent and isinstance(if_absent, list):
        if any([os.path.isdir(path) for path in if_absent]):
            ret["result"] = True
            ret["comment_"] = "Any specail directory existed"
            return ret

    # get cached checksum
    cs = Checksum(source.split("/")[-1], name, __opts__["watch_dir"])
    current_hash = cs.get()

    # get source hash value
    if source_hash:
        try:
            tmp, source_hash, comment_ = __salt__["file.get_managed"](
                filename, None, source, source_hash, None, None, None, __env__, None, None
            )
            if comment_:
                ret["result"] = False
                ret["comment"] = comment_
                return ret
        except Exception, e:
            ret["result"] = False
            ret["comment"] = "Parse source hash %s failed" % str(source_hash)
            ret["state_stdout"] = str(e)
            return ret

        # fetch source tarball when the target directory isn't existed or no cached checksum
        if os.path.isdir(name) and current_hash:

            # check source hash value
            if source_hash["hash_type"] == "md5" and current_hash == source_hash["hsum"]:
                ret["result"] = True
                ret["comment"] = ("File sum set for file {0} of {1} is unchanged.").format(source, source_hash["hsum"])
                return ret
Пример #2
0
def extracted(name,
              source,
              archive_format,
              tar_options=None,
              source_hash=None,
              if_missing=None,
              if_absent=None):
    '''
    State that make sure an archive is extracted in a directory.
    The downloaded archive is erased if succesfully extracted.
    The archive is downloaded only if necessary.

    .. code-block:: yaml

        graylog2-server:
          archive:
            - extracted
            - name: /opt/
            - source: https://github.com/downloads/Graylog2/graylog2-server/graylog2-server-0.9.6p1.tar.gz
            - source_hash: md5=499ae16dcae71eeb7c3a30c75ea7a1a6
            - archive_format: tar
            - tar_options: z
            - if_missing: /opt/graylog2-server-0.9.6p1/

    name
        Directory name where to extract the archive

    source
        Archive source, same syntax as file.managed source argument.

    archive_format
        tar, zip or rar

    if_missing
        Some archive, such as tar, extract themself in a subfolder.
        This directive can be used to validate if the archive had been
        previously extracted.

    if_absent
        Extract the archive only if none of the specified paths exist.

    tar_options
        Only used for tar format, it need to be the tar argument specific to
        this archive, such as 'j' for bzip2, 'z' for gzip, '' for uncompressed
        tar, 'J' for LZMA.
    '''
    ret = {'name': name, 'result': None, 'changes': {}, 'comment': ''}
    valid_archives = ('tar', 'rar', 'zip')

    if archive_format not in valid_archives:
        ret['result'] = False
        ret['comment'] = '{0} is not supported, valids: {1}'.format(
            name, ','.join(valid_archives))
        return ret

    if archive_format == 'tar' and tar_options is None:
        ret['result'] = False
        ret['comment'] = 'tar archive need argument tar_options'
        return ret

    # if if_missing is None:
    #     if_missing = name
    # if (__salt__['file.directory_exists'](if_missing) or
    #     __salt__['file.file_exists'](if_missing)):
    #     ret['result'] = True
    #     ret['comment'] = '{0} already exists'.format(if_missing)
    #     return ret

    log.debug("Input seem valid so far")
    filename = os.path.join(__opts__['cachedir'], source.split('/')[-1])

    #########################################################################
    # check whether special paths are absent
    if if_absent and isinstance(if_absent, list):
        if any([os.path.isdir(path) for path in if_absent]):
            ret['result'] = True
            ret['comment_'] = 'Any specail directory existed'
            return ret

    # get cached checksum
    cs = Checksum(source.split('/')[-1], name, __opts__['watch_dir'])
    current_hash = cs.get()

    # get source hash value
    if source_hash:
        try:
            tmp, source_hash, comment_ = __salt__['file.get_managed'](
                filename, None, source, source_hash, None, None, None, __env__,
                None, None)
            if comment_:
                ret['result'] = False
                ret['comment'] = comment_
                return ret
        except Exception, e:
            ret['result'] = False
            ret['comment'] = 'Parse source hash %s failed' % str(source_hash)
            ret['state_stdout'] = str(e)
            return ret

        # fetch source tarball when the target directory isn't existed or no cached checksum
        if os.path.isdir(name) and current_hash:

            # check source hash value
            if source_hash[
                    'hash_type'] == 'md5' and current_hash == source_hash[
                        'hsum']:
                ret['result'] = True
                ret['comment'] = (
                    'File sum set for file {0} of {1} is unchanged.').format(
                        source, source_hash['hsum'])
                return ret