diff options
author | Olivier Mauras <olivier@mauras.ch> | 2016-09-10 23:36:25 +0200 |
---|---|---|
committer | Jakub Jirutka <jakub@jirutka.cz> | 2016-09-16 00:44:21 +0200 |
commit | ed318eef3659db66bc5308dae20b1a2932dd2258 (patch) | |
tree | 39ce14e5b73c57cc1a597d74e91b1de252053b55 /community/salt | |
parent | 1fa6b2eb53bf56460a16c768109a956689a37f98 (diff) | |
download | aports-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
Diffstat (limited to 'community/salt')
-rw-r--r-- | community/salt/0001-alpine-support.patch | 593 | ||||
-rw-r--r-- | community/salt/APKBUILD | 12 |
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" |