[PATCH] ver_linux: uniform output across various linux distros

From: Alexander Kapshuk
Date: Tue Sep 29 2015 - 11:37:19 EST


On Mon, Sep 28, 2015 at 10:42 PM, Alexander Kapshuk
<alexander.kapshuk@xxxxxxxxx> wrote:
> On Mon, Sep 28, 2015 at 5:09 PM, Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx> wrote:
>> On Mon, Sep 28, 2015 at 07:50:37AM +0300, Alexander Kapshuk wrote:
>>> Hello,
>>
>> Hi!
>>
>> First off, your Subject: is a bit odd, you might want to fix up your
>> email client :)
>>
>>>
>>> Having run 'scripts/ver_linux' on my Gentoo system, as well as having
>>> looked through some recent bug reports on the kernel bugzilla website
>>> showing the output of the script in question, I have observed that
>>> the output is not accurate across various distros. While the current
>>> implementation of the script expects the version info to be found in
>>> particular fields, some of the utilities invoked by the script, output
>>> their version information in varying formats, which results in the
>>> script displaying information other than the version number.
>>>
>>> The proposed implementation relies mostly on sed to detect the version
>>> numbers more accurately. Running the patched version of the script on
>>> the distros below resulted in accurate and uniform output.
>>>
>>> Gentoo Linux
>>> Debian 6.0.10
>>> Oracle Linux Server release 7.1
>>> Arch Linux
>>>
>>> The items left unchanged are those I did not have access to. I would
>>> be willing to work on those too, if supplied the output of the affected
>>> commands whose format differs based on the distro.
>>
>> <snip>
>>
>> Your patch is a bit complex, you are changing the formatting, and at the
>> same time, also changing the code. Please do this in multiple patches,
>> one to fix any issues you see, and the second to then clean up the
>> formatting, making it easier to actually see what the difference is
>> here.
>>
>> Also, take a look at Documentation/SubmittingPatches for the proper
>> format of a kernel patch to ensure we are able to accept it (hint, your
>> patch is missing the signed-off-by line in the body of the changelog
>> area).
>>
>> thanks,
>>
>> greg k-h
>
> Thanks very much for the tips you've given.
>
> I'll go and read through 'Documentation/SubmittingPatches' again, as I
> seem not to have clearly understood the things you've pointed out.
> I'll get back to the list at a later time, hopefully, with a patch
> that meets the requirements.

I've reread 'Documentation/SubmittingPatches', and opted for method 1
to create the patch.

When you mentioned about the patch changing the formatting, were you
referring to the formatting of the actual script, or the output the
script generated? If it's the former, I'm not sure I'm clear on how to
keep separate the changes made to the code base from the changes in
the formatting of the new code base introduced by these changes. If
it's the latter, the overall output generated by the script is mostly
identical to that generated by the original implementation.

If the patch below is still off the mark, I apologise for that, and
would appreciate being pointed out what else needs changing, when you
have the time. I understand you having more pressing matters to attend
to.

Signed-off-by: Alexander Kapshuk <alexander.kapshuk@xxxxxxxxx>
---
--- ver_linux.orig 2015-08-30 21:34:09.000000000 +0300
+++ ver_linux 2015-09-29 17:47:35.692348337 +0300
@@ -4,54 +4,112 @@
# /bin /sbin /usr/bin /usr/sbin /usr/local/bin, but it may
# differ on your system.
#
+
echo 'If some fields are empty or look unusual you may have an old version.'
echo 'Compare to the current minimal requirements in Documentation/Changes.'
-echo ' '
+echo

uname -a
-echo ' '
-
-gcc -dumpversion 2>&1| awk \
-'NR==1{print "Gnu C ", $1}'
-
-make --version 2>&1 | awk -F, '{print $1}' | awk \
- '/GNU Make/{print "Gnu make ",$NF}'
-
-echo "binutils $(ld -v | egrep -o '[0-9]+\.[0-9\.]+')"
-
-echo -n "util-linux "
-fdformat --version | awk '{print $NF}' | sed -e s/^util-linux-// -e s/\)$//
+echo

