mirror of
https://github.com/valitydev/salt.git
synced 2024-11-08 01:18:58 +00:00
Initial support for openSUSE's zypper
This commit is contained in:
parent
e4e2c383c4
commit
d4437c075f
224
salt/modules/zypper.py
Normal file
224
salt/modules/zypper.py
Normal file
@ -0,0 +1,224 @@
|
||||
'''
|
||||
Package support for openSUSE via the zypper package manager
|
||||
'''
|
||||
|
||||
|
||||
def __virtual__():
|
||||
'''
|
||||
Set the virtual pkg module if the os is openSUSE
|
||||
'''
|
||||
return 'pkg' if __grains__['os'] == 'openSUSE' else False
|
||||
|
||||
|
||||
def _list_removed(old, new):
|
||||
'''
|
||||
List the packages which have been removed between the two package objects
|
||||
'''
|
||||
pkgs = []
|
||||
for pkg in old:
|
||||
if pkg not in new:
|
||||
pkgs.append(pkg)
|
||||
return pkgs
|
||||
|
||||
|
||||
def _available_versions():
|
||||
'''
|
||||
The available versions of packages
|
||||
'''
|
||||
cmd = 'zypper packages -i'
|
||||
ret = {}
|
||||
out = __salt__['cmd.run'](cmd).split('\n')
|
||||
for line in out:
|
||||
if not line:
|
||||
continue
|
||||
if '|' not in line:
|
||||
continue
|
||||
comps = []
|
||||
for comp in line.split('|'):
|
||||
comps.append(comp.strip())
|
||||
if comps[0] == 'v':
|
||||
ret[comps[2]] = comps[3]
|
||||
return ret
|
||||
|
||||
def available_version(name):
|
||||
'''
|
||||
Return the available version of a given package
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.available_version <package name>
|
||||
'''
|
||||
avail = _available_versions()
|
||||
return avail.get(name, '')
|
||||
|
||||
def version(name):
|
||||
'''
|
||||
Returns a version if the package is installed, else returns an empty string
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.version <package name>
|
||||
'''
|
||||
pkgs = list_pkgs()
|
||||
if name in pkgs:
|
||||
return pkgs[name]
|
||||
else:
|
||||
return ''
|
||||
|
||||
|
||||
def list_pkgs():
|
||||
'''
|
||||
List the packages currently installed as a dict::
|
||||
|
||||
{'<package_name>': '<version>'}
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.list_pkgs
|
||||
'''
|
||||
cmd = 'zypper packages -i'
|
||||
ret = {}
|
||||
out = __salt__['cmd.run'](cmd).split('\n')
|
||||
for line in out:
|
||||
if not line:
|
||||
continue
|
||||
if '|' not in line:
|
||||
continue
|
||||
comps = []
|
||||
for comp in line.split('|'):
|
||||
comps.append(comp.strip())
|
||||
if comps[0] == 'i':
|
||||
ret[comps[2]] = comps[3]
|
||||
return ret
|
||||
|
||||
|
||||
def refresh_db():
|
||||
'''
|
||||
Just run a ``zypper refresh``, return a dict::
|
||||
|
||||
{'<database name>': Bool}
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.refresh_db
|
||||
'''
|
||||
cmd = 'zypper refresh'
|
||||
ret = {}
|
||||
out = __salt__['cmd.run'](cmd).split('\n')
|
||||
for line in out:
|
||||
if not line:
|
||||
continue
|
||||
if line.strip().startswith('Repository'):
|
||||
key = line.split("'")[1].strip()
|
||||
if 'is up to date' in line:
|
||||
ret[key] = False
|
||||
elif line.strip().startswith('Building'):
|
||||
key = line.split("'")[1].strip()
|
||||
if 'done' in line:
|
||||
ret[key] = True
|
||||
return ret
|
||||
|
||||
|
||||
def install(name, refresh=False, **kwargs):
|
||||
'''
|
||||
Install the passed package, add refresh=True to install with an -Sy
|
||||
|
||||
Return a dict containing the new package names and versions::
|
||||
|
||||
{'<package>': {'old': '<old-version>',
|
||||
'new': '<new-version>']}
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.install <package name>
|
||||
'''
|
||||
old = list_pkgs()
|
||||
cmd = 'zypper -n install -l {0}'.format(name)
|
||||
if refresh:
|
||||
refresh_db()
|
||||
__salt__['cmd.retcode'](cmd)
|
||||
new = list_pkgs()
|
||||
pkgs = {}
|
||||
for npkg in new:
|
||||
if npkg in old:
|
||||
if old[npkg] == new[npkg]:
|
||||
# no change in the package
|
||||
continue
|
||||
else:
|
||||
# the package was here before and the version has changed
|
||||
pkgs[npkg] = {'old': old[npkg],
|
||||
'new': new[npkg]}
|
||||
else:
|
||||
# the package is freshly installed
|
||||
pkgs[npkg] = {'old': '',
|
||||
'new': new[npkg]}
|
||||
return pkgs
|
||||
|
||||
|
||||
def upgrade():
|
||||
'''
|
||||
Run a full system upgrade, a zypper upgrade
|
||||
|
||||
Return a dict containing the new package names and versions::
|
||||
|
||||
{'<package>': {'old': '<old-version>',
|
||||
'new': '<new-version>']}
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.upgrade
|
||||
'''
|
||||
old = list_pkgs()
|
||||
cmd = 'zypper -n up -l'
|
||||
__salt__['cmd.retcode'](cmd)
|
||||
new = list_pkgs()
|
||||
pkgs = {}
|
||||
for npkg in new:
|
||||
if npkg in old:
|
||||
if old[npkg] == new[npkg]:
|
||||
# no change in the package
|
||||
continue
|
||||
else:
|
||||
# the package was here before and the version has changed
|
||||
pkgs[npkg] = {'old': old[npkg],
|
||||
'new': new[npkg]}
|
||||
else:
|
||||
# the package is freshly installed
|
||||
pkgs[npkg] = {'old': '',
|
||||
'new': new[npkg]}
|
||||
return pkgs
|
||||
|
||||
|
||||
def remove(name):
|
||||
'''
|
||||
Remove a single package with ``zypper remove``
|
||||
|
||||
Return a list containing the removed packages.
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.remove <package name>
|
||||
'''
|
||||
old = list_pkgs()
|
||||
cmd = 'zypper -n remove {0}'.format(name)
|
||||
__salt__['cmd.retcode'](cmd)
|
||||
new = list_pkgs()
|
||||
return _list_removed(old, new)
|
||||
|
||||
|
||||
def purge(name):
|
||||
'''
|
||||
Recursively remove a package and all dependencies which were installed
|
||||
with it, this will call a ``zypper remove -u``
|
||||
|
||||
Return a list containing the removed packages.
|
||||
|
||||
CLI Example::
|
||||
|
||||
salt '*' pkg.purge <package name>
|
||||
'''
|
||||
old = list_pkgs()
|
||||
cmd = 'zypper -n remove -u {0}'.format(name)
|
||||
__salt__['cmd.retcode'](cmd)
|
||||
new = list_pkgs()
|
||||
return _list_removed(old, new)
|
Loading…
Reference in New Issue
Block a user