Add support for distro_family (#213)

Obtained from /etc/os-release: ID_LIKE.
Alternate attributes f & distro_family.
This commit is contained in:
Tim Byrne 2022-01-17 13:46:31 -06:00
parent 32bc9abb0c
commit 5ae553b078
No known key found for this signature in database
GPG Key ID: 14DB4FC2465A4B12
9 changed files with 187 additions and 64 deletions

View File

@ -68,6 +68,17 @@ def tst_distro(runner):
return distro return distro
@pytest.fixture(scope='session')
def tst_distro_family(runner):
"""Test session's distro_family"""
family = ''
with contextlib.suppress(Exception):
run = runner(command=[
'grep', '-oP', r'ID_LIKE=\K.+', '/etc/os-release'], report=False)
family = run.out.strip()
return family
@pytest.fixture(scope='session') @pytest.fixture(scope='session')
def tst_sys(): def tst_sys():
"""Test session's uname value""" """Test session's uname value"""

View File

@ -85,13 +85,15 @@ def test_relative_link(runner, paths, yadm_alt):
'##a.$tst_arch', '##arch.$tst_arch', '##architecture.$tst_arch', '##a.$tst_arch', '##arch.$tst_arch', '##architecture.$tst_arch',
'##o.$tst_sys', '##os.$tst_sys', '##o.$tst_sys', '##os.$tst_sys',
'##d.$tst_distro', '##distro.$tst_distro', '##d.$tst_distro', '##distro.$tst_distro',
'##f.$tst_distro_family', '##distro_family.$tst_distro_family',
'##c.$tst_class', '##class.$tst_class', '##c.$tst_class', '##class.$tst_class',
'##h.$tst_host', '##hostname.$tst_host', '##h.$tst_host', '##hostname.$tst_host',
'##u.$tst_user', '##user.$tst_user', '##u.$tst_user', '##user.$tst_user',
]) ])
def test_alt_conditions( def test_alt_conditions(
runner, paths, runner, paths,
tst_arch, tst_sys, tst_distro, tst_host, tst_user, suffix): tst_arch, tst_sys, tst_distro, tst_distro_family, tst_host, tst_user,
suffix):
"""Test conditions supported by yadm alt""" """Test conditions supported by yadm alt"""
yadm_dir, yadm_data = setup_standard_yadm_dir(paths) yadm_dir, yadm_data = setup_standard_yadm_dir(paths)
@ -103,6 +105,7 @@ def test_alt_conditions(
tst_arch=tst_arch, tst_arch=tst_arch,
tst_sys=tst_sys, tst_sys=tst_sys,
tst_distro=tst_distro, tst_distro=tst_distro,
tst_distro_family=tst_distro_family,
tst_class=tst_class, tst_class=tst_class,
tst_host=tst_host, tst_host=tst_host,
tst_user=tst_user, tst_user=tst_user,

View File

@ -0,0 +1,26 @@
"""Unit tests: query_distro_family"""
import pytest
@pytest.mark.parametrize(
'condition', ['os-release', 'os-release-quotes', 'missing'])
def test_query_distro_family(runner, yadm, tmp_path, condition):
"""Match ID_LIKE when present"""
test_family = 'testfamily'
os_release = tmp_path.joinpath('os-release')
if 'os-release' in condition:
quotes = '"' if 'quotes' in condition else ''
os_release.write_text(
f"testing\nID_LIKE={quotes}{test_family}{quotes}\nfamily")
script = f"""
YADM_TEST=1 source {yadm}
OS_RELEASE="{os_release}"
query_distro_family
"""
run = runner(command=['bash'], inp=script)
assert run.success
assert run.err == ''
if 'os-release' in condition:
assert run.out.rstrip() == test_family
else:
assert run.out.rstrip() == ''

View File

@ -18,17 +18,21 @@ CONDITION = {
'labels': ['d', 'distro'], 'labels': ['d', 'distro'],
'modifier': 4, 'modifier': 4,
}, },
'distro_family': {
'labels': ['f', 'distro_family'],
'modifier': 8,
},
'class': { 'class': {
'labels': ['c', 'class'], 'labels': ['c', 'class'],
'modifier': 8, 'modifier': 16,
}, },
'hostname': { 'hostname': {
'labels': ['h', 'hostname'], 'labels': ['h', 'hostname'],
'modifier': 16, 'modifier': 32,
}, },
'user': { 'user': {
'labels': ['u', 'user'], 'labels': ['u', 'user'],
'modifier': 32, 'modifier': 64,
}, },
} }
TEMPLATE_LABELS = ['t', 'template', 'yadm'] TEMPLATE_LABELS = ['t', 'template', 'yadm']

