From b576e389b16a846f28492ff1f0d262387e5d4034 Mon Sep 17 00:00:00 2001 From: Seth Vidal Date: Fri, 9 Mar 2012 18:33:58 -0500 Subject: [PATCH] runner buglet and yum module runner: fix buglet causing logger output to include a u for the command yum: add yum module: ensure=installed pkg=name/name.arch/name-ver-rel.arch ensure=removed pkg=name/name.arch/name-ver-rel.arch list=installed list=updates list=available list=pkgspec list=repos --- lib/ansible/runner.py | 3 +- library/yum | 234 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 library/yum diff --git a/lib/ansible/runner.py b/lib/ansible/runner.py index 5648fd43ef..1c9ef89caf 100755 --- a/lib/ansible/runner.py +++ b/lib/ansible/runner.py @@ -374,12 +374,13 @@ class Runner(object): def remote_log(self, conn, msg): ''' this is the function we use to log things ''' - stdin, stdout, stderr = conn.exec_command('/usr/bin/logger -t ansible -p auth.info %r' % msg) + stdin, stdout, stderr = conn.exec_command('/usr/bin/logger -t ansible -p auth.info "%s"' % msg) # TODO: maybe make that optional def _exec_command(self, conn, cmd): ''' execute a command string over SSH, return the output ''' msg = '%s: %s' % (self.module_name, cmd) + self.remote_log(conn, msg) stdin, stdout, stderr = conn.exec_command(cmd) results = "\n".join(stdout.readlines()) diff --git a/library/yum b/library/yum new file mode 100644 index 0000000000..1a0f4285ca --- /dev/null +++ b/library/yum @@ -0,0 +1,234 @@ +#!/usr/bin/python -tt +# (c) 2012, Red Hat, Inc +# Written by Seth Vidal +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# + + +import os +import sys +import yum +import subprocess +import datetime +import shlex +import re +import traceback + + +try: + import json +except ImportError: + import simplejson as json + + +def yum_base(conf_file=None, cachedir=False): + my = yum.YumBase() + my.preconf.debuglevel=0 + if conf_file and os.path.exists(conf_file): + my.preconf.fn = conf_file + if cachedir: + my.setCacheDir() + + return my + +def pkg_to_dict(po): + d = { + 'name':po.name, + 'arch':po.arch, + 'epoch':po.epoch, + 'release':po.release, + 'version':po.version, + 'repo':po.ui_from_repo, + '_nevra':po.ui_nevra, + } + if type(po) == yum.rpmsack.RPMInstalledPackage: + d['state'] = 'installed' + else: + d['state'] = 'available' + + return d + +def list_stuff(my, stuff): + if stuff == 'installed': + return [ pkg_to_dict(po) for po in my.rpmdb ] + elif stuff == 'updates': + return [ pkg_to_dict(po) for + po in my.doPackageLists(pkgnarrow='updates').updates ] + elif stuff == 'available': + return [ pkg_to_dict(po) for po in my.pkgSack ] + elif stuff == 'repos': + r = [] + for repo in my.repos.repos.values(): + t = {} + s = 'disabled' + if repo.enabled: + s = 'enabled' + r[repo.id] = s + r.append(t) + + return r + else: + e,m,u = my.rpmdb.matchPackageNames([stuff]) + p = e + m + e,m,u = my.pkgSack.matchPackageNames([stuff]) + p = p + e + m + return [ pkg_to_dict(po) for po in p ] + +def run_yum(command): + try: + cmd = subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + out, err = cmd.communicate() + except (OSError, IOError), e: + rc = 1 + err = str(e) + out = '' + except: + rc = 1 + err = traceback.format_exc() + out = '' + + if out is None: + out = '' + if err is None: + err = '' + else: + rc = cmd.returncode + + return rc, out, err + +def ensure(my, state, pkgspec): + yumconf = my.conf.config_file_path + if state == 'installed': + pkg = None + # check if pkgspec is installed + if re.search('[>