2020-01-19 17:06:03 +00:00
|
|
|
#!/bin/sh -e
|
|
|
|
#
|
2021-02-01 21:26:15 +00:00
|
|
|
# 2020-2021 Dennis Camera (dennis.camera@ssrq-sds-fds.ch)
|
2020-01-19 17:06:03 +00:00
|
|
|
#
|
|
|
|
# This file is part of cdist.
|
|
|
|
#
|
|
|
|
# cdist is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# (at your option) any later version.
|
|
|
|
#
|
|
|
|
# cdist is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
|
|
|
INTERFACES_FILE=/etc/network/interfaces
|
|
|
|
INTERFACES_D_PATH=/etc/network/interfaces.d
|
|
|
|
|
2020-01-29 17:12:53 +00:00
|
|
|
os=$(cat "${__global}/explorer/os")
|
2020-01-19 17:06:03 +00:00
|
|
|
|
2020-06-24 09:52:08 +00:00
|
|
|
if test -s "${__object}/parameter/name"
|
|
|
|
then
|
|
|
|
name=$(cat "${__object}/parameter/name")
|
|
|
|
else
|
|
|
|
name=$__object_id
|
|
|
|
fi
|
|
|
|
onchange_action=$(cat "${__object}/parameter/onchange")
|
2020-01-19 17:06:03 +00:00
|
|
|
state=$(cat "${__object}/parameter/state")
|
|
|
|
|
2020-06-24 09:52:08 +00:00
|
|
|
# NOTE: No file ending is used not to break the source-directory stanza
|
|
|
|
# (if used and at least for normal interface names)
|
|
|
|
iface_file="${INTERFACES_D_PATH}/${__object_id}"
|
2020-01-29 17:12:53 +00:00
|
|
|
|
|
|
|
onchange_action() {
|
2020-06-24 09:52:08 +00:00
|
|
|
case $onchange_action
|
2020-01-29 17:12:53 +00:00
|
|
|
in
|
2020-06-24 09:52:08 +00:00
|
|
|
(refresh)
|
2020-01-29 17:12:53 +00:00
|
|
|
printf "ifdown --force '%s' ; ifup '%s'\n" "${name}" "${name}"
|
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(up)
|
2020-01-29 17:12:53 +00:00
|
|
|
printf "ifup '%s'\n" "${name}"
|
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(down)
|
2020-01-29 17:12:53 +00:00
|
|
|
printf "ifdown --force '%s'\n" "${name}"
|
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(leave)
|
|
|
|
# ignore
|
2020-01-29 17:12:53 +00:00
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(*)
|
|
|
|
printf 'Invalid --onchange: %s\n' "${onchange_action}" >&2
|
2020-01-29 17:12:53 +00:00
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-01-19 17:06:03 +00:00
|
|
|
case $os
|
|
|
|
in
|
2020-06-24 09:52:08 +00:00
|
|
|
(debian)
|
2020-01-19 17:06:03 +00:00
|
|
|
os_major=$(grep -o '^[0-9][0-9]*' "${__global}/explorer/os_version")
|
|
|
|
if test "${os_major}" -lt 7
|
|
|
|
then
|
|
|
|
# Old versions do not support "source"
|
|
|
|
printf 'Debian versions older than 7 (wheezy) are not supported by this type (%s)\n' "${__type##*/}" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if test "${state}" = 'present'
|
|
|
|
then
|
|
|
|
__package ifupdown --state present
|
|
|
|
export require=__package/ifupdown
|
|
|
|
fi
|
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(devuan)
|
2020-01-19 17:06:03 +00:00
|
|
|
if test "${state}" = 'present'
|
|
|
|
then
|
|
|
|
__package ifupdown --state present
|
|
|
|
export require=__package/ifupdown
|
|
|
|
fi
|
|
|
|
;;
|
2020-06-24 09:52:08 +00:00
|
|
|
(*)
|
2020-01-19 17:06:03 +00:00
|
|
|
printf 'Your operating system (%s) is currently not supported by this type (%s)\n' "$os" "${__type##*/}" >&2
|
|
|
|
printf "Please contribute an implementation for it if you can.\n" >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
2020-06-24 09:52:08 +00:00
|
|
|
case $state
|
|
|
|
in
|
|
|
|
(present)
|
|
|
|
if test "${IFUPDOWND_LEAVE_EXISTING_CONFIG:-0}" -eq 0
|
2020-01-29 17:12:53 +00:00
|
|
|
then
|
2020-06-24 09:52:08 +00:00
|
|
|
# The /etc/network/interfaces file is overwritten with a basic example.
|
|
|
|
__file "${INTERFACES_FILE}" --state present --owner root --mode 0644 \
|
|
|
|
--source "${__type}/files/interfaces"
|
2021-02-01 21:26:15 +00:00
|
|
|
export require="__file${INTERFACES_FILE}"
|
2020-06-24 09:52:08 +00:00
|
|
|
else
|
|
|
|
# If state is present and IFUPDOWND_LEAVE_EXISTING_CONFIG is set,
|
|
|
|
# ensure that the interfaces.d directory is sourced in the main
|
|
|
|
# interfaces file, being as minimally invasive as possible.
|
|
|
|
__line "${INTERFACES_FILE}:source_interfaces.d" --state present \
|
|
|
|
--file "${INTERFACES_FILE}" \
|
|
|
|
--before '^#?[:blank:]*(auto|no-auto-down|no-scripts|allow-|iface|mapping|rename|source|source-directory)|^#[[:blank:]]*The .* interface$' \
|
|
|
|
--line "source ${INTERFACES_D_PATH}/*"
|
2021-02-01 21:26:15 +00:00
|
|
|
export require="__line${INTERFACES_FILE}:source_interfaces.d"
|
2020-01-29 17:12:53 +00:00
|
|
|
fi
|
2020-01-19 17:06:03 +00:00
|
|
|
|
2020-06-24 09:52:08 +00:00
|
|
|
__directory "${INTERFACES_D_PATH}" --state pre-exists \
|
|
|
|
--owner root --mode 0755
|
|
|
|
export require="__directory/${INTERFACES_D_PATH}"
|
|
|
|
|
|
|
|
# Construct interface config file
|
|
|
|
(
|
|
|
|
cat <<-EOF
|
|
|
|
# Managed by cdist (${__type##*/})
|
|
|
|
# Do not change. Changes will be overwritten.
|
|
|
|
|
|
|
|
EOF
|
|
|
|
|
|
|
|
if test -s "${__object}/parameter/comment"
|
|
|
|
then
|
|
|
|
# Prefix lines with # and append trailing empty line.
|
|
|
|
# shellcheck disable=SC2016
|
|
|
|
{
|
|
|
|
if test "$(cat "${__object}/parameter/comment")" = '-'
|
|
|
|
then
|
|
|
|
cat "${__object}/stdin"
|
|
|
|
else
|
|
|
|
cat "${__object}/parameter/comment"
|
|
|
|
fi
|
|
|
|
} | sed -e 's/^/# /;$G'
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Put together rename line
|
|
|
|
if test -s "${__object}/parameter/rename"
|
|
|
|
then
|
|
|
|
printf 'rename %s\n' "$(cat "${__object}/parameter/rename")"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# Put together the "allow" lines (these are the line(s) usually
|
|
|
|
# preceeding the iface line in the config).
|
|
|
|
if test -f "${__object}/parameter/auto"
|
|
|
|
then
|
|
|
|
printf 'auto %s\n' "${name}"
|
|
|
|
fi
|
|
|
|
if test -f "${__object}/parameter/hotplug"
|
|
|
|
then
|
|
|
|
printf 'allow-hotplug %s\n' "${name}"
|
|
|
|
fi
|
|
|
|
if test -f "${__object}/parameter/no-auto-down"
|
|
|
|
then
|
|
|
|
printf 'no-auto-down %s\n' "${name}"
|
|
|
|
fi
|
|
|
|
if test -f "${__object}/parameter/no-scripts"
|
|
|
|
then
|
|
|
|
printf 'no-scripts %s\n' "${name}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
addrfam=$(cat "${__object}/parameter/family")
|
|
|
|
method=$(cat "${__object}/parameter/method")
|
|
|
|
printf 'iface %s %s %s\n' "${name}" "${addrfam}" "${method}"
|
|
|
|
|
|
|
|
while read -r _opt
|
|
|
|
do
|
|
|
|
printf '\t%s\n' "${_opt}"
|
|
|
|
done <"${__object}/parameter/option"
|
|
|
|
unset _opt
|
|
|
|
) | __file "${iface_file}" --state present --owner root --mode 0644 \
|
|
|
|
--onchange "$(onchange_action)" --source -
|
|
|
|
;;
|
|
|
|
(absent)
|
|
|
|
__file "${iface_file}" --state absent \
|
|
|
|
--onchange "$(onchange_action)"
|
|
|
|
;;
|
|
|
|
(*)
|
|
|
|
printf 'Invalid --state: %s\n' "${state}" >&2
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|