Skip to contentSkip to conversation

ver_linux: check /usr/lib/os-release in case /etc/os-release not exists

PATCH New Yixin Zhang 4 participants 4 messages Aug 15, 2018 – Oct 2, 2018

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 ver_linux: check /usr/lib/os-release in case /etc/os-release not exists

https://www.linux.org/docs/man5/os-release.html:
"The file /etc/os-release takes precedence over /usr/lib/os-release. Applications should check for the former, and exclusively use its data if it exists, and only fall back to /usr/lib/os-release if it is missing. Applications should not read data from both files at the same time. /usr/lib/os-release is the recommended place to store OS release information as part of vendor trees. /etc/os-release should be a relative symlink to /usr/lib/os-release, to provide compatibility with applications only looking at /etc. A relative symlink instead of an absolute symlink is necessary to avoid breaking the link in a chroot or initrd environment such as dracut."

To be compatible with some distro which don't have the soft link "/etc/os-release", check "/usr/lib/os-release" first before checking "/etc/issue".

---
 ver_linux | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
ver_linux +5 -1
index dda337926..f4c4e07f4 100755
@@ -9,8 +9,12 @@ 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 "`ls /etc/*release`"
+echo "`ls /etc/*release 2> /dev/null`"
 cat /etc/*release 2> /dev/null
+if [ $? = 1 ]; then
+   echo "`ls /usr/lib/*release 2> /dev/null`"
+   cat /usr/lib/*release 2> /dev/null
+fi
 if [ $? = 1 ]; then
    echo '/etc/issue:'
    cat /etc/issue 2> /dev/null
Signature · 1 line
2.17.1
#1 lore raw

PATCH 1/1 ver_linux: check /usr/lib/os-release in case /etc/os-release not exists

Hi Yixin,

Quoted 29 lines

https://www.linux.org/docs/man5/os-release.html:
"The file /etc/os-release takes precedence over /usr/lib/os-release. Applications should check for the former, and exclusively use its data if it exists, and only fall back to /usr/lib/os-release if it is missing. Applications should not read data from both files at the same time. /usr/lib/os-release is the recommended place to store OS release information as part of vendor trees. /etc/os-release should be a relative symlink to /usr/lib/os-release, to provide compatibility with applications only looking at /etc. A relative symlink instead of an absolute symlink is necessary to avoid breaking the link in a chroot or initrd environment such as dracut."

To be compatible with some distro which don't have the soft link "/etc/os-release", check "/usr/lib/os-release" first before checking "/etc/issue".

---
 ver_linux | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
ver_linux +0 -0
index dda337926..f4c4e07f4 100755
@@ -9,8 +9,12 @@ 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

ver_linux echo 'If some fields are empty or look unusual you may have an old version.' · line 20

Quoted 10 lines
ver_linux +5 -1
-echo "`ls /etc/*release`"
+echo "`ls /etc/*release 2> /dev/null`"
 cat /etc/*release 2> /dev/null
+if [ $? = 1 ]; then
+   echo "`ls /usr/lib/*release 2> /dev/null`"
+   cat /usr/lib/*release 2> /dev/null
+fi
 if [ $? = 1 ]; then
    echo '/etc/issue:'
    cat /etc/issue 2> /dev/null

How about, instead of repeating files with cat, find the file and then work with it? Something like this:

f="$(ls /etc/*release 2>/dev/null)"

[ -f "$f" ] || f="$(ls /usr/lib/*release 2>/dev/null)"
[ -f "$f" ] || f="$(ls /etc/issue 2>/dev/null)"
if [ -f "$f" ]; then
	echo "$f:"
	cat $f

fi

We could also run `lsb_release -a' (if available).

Kind regards,
Petr

#2 lore raw

PATCH 1/1 ver_linux: check /usr/lib/os-release in case /etc/os-release not exists

Hi Petr,

Quoted 46 lines · Petr Vorel

Hi Yixin,

Quoted 29 lines

https://www.linux.org/docs/man5/os-release.html:
"The file /etc/os-release takes precedence over /usr/lib/os-release. Applications should check for the former, and exclusively use its data if it exists, and only fall back to /usr/lib/os-release if it is missing. Applications should not read data from both files at the same time. /usr/lib/os-release is the recommended place to store OS release information as part of vendor trees. /etc/os-release should be a relative symlink to /usr/lib/os-release, to provide compatibility with applications only looking at /etc. A relative symlink instead of an absolute symlink is necessary to avoid breaking the link in a chroot or initrd environment such as dracut."

To be compatible with some distro which don't have the soft link "/etc/os-release", check "/usr/lib/os-release" first before checking "/etc/issue".

---
 ver_linux | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)
ver_linux +0 -0
index dda337926..f4c4e07f4 100755
@@ -9,8 +9,12 @@ 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

ver_linux echo 'If some fields are empty or look unusual you may have an old version.' · line 20

Quoted 10 lines
ver_linux +5 -1
-echo "`ls /etc/*release`"
+echo "`ls /etc/*release 2> /dev/null`"
 cat /etc/*release 2> /dev/null
+if [ $? = 1 ]; then
+   echo "`ls /usr/lib/*release 2> /dev/null`"
+   cat /usr/lib/*release 2> /dev/null
+fi
 if [ $? = 1 ]; then
    echo '/etc/issue:'
    cat /etc/issue 2> /dev/null

How about, instead of repeating files with cat, find the file and then work with it? Something like this:

f="$(ls /etc/*release 2>/dev/null)"

Quoted 8 lines
[ -f "$f" ] || f="$(ls /usr/lib/*release 2>/dev/null)"
[ -f "$f" ] || f="$(ls /etc/issue 2>/dev/null)"
if [ -f "$f" ]; then
	echo "$f:"
	cat $f

fi

We could also run `lsb_release -a' (if available).

In most case, /etc/*release includes both os-release and lsb-release and sometimes other -release file, so the $f will be an array for most of the time. We cannot just test it with -f (maybe a extra for loop is needed). My inital plan is fall back to /usr/lib/ if none of the /etc/*-release exists. This is the case on Clear Linux, and it's tested on both Ubuntu and Clear Linux.

Yixin

Quoted 4 lines

Kind regards,
Petr