X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=src%2Fidentify-distros;h=fa661721cfa3882dd9cd006e95688e334e7d1896;hb=HEAD;hp=0d7a8fe1a9a1eff9b93a178efbe4839871c40c41;hpb=b3f12bb11f16b2bdf52e0d85f000e04b59ba9f1f;p=distro-functions diff --git a/src/identify-distros b/src/identify-distros index 0d7a8fe..88b31fc 100644 --- a/src/identify-distros +++ b/src/identify-distros @@ -1,5 +1,12 @@ #!/bin/bash -# Copyright (C) 2014 Ian Kelling +# I, Ian Kelling, follow the GNU license recommendations at +# https://www.gnu.org/licenses/license-recommendations.en.html. They +# recommend that small programs, < 300 lines, be licensed under the +# Apache License 2.0. This file contains or is part of one or more small +# programs. If a small program grows beyond 300 lines, I plan to switch +# its license to GPL. + +# Copyright 2024 Ian Kelling # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,26 +20,168 @@ # See the License for the specific language governing permissions and # limitations under the License. -distro_name() { - if [[ -f /etc/fedora-release ]]; then - echo fedora - else - grep "^ID=.*" /etc/os-release | sed 's/^ID=//' +distro-name() { + local x + if [[ -f /etc/fedora-release ]]; then + echo fedora + elif [[ -e /etc/os-release ]]; then + sed -rn 's/^ID=(.*)/\1/p' /etc/os-release + elif type -p lsb_release &>/dev/null; then + # well, this is more standard, but it's 2 ms vs 200 ms + x=$(lsb_release -si); echo ${x,,} + else + echo "unknown distro" + return 1 + fi +} + +distro-name-compat() { + local x + x=$(distro-name) + case $x in + trisquel) + echo ubuntu + ;; + *) + printf "%s\n" "$x" + ;; + esac +} + +distro-name-ver() { + printf "%s\n" "$(distro-name)$(debian-archive)" +} + +distro-num() { + local os_id ver_id + os_id=$(awk -F = '$1 == "ID" { print $2 }' /etc/os-release) + ver_id=$(awk -F = '$1 == "VERSION_ID" { print $2 }' /etc/os-release | sed 's/"//g') + # of VERSION_ID.x, the x matters in ubuntu but not trisquel + if [[ $os_id == ubuntu ]]; then + printf "%s\n" "$ver_id" + else + printf "%s\n" "$ver_id" | sed 's/\..*//' + fi +} + +debian-archive() { + isdeb || return 0 + local archive expression pri name highpri shortest + local policy="${1:-$(apt-cache policy)}" || return $? + # a = archive + # n = codename + # o = origin + # c = component (licensing component) + # l = label (Debian{,-Security,-Updates}) + local d + d=$(distro-name) + # goto b for archive lines we are interested in, a for lines we arent + # print priority + archive name. priority is in + # the previous line from the archive line. + # case insensitive, because $d is lower and we are matching with first char upper + read -rd '' expression < ${#name} )); then + shortest=$name + fi + done < <(echo "$policy" | sed -rn "$expression" | sort -rn || [[ $? == 141 ]]) + echo "$shortest" +} + +# formatted for use in pfile() in package-manager-abstractions +positive-origins() { + isdeb || return 0 + local archive expression pri name highpri shortest policy + # In theory we might want a policy subset, we could alter this to pass + # it in. + policy="(apt-cache policy)" + # a = archive + # n = codename + # o = origin + # c = component (licensing component) + # l = label (Debian{,-Security,-Updates}) + read -rd '' expression < 0 )); then + if [[ ! $origins ]]; then + origins=$name + else + origins+=,$name + fi fi + done < <(echo "$policy" | sed -rn "$expression" | sort -rn || [[ $? == 141 ]]) + echo $origins +} + +isdebian-testing() { + [[ $(debian-archive) == testing ]] +} +# I only do testing or stable. +isdebian-stable() { + [[ $(debian-archive) == stable ]] } + +debian-codename() { + isdeb || return 0 + local policy + policy="$(apt-cache policy)" + archive=$(debian-archive "$policy") + printf "%s\n" "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q" || [[ $? == 141 ]] +} +debian-codename-compat() { + local n + n=$(debian-codename) + case $n in + flidas) + echo xenial + ;; + etiona) + echo bionic + ;; + nabia) + echo focal + ;; + aramo) + echo jammy + ;; + *) + echo $n + ;; + esac +} + isfedora() { - local d=$(distro_name) - [[ $d == fedora ]] || return 1 + [[ $(distro-name) == fedora ]] } isdebian() { - local d=$(distro_name) - [[ $d == debian ]] || return 1 + [[ $(distro-name) == debian ]] } -isdeb() { - local d=$(distro_name) - [[ $d == debian || $d == ubuntu ]] || return 1 +isarch() { + [[ $(distro-name) == arch ]] } isubuntu() { - local d=$(distro_name) - [[ $d == ubuntu ]] || return 1 + [[ $(distro-name) == ubuntu ]] +} +istrisquel() { + [[ $(distro-name) == trisquel ]] } +# is debian/apt based +isdeb() { command -v apt-get &>/dev/null; }