Initial support for openSUSE's zypper

This commit is contained in:
Thomas S Hatch 2012-02-29 20:24:19 -07:00
parent e4e2c383c4
commit d4437c075f

224
salt/modules/zypper.py Normal file
View 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)