* [devel] os-release / lsb_release / VENDOR-release
@ 2019-06-04 0:34 Leonid Krivoshein
2019-06-05 9:06 ` Vitaly Lipatov
0 siblings, 1 reply; 6+ messages in thread
From: Leonid Krivoshein @ 2019-06-04 0:34 UTC (permalink / raw)
To: ALT Linux Team development discussions
[-- Attachment #1: Type: text/plain, Size: 1531 bytes --]
Всем привет!
Три вопроса к знатокам по методике определения Linux-дистрибутива, в
котором сейчас работает скрипт:
1) Это правда, что LSB-метод (lsb_release) не так широко распространён и
теперь уступает freedesktop'ному парсингу файла /etc/os-release? Критика
LSB в этой рассылке уже имела место несколько лет назад. Но альтернатив
тогда не предлагалось, де-факто стандарт нами не поддерживается (пакет
отсутствует в системе сразу после установки, на него нет зависимости в
basesystem/interactivesystem).
2) Как вы считаете, какой идентификатор (ID, DISTRIB_ID) должен быть у
наших систем -- "alt" или "altlinux"? Дело в том, что LSB считает нас
как "alt". Тогда как два других метода -- "altlinux". Пояснение в
прилагаемом скрипте.
3) Если исключить экзотику, типа разбора /proc/version или имени файла
ядра, есть ли хорошие примеры кода, надёжно определяющего текущий
дистрибутив Linux?
--
Best regards,
Leonid Krivoshein.
[-- Attachment #2: detect_linux_distro --]
[-- Type: text/plain, Size: 5100 bytes --]
#!/bin/sh -efu
### This file is covered by the GNU General Public License
### version 2 or later.
###
### Copyright (C) 2019, ALT Linux Team
### Author: Leonid Krivoshein <klark@altlinux.org>
### Linux distribution detector
detect_linux_distro() {
local a= b= c= filename= idvar="$1"
local p= namevar="${2-}" rootfs="${3-}"
if [ "${__deploy_detect_linux_distro_included-}" != "2" ]; then
__deploy_detect_linux_distro_included=2
# parse single /etc/<RELEASE> file ($p)
# to DISTRO ID ($a) and DESCRIPTION ($b)
#
__parse_linux_release_file() {
if grep -qE ^PRETTY_NAME= "$p"; then
b="$(grep -sE ^PRETTY_NAME= "$p")"
b="$(unquote "${b:12}")"
elif grep -qE ^NAME= "$p" && grep -qE ^VERSION= "$p"; then
b="$(grep -sE ^NAME= "$p")"
b="$(unquote "${b:5}")"
if [ -n "$b" ]; then
c="$(grep -sE ^VERSION= "$p")"
c="$(unquote "${c:8}")"
[ -z "$c" ] || b="$b $c"
fi
fi
[ -n "$b" ] || return 0
if grep -qE ^ID= "$p"; then
a="$(grep -sE ^ID= "$p")"
a="$(unquote "${a:3}")"
elif grep -qE ^NAME= "$p"; then
a="$(grep -sE ^NAME= "$p")"; a="$(unquote "${a:5}")"
a="$(echo "${a% *}" |tr '[[:upper:]]' '[[:lower:]]')"
fi
[ -n "$a" ] || b=
}
# modern freedesktop.org standard
__detect_distro_by_os_release() {
for filename in /etc/os-release \
/lib/os-release \
/usr/lib/os-release
do
p="$rootfs$filename"
[ -r "$p" ] || continue
__parse_linux_release_file
[ -z "$a" ] || return 0
done
return 1
}
# also well-known, but not very common and
# sluggishly supported "Linux Standard Base"
# lsb_release command or /etc/lsb-release file
# (Chakra, IYCC, Arch Linux, Linux Mint, Ubuntu,
# Elementary OS, Manjaro Linux, etc...)
#
__detect_distro_by_lsb_release() {
[ -n "$rootfs" ] && c="" ||
c="$(command -v lsb_release 2>/dev/null ||:)"
if [ -x "$c" ]; then
a="$($c -si 2>/dev/null |
tr '[[:upper:]]' '[[:lower:]]')"
a="$(unquote "$a")"
if [ -n "$a" ]; then
b="$($c -sd 2>/dev/null ||:)"
b="$(unquote "$b")"
[ -n "$b" ] && return 0 || a=
fi
fi
p="$rootfs/etc/lsb-release"
[ -r "$p" ] || return 1
grep -qE ^DISTRIB_ID= "$p" || return 1
grep -qE ^DISTRIB_DESCRIPTION= "$p" || return 1
b="$(grep -sE ^DISTRIB_DESCRIPTION= "$p")"
b="$(unquote "${b:20}")"
[ -n "$b" ] || return 1
a="$(grep -sE ^DISTRIB_ID= "$p" |
tr '[[:upper:]]' '[[:lower:]]')"
a="$(unquote "${a:11}")"
[ -n "$a" ] && return 0 || b=
return 1
}
# fallback to the old detection method: please,
# don't check /etc/os-release and /etc/lsb-release
# files here, add your distro-specific file names,
# if necessary, but only by single name per line
#
__detect_distro_by_release_files() {
[ -n "$rootfs" ] && c="" ||
c="$(command -v hostnamectl 2>/dev/null ||:)"
[ ! -x "$c" ] || c="$($c 2>/dev/null |
grep -i 'operating system:' |
sed 's,^.*\: ,,')"
for filename in \
alpine-release \
altlinux-release \
annvix-release \
arch-release \
arklinux-release \
aurox-release \
blackcat-release \
cobalt-release \
conectiva-release \
eos-version \
gentoo-release \
hlfs-release \
hlfs_version \
immunix-release \
knoppix_version \
lfs-release \
lfs_version \
linuxppc-release \
mageia-release \
mandrake-release \
mandriva-release \
mandakelinux-release \
mklinux-release \
nld-release \
openwrt_version \
pld-release \
rubix-version \
slackware-version \
slackware-release \
e-smith-release \
sun-release \
SuSE-release \
novell-release \
sles-release \
system-release \
tinysofa-release \
trustix-release \
trustix-version \
turbolinux-release \
ultrapenguin-release \
UnitedLinux-release \
va-release \
yellowdog-release \
fedora-release \
redhat-release \
redhat_version \
debian_version \
debian_release
do
p="$rootfs/etc/$filename"
[ -r "$p" ] || continue
a="$(echo "$filename" |
sed -re 's,[_\-](release|version)$,,' |
tr '[[:upper:]]' '[[:lower:]]')"
b="$(head -n1 "$p")"
case "$a" in
system) a="amazon";;
debian) b="Debian $b";;
esac
[ -n "$b" ] || b=c
[ -n "$b" ] || [ -z "$namevar" ] || return 1
return 0
done
# Special case for Synology
# /etc/synoinfo.conf
# ToDo: ...
# Special case for Solaris SPARC and Sundry Linux
# /etc/release
# ToDo: ...
# Special case for NixOS
# /etc/NIXOS
# ToDo: ...
return 1
}
fi # __deploy_detect_linux_distro_included
__detect_distro_by_os_release ||
__detect_distro_by_lsb_release ||
__detect_distro_by_release_files ||:
# Replaces
case "$a" in
altlinux) a="alt";;
eos) a="freeeos";;
e-smith) a="esmith";;
mandakelinux) a="mandrake";;
nld) a="suse";;
novell) a="suse";;
sles) a="suse";;
unitedlinux) a="united";;
va) a="rhvale";;
esac
[ -z "$namevar" ] ||
eval "$namevar=\"${b:-Unknown Linux}\""
eval "$idvar=\"${a:-unknown}\""
}
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] os-release / lsb_release / VENDOR-release
2019-06-04 0:34 [devel] os-release / lsb_release / VENDOR-release Leonid Krivoshein
@ 2019-06-05 9:06 ` Vitaly Lipatov
2019-06-05 12:11 ` Leonid Krivoshein
2019-06-07 0:37 ` Leonid Krivoshein
0 siblings, 2 replies; 6+ messages in thread
From: Vitaly Lipatov @ 2019-06-05 9:06 UTC (permalink / raw)
To: ALT Linux Team development discussions
Leonid Krivoshein писал 4.6.19 3:34:
> Всем привет!
>
>
> Три вопроса к знатокам по методике определения Linux-дистрибутива, в
> котором сейчас работает скрипт:
>
> 1) Это правда, что LSB-метод (lsb_release) не так широко распространён
> и теперь уступает freedesktop'ному парсингу файла /etc/os-release?
> Критика LSB в этой рассылке уже имела место несколько лет назад. Но
> альтернатив тогда не предлагалось, де-факто стандарт нами не
> поддерживается (пакет отсутствует в системе сразу после установки, на
> него нет зависимости в basesystem/interactivesystem).
/etc/os-release гораздо популярнее и адекватнее.
lsb_release умер, на мой взгляд.
>
> 2) Как вы считаете, какой идентификатор (ID, DISTRIB_ID) должен быть у
> наших систем -- "alt" или "altlinux"? Дело в том, что LSB считает нас
> как "alt". Тогда как два других метода -- "altlinux". Пояснение в
> прилагаемом скрипте.
Привет строителям велосипедов.
>
> 3) Если исключить экзотику, типа разбора /proc/version или имени файла
> ядра, есть ли хорошие примеры кода, надёжно определяющего текущий
> дистрибутив Linux?
Есть.
$ distr_info
ALTLinux/Sisyphus
$ rpm -qf /usr/bin/distr_info
eepm-2.5.8-alt1.noarch
Определяет на всех дистрибутивах, на многих производных дистрибутивах, и
на других системах типа Solaris/MacOS/*BSD.
$ distr_info -h
distr_vendor - system name and version detection
Usage: distr_vendor [options] [args]
-p [SystemName] - print type of packaging system
-d - print distro name
-a - print hardware architecture
-b - print size of arch bit (32/64)
-m - print system memory size (in MB)
-o - print base os name
-v - print version of distro
-e - print full name of distro with version (by default)
--
С уважением,
Виталий Липатов,
Etersoft
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] os-release / lsb_release / VENDOR-release
2019-06-05 9:06 ` Vitaly Lipatov
@ 2019-06-05 12:11 ` Leonid Krivoshein
2019-06-05 13:14 ` Vitaly Lipatov
2019-06-07 0:37 ` Leonid Krivoshein
1 sibling, 1 reply; 6+ messages in thread
From: Leonid Krivoshein @ 2019-06-05 12:11 UTC (permalink / raw)
To: devel
05.06.2019 12:06, Vitaly Lipatov пишет:
> Leonid Krivoshein писал 4.6.19 3:34:
>> [...]
>> 1) Это правда, что LSB-метод (lsb_release) не так широко распространён
>> и теперь уступает freedesktop'ному парсингу файла /etc/os-release?
>> Критика LSB в этой рассылке уже имела место несколько лет назад. Но
>> альтернатив тогда не предлагалось, де-факто стандарт нами не
>> поддерживается (пакет отсутствует в системе сразу после установки, на
>> него нет зависимости в basesystem/interactivesystem).
> /etc/os-release гораздо популярнее и адекватнее.
> lsb_release умер, на мой взгляд.
>
Да, вот только и /etc/os-release не так уж хорош, именно как стандарт.
По крайней мере, для данного применения. А какое оно может быть ещё?
Найти ID, чтобы прописать в загрузчик UEFI. Для него новый стандарт тоже
не ахти.
То есть, грубо, они друг друга стоят. Теперь ещё есть hostnamectl...
>>
>> 2) Как вы считаете, какой идентификатор (ID, DISTRIB_ID) должен быть у
>> наших систем -- "alt" или "altlinux"? Дело в том, что LSB считает нас
>> как "alt". Тогда как два других метода -- "altlinux". Пояснение в
>> прилагаемом скрипте.
> Привет строителям велосипедов.
>
Ух ты, привет!!!
>>
>> 3) Если исключить экзотику, типа разбора /proc/version или имени файла
>> ядра, есть ли хорошие примеры кода, надёжно определяющего текущий
>> дистрибутив Linux?
> Есть.
> $ distr_info
Спасибо! Буду иметь ввиду...
--
Best regards,
Leonid Krivoshein.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] os-release / lsb_release / VENDOR-release
2019-06-05 12:11 ` Leonid Krivoshein
@ 2019-06-05 13:14 ` Vitaly Lipatov
0 siblings, 0 replies; 6+ messages in thread
From: Vitaly Lipatov @ 2019-06-05 13:14 UTC (permalink / raw)
To: ALT Linux Team development discussions; +Cc: Leonid Krivoshein
Leonid Krivoshein писал 5.6.19 15:11:
...
>>> 3) Если исключить экзотику, типа разбора /proc/version или имени
>>> файла
>>> ядра, есть ли хорошие примеры кода, надёжно определяющего текущий
>>> дистрибутив Linux?
>> Есть.
>> $ distr_info
>
> Спасибо! Буду иметь ввиду...
Было бы неплохо соединить наши разработки. Возможно ради этого стоит
придумать нормальное имя скрипту и выделить его в отдельный
проект/пакет.
Я как посмотрю в dotnet, а там Microsoft городит определение
дистрибутива, версии, чтобы нужный бинарник подсунуть.
--
С уважением,
Виталий Липатов,
Etersoft
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] os-release / lsb_release / VENDOR-release
2019-06-05 9:06 ` Vitaly Lipatov
2019-06-05 12:11 ` Leonid Krivoshein
@ 2019-06-07 0:37 ` Leonid Krivoshein
2019-11-21 16:50 ` Vitaly Lipatov
1 sibling, 1 reply; 6+ messages in thread
From: Leonid Krivoshein @ 2019-06-07 0:37 UTC (permalink / raw)
To: devel
[[ Только сейчас заметил это в рассылке (не долетело в почту): ]]
05.06.2019 16:14, Vitaly Lipatov пишет:
...
>>>/3) Если исключить экзотику, типа разбора /proc/version или имени />>>/файла />>>/ядра, есть ли хорошие примеры кода, надёжно определяющего текущий />>>/дистрибутив Linux? />>/Есть. />>/$ distr_info />//>/Спасибо! Буду иметь ввиду... /
Было бы неплохо соединить наши разработки. Возможно ради этого стоит
придумать нормальное имя скрипту и выделить его в отдельный
проект/пакет.
Я как посмотрю в dotnet, а там Microsoft городит определение
дистрибутива, версии, чтобы нужный бинарник подсунуть.
Категорически "ЗА" -- уже опубликовал один из скриптов этой серии в
данной рассылке под GPLv2. Другие скрипты этой серии определяют тип ОС,
итп. В идеале д.б. апстрим, чтобы все дистростроители брали из него и
включали в свои базовые системы команду с аналогичным единым
интерфейсом. И он же был бы донором такой жирной "универсальщины" на
остальные случаи.
Опакетить такое тоже можно, но с пониманием, что ни одному нормальному
пакету в целевой системе зависимость на него не будет нужна. В каких-то
случаях она может быть полезна только как сборочная зависимость.
В твоём скрипте иной подход к определению версии, отличающийся от
стандартов и того, что определено дистрибутивом. Мой скрипт -- это часть
деплойного проекта. Определение дистра там нужно, чтобы поддерживать не
только АЛЬТ и его специфику, чтобы изначально уйти от вендор-локинга.
Скрипт включаемый определённым механизмом, поэтому начало может
показаться необычным.
--
Best regards,
Leonid Krivoshein.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [devel] os-release / lsb_release / VENDOR-release
2019-06-07 0:37 ` Leonid Krivoshein
@ 2019-11-21 16:50 ` Vitaly Lipatov
0 siblings, 0 replies; 6+ messages in thread
From: Vitaly Lipatov @ 2019-11-21 16:50 UTC (permalink / raw)
To: ALT Linux Team development discussions; +Cc: Leonid Krivoshein
Leonid Krivoshein писал 7.6.19 3:37:
...
>
> Категорически "ЗА" -- уже опубликовал один из скриптов этой серии в
> данной рассылке под GPLv2. Другие скрипты этой серии определяют тип
> ОС, итп. В идеале д.б. апстрим, чтобы все дистростроители брали из
> него и включали в свои базовые системы команду с аналогичным единым
> интерфейсом. И он же был бы донором такой жирной "универсальщины" на
> остальные случаи.
Сделал шаг вперёд:
https://github.com/Etersoft/distro_info
> В твоём скрипте иной подход к определению версии, отличающийся от
> стандартов и того, что определено дистрибутивом. Мой скрипт -- это
Я бы хотел не отличаться от стандартов. Но скрипт появился прежде, чем
стандарты, и может иногда не успевать.
--
С уважением,
Виталий Липатов,
Etersoft
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2019-11-21 16:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-04 0:34 [devel] os-release / lsb_release / VENDOR-release Leonid Krivoshein
2019-06-05 9:06 ` Vitaly Lipatov
2019-06-05 12:11 ` Leonid Krivoshein
2019-06-05 13:14 ` Vitaly Lipatov
2019-06-07 0:37 ` Leonid Krivoshein
2019-11-21 16:50 ` Vitaly Lipatov
ALT Linux Team development discussions
This inbox may be cloned and mirrored by anyone:
git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \
devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru
public-inbox-index devel
Example config snippet for mirrors.
Newsgroup available over NNTP:
nntp://lore.altlinux.org/org.altlinux.lists.devel
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git