X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=src%2Fidentify-distros;h=fa661721cfa3882dd9cd006e95688e334e7d1896;hb=HEAD;hp=c3cfc723c585d9737d958a874026eb54146482bf;hpb=b603450a2502e1ae500f1527d4c4e8002e15d9be;p=distro-functions diff --git a/src/identify-distros b/src/identify-distros index c3cfc72..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. @@ -14,115 +21,167 @@ # limitations under the License. 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 + 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=$(distro-name) - case $x in - trisquel) - echo ubuntu - ;; - *) - echo $x - ;; - esac + local x + x=$(distro-name) + case $x in + trisquel) + echo ubuntu + ;; + *) + printf "%s\n" "$x" + ;; + esac } distro-name-ver() { - echo `distro-name``debian-archive` + 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=$(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) - echo "$shortest" - + while read -r pri name; do + # in ubuntu, we get archives like flidas, flidas-updates, all the same pri, + # so just pick the shortest one. + if [[ ! $highpri ]]; then + highpri=$pri; + shortest=$name + continue + fi + if [[ $pri != "$highpri" ]]; then + break + fi + if (( ${#shortest} > ${#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 ]] + [[ $(debian-archive) == testing ]] } # I only do testing or stable. isdebian-stable() { - [[ $(debian-archive) == stable ]] + [[ $(debian-archive) == stable ]] } debian-codename() { - isdeb || return 0 - local policy="$(apt-cache policy)" || return $? - archive=$(debian-archive "$policy") - echo "$policy" | sed -rn "s/^.*a=$archive,n=([a-z]+).*/\1/p;T;q" + 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=$(debian-codename) - case $n in - flidas) - echo xenial - ;; - *) - echo $n - ;; - esac + local n + n=$(debian-codename) + case $n in + flidas) + echo xenial + ;; + etiona) + echo bionic + ;; + nabia) + echo focal + ;; + aramo) + echo jammy + ;; + *) + echo $n + ;; + esac } isfedora() { - [[ $(distro-name) == fedora ]] + [[ $(distro-name) == fedora ]] } isdebian() { - [[ $(distro-name) == debian ]] + [[ $(distro-name) == debian ]] } isarch() { - [[ $(distro-name) == arch ]] + [[ $(distro-name) == arch ]] } isubuntu() { - [[ $(distro-name) == ubuntu ]] + [[ $(distro-name) == ubuntu ]] } istrisquel() { - [[ $(distro-name) == trisquel ]] + [[ $(distro-name) == trisquel ]] } # is debian/apt based isdeb() { command -v apt-get &>/dev/null; }