aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOlivier Mauras <olivier@mauras.ch>2016-09-10 23:36:25 +0200
committerJakub Jirutka <jakub@jirutka.cz>2016-09-16 00:44:21 +0200
commited318eef3659db66bc5308dae20b1a2932dd2258 (patch)
tree39ce14e5b73c57cc1a597d74e91b1de252053b55
parent1fa6b2eb53bf56460a16c768109a956689a37f98 (diff)
downloadaports-ed318eef3659db66bc5308dae20b1a2932dd2258.tar.bz2
aports-ed318eef3659db66bc5308dae20b1a2932dd2258.tar.xz
community/salt: add alpine support for service and pkg modules
Patch will stay until upstream merges these changes
-rw-r--r--community/salt/0001-alpine-support.patch593
-rw-r--r--community/salt/APKBUILD12
2 files changed, 601 insertions, 4 deletions
diff --git a/community/salt/0001-alpine-support.patch b/community/salt/0001-alpine-support.patch
new file mode 100644
index 0000000000..3963ea8173
--- /dev/null
+++ b/community/salt/0001-alpine-support.patch
@@ -0,0 +1,593 @@
+Patch has been merged upstream through PR https://github.com/saltstack/salt/pull/36207
+Will keep the patch until the feature appears in the next version
+---
+diff --git a/salt/modules/apk.py b/salt/modules/apk.py
+new file mode 100644
+index 0000000..40bf38f
+--- /dev/null
++++ b/salt/modules/apk.py
+@@ -0,0 +1,571 @@
++# -*- coding: utf-8 -*-
++'''
++Support for apk
++
++.. important::
++ If you feel that Salt should be using this module to manage packages on a
++ minion, and it is using a different module (or gives an error similar to
++ *'pkg.install' is not available*), see :ref:`here
++ <module-provider-override>`.
++
++.. versionadded: 2016.3.0
++
++'''
++from __future__ import absolute_import
++
++# Import python libs
++import copy
++import logging
++
++# Import salt libs
++import salt.utils
++import salt.utils.itertools
++
++from salt.exceptions import CommandExecutionError
++
++log = logging.getLogger(__name__)
++
++# Define the module's virtual name
++__virtualname__ = 'pkg'
++
++
++def __virtual__():
++ '''
++ Confirm this module is on a nilrt based system
++ '''
++ if __grains__.get('os_family', False) == 'Alpine':
++ return __virtualname__
++ return (False, "Module apk only works on Alpine Linux based systems")
++
++# Unavailable functions
++#def version(*names, **kwargs):
++# return 'Not available'
++#def autoremove(list_only=False, purge=False):
++# return 'Not available'
++#def hold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W0613
++# return 'Not available'
++#def unhold(name=None, pkgs=None, sources=None, **kwargs): # pylint: disable=W0613
++# return 'Not available'
++#def upgrade_available(name):
++# return 'Not available'
++#def version_cmp(pkg1, pkg2, ignore_epoch=False):
++# return 'Not available'
++#def list_repos():
++# return 'Not available'
++#def get_repo(repo, **kwargs):
++# return 'Not available'
++#def del_repo(repo, **kwargs):
++# return 'Not available'
++#def del_repo_key(name=None, **kwargs):
++# return 'Not available'
++#def mod_repo(repo, saltenv='base', **kwargs):
++# return 'Not available'
++#def expand_repo_def(**kwargs):
++# return 'Not available'
++#def get_selections(pattern=None, state=None):
++# return 'Not available'
++#def set_selections(path=None, selection=None, clear=False, saltenv='base'):
++# return 'Not available'
++#def info_installed(*names):
++# return 'Not available'
++
++
++def refresh_db():
++ '''
++ Updates the package list
++
++ - ``True``: Database updated successfully
++ - ``False``: Problem updating database
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.refresh_db
++ '''
++ ret = {}
++ cmd = ['apk', 'update']
++ call = __salt__['cmd.run_all'](cmd,
++ output_loglevel='trace',
++ python_shell=False)
++ if call['retcode'] == 0:
++ errors = []
++ ret = True
++ else:
++ errors = [call['stdout']]
++ ret = False
++
++ if errors:
++ raise CommandExecutionError(
++ 'Problem encountered installing package(s)',
++ info={'errors': errors, 'changes': ret}
++ )
++
++ return ret
++
++
++def list_pkgs(versions_as_list=False, **kwargs):
++ '''
++ List the packages currently installed in a dict::
++
++ {'<package_name>': '<version>'}
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.list_pkgs
++ salt '*' pkg.list_pkgs versions_as_list=True
++ '''
++ versions_as_list = salt.utils.is_true(versions_as_list)
++ # not yet implemented or not applicable
++ if any([salt.utils.is_true(kwargs.get(x))
++ for x in ('removed', 'purge_desired')]):
++ return {}
++
++ if 'pkg.list_pkgs' in __context__:
++ if versions_as_list:
++ return __context__['pkg.list_pkgs']
++ else:
++ ret = copy.deepcopy(__context__['pkg.list_pkgs'])
++ __salt__['pkg_resource.stringify'](ret)
++ return ret
++
++ cmd = ['apk', 'info', '-v']
++ ret = {}
++ out = __salt__['cmd.run'](cmd, output_loglevel='trace', python_shell=False)
++ for line in salt.utils.itertools.split(out, '\n'):
++ pkg_version = '-'.join(line.split('-')[-2:])
++ pkg_name = '-'.join(line.split('-')[:-2])
++ __salt__['pkg_resource.add_pkg'](ret, pkg_name, pkg_version)
++
++ __salt__['pkg_resource.sort_pkglist'](ret)
++ __context__['pkg.list_pkgs'] = copy.deepcopy(ret)
++ if not versions_as_list:
++ __salt__['pkg_resource.stringify'](ret)
++ return ret
++
++
++def latest_version(*names, **kwargs):
++ '''
++ Return the latest version of the named package available for upgrade or
++ installation. If more than one package name is specified, a dict of
++ name/version pairs is returned.
++
++ If the latest version of a given package is already installed, an empty
++ string will be returned for that package.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.latest_version <package name>
++ salt '*' pkg.latest_version <package name>
++ salt '*' pkg.latest_version <package1> <package2> <package3> ...
++ '''
++ refresh = salt.utils.is_true(kwargs.pop('refresh', True))
++
++ if len(names) == 0:
++ return ''
++
++ ret = {}
++ for name in names:
++ ret[name] = ''
++
++ # Refresh before looking for the latest version available
++ if refresh:
++ refresh_db()
++
++ cmd = ['apk', 'upgrade', '-s']
++ out = __salt__['cmd.run_stdout'](cmd,
++ output_loglevel='trace',
++ python_shell=False)
++ for line in salt.utils.itertools.split(out, '\n'):
++ try:
++ name = line.split(' ')[2]
++ _oldversion = line.split(' ')[3].strip('(')
++ newversion = line.split(' ')[5].strip(')')
++ if name in names:
++ ret[name] = newversion
++ except ValueError:
++ pass
++
++ # Return a string if only one package name passed
++ if len(names) == 1:
++ return ret[names[0]]
++ return ret
++
++
++# TODO: Support specific version installation
++def install(name=None,
++ refresh=False,
++ pkgs=None,
++ sources=None,
++ **kwargs):
++ '''
++ Install the passed package, add refresh=True to update the apk database.
++
++ name
++ The name of the package to be installed. Note that this parameter is
++ ignored if either "pkgs" or "sources" is passed. Additionally, please
++ note that this option can only be used to install packages from a
++ software repository. To install a package file manually, use the
++ "sources" option.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.install <package name>
++
++ refresh
++ Whether or not to refresh the package database before installing.
++
++
++ Multiple Package Installation Options:
++
++ pkgs
++ A list of packages to install from a software repository. Must be
++ passed as a python list.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.install pkgs='["foo", "bar"]'
++
++ sources
++ A list of IPK packages to install. Must be passed as a list of dicts,
++ with the keys being package names, and the values being the source URI
++ or local path to the package. Dependencies are automatically resolved
++ and marked as auto-installed.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.install sources='[{"foo": "salt://foo.deb"},{"bar": "salt://bar.deb"}]'
++
++ install_recommends
++ Whether to install the packages marked as recommended. Default is True.
++
++ Returns a dict containing the new package names and versions::
++
++ {'<package>': {'old': '<old-version>',
++ 'new': '<new-version>'}}
++ '''
++ refreshdb = salt.utils.is_true(refresh)
++ pkg_to_install = []
++
++ old = list_pkgs()
++
++ if name and not (pkgs or sources):
++ if ',' in name:
++ pkg_to_install = name.split(',')
++ else:
++ pkg_to_install = [name]
++
++ if pkgs:
++ pkg_to_install.extend(pkgs)
++
++ if not pkg_to_install:
++ return {}
++
++ if refreshdb:
++ refresh_db()
++
++ cmd = ['apk', 'add']
++ cmd.extend(pkg_to_install)
++
++ out = __salt__['cmd.run_all'](
++ cmd,
++ output_loglevel='trace',
++ python_shell=False
++ )
++
++ if out['retcode'] != 0 and out['stderr']:
++ errors = [out['stderr']]
++ else:
++ errors = []
++
++ __context__.pop('pkg.list_pkgs', None)
++ new = list_pkgs()
++ ret = salt.utils.compare_dicts(old, new)
++
++ if errors:
++ raise CommandExecutionError(
++ 'Problem encountered installing package(s)',
++ info={'errors': errors, 'changes': ret}
++ )
++
++ return ret
++
++
++def purge(name=None, pkgs=None, **kwargs):
++ '''
++ Alias to remove
++ '''
++ return remove(name=name, pkgs=pkgs, purge=True)
++
++
++def remove(name=None, pkgs=None, purge=False, **kwargs): # pylint: disable=unused-argument
++ '''
++ Remove packages using ``apk del``.
++
++ name
++ The name of the package to be deleted.
++
++
++ Multiple Package Options:
++
++ pkgs
++ A list of packages to delete. Must be passed as a python list. The
++ ``name`` parameter will be ignored if this option is passed.
++
++ Returns a dict containing the changes.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.remove <package name>
++ salt '*' pkg.remove <package1>,<package2>,<package3>
++ salt '*' pkg.remove pkgs='["foo", "bar"]'
++ '''
++ old = list_pkgs()
++ pkg_to_remove = []
++
++ if name:
++ if ',' in name:
++ pkg_to_remove = name.split(',')
++ else:
++ pkg_to_remove = [name]
++
++ if pkgs:
++ pkg_to_remove.extend(pkgs)
++
++ if not pkg_to_remove:
++ return {}
++
++ if purge:
++ cmd = ['apk', 'del', '--purge']
++ else:
++ cmd = ['apk', 'del']
++
++ cmd.extend(pkg_to_remove)
++
++ out = __salt__['cmd.run_all'](
++ cmd,
++ output_loglevel='trace',
++ python_shell=False
++ )
++ if out['retcode'] != 0 and out['stderr']:
++ errors = [out['stderr']]
++ else:
++ errors = []
++
++ __context__.pop('pkg.list_pkgs', None)
++ new = list_pkgs()
++ ret = salt.utils.compare_dicts(old, new)
++
++ if errors:
++ raise CommandExecutionError(
++ 'Problem encountered removing package(s)',
++ info={'errors': errors, 'changes': ret}
++ )
++
++ return ret
++
++
++def upgrade(name=None, pkgs=None, refresh=True):
++ '''
++ Upgrades all packages via ``apk upgrade`` or a specific package if name or
++ pkgs is specified. Name is ignored if pkgs is specified
++
++ Returns a dict containing the changes.
++
++ {'<package>': {'old': '<old-version>',
++ 'new': '<new-version>'}}
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.upgrade
++ '''
++ ret = {'changes': {},
++ 'result': True,
++ 'comment': '',
++ }
++
++ if salt.utils.is_true(refresh):
++ refresh_db()
++
++ old = list_pkgs()
++
++ pkg_to_upgrade = []
++
++ if name and not pkgs:
++ if ',' in name:
++ pkg_to_upgrade = name.split(',')
++ else:
++ pkg_to_upgrade = [name]
++
++ if pkgs:
++ pkg_to_upgrade.extend(pkgs)
++
++ if pkg_to_upgrade:
++ cmd = ['apk', 'add', '-u']
++ cmd.extend(pkg_to_upgrade)
++ else:
++ cmd = ['apk', 'upgrade']
++
++ call = __salt__['cmd.run_all'](cmd,
++ output_loglevel='trace',
++ python_shell=False,
++ redirect_stderr=True)
++
++ if call['retcode'] != 0:
++ ret['result'] = False
++ if call['stdout']:
++ ret['comment'] = call['stdout']
++
++ __context__.pop('pkg.list_pkgs', None)
++ new = list_pkgs()
++ ret['changes'] = salt.utils.compare_dicts(old, new)
++
++ return ret
++
++
++def list_upgrades(refresh=True):
++ '''
++ List all available package upgrades.
++
++ CLI Example:
++
++ .. code-block:: bash
++
++ salt '*' pkg.list_upgrades
++ '''
++ ret = {}
++ if salt.utils.is_true(refresh):
++ refresh_db()
++
++ cmd = ['apk', 'upgrade', '-s']
++ call = __salt__['cmd.run_all'](cmd,
++ output_loglevel='trace',
++ python_shell=False)
++
++ if call['retcode'] != 0:
++ comment = ''
++ if 'stderr' in call:
++ comment += call['stderr']
++ if 'stdout' in call:
++ comment += call['stdout']
++ raise CommandExecutionError(
++ '{0}'.format(comment)
++ )
++ else:
++ out = call['stdout']
++
++ for line in out.splitlines():
++ if not line.startswith('OK:'):
++ name = line.split(' ')[2]
++ _oldversion = line.split(' ')[3].strip('(')
++ newversion = line.split(' ')[5].strip(')')
++ ret[name] = newversion
++
++ return ret
++
++
++def file_list(*packages):
++ '''
++ List the files that belong to a 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
++ '''
++ return file_dict(*packages)
++
++
++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 = []
++ ret = {}
++ cmd_files = ['apk', 'info', '-L']
++
++ if not packages:
++ return 'Package name should be provided'
++
++ for package in packages:
++ files = []
++ cmd = cmd_files[:]
++ cmd.append(package)
++ out = __salt__['cmd.run_all'](cmd,
++ output_loglevel='trace',
++ python_shell=False)
++ for line in out['stdout'].splitlines():
++ if line.endswith('contains:'):
++ continue
++ else:
++ files.append(line)
++ if files:
++ ret[package] = files
++
++ return {'errors': errors, 'packages': ret}
++
++
++def owner(*paths):
++ '''
++ Return the name of the package that owns the file. Multiple file paths can
++ be passed. Like :mod:`pkg.version <salt.modules.apk.version`, if a single
++ path is passed, a string will be returned, and if multiple paths are passed,
++ a dictionary of file/package name pairs will be returned.
++
++ If the file is not owned by a package, or is not present on the minion,
++ then an empty string will be returned for that path.
++
++ CLI Example:
++
++ salt '*' pkg.owns /usr/bin/apachectl
++ salt '*' pkg.owns /usr/bin/apachectl /usr/bin/basename
++ '''
++ if not paths:
++ return 'You must provide a path'
++
++ ret = {}
++ cmd_search = ['apk', 'info', '-W']
++ for path in paths:
++ cmd = cmd_search[:]
++ cmd.append(path)
++ output = __salt__['cmd.run_stdout'](cmd,
++ output_loglevel='trace',
++ python_shell=False)
++ if output:
++ if 'ERROR:' in output:
++ ret[path] = 'Could not find owner package'
++ else:
++ ret[path] = output.split('by ')[1].strip()
++ else:
++ ret[path] = 'Error running {0}'.format(cmd)
++
++ return ret
+diff --git a/salt/modules/gentoo_service.py b/salt/modules/gentoo_service.py
+index 6345ae3..32dfcde 100644
+--- a/salt/modules/gentoo_service.py
++++ b/salt/modules/gentoo_service.py
+@@ -31,6 +31,8 @@ def __virtual__():
+ '''
+ if __grains__['os'] == 'Gentoo' and not salt.utils.systemd.booted(__context__):
+ return __virtualname__
++ if __grains__['os'] == 'Alpine':
++ return __virtualname__
+ return (False, 'The gentoo_service execution module cannot be loaded: '
+ 'only available on Gentoo/Open-RC systems.')
+
diff --git a/community/salt/APKBUILD b/community/salt/APKBUILD
index 48e2c7fa20..3f14beb028 100644
--- a/community/salt/APKBUILD
+++ b/community/salt/APKBUILD
@@ -22,7 +22,8 @@ source="$pkgname-$pkgver.tar.gz::https://codeload.github.com/saltstack/$pkgname/
salt-minion.confd
salt-minion.initd
salt-syndic.confd
- salt-syndic.initd"
+ salt-syndic.initd
+ 0001-alpine-support.patch"
builddir="$srcdir/$pkgname-$pkgver"
build() {
@@ -128,7 +129,8 @@ md5sums="5db25ad762a0780ff5d74561516a97fa salt-2016.3.3.tar.gz
75badf5042aa93a6da74659ca12bef70 salt-minion.confd
c8326b9cff0df6065a1320eefea09b2c salt-minion.initd
a24d13b018a35b31b34167bcaa749db5 salt-syndic.confd
-dffce15d3a16a2dc40dd02d0c24fb4c6 salt-syndic.initd"
+dffce15d3a16a2dc40dd02d0c24fb4c6 salt-syndic.initd
+87331025b2b76a4b608b54304efd8f53 0001-alpine-support.patch"
sha256sums="7d09bc9142d96ecdfe779cf813e43ab62b9b4632f6e0711af383809661b87e1d salt-2016.3.3.tar.gz
b25cfdb769305f2245b27f6753adee590bac10faeb8c43ba605dbf7e931fe258 salt-api.confd
f8918f2819b81e69af1b8564b90ec370942ed733aefd4b97e5d2446a892880eb salt-api.initd
@@ -137,7 +139,8 @@ f8918f2819b81e69af1b8564b90ec370942ed733aefd4b97e5d2446a892880eb salt-api.initd
286148f5391d42c04a62a13cc125fa2130b5821e50da913c5a20d3a913e5f2d1 salt-minion.confd
ae9236919c3fee3eef0ef8ad54334d6f833a51bbd4d42c40214614498acbe573 salt-minion.initd
66a663c426e2fa157ea78f7f9b2f33f17b72dbc48e119f8dd2609aab8f8370e7 salt-syndic.confd
-6a453f63e51f2cc1ecb024ee8e7fa1beab7fbcea010f3eb10ea23bdb2383e7f5 salt-syndic.initd"
+6a453f63e51f2cc1ecb024ee8e7fa1beab7fbcea010f3eb10ea23bdb2383e7f5 salt-syndic.initd
+b3680210e046ca19eba34169f17eba2604e7dfe5b05984c29ac5663d4f3bd17f 0001-alpine-support.patch"
sha512sums="89a6f9e7d8a337ec5addda2374c833d251162150c4e57ce34f7f9e81a75f540539071064c0e7c4486ef6e447c6422363f868e9b035e4c5af2f3d320e98e0226d salt-2016.3.3.tar.gz
975ba2f5e681fbd62045da61cc3dc065b148683a07b5df7eca9f131e47314eb6bfa8660ca1c06a3bd93683c7097d0ff9f8e514273dd24d82fb2de6a255e6b275 salt-api.confd
435d399bfecf431d0c713031e2ae57ce25b5c6edc98b62f33bd7a4ff1c587e3cdeb988445ae0c3e9ffc1911555c3694654d98815f9562b8a14bf0688ec1ebea6 salt-api.initd
@@ -146,4 +149,5 @@ cfbbeb8023a383e7c42d84e3346edfd068c9ec7650c4ddc3caa38534da325a67497e1f06ca02cc1f
0051e13351cef8db81dc075a194bb384723f07d5591b5b4d3f3adf4180afaf7beced470ab79ceca9d1ec0dae62dbd72084eb76af009fc78411a011050a94a2ed salt-minion.confd
c6634a592c6f3e65dd2b704cb500486bf8004c5b287d4a4d42b09af36ef129c59d6a89f005af058cf7911e8587d927b3db931186569084f13ebaca56f6ef93a0 salt-minion.initd
bafc6ea10cdafd0aef868feb35aecbe4ae6a7dff0ae42862bded85715ad763eb89e1ed27437866a7e5f2b9f7064e3c2a3fb59814487744ba4227238d95cf3818 salt-syndic.confd
-d71133e834685304e0167554035ebbc861252f972bbe981cc71e45b70f15d94a28a02a369463c9a641372919689f96b62a0408b14f824ad986d536e52b1e5ec0 salt-syndic.initd"
+d71133e834685304e0167554035ebbc861252f972bbe981cc71e45b70f15d94a28a02a369463c9a641372919689f96b62a0408b14f824ad986d536e52b1e5ec0 salt-syndic.initd
+6e4d3129b661184317f60dda7217fec3815f59d126c368ff73e89a32a46e96c1b243614506f5f81b4f42130ef64153e90c9828e0d7c743d52dcff980d068c0fa 0001-alpine-support.patch"