oslevel -s gives bogus message; 70324,004

On AIX 6.1, we see the following error:

# oslevel -s
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.487456.430278_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
6100-02-05-0939
#

This may be something we can further debug, if oslevel is a shell script.

First of all, figure out where oslevel is:

# whereis oslevel
oslevel: /usr/bin/oslevel

Next, figure out what it is:

# file /usr/bin/oslevel
/usr/bin/oslevel: shell script  - ksh (Korn shell)

Now, that we know its a shell, script, we put in a set -x. To do this to the beginning, you
can just put a -x after the ksh line:

Change:

#!/bin/ksh
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# bos53L src/bos/usr/bin/oslevel/oslevel.sh 1.5.6.2
#

To this:

#!/bin/ksh -x
# IBM_PROLOG_BEGIN_TAG
# This is an automatically generated prolog.
#
# bos53L src/bos/usr/bin/oslevel/oslevel.sh 1.5.6.2
#

Then, run it again (I only show the end of the command):

+ [[ 1 = 1 ]]
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]
+ print_current_spack
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.667776.684286_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
6100-02-05-0939
+ exit 0
+ interrupted

Looks like we are looking for a function called ‘print_current_spack’, the set -x doesn’t descend
into functions, so take the original one out and add one into this function:

Before:

print_current_spack()
{
        trap interrupted INT QUIT TERM
        typeset BUF
        typeset DVRMF
        typeset DSPNO
        typeset DTLNO

After:

print_current_spack()
{
        set -x
        trap interrupted INT QUIT TERM
        typeset BUF
        typeset DVRMF
        typeset DSPNO
        typeset DTLNO

Now we see the next level of debugging show up at the top of the output:

# oslevel -s | more
+ trap interrupted INT QUIT TERM
+ typeset BUF
+ typeset DVRMF
+ typeset DSPNO
+ typeset DTLNO
+ get_known_spacks
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.536746.573476_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
+ + /bin/grep _SP: /tmp/oslevel.0.577656/.oslevel.mlinfo
+ /bin/grep :-:
+ /usr/bin/awk -F: { print $1 }

So we just move on to ‘get_known_spacks’. In this case, I can’t find the output easily on the screen,
so I write to a file:

oslevel -s > /tmp/outfile 2>&1

print_current_rml (this may now be official spaghetti code):

+ typeset MVRMF
+ typeset SPNO
+ typeset TLNO
+ + print_current_rml
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.585812.594022_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
BUF=6100-02-00_SP
+ [[ ! -s /tmp/oslevel.0.684192/.oslevel.mlinfo ]]
+ + /usr/bin/awk -F: $1 ~ /_SP$/ { print $1 } /tmp/oslevel.0.684192/.oslevel.mlinfo
+ /usr/bin/sort -t- -r
+ /usr/bin/uniq

Next function = get_known_rmls:

+ trap interrupted INT QUIT TERM
+ get_known_rmls
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.557148.569454_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
+ + /bin/grep _AIX_ML /tmp/oslevel.0.340030/.oslevel.mlinfo
+ grep :-:
+ /usr/bin/awk -F: { print $1 }
+ /usr/bin/uniq

print_min_rml:

+ trap interrupted INT QUIT TERM
+ typeset BUF
+ + print_min_rml
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.512036.557160_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
BUF=6120-00
+ [[ ! -s /tmp/oslevel.0.553194/.oslevel.mlinfo ]]
+ + /usr/bin/awk -F: $1 ~ /_AIX_ML$/ { print $1 } /tmp/oslevel.0.553194/.oslevel.mlinfo
+ /usr/bin/uniq
+ /usr/bin/sort -r
KWN_RML_LEVS=6100-02_AIX_ML
6100-01_AIX_ML
6100-00_AIX_ML
5300-08_AIX_ML

Now, it might be getting trickier:

+ trap interrupted INT QUIT TERM
+ typeset BUF
+ + print_min_rml
+ typeset ERROR=eval /usr/sbin/inuumsg 216 110 >&2; exit 1
+ typeset BUF
+ [[ 1 -ne 1 ]]
+ + /usr/bin/lslpp -qLc bos.rte
+ LC_ALL=C
rpm_share: 0645-024 Unable to access directory /tmp/.workdir.377012.446524_1
rpm_share: 0645-007 ATTENTION: init_baselib() returned an unexpected result.
BUF=bos:bos.rte:6.1.2.1: : :C:F:Base Operating System Runtime: : : : : : :0:0:/:0920
+ + echo bos:bos.rte:6.1.2.1: : :C:F:Base Operating System Runtime: : : : : : :0:0:/:0920
+ awk -F: {split($3,lev,".");
         print lev[1]lev[2]lev[3]"0"; exit(0)}
+ LC_ALL=C

Now, it gets more difficult. First we see that rpm_share is not something called directly, although some research shows that it is a different script. Set -x in it gets stripped out, so that doesn’t help.

Here is the source:

print_min_rml()
{
   typeset ERROR='eval /usr/sbin/inuumsg 216 110 >&2; exit 1'
   typeset BUF

   [[ $recml -ne 1 ]] && return 0

   # There is no RML information, lets print out
   # VRMF-00.
   BUF=$(LC_ALL=C /usr/bin/lslpp -qLc bos.rte) || $ERROR
   BUF=$(echo "$BUF" | LC_ALL=C awk -F: '{split($3,lev,".");
         print lev[1]lev[2]lev[3]"0"; exit(0)}')
   [[ $? -ne 0 || -z $BUF ]] && $ERROR
   echo "${BUF}-00"
   return 0

}  # end of print_min_rml()

Lets walks though it from the shell, one line at a time:

# BUF=$(LC_ALL=C /usr/bin/lslpp -qLc bos.rte)
# echo $BUF
bos:bos.rte:6.1.2.1: : :C:F:Base Operating System Runtime: : : : : : :0:0:/:

I include the echo to make sure we got something, so we move onto the next line:

 echo "$BUF" |  LC_ALL=C awk -F: '{split($3,lev,"."); print lev[1]lev[2]lev[3]"0"; exit(0)}'
6121

I would have done that mass off ugliness differently, but now we have BUF=6121

We are also at the end of this function, it is supposed to return 6.1.2.0-00, and does so, but also throws an error. Lets try to hard-code something to isolate it. This means stepping back a function:

get_known_rmls()
{
   trap interrupted INT QUIT TERM
   typeset BUF

#   BUF=$(print_min_rml)
        BUF="6.1.2.0-00"

   if [[ ! -s $mlinfo ]]; then
      KWN_RML_LEVS=$BUF
      return 0

This works fine:

# oslevel -s
6100-02-05-0939

So know we know the problem must be in ‘print_min_rml’. When we removed the hard-coding, it still seemed to work, maybe it cleared out an unknown wierdness.

Leave a Reply

Your email address will not be published. Required fields are marked *