| Server IP : 162.144.4.212 / Your IP : 216.73.216.9 Web Server : Apache System : Linux gator2125.hostgator.com 4.19.286-203.ELK.el7.x86_64 #1 SMP Wed Jun 14 04:33:55 CDT 2023 x86_64 User : cozeellc ( 2980) PHP Version : 8.3.30 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /lib/yum-plugins/ |
Upload File : |
# This program 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 2 of the License, or
# (at your option) any later version.
#
# This program 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 Library General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
# Copyright 2008 Red Hat, Inc
# written by Seth Vidal <skvidal@fedoraproject.org>
"""
This plugin runs actions following the transaction based on the content of
the transaction.
"""
from yum.plugins import TYPE_CORE
from yum.constants import *
import yum.misc
from yum.parser import varReplace
from yum.packages import parsePackages
import fnmatch
import re
import os
import glob
import shlex
requires_api_version = '2.4'
plugin_type = (TYPE_CORE,)
_just_installed = {} # pkgtup = po
def parse_actions(ddir, conduit):
"""read in .action files from ddir path.
store content in a list of tuples"""
action_tuples = [] # (action key, action_state, shell command)
action_file_list = []
if os.access(ddir, os.R_OK):
action_file_list.extend(glob.glob(ddir + "*.action"))
if action_file_list:
for f in action_file_list:
for line in open(f).readlines():
line = line.strip()
if line and line[0] != "#":
try:
(a_key, a_state, a_command) = line.split(':', 2)
except ValueError,e:
conduit.error(2,'Bad Action Line: %s' % line)
continue
else:
action_tuples.append((a_key, a_state, a_command))
return action_tuples
def _get_installed_po(rpmdb, pkgtup):
(n,a,e,v,r) = pkgtup
if pkgtup in _just_installed:
return _just_installed[pkgtup]
return rpmdb.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r)[0]
def _convert_vars(txmbr, command):
"""converts %options on the command to their values from the package it
is running it for: takes $name, $arch, $ver, $rel, $epoch,
$state, $repoid"""
state_dict = { TS_INSTALL: 'install',
TS_TRUEINSTALL: 'install',
TS_OBSOLETING: 'obsoleting',
TS_UPDATE: 'updating',
TS_ERASE: 'remove',
TS_OBSOLETED: 'obsoleted',
TS_UPDATED: 'updated'}
try:
state = state_dict[txmbr.output_state]
except KeyError:
state = 'unknown - %s' % txmbr.output_state
vardict = {'name': txmbr.name,
'arch': txmbr.arch,
'ver': txmbr.version,
'rel': txmbr.release,
'epoch': txmbr.epoch,
'repoid': txmbr.repoid,
'state': state }
result = varReplace(command, vardict)
return result
def pretrans_hook(conduit):
# Prefetch filelist for packages to be removed,
# otherwise for updated packages headers will not be available
ts = conduit.getTsInfo()
removes = ts.getMembersWithState(output_states=TS_REMOVE_STATES)
for txmbr in removes:
txmbr.po.filelist
def posttrans_hook(conduit):
# we have provides/requires for everything
# we do not have filelists for erasures
# we have to fetch filelists for the package object for installs/updates
action_dir = conduit.confString('main','actiondir','/etc/yum/post-actions/')
action_tuples = parse_actions(action_dir, conduit)
commands_to_run = {}
ts = conduit.getTsInfo()
rpmdb = conduit.getRpmDB()
all = ts.getMembers()
removes = ts.getMembersWithState(output_states=TS_REMOVE_STATES)
installs = ts.getMembersWithState(output_states=TS_INSTALL_STATES)
updates = ts.getMembersWithState(output_states=[TS_UPDATE, TS_OBSOLETING])
for (a_k, a_s, a_c) in action_tuples:
#print 'if %s in state %s the run %s' %( a_k, a_s, a_c)
if a_s == 'update':
pkgset = updates
elif a_s == 'install':
pkgset = installs
elif a_s == 'remove':
pkgset = removes
elif a_s == 'any':
pkgset = all
else:
# no idea what this is skip it
conduit.error(2,'whaa? %s' % a_s)
continue
if a_k.startswith('/'):
if yum.misc.re_glob(a_k):
restring = fnmatch.translate(a_k)
c_string = re.compile(restring)
for txmbr in pkgset:
thispo = txmbr.po
if txmbr.output_state in TS_INSTALL_STATES:
# thispo is AvailablePackage; filelist access could trigger download
# of the filelist. Since it's installed now, use rpmdb data instead.
thispo = _get_installed_po(rpmdb, txmbr.pkgtup)
if not yum.misc.re_glob(a_k):
if a_k in thispo.filelist + thispo.dirlist + thispo.ghostlist:
thiscommand = _convert_vars(txmbr, a_c)
commands_to_run[thiscommand] = 1
break
else:
for name in thispo.filelist + thispo.dirlist + thispo.ghostlist:
if c_string.match(name):
thiscommand = _convert_vars(txmbr, a_c)
commands_to_run[thiscommand] = 1
break
continue
if a_k.find('/') == -1: # pkgspec
pkgs = [ txmbr.po for txmbr in pkgset ]
e,m,u = parsePackages(pkgs, [a_k])
if not u:
for pkg in e+m:
for txmbr in ts.getMembers(pkgtup=pkg.pkgtup):
thiscommand = _convert_vars(txmbr, a_c)
commands_to_run[thiscommand] = 1
continue
for comm in commands_to_run.keys():
try:
args = shlex.split(comm)
except ValueError, e:
conduit.error(2,"command was not parseable: %s" % comm)
continue
#try
conduit.info(2,'Running post transaction command: %s' % comm)
p = os.system(comm)
#except?