View File

@ -70,17 +70,20 @@ def test_set_local_alt_values(
assert f"user='{tst_user}'" in run.out assert f"user='{tst_user}'" in run.out
def test_distro(runner, yadm): def test_distro_and_family(runner, yadm):
"""Assert that local_distro is set""" """Assert that local_distro/local_distro_family are set"""
script = f""" script = f"""
YADM_TEST=1 source {yadm} YADM_TEST=1 source {yadm}
function config() {{ echo "$1"; }} function config() {{ echo "$1"; }}
function query_distro() {{ echo "testdistro"; }} function query_distro() {{ echo "testdistro"; }}
function query_distro_family() {{ echo "testfamily"; }}
set_local_alt_values set_local_alt_values
echo "distro='$local_distro'" echo "distro='$local_distro'"
echo "distro_family='$local_distro_family'"
""" """
run = runner(command=['bash'], inp=script) run = runner(command=['bash'], inp=script)
assert run.success assert run.success
assert run.err == '' assert run.err == ''
assert run.out.strip() == "distro='testdistro'" assert "distro='testdistro'" in run.out
assert "distro_family='testfamily'" in run.out

View File

@ -10,14 +10,16 @@ LOCAL_SYSTEM = "default_Test+@-!^System"
LOCAL_HOST = "default_Test+@-!^Host" LOCAL_HOST = "default_Test+@-!^Host"
LOCAL_USER = "default_Test+@-!^User" LOCAL_USER = "default_Test+@-!^User"
LOCAL_DISTRO = "default_Test+@-!^Distro" LOCAL_DISTRO = "default_Test+@-!^Distro"
LOCAL_DISTRO_FAMILY = "default_Test+@-!^Family"
TEMPLATE = f''' TEMPLATE = f'''
start of template start of template
default class = >{{{{yadm.class}}}}< default class = >{{{{yadm.class}}}}<
default arch = >{{{{yadm.arch}}}}< default arch = >{{{{yadm.arch}}}}<
default os = >{{{{yadm.os}}}}< default os = >{{{{yadm.os}}}}<
default host = >{{{{yadm.hostname}}}}< default host = >{{{{yadm.hostname}}}}<
default user = >{{{{yadm.user}}}}< default user = >{{{{yadm.user}}}}<
default distro = >{{{{yadm.distro}}}}< default distro = >{{{{yadm.distro}}}}<
default distro_family = >{{{{yadm.distro_family}}}}<
{{% if yadm.class == "else1" %}} {{% if yadm.class == "else1" %}}
wrong else 1 wrong else 1
{{% else %}} {{% else %}}
@ -80,16 +82,27 @@ Included section for distro = {{{{yadm.distro}}}} ({{{{yadm.distro}}}} again)
{{% if yadm.distro == "wrongdistro2" %}} {{% if yadm.distro == "wrongdistro2" %}}
wrong distro 2 wrong distro 2
{{% endif %}} {{% endif %}}
{{% if yadm.distro_family == "wrongfamily1" %}}
wrong family 1
{{% endif %}}
{{% if yadm.distro_family == "{LOCAL_DISTRO_FAMILY}" %}}
Included section for distro_family = \
{{{{yadm.distro_family}}}} ({{{{yadm.distro_family}}}} again)
{{% endif %}}
{{% if yadm.distro_family == "wrongfamily2" %}}
wrong family 2
{{% endif %}}
end of template end of template
''' '''
EXPECTED = f''' EXPECTED = f'''
start of template start of template
default class = >{LOCAL_CLASS}< default class = >{LOCAL_CLASS}<
default arch = >{LOCAL_ARCH}< default arch = >{LOCAL_ARCH}<
default os = >{LOCAL_SYSTEM}< default os = >{LOCAL_SYSTEM}<
default host = >{LOCAL_HOST}< default host = >{LOCAL_HOST}<
default user = >{LOCAL_USER}< default user = >{LOCAL_USER}<
default distro = >{LOCAL_DISTRO}< default distro = >{LOCAL_DISTRO}<
default distro_family = >{LOCAL_DISTRO_FAMILY}<
Included section from else Included section from else
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated) Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Multiple lines Multiple lines
@ -98,6 +111,8 @@ Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again) Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated) Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again) Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
Included section for distro_family = \
{LOCAL_DISTRO_FAMILY} ({LOCAL_DISTRO_FAMILY} again)
end of template end of template
''' '''
@ -155,6 +170,7 @@ def test_template_default(runner, yadm, tmpdir):
local_host="{LOCAL_HOST}" local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}" local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}" local_distro="{LOCAL_DISTRO}"
local_distro_family="{LOCAL_DISTRO_FAMILY}"
template_default "{input_file}" "{output_file}" template_default "{input_file}" "{output_file}"
""" """
run = runner(command=['bash'], inp=script) run = runner(command=['bash'], inp=script)