-echo -n "mount "
-mount --version | awk '{print $NF}' | sed -e s/^mount-// -e s/\)$//
-
-depmod -V 2>&1 | awk 'NR==1 {print "module-init-tools ",$NF}'
-
-tune2fs 2>&1 | grep "^tune2fs" | sed 's/,//' | awk \
-'NR==1 {print "e2fsprogs ", $2}'
-
-fsck.jfs -V 2>&1 | grep version | sed 's/,//' | awk \
-'NR==1 {print "jfsutils ", $3}'
-
-reiserfsck -V 2>&1 | grep ^reiserfsck | awk \
-'NR==1{print "reiserfsprogs ", $2}'
+gcc -dumpversion 2>&1 |
+sed '
+ /^[0-9\.]*$/!d
+ s/^/GNU C\t\t\t/
+'
+
+make --version 2>&1 |
+sed '
+ /^\(GNU Make\)[ \t]/!d
+ s//\1\t\t/
+'
+
+ld -v 2>&1 |
+sed '
+ /[0-9]$/!d
+ s/-.*//
+ s/.*[ \t]//
+ s/^/binutils\t\t/
+'
+
+mount --version 2>&1 |
+sed '
+ /^mount/!d
+ s/.*util-linux//
+ s/lib.*//
+ s/[^0-9\.]//g
+ s/^/util-linux\t\t/
+ h
+ s/util-linux/mount\t/
+ H
+ g
+'
+
+/sbin/depmod -V 2>&1 |
+sed '
+ /[0-9]$/!d
+ s/[^0-9\.]//g
+ s/^/module-init-tools\t/
+'
+
+/sbin/tune2fs 2>&1 |
+sed '
+ /^tune2fs/!d
+ s/-.*//
+ s/[^0-9\.]*//
+ s/.*[ \t]\(.*\)[ \t].*/e2fsprogs\t\t\1/
+'
+
+fsck.jfs -V 2>&1 |
+sed '
+ /version/!d
+ s/.*version[ \t]//
+ s/[ \t].*//
+ s/[^0-9]$//
+ s/^/jfsutils\t/
+'
+
+reiserfsck -V 2>&1 |
+sed '
+ /^reiserfsck/!d
+ s/[^0-9\.]//g
+ /^$/d
+ s/^/reiserfsprogs\t/
+'

fsck.reiser4 -V 2>&1 | grep ^fsck.reiser4 | awk \
'NR==1{print "reiser4progs ", $2}'

-xfs_db -V 2>&1 | grep version | awk \
-'NR==1{print "xfsprogs ", $3}'
-
-pccardctl -V 2>&1| grep pcmciautils | awk '{print "pcmciautils
", $2}'
+xfs_db -V 2>&1 |
+sed '
+ /version/!d
+ s/[^0-9\.]//g
+ s/^/xfsprogs\t\t\t/
+'
+
+pccardctl -V 2>&1 |
+sed '
+ /^\(pcmciautils\)[ \t]/!d
+ s//\1\t\t/
+'

cardmgr -V 2>&1| grep version | awk \
'NR==1{print "pcmcia-cs ", $3}'

-quota -V 2>&1 | grep version | awk \
-'NR==1{print "quota-tools ", $NF}'
-
-pppd --version 2>&1| grep version | awk \
-'NR==1{print "PPP ", $3}'
+quota -V 2>&1 |
+sed '
+ /version/!d
+ s/[^0-9\.]//g
+ s/\.$//
+ s/^/quota-tools\t\t/
+'
+
+pppd --version 2>&1 |
+sed '
+ /version/!d
+ s/[^0-9\.]//g
+ s/^/PPP\t\t\t\t/
+'

isdnctrl 2>&1 | grep version | awk \
'NR==1{print "isdn4k-utils ", $NF}'
@@ -59,40 +117,97 @@
showmount --version 2>&1 | grep nfs-utils | awk \
'NR==1{print "nfs-utils ", $NF}'

