ALT Linux Team development discussions
 help / color / mirror / Atom feed
* [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