@ -285,11 +285,13 @@ def_qf = "%{epoch}:%{name}-%{version}-%{release}.%{arch}"
rpmbin = None
def yum_base ( conf_file = None , installroot = ' / ' ):
def yum_base ( conf_file = None , installroot = ' / ' , enabled_plugins = None , disabled_plugins = None ):
my = yum . YumBase ( )
my . preconf . debuglevel = 0
my . preconf . errorlevel = 0
my . preconf . plugins = True
my . preconf . enabled_plugins = enabled_plugins
my . preconf . disabled_plugins = disabled_plugins
# my.preconf.releasever = '/'
if installroot != ' / ' :
# do not setup installroot by default, because of error
@ -352,10 +354,10 @@ def po_to_envra(po):
return ' %s : %s - %s - %s . %s ' % ( po . epoch , po . name , po . version , po . release , po . arch )
def is_group_env_installed ( name , conf_file , installroot= ' / ' ) :
def is_group_env_installed ( name , conf_file , en_plugins= None , dis_plugins = None , installroot= ' / ' ) :
name_lower = name . lower ( )
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , en_plugins , dis_plugins )
if yum . __version_info__ > = ( 3 , 4 ) :
groups_list = my . doGroupLists ( return_evgrps = True )
else :
@ -377,7 +379,7 @@ def is_group_env_installed(name, conf_file, installroot='/'):
return False
def is_installed ( module , repoq , pkgspec , conf_file , qf = None , en_repos = None , dis_repos = None , is_pkg= False , installroot = ' / ' ) :
def is_installed ( module , repoq , pkgspec , conf_file , qf = None , en_repos = None , dis_repos = None , en_plugins= None , dis_plugins = None , is_pkg= False , installroot = ' / ' ) :
if en_repos is None :
en_repos = [ ]
if dis_repos is None :
@ -388,7 +390,7 @@ def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_
if not repoq :
pkgs = [ ]
try :
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , en_plugins , dis_plugins )
for rid in dis_repos :
my . repos . disableRepo ( rid )
for rid in en_repos :
@ -439,7 +441,7 @@ def is_installed(module, repoq, pkgspec, conf_file, qf=None, en_repos=None, dis_
return [ ]
def is_available ( module , repoq , pkgspec , conf_file , qf = def_qf , en_repos = None , dis_repos = None , installroot= ' / ' ) :
def is_available ( module , repoq , pkgspec , conf_file , qf = def_qf , en_repos = None , dis_repos = None , en_plugins= None , dis_plugins = None , installroot= ' / ' ) :
if en_repos is None :
en_repos = [ ]
if dis_repos is None :
@ -449,7 +451,7 @@ def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, di
pkgs = [ ]
try :
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , en_plugins , dis_plugins )
for rid in dis_repos :
my . repos . disableRepo ( rid )
for rid in en_repos :
@ -483,7 +485,7 @@ def is_available(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, di
return [ ]
def is_update ( module , repoq , pkgspec , conf_file , qf = def_qf , en_repos = None , dis_repos = None , installroot= ' / ' ) :
def is_update ( module , repoq , pkgspec , conf_file , qf = def_qf , en_repos = None , dis_repos = None , en_plugins= None , dis_plugins = None , installroot= ' / ' ) :
if en_repos is None :
en_repos = [ ]
if dis_repos is None :
@ -496,7 +498,7 @@ def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_r
updates = [ ]
try :
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , en_plugins , dis_plugins )
for rid in dis_repos :
my . repos . disableRepo ( rid )
for rid in en_repos :
@ -535,7 +537,9 @@ def is_update(module, repoq, pkgspec, conf_file, qf=def_qf, en_repos=None, dis_r
return set ( )
def what_provides ( module , repoq , yum_basecmd , req_spec , conf_file , qf = def_qf , en_repos = None , dis_repos = None , installroot = ' / ' ) :
def what_provides ( module , repoq , yum_basecmd , req_spec , conf_file , qf = def_qf ,
en_repos = None , dis_repos = None , en_plugins = None ,
dis_plugins = None , installroot = ' / ' ) :
if en_repos is None :
en_repos = [ ]
if dis_repos is None :
@ -545,7 +549,7 @@ def what_provides(module, repoq, yum_basecmd, req_spec, conf_file, qf=def_qf, en
pkgs = [ ]
try :
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , en_plugins , dis_plugins )
for rid in dis_repos :
my . repos . disableRepo ( rid )
for rid in en_repos :
@ -790,7 +794,7 @@ def exec_install(module, items, action, pkgs, res, yum_basecmd):
return res
def install ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , installroot= ' / ' , allow_downgrade = False ) :
def install ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , en_plugins, dis_plugins , installroot= ' / ' , allow_downgrade = False ) :
pkgs = [ ]
downgrade_pkgs = [ ]
@ -822,13 +826,17 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
envra = local_envra ( package )
if envra is None :
module . fail_json ( msg = " Failed to get nevra information from RPM package: %s " % spec )
installed_pkgs = is_installed ( module , repoq , envra , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
installed_pkgs = is_installed ( module , repoq , envra , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot )
if installed_pkgs :
res [ ' results ' ] . append ( ' %s providing %s is already installed ' % ( installed_pkgs [ 0 ] , package ) )
continue
( name , ver , rel , epoch , arch ) = splitFilename ( envra )
installed_pkgs = is_installed ( module , repoq , name , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
installed_pkgs = is_installed ( module , repoq , name , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot )
# case for two same envr but differrent archs like x86_64 and i686
if len ( installed_pkgs ) == 2 :
@ -863,7 +871,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
# groups
elif spec . startswith ( ' @ ' ) :
if is_group_env_installed ( spec , conf_file , installroot= installroot ) :
if is_group_env_installed ( spec , conf_file , en_plugins= en_plugins , dis_plugins = dis_plugins , installroot= installroot ) :
continue
pkg = spec
@ -874,13 +882,18 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
# short circuit all the bs - and search for it as a pkg in is_installed
# if you find it then we're done
if not set ( [ ' * ' , ' ? ' ] ) . intersection ( set ( spec ) ) :
installed_pkgs = is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , is_pkg = True , installroot = installroot )
installed_pkgs = is_installed ( module , repoq , spec , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , is_pkg = True ,
installroot = installroot )
if installed_pkgs :
res [ ' results ' ] . append ( ' %s providing %s is already installed ' % ( installed_pkgs [ 0 ] , spec ) )
continue
# look up what pkgs provide this
pkglist = what_provides ( module , repoq , yum_basecmd , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
pkglist = what_provides ( module , repoq , yum_basecmd , spec , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins , dis_plugins = dis_plugins ,
installroot = installroot )
if not pkglist :
res [ ' msg ' ] + = " No package matching ' %s ' found available, installed or updated " % spec
res [ ' results ' ] . append ( " No package matching ' %s ' found available, installed or updated " % spec )
@ -900,7 +913,9 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
found = False
for this in pkglist :
if is_installed ( module , repoq , this , conf_file , en_repos = en_repos , dis_repos = dis_repos , is_pkg = True , installroot = installroot ) :
if is_installed ( module , repoq , this , conf_file , en_repos = en_repos , dis_repos = dis_repos ,
en_plugins = en_plugins , dis_plugins = dis_plugins , is_pkg = True ,
installroot = installroot ) :
found = True
res [ ' results ' ] . append ( ' %s providing %s is already installed ' % ( this , spec ) )
break
@ -911,7 +926,8 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
# but virt provides should be all caught in what_provides on its own.
# highly irritating
if not found :
if is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) :
if is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos ,
en_plugins = en_plugins , dis_plugins = dis_plugins , installroot = installroot ) :
found = True
res [ ' results ' ] . append ( ' package providing %s is already installed ' % ( spec ) )
@ -929,7 +945,9 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
( name , ver , rel , epoch , arch ) = splitFilename ( package )
# Check if any version of the requested package is installed
inst_pkgs = is_installed ( module , repoq , name , conf_file , en_repos = en_repos , dis_repos = dis_repos , is_pkg = True )
inst_pkgs = is_installed ( module , repoq , name , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , is_pkg = True )
if inst_pkgs :
( cur_name , cur_ver , cur_rel , cur_epoch , cur_arch ) = splitFilename ( inst_pkgs [ 0 ] )
compare = compareEVR ( ( cur_epoch , cur_ver , cur_rel ) , ( epoch , ver , rel ) )
@ -958,7 +976,7 @@ def install(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, i
return res
def remove ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , installroot= ' / ' ) :
def remove ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , en_plugins, dis_plugins , installroot= ' / ' ) :
pkgs = [ ]
res = { }
@ -969,9 +987,11 @@ def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, in
for pkg in items :
if pkg . startswith ( ' @ ' ) :
installed = is_group_env_installed ( pkg , conf_file , installroot= installroot )
installed = is_group_env_installed ( pkg , conf_file , en_plugins= en_plugins , dis_plugins = dis_plugins , installroot= installroot )
else :
installed = is_installed ( module , repoq , pkg , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
installed = is_installed ( module , repoq , pkg , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot )
if installed :
pkgs . append ( pkg )
@ -1002,9 +1022,11 @@ def remove(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, in
# at this point we check to see if the pkg is no longer present
for pkg in pkgs :
if pkg . startswith ( ' @ ' ) :
installed = is_group_env_installed ( pkg , conf_file , installroot= installroot )
installed = is_group_env_installed ( pkg , conf_file , en_plugins= en_plugins , dis_plugins = dis_plugins , installroot= installroot )
else :
installed = is_installed ( module , repoq , pkg , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
installed = is_installed ( module , repoq , pkg , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot )
if installed :
module . fail_json ( * * res )
@ -1060,7 +1082,7 @@ def parse_check_update(check_update_output):
return updates
def latest ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , update_only, installroot = ' / ' ) :
def latest ( module , items , repoq , yum_basecmd , conf_file , en_repos , dis_repos , en_plugins, dis_plugins , update_only, installroot = ' / ' ) :
res = { }
res [ ' results ' ] = [ ]
@ -1120,7 +1142,9 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, up
module . fail_json ( msg = " Failed to get nevra information from RPM package: %s " % spec )
# local rpm files can't be updated
if not is_installed ( module , repoq , envra , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) :
if not is_installed ( module , repoq , envra , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot ) :
pkgs [ ' install ' ] . append ( spec )
continue
@ -1135,17 +1159,22 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, up
module . fail_json ( msg = " Failed to get nevra information from RPM package: %s " % spec )
# local rpm files can't be updated
if not is_installed ( module , repoq , envra , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) :
if not is_installed ( module , repoq , envra , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot ) :
pkgs [ ' install ' ] . append ( package )
continue
# dep/pkgname - find it
else :
if is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) or update_only :
if is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos ,
en_plugins = en_plugins , dis_plugins = dis_plugins , installroot = installroot ) or update_only :
pkgs [ ' update ' ] . append ( spec )
else :
pkgs [ ' install ' ] . append ( spec )
pkglist = what_provides ( module , repoq , yum_basecmd , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot )
pkglist = what_provides ( module , repoq , yum_basecmd , spec , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins , dis_plugins = dis_plugins ,
installroot = installroot )
# FIXME..? may not be desirable to throw an exception here if a single package is missing
if not pkglist :
res [ ' msg ' ] + = " No package matching ' %s ' found available, installed or updated " % spec
@ -1155,7 +1184,10 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, up
nothing_to_do = True
for pkg in pkglist :
if spec in pkgs [ ' install ' ] and is_available ( module , repoq , pkg , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) :
if spec in pkgs [ ' install ' ] and is_available ( module , repoq , pkg , conf_file ,
en_repos = en_repos , dis_repos = dis_repos ,
en_plugins = en_plugins , dis_plugins = dis_plugins ,
installroot = installroot ) :
nothing_to_do = False
break
@ -1173,7 +1205,9 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, up
will_update_from_other_package [ spec ] = pkgname
break
if not is_installed ( module , repoq , spec , conf_file , en_repos = en_repos , dis_repos = dis_repos , installroot = installroot ) and update_only :
if not is_installed ( module , repoq , spec , conf_file , en_repos = en_repos ,
dis_repos = dis_repos , en_plugins = en_plugins ,
dis_plugins = dis_plugins , installroot = installroot ) and update_only :
res [ ' results ' ] . append ( " Packages providing %s not installed due to update_only specified " % spec )
continue
if nothing_to_do :
@ -1238,7 +1272,7 @@ def latest(module, items, repoq, yum_basecmd, conf_file, en_repos, dis_repos, up
def ensure ( module , state , pkgs , conf_file , enablerepo , disablerepo ,
disable_gpg_check , exclude , repoq , skip_broken , update_only , security ,
installroot = ' / ' , allow_downgrade = False , disable_plugin = ' ' , enable_plugin = ' ' ) :
installroot = ' / ' , allow_downgrade = False , disable_plugin = None , enable_plugin = None ) :
# fedora will redirect yum to dnf, which has incompatibilities
# with how this module expects yum to operate. If yum-deprecated
@ -1272,10 +1306,10 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
yum_basecmd . extend ( r_cmd )
if enable_plugin :
yum_basecmd . extend ( [ ' --enableplugin ' , enable_plugin ] )
yum_basecmd . extend ( [ ' --enableplugin ' , ' , ' . join ( enable_plugin ) ] )
if disable_plugin :
yum_basecmd . extend ( [ ' --disableplugin ' , disable_plugin ] )
yum_basecmd . extend ( [ ' --disableplugin ' , ' , ' . join ( disable_plugin ) ] )
if exclude :
e_cmd = [ ' --exclude= %s ' % exclude ]
@ -1317,7 +1351,7 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
if module . params . get ( ' update_cache ' ) :
module . run_command ( yum_basecmd + [ ' clean ' , ' expire-cache ' ] )
my = yum_base ( conf_file , installroot )
my = yum_base ( conf_file , installroot , enable_plugin , disable_plugin )
try :
if disablerepo :
my . repos . disableRepo ( disablerepo )
@ -1338,15 +1372,17 @@ def ensure(module, state, pkgs, conf_file, enablerepo, disablerepo,
if state in [ ' installed ' , ' present ' ] :
if disable_gpg_check :
yum_basecmd . append ( ' --nogpgcheck ' )
res = install ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos , installroot = installroot , allow_downgrade = allow_downgrade )
res = install ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos ,
enable_plugin , disable_plugin , installroot = installroot ,
allow_downgrade = allow_downgrade )
elif state in [ ' removed ' , ' absent ' ] :
res = remove ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos , installroot = installroot )
res = remove ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos , enable_plugin, disable_plugin , installroot= installroot )
elif state == ' latest ' :
if disable_gpg_check :
yum_basecmd . append ( ' --nogpgcheck ' )
if security :
yum_basecmd . append ( ' --security ' )
res = latest ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos , update_only, installroot = installroot )
res = latest ( module , pkgs , repoq , yum_basecmd , conf_file , en_repos , dis_repos , enable_plugin, disable_plugin , update_only, installroot = installroot )
else :
# should be caught by AnsibleModule argument_spec
module . fail_json ( msg = " we should never get here unless this all failed " ,
@ -1404,12 +1440,8 @@ def main():
module . fail_json ( msg = ' . ' . join ( error_msgs ) )
params = module . params
enable_plugin = params . get ( ' enable_plugin ' , ' ' )
if enable_plugin :
enable_plugin = ' , ' . join ( enable_plugin )
disable_plugin = params . get ( ' disable_plugin ' , ' ' )
if disable_plugin :
disable_plugin = ' , ' . join ( disable_plugin )
enable_plugin = params . get ( ' enable_plugin ' )
disable_plugin = params . get ( ' disable_plugin ' )
if params [ ' list ' ] :
repoquerybin = ensure_yum_utils ( module )
@ -1423,7 +1455,7 @@ def main():
# the system then users will see an error message using the yum API.
# Use repoquery in those cases.
my = yum_base ( params [ ' conf_file ' ] , params [ ' installroot ' ] )
my = yum_base ( params [ ' conf_file ' ] , params [ ' installroot ' ] , enable_plugin , disable_plugin )
# A sideeffect of accessing conf is that the configuration is
# loaded and plugins are discovered
my . conf