View File

@ -9,14 +9,16 @@ LOCAL_SYSTEM = "esh_Test+@-!^System"
LOCAL_HOST = "esh_Test+@-!^Host" LOCAL_HOST = "esh_Test+@-!^Host"
LOCAL_USER = "esh_Test+@-!^User" LOCAL_USER = "esh_Test+@-!^User"
LOCAL_DISTRO = "esh_Test+@-!^Distro" LOCAL_DISTRO = "esh_Test+@-!^Distro"
LOCAL_DISTRO_FAMILY = "esh_Test+@-!^Family"
TEMPLATE = f''' TEMPLATE = f'''
start of template start of template
esh class = ><%=$YADM_CLASS%>< esh class = ><%=$YADM_CLASS%><
esh arch = ><%=$YADM_ARCH%>< esh arch = ><%=$YADM_ARCH%><
esh os = ><%=$YADM_OS%>< esh os = ><%=$YADM_OS%><
esh host = ><%=$YADM_HOSTNAME%>< esh host = ><%=$YADM_HOSTNAME%><
esh user = ><%=$YADM_USER%>< esh user = ><%=$YADM_USER%><
esh distro = ><%=$YADM_DISTRO%>< esh distro = ><%=$YADM_DISTRO%><
esh distro_family = ><%=$YADM_DISTRO_FAMILY%><
<% if [ "$YADM_CLASS" = "wrongclass1" ]; then -%> <% if [ "$YADM_CLASS" = "wrongclass1" ]; then -%>
wrong class 1 wrong class 1
<% fi -%> <% fi -%>
@ -71,22 +73,35 @@ Included section for distro = <%=$YADM_DISTRO%> (<%=$YADM_DISTRO%> again)
<% if [ "$YADM_DISTRO" = "wrongdistro2" ]; then -%> <% if [ "$YADM_DISTRO" = "wrongdistro2" ]; then -%>
wrong distro 2 wrong distro 2
<% fi -%> <% fi -%>
<% if [ "$YADM_DISTRO_FAMILY" = "wrongfamily1" ]; then -%>
wrong family 1
<% fi -%>
<% if [ "$YADM_DISTRO_FAMILY" = "{LOCAL_DISTRO_FAMILY}" ]; then -%>
Included section for distro_family = \
<%=$YADM_DISTRO_FAMILY%> (<%=$YADM_DISTRO_FAMILY%> again)
<% fi -%>
<% if [ "$YADM_DISTRO" = "wrongfamily2" ]; then -%>
wrong family 2
<% fi -%>
end of template end of template
''' '''
EXPECTED = f''' EXPECTED = f'''
start of template start of template
esh class = >{LOCAL_CLASS}< esh class = >{LOCAL_CLASS}<
esh arch = >{LOCAL_ARCH}< esh arch = >{LOCAL_ARCH}<
esh os = >{LOCAL_SYSTEM}< esh os = >{LOCAL_SYSTEM}<
esh host = >{LOCAL_HOST}< esh host = >{LOCAL_HOST}<
esh user = >{LOCAL_USER}< esh user = >{LOCAL_USER}<
esh distro = >{LOCAL_DISTRO}< esh distro = >{LOCAL_DISTRO}<
esh distro_family = >{LOCAL_DISTRO_FAMILY}<
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated) Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated) Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated) Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again) Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated) Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again) Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
Included section for distro_family = \
{LOCAL_DISTRO_FAMILY} ({LOCAL_DISTRO_FAMILY} again)
end of template end of template
''' '''
@ -113,6 +128,7 @@ def test_template_esh(runner, yadm, tmpdir):
local_host="{LOCAL_HOST}" local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}" local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}" local_distro="{LOCAL_DISTRO}"
local_distro_family="{LOCAL_DISTRO_FAMILY}"
template_esh "{input_file}" "{output_file}" template_esh "{input_file}" "{output_file}"
""" """
run = runner(command=['bash'], inp=script) run = runner(command=['bash'], inp=script)

