def list_pkgs(versions_as_list=False, with_origin=False, **kwargs):
    """
    List the packages currently installed as a dict::

        {'<package_name>': '<version>'}

    with_origin : False
        Return a nested dictionary containing both the origin name and version
        for each installed package.

        .. versionadded:: 2014.1.0

    CLI Example:

    .. code-block:: bash

        salt '*' pkg.list_pkgs
    """
    versions_as_list = salt.utils.data.is_true(versions_as_list)
    # not yet implemented or not applicable
    if any([
            salt.utils.data.is_true(kwargs.get(x))
            for x in ("removed", "purge_desired")
    ]):
        return {}

    if "pkg.list_pkgs" in __context__ and kwargs.get("use_context", True):
        return _list_pkgs_from_context(versions_as_list, with_origin)

    ret = {}
    origins = {}
    out = __salt__["cmd.run_stdout"](["pkg_info", "-ao"],
                                     output_loglevel="trace",
                                     python_shell=False)
    pkgs_re = re.compile(r"Information for ([^:]+):\s*Origin:\n([^\n]+)")
    for pkg, origin in pkgs_re.findall(out):
        if not pkg:
            continue
        try:
            pkgname, pkgver = pkg.rsplit("-", 1)
        except ValueError:
            continue
        __salt__["pkg_resource.add_pkg"](ret, pkgname, pkgver)
        origins[pkgname] = origin

    __salt__["pkg_resource.sort_pkglist"](ret)
    __context__["pkg.list_pkgs"] = copy.deepcopy(ret)
    __context__["pkg.origin"] = origins
    if not versions_as_list:
        __salt__["pkg_resource.stringify"](ret)
    if salt.utils.data.is_true(with_origin):
        return {
            x: {
                "origin": origins.get(x, ""),
                "version": y
            }
            for x, y in ret.items()
        }
    return ret
Exemple #2
0
def file_dict(*packages, **kwargs):
    """
    List the files that belong to a package, grouped by package. Not
    specifying any packages will return a list of _every_ file on the
    system's package database (not generally recommended).

    CLI Examples:

    .. code-block:: bash

        salt '*' pkg.file_list httpd
        salt '*' pkg.file_list httpd postfix
        salt '*' pkg.file_list
    """
    errors = []
    files = {}

    if packages:
        match_pattern = "'{0}-[0-9]*'"
        cmd = ["pkg_info", "-QL"] + [match_pattern.format(p) for p in packages]
    else:
        cmd = ["pkg_info", "-QLa"]

    ret = __salt__["cmd.run_all"](cmd,
                                  output_loglevel="trace",
                                  python_shell=False)

    for line in ret["stderr"].splitlines():
        errors.append(line)

    pkg = None
    for line in ret["stdout"].splitlines():
        if pkg is not None and line.startswith("/"):
            files[pkg].append(line)
        elif ":/" in line:
            pkg, fn = line.split(":", 1)
            pkg, ver = pkg.rsplit("-", 1)
            files[pkg] = [fn]
        else:
            continue  # unexpected string

    return {"errors": errors, "files": files}
Exemple #3
0
def file_dict(*packages):
    '''
    List the files that belong to a package, grouped by package. Not
    specifying any packages will return a list of _every_ file on the
    system's package database (not generally recommended).

    CLI Examples:

    .. code-block:: bash

        salt '*' pkg.file_list httpd
        salt '*' pkg.file_list httpd postfix
        salt '*' pkg.file_list
    '''
    errors = []
    files = {}

    if packages:
        match_pattern = '\'{0}-[0-9]*\''
        cmd = ['pkg_info', '-QL'] + [match_pattern.format(p) for p in packages]
    else:
        cmd = ['pkg_info', '-QLa']

    ret = __salt__['cmd.run_all'](cmd,
                                  output_loglevel='trace',
                                  python_shell=False)

    for line in ret['stderr'].splitlines():
        errors.append(line)

    pkg = None
    for line in ret['stdout'].splitlines():
        if pkg is not None and line.startswith('/'):
            files[pkg].append(line)
        elif ':/' in line:
            pkg, fn = line.split(':', 1)
            pkg, ver = pkg.rsplit('-', 1)
            files[pkg] = [fn]
        else:
            continue  # unexpected string

    return {'errors': errors, 'files': files}
Exemple #4
0
def list_pkgs(versions_as_list=False,
              jail=None,
              chroot=None,
              root=None,
              with_origin=False,
              **kwargs):
    '''
    List the packages currently installed as a dict::

        {'<package_name>': '<version>'}

    jail
        List the packages in the specified jail

    chroot
        List the packages in the specified chroot (ignored if ``jail`` is
        specified)

    root
        List the packages in the specified root (ignored if ``jail`` is
        specified)

    with_origin : False
        Return a nested dictionary containing both the origin name and version
        for each installed package.

        .. versionadded:: 2014.1.0

    CLI Example:

    .. code-block:: bash

        salt '*' pkg.list_pkgs
        salt '*' pkg.list_pkgs jail=<jail name or id>
        salt '*' pkg.list_pkgs chroot=/path/to/chroot
    '''
    # not yet implemented or not applicable
    if any([salt.utils.data.is_true(kwargs.get(x))
            for x in ('removed', 'purge_desired')]):
        return {}

    versions_as_list = salt.utils.data.is_true(versions_as_list)
    contextkey_pkg = _contextkey(jail, chroot, root)
    contextkey_origins = _contextkey(jail, chroot, root, prefix='pkg.origin')

    if contextkey_pkg in __context__:
        ret = copy.deepcopy(__context__[contextkey_pkg])
        if not versions_as_list:
            __salt__['pkg_resource.stringify'](ret)
        if salt.utils.data.is_true(with_origin):
            origins = __context__.get(contextkey_origins, {})
            return dict([
                (x, {'origin': origins.get(x, ''), 'version': y})
                for x, y in six.iteritems(ret)
            ])
        return ret

    ret = {}
    origins = {}
    out = __salt__['cmd.run_stdout'](
        _pkg(jail, chroot, root) + ['info', '-ao'],
        output_loglevel='trace',
        python_shell=False)
    for line in salt.utils.itertools.split(out, '\n'):
        if not line:
            continue
        try:
            pkg, origin = line.split()
            pkgname, pkgver = pkg.rsplit('-', 1)
        except ValueError:
            continue
        __salt__['pkg_resource.add_pkg'](ret, pkgname, pkgver)
        origins[pkgname] = origin

    __salt__['pkg_resource.sort_pkglist'](ret)
    __context__[contextkey_pkg] = copy.deepcopy(ret)
    __context__[contextkey_origins] = origins
    if not versions_as_list:
        __salt__['pkg_resource.stringify'](ret)
    if salt.utils.data.is_true(with_origin):
        return dict([
            (x, {'origin': origins.get(x, ''), 'version': y})
            for x, y in six.iteritems(ret)
        ])
    return ret
Exemple #5
0
def list_pkgs(versions_as_list=False, with_origin=False, **kwargs):
    '''
    List the packages currently installed as a dict::

        {'<package_name>': '<version>'}

    with_origin : False
        Return a nested dictionary containing both the origin name and version
        for each installed package.

        .. versionadded:: 2014.1.0

    CLI Example:

    .. code-block:: bash

        salt '*' pkg.list_pkgs
    '''
    versions_as_list = salt.utils.data.is_true(versions_as_list)
    # not yet implemented or not applicable
    if any([
            salt.utils.data.is_true(kwargs.get(x))
            for x in ('removed', 'purge_desired')
    ]):
        return {}

    if 'pkg.list_pkgs' in __context__:
        ret = copy.deepcopy(__context__['pkg.list_pkgs'])
        if not versions_as_list:
            __salt__['pkg_resource.stringify'](ret)
        if salt.utils.data.is_true(with_origin):
            origins = __context__.get('pkg.origin', {})
            return dict([(x, {
                'origin': origins.get(x, ''),
                'version': y
            }) for x, y in six.iteritems(ret)])
        return ret

    ret = {}
    origins = {}
    out = __salt__['cmd.run_stdout'](['pkg_info', '-ao'],
                                     output_loglevel='trace',
                                     python_shell=False)
    pkgs_re = re.compile(r'Information for ([^:]+):\s*Origin:\n([^\n]+)')
    for pkg, origin in pkgs_re.findall(out):
        if not pkg:
            continue
        try:
            pkgname, pkgver = pkg.rsplit('-', 1)
        except ValueError:
            continue
        __salt__['pkg_resource.add_pkg'](ret, pkgname, pkgver)
        origins[pkgname] = origin

    __salt__['pkg_resource.sort_pkglist'](ret)
    __context__['pkg.list_pkgs'] = copy.deepcopy(ret)
    __context__['pkg.origin'] = origins
    if not versions_as_list:
        __salt__['pkg_resource.stringify'](ret)
    if salt.utils.data.is_true(with_origin):
        return dict([(x, {
            'origin': origins.get(x, ''),
            'version': y
        }) for x, y in six.iteritems(ret)])
    return ret
Exemple #6
0
        salt '*' pkg.file_list httpd
        salt '*' pkg.file_list httpd postfix
        salt '*' pkg.file_list
    """
    errors = []
    files = {}

    if packages:
        match_pattern = "'{0}-[0-9]*'"
        cmd = ["pkg_info", "-QL"] + [match_pattern.format(p) for p in packages]
    else:
        cmd = ["pkg_info", "-QLa"]

    ret = __salt__["cmd.run_all"](cmd, output_loglevel="trace", python_shell=False)

    for line in ret["stderr"].splitlines():
        errors.append(line)

    pkg = None
    for line in ret["stdout"].splitlines():
        if pkg is not None and line.startswith("/"):
            files[pkg].append(line)
        elif ":/" in line:
            pkg, fn = line.split(":", 1)
            pkg, ver = pkg.rsplit("-", 1)
            files[pkg] = [fn]
        else:
            continue  # unexpected string

    return {"errors": errors, "files": files}