-echo -n "Linux C Library "
-sed -n -e '/^.*\/libc-\([^/]*\)\.so$/{s//\1/;p;q}' < /proc/self/maps
-
-ldd -v > /dev/null 2>&1 && ldd -v || ldd --version |head -n 1 | awk \
-'NR==1{print "Dynamic linker (ldd) ", $NF}'
-
-ls -l /usr/lib/libg++.so /usr/lib/libstdc++.so 2>/dev/null | awk -F. \
- '{print "Linux C++ Library " $4"."$5"."$6}'
-
-ps --version 2>&1 | grep version | awk \
-'NR==1{print "Procps ", $NF}'
-
-ifconfig --version 2>&1 | grep tools | awk \
-'NR==1{print "Net-tools ", $NF}'
+test -r /proc/self/maps &&
+sed '
+ /.*libc-\(.*\)\.so$/!d
+ s//Linux C Library\t\t\1/
+ q
+' /proc/self/maps
+
+lddsed='
+ /^ldd/!d
+ s/.*[ \t]\([0-9\.]*$\)/\1/
+ s/^/Dynamic linker (ldd)\t/
+'
+if ldd -v >/dev/null 2>&1
+then
+ ldd -v 2>&1 | sed "$lddsed"
+else
+ ldd --version 2>&1 | sed "$lddsed"
+fi

-# Kbd needs 'loadkeys -h',
-loadkeys -h 2>&1 | awk \
-'(NR==1 && ($3 !~ /option/)) {print "Kbd ", $3}'
+libcpp=`/sbin/ldconfig -p |
+ awk '/(libg|stdc)[+]+\.so/ {
+ print $NF
+ exit
+ }
+'`
+ls -l $libcpp |
+sed '
+ s!.*so\.!!
+ s!^!Linux C++ Library\t!
+'
+
+ps --version 2>&1 |
+sed '
+ /version/!d
+ s/[^0-9.]//g
+ s/^/Procps\t\t\t/
+'
+
+ifconfig=`whereis ifconfig | awk '{print $2}'`
+if test -n "$ifconfig"
+then
+ $ifconfig --version 2>&1 |
+ sed '
+ /net-tools/!d
+ s/\([0-9]\)-.*/\1/
+ s/[ \t]/\t\t/
+ s/_.*//
+ '
+else
+ :
+fi

-# while console-tools needs 'loadkeys -V'.
-loadkeys -V 2>&1 | awk \
-'(NR==1 && ($2 ~ /console-tools/)) {print "Console-tools ", $3}'
+loadkeys -V 2>&1 |
+sed '
+ /^loadkeys/!d
+ s/.*[ \t]\([0-9\.]*$\)/\1/
+ s/^/Kbd\t\t\t/
+ h
+ s/Kbd\t/Console-tools/
+ H
+ g
+'

oprofiled --version 2>&1 | awk \
'(NR==1 && ($2 == "oprofile")) {print "oprofile ", $3}'

-expr --v 2>&1 | awk 'NR==1{print "Sh-utils ", $NF}'
-
+expr --v 2>&1 |
+sed '
+ /^expr/!d
+ s/[^0-9.]//g
+ s/^/Sh-utils\t\t/
+'
udevinfo -V 2>&1 | grep version | awk '{print "udev ", $3}'

-iwconfig --version 2>&1 | awk \
-'(NR==1 && ($3 == "version")) {print "wireless-tools ",$4}'
-
-if [ -e /proc/modules ]; then
- X=`cat /proc/modules | sed -e "s/ .*$//"`
- echo "Modules Loaded "$X
-fi
+iwconfig --version 2>&1 |
+sed '
+ /version/!d
+ s/[^0-9\.]//g
+ s/^/wireless-tools\t\t/
+'
+
+test -e /proc/modules &&
+sort /proc/modules |
+sed '
+ s/ .*//
+ H
+${
+ g
+ s/^\n/Modules Loaded\t\t/
+ y/\n/ /
+ q
+}
+ d
+'
---
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/