View File

@ -10,14 +10,16 @@ LOCAL_SYSTEM = "j2_Test+@-!^System"
LOCAL_HOST = "j2_Test+@-!^Host" LOCAL_HOST = "j2_Test+@-!^Host"
LOCAL_USER = "j2_Test+@-!^User" LOCAL_USER = "j2_Test+@-!^User"
LOCAL_DISTRO = "j2_Test+@-!^Distro" LOCAL_DISTRO = "j2_Test+@-!^Distro"
LOCAL_DISTRO_FAMILY = "j2_Test+@-!^Family"
TEMPLATE = f''' TEMPLATE = f'''
start of template start of template
j2 class = >{{{{YADM_CLASS}}}}< j2 class = >{{{{YADM_CLASS}}}}<
j2 arch = >{{{{YADM_ARCH}}}}< j2 arch = >{{{{YADM_ARCH}}}}<
j2 os = >{{{{YADM_OS}}}}< j2 os = >{{{{YADM_OS}}}}<
j2 host = >{{{{YADM_HOSTNAME}}}}< j2 host = >{{{{YADM_HOSTNAME}}}}<
j2 user = >{{{{YADM_USER}}}}< j2 user = >{{{{YADM_USER}}}}<
j2 distro = >{{{{YADM_DISTRO}}}}< j2 distro = >{{{{YADM_DISTRO}}}}<
j2 distro_family = >{{{{YADM_DISTRO_FAMILY}}}}<
{{%- if YADM_CLASS == "wrongclass1" %}} {{%- if YADM_CLASS == "wrongclass1" %}}
wrong class 1 wrong class 1
{{%- endif %}} {{%- endif %}}
@ -72,22 +74,35 @@ Included section for distro = {{{{YADM_DISTRO}}}} ({{{{YADM_DISTRO}}}} again)
{{%- if YADM_DISTRO == "wrongdistro2" %}} {{%- if YADM_DISTRO == "wrongdistro2" %}}
wrong distro 2 wrong distro 2
{{%- endif %}} {{%- endif %}}
{{%- if YADM_DISTRO_FAMILY == "wrongfamily1" %}}
wrong family 1
{{%- endif %}}
{{%- if YADM_DISTRO_FAMILY == "{LOCAL_DISTRO_FAMILY}" %}}
Included section for distro_family = \
{{{{YADM_DISTRO_FAMILY}}}} ({{{{YADM_DISTRO_FAMILY}}}} again)
{{%- endif %}}
{{%- if YADM_DISTRO_FAMILY == "wrongfamily2" %}}
wrong family 2
{{%- endif %}}
end of template end of template
''' '''
EXPECTED = f''' EXPECTED = f'''
start of template start of template
j2 class = >{LOCAL_CLASS}< j2 class = >{LOCAL_CLASS}<
j2 arch = >{LOCAL_ARCH}< j2 arch = >{LOCAL_ARCH}<
j2 os = >{LOCAL_SYSTEM}< j2 os = >{LOCAL_SYSTEM}<
j2 host = >{LOCAL_HOST}< j2 host = >{LOCAL_HOST}<
j2 user = >{LOCAL_USER}< j2 user = >{LOCAL_USER}<
j2 distro = >{LOCAL_DISTRO}< j2 distro = >{LOCAL_DISTRO}<
j2 distro_family = >{LOCAL_DISTRO_FAMILY}<
Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated) Included section for class = {LOCAL_CLASS} ({LOCAL_CLASS} repeated)
Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated) Included section for arch = {LOCAL_ARCH} ({LOCAL_ARCH} repeated)
Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated) Included section for os = {LOCAL_SYSTEM} ({LOCAL_SYSTEM} repeated)
Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again) Included section for host = {LOCAL_HOST} ({LOCAL_HOST} again)
Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated) Included section for user = {LOCAL_USER} ({LOCAL_USER} repeated)
Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again) Included section for distro = {LOCAL_DISTRO} ({LOCAL_DISTRO} again)
Included section for distro_family = \
{LOCAL_DISTRO_FAMILY} ({LOCAL_DISTRO_FAMILY} again)
end of template end of template
''' '''
@ -115,6 +130,7 @@ def test_template_j2(runner, yadm, tmpdir, processor):
local_host="{LOCAL_HOST}" local_host="{LOCAL_HOST}"
local_user="{LOCAL_USER}" local_user="{LOCAL_USER}"
local_distro="{LOCAL_DISTRO}" local_distro="{LOCAL_DISTRO}"
local_distro_family="{LOCAL_DISTRO_FAMILY}"
template_{processor} "{input_file}" "{output_file}" template_{processor} "{input_file}" "{output_file}"
""" """
run = runner(command=['bash'], inp=script) run = runner(command=['bash'], inp=script)

70
yadm
View File

@ -210,23 +210,30 @@ function score_file() {
score=0 score=0
return return
fi fi
elif [[ "$label" =~ ^(f|distro_family)$ ]]; then
if [ "$value" = "$local_distro_family" ]; then
score=$((score + 8))
else
score=0
return
fi
elif [[ "$label" =~ ^(c|class)$ ]]; then elif [[ "$label" =~ ^(c|class)$ ]]; then
if [ "$value" = "$local_class" ]; then if [ "$value" = "$local_class" ]; then
score=$((score + 8)) score=$((score + 16))
else else
score=0 score=0
return return
fi fi
elif [[ "$label" =~ ^(h|hostname)$ ]]; then elif [[ "$label" =~ ^(h|hostname)$ ]]; then
if [ "$value" = "$local_host" ]; then if [ "$value" = "$local_host" ]; then
score=$((score + 16)) score=$((score + 32))
else else
score=0 score=0
return return
fi fi
elif [[ "$label" =~ ^(u|user)$ ]]; then elif [[ "$label" =~ ^(u|user)$ ]]; then
if [ "$value" = "$local_user" ]; then if [ "$value" = "$local_user" ]; then
score=$((score + 32)) score=$((score + 64))
else else
score=0 score=0
return return
@ -363,24 +370,25 @@ function template_default() {
read -r -d '' awk_pgm << "EOF" read -r -d '' awk_pgm << "EOF"
# built-in default template processor # built-in default template processor
BEGIN { BEGIN {
blank = "[ ]" blank = "[ ]"
c["class"] = class c["class"] = class
c["arch"] = arch c["arch"] = arch
c["os"] = os c["os"] = os
c["hostname"] = host c["hostname"] = host
c["user"] = user c["user"] = user
c["distro"] = distro c["distro"] = distro
c["source"] = source c["distro_family"] = distro_family
ifs = "^{%" blank "*if" c["source"] = source
els = "^{%" blank "*else" blank "*%}$" ifs = "^{%" blank "*if"
end = "^{%" blank "*endif" blank "*%}$" els = "^{%" blank "*else" blank "*%}$"
skp = "^{%" blank "*(if|else|endif)" end = "^{%" blank "*endif" blank "*%}$"
vld = conditions() skp = "^{%" blank "*(if|else|endif)"
inc_start = "^{%" blank "*include" blank "+\"?" vld = conditions()
inc_end = "\"?" blank "*%}$" inc_start = "^{%" blank "*include" blank "+\"?"
inc = inc_start ".+" inc_end inc_end = "\"?" blank "*%}$"
prt = 1 inc = inc_start ".+" inc_end
err = 0 prt = 1
err = 0
} }
END { exit err } END { exit err }
{ replace_vars() } # variable replacements { replace_vars() } # variable replacements
@ -437,6 +445,7 @@ EOF
-v host="$local_host" \ -v host="$local_host" \
-v user="$local_user" \ -v user="$local_user" \
-v distro="$local_distro" \ -v distro="$local_distro" \
-v distro_family="$local_distro_family" \
-v source="$input" \ -v source="$input" \
-v source_dir="$(dirname "$input")" \ -v source_dir="$(dirname "$input")" \
"$awk_pgm" \ "$awk_pgm" \
@ -456,6 +465,7 @@ function template_j2cli() {
YADM_HOSTNAME="$local_host" \ YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \ YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \ YADM_DISTRO="$local_distro" \
YADM_DISTRO_FAMILY="$local_distro_family" \
YADM_SOURCE="$input" \ YADM_SOURCE="$input" \
"$J2CLI_PROGRAM" "$input" -o "$temp_file" "$J2CLI_PROGRAM" "$input" -o "$temp_file"
@ -473,6 +483,7 @@ function template_envtpl() {
YADM_HOSTNAME="$local_host" \ YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \ YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \ YADM_DISTRO="$local_distro" \
YADM_DISTRO_FAMILY="$local_distro_family" \
YADM_SOURCE="$input" \ YADM_SOURCE="$input" \
"$ENVTPL_PROGRAM" --keep-template "$input" -o "$temp_file" "$ENVTPL_PROGRAM" --keep-template "$input" -o "$temp_file"
@ -491,6 +502,7 @@ function template_esh() {
YADM_HOSTNAME="$local_host" \ YADM_HOSTNAME="$local_host" \
YADM_USER="$local_user" \ YADM_USER="$local_user" \
YADM_DISTRO="$local_distro" \ YADM_DISTRO="$local_distro" \
YADM_DISTRO_FAMILY="$local_distro_family" \
YADM_SOURCE="$input" YADM_SOURCE="$input"
move_file "$input" "$output" "$temp_file" move_file "$input" "$output" "$temp_file"
@ -526,6 +538,7 @@ function alt() {
local local_host local local_host
local local_user local local_user
local local_distro local local_distro
local local_distro_family
set_local_alt_values set_local_alt_values
# only be noisy if the "alt" command was run directly # only be noisy if the "alt" command was run directly
@ -644,6 +657,7 @@ function set_local_alt_values() {
fi fi
local_distro="$(query_distro)" local_distro="$(query_distro)"
local_distro_family="$(query_distro_family)"
} }
@ -1486,6 +1500,20 @@ function query_distro() {
echo "$distro" echo "$distro"
} }
function query_distro_family() {
family=""
if [ -f "$OS_RELEASE" ]; then
while IFS='' read -r line || [ -n "$line" ]; do
if [[ "$line" = ID_LIKE=* ]]; then
family="${line#ID_LIKE=}"
family="${family//\"}"
break
fi
done < "$OS_RELEASE"
fi
echo "$family"
}
function process_global_args() { function process_global_args() {
# global arguments are removed before the main processing is done # global arguments are removed before the main processing is done