47

I am setting up a yum repository, and need to debug some of the URLs in the yum.conf file. I need to know why is Scientific Linux trying to grab this URL, when I was expecting it to grab another URL:

# yum install package 
http://192.168.1.100/pub/scientific/6.1/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 404"
Trying other mirror.
Error: Cannot retrieve repository metadata (repomd.xml) for repository: sl. Please verify its path and try again

The yum.conf(5) manpage gives some information about these variables:

Variables

There are a number of variables you can use to ease maintenance of yum's configuration files. They are available in the values of several options including name, baseurl and commands.

$releasever This will be replaced with the value of the version of the package listed in distroverpkg. This defaults to the version of 'redhat-release' package.

$arch This will be replaced with your architecture as listed by os.uname()[4] in Python.

$basearch This will be replaced with your base architecture in yum. For example, if your $arch is i686 your $basearch will be i386.

$YUM0-$YUM9 These will be replaced with the value of the shell environment variable of the same name. If the shell environment variable does not exist then the configuration file variable will not be replaced.

Is there a way to view these variables by using the yum commandline utility? I would prefer to not hunt down the version of the 'redhat-release' package, or manually get the value of os.uname()[4] in Python.

  • 'hunt down the version of redhat-release' is trivial. cat /etc/redhat-release Actually, use cat /etc/system-release instead, since this will be a symlink to /etc/redhat-release, /etc/centos-release, /etc/oel-release, /etc/<whatever scientific Linux uses>, as appropriate. – Xalorous Oct 19 '16 at 16:01
  • 3
    /etc/redhat-release is not the same thing as the $releasever variable. The question here is to figure out what is Yum substituting in place of these variables? What's happening programmatically? – Stefan Lasiewski Oct 20 '16 at 18:46
  • 1
    'hunt down the version of redhat-release' is also NOT the same as 'cat /etc/redhat-release'. The former asks for a version, whereas the latter views a completely unreliable and infinitely mutable file which should NEVER be trusted. rpm -qf /etc/issue is the canonical method, and would have been the method in LSB except SuSE didn't budge in the FSStnd meetings. YARLY. – user2066657 Dec 5 '17 at 19:09
68

If you install yum-utils, that will give you yum-debug-dump which will write those variables and more debugging info to a file. There is no option to write to stdout, it will always write to some file which really isn't that helpful.

This is obviously not a great solution so here's a python one-liner you can copy and paste which will print those variables to stdout.

python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'

This works on CentOS 5 and 6, but not 4. yum is written in python, so the yum python module is already on your server, no need to install anything exra.

Here's what it looks like on CentOS 5:

[root@somebox]# python -c 'import yum, pprint; yb = yum.YumBase(); pprint.pprint(yb.conf.yumvar, width=1)'
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'releasever': '5',
 'yum0': '200',
 'yum5': 'foo'}
[root@somebox]# 
  • 2
    yum-debug-dump seems to do what I need. Looks like the information is all there under the %%%%YUM INFO section. I can't seem to make things like $YUM0-$YUM9 appear, but I never use those variables anyways. – Stefan Lasiewski Sep 7 '11 at 1:12
  • 2
    To get a clean display of $releasever in the bash shell, use this: /usr/bin/python -c 'import yum;yb=yum.YumBase();yb.doConfigSetup(init_plugins=False);print yb.conf.yumvar["releasever"]' – Rockallite Feb 9 '17 at 7:36
  • This only works for the system version of Python - how do you get this working for an additional "alt-install" version of Python? – RCross Sep 1 '17 at 15:57
  • what do you do if releasever is actually $releasever the string.... – The Lazy Coder Nov 29 '17 at 7:35
8

To get all of them you'll need to use code like mmckinst posted, but if you just want to check $releasever you can run yum version nogroups on RHEL-6.

The other thing to do, in RHEL-6, is to just create your own in /etc/yum/vars.

  • can you elaborate? What does creating /etc/yum/vars accomplish? Also, do you happen to know if this changed from RHEL5 to RHEL6? – Stefan Lasiewski Sep 29 '11 at 16:12
  • 1
    You should be able to write code which works on RHEL-5 and RHEL-6, without a problem. The version command is not in RHEL-5 atm. What I meant about /etc/yum/vars (RHEL-6 only) is that you can just create a /etc/yum/vars/foorelease ... which has your own release data in it, or even just override the system releasever by writing to /etc/yum/vars/releasever. – James Antill Oct 3 '11 at 20:07
  • More info about /etc/yum/vars can be found at access.redhat.com/knowledge/docs/en-US/Red_Hat_Enterprise_Linux/… – Stefan Lasiewski Dec 3 '12 at 19:47
7

Just in case anybody ends up here, like me, looking for the equivalent answer for dnf on Fedora I fathomed out the following python one-liner:

python3 -c 'import dnf, pprint; db = dnf.dnf.Base(); pprint.pprint(db.conf.substitutions,width=1)'

On Fedora 24 it looks like this:

{'arch': 'x86_64',
 'basearch': 'x86_64',
 'releasever': '24'}
  • 1
    Found this from searching yum variables repo names. This answers the question for now, with the replacement of yum with dnf. Great work! – bgStack15 Feb 21 '17 at 22:08
3

And drilling down how $releasever is assigned:

The function _getsysver query the rpm database like:

rpm -q --provides $(rpm -q --whatprovides "system-release(releasever)") | grep "system-release(releasever)" | cut -d ' ' -f 3

"system-release(releasever)" value is defined here, and it could be override by distroverpkg in yum.conf

If the query did not return any value, releasever is set to '$releasever' (for example if you set distroverpkg=centos-release but have installed the rpm redhat-release-server)

0

Another way to see the results of variable substitution is to do something like this:

yum-config-manager -c /etc/reposyncb.conf  | grep -i spacewalk

I was tinkering with yum variables to control which spacewalk client is selected for building a local repo and found this useful to see how the variables are being interpreted.

  • Cool, however this method doesn't seem to provide variables like releasever. – Stefan Lasiewski Oct 1 '13 at 0:14

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.