Source code for nuka.tasks.yum
"""
yum related tasks
"""
import os
import time
import codecs
from nuka.task import Task
[docs]class update(Task):
"""yum update"""
timestamp_file = '/root/.last-yum-update'
def __init__(self, cache=None, **kwargs):
kwargs.setdefault('name', '')
kwargs.update(cache=cache)
super(update, self).__init__(**kwargs)
def do(self):
cache = self.args['cache']
timestamp_file = self.args.get('timestamp_file', self.timestamp_file)
if cache:
try:
mtime = os.path.getmtime(timestamp_file)
except OSError:
need_update = True
else:
need_update = time.time() < mtime + cache
else:
need_update = True
if need_update:
res = self.sh(['yum', 'update', '-q', '-y'])
if cache:
with codecs.open(timestamp_file, 'w', 'utf8') as fd:
fd.write(str(time.time()))
res['changed'] = True
else:
res = dict(rc=0, changed=False)
return res
[docs]class install(Task):
"""yum install"""
def __init__(self, packages=None, update_cache=None, **kwargs):
kwargs.setdefault('name', ', '.join(packages or []))
kwargs.update(packages=packages, update_cache=update_cache)
super(install, self).__init__(**kwargs)
def pkg_list(self, packages):
installed = []
res = self.sh(['yum', '-q', 'list', 'installed'] + (packages or []),
check=False)
in_list = False
for line in res['stdout'].split('\n'):
if not line:
continue
elif line.lower().startswith('installed packages'):
in_list = True
continue
elif not in_list:
continue
line = line.split()
package = line[0]
package = package.split('.', 1)[0]
installed.append(package)
return installed
def do(self):
"""install packages"""
packages = self.args['packages']
if not packages:
return dict(rc=1, stderr='no packages provided')
installed = self.pkg_list(packages)
to_install = [p for p in packages if p not in installed]
if to_install:
update_cache = self.args.get('update_cache')
if update_cache is not None:
update(cache=update_cache).do()
res = self.sh(['yum', 'install', '-q', '-y'] + packages)
else:
res = dict(rc=0)
res['changed'] = to_install
return res
def diff(self):
packages = self.args['packages']
installed = self.pkg_list(packages)
installed = [p + '\n' for p in sorted(installed)]
packages = [p + '\n' for p in sorted(packages)]
diff = self.lists_diff(installed, packages)
return dict(rc=0, diff=diff, packages=packages)