add samples

This commit is contained in:
Mario Fetka
2026-04-19 23:08:28 +02:00
parent 22dcfb823b
commit a1490efb03
8 changed files with 458 additions and 136 deletions

View File

@@ -0,0 +1,176 @@
#!/bin/sh
# Copyright 1999-2026 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
# IPX start helper for systemd and OpenRC.
#
# This script reads its configuration from environment variables, typically
# provided through /etc/conf.d/ipx.
#
# Manual interface format:
# <device>:<frame>:<netnum>
#
# Static route format:
# <target_network>:<router_network>:<router_node>
#
# Behaviour:
# - The first successfully configured interface becomes the primary IPX
# interface.
# - Missing interfaces are skipped.
# - Optionally, interfaces with no active link can also be skipped.
# - Static routes are added after interface configuration.
set -u
configured=0
retval=0
primary_set=0
log_warn() {
printf '%s\n' "ipx: $*" >&2
}
log_err() {
printf '%s\n' "ipx: $*" >&2
}
link_is_usable() {
local dev carrier_file operstate_file state
dev=$1
carrier_file="/sys/class/net/${dev}/carrier"
operstate_file="/sys/class/net/${dev}/operstate"
if [ "${IPX_SKIP_LINK_DOWN:-no}" != "yes" ]; then
return 0
fi
if [ -r "${carrier_file}" ]; then
state=$(cat "${carrier_file}")
if [ "${state}" = "0" ]; then
log_warn "interface ${dev} has no carrier, skipping"
return 1
fi
return 0
fi
if [ -r "${operstate_file}" ]; then
state=$(cat "${operstate_file}")
case "${state}" in
down)
log_warn "interface ${dev} is link-down, skipping"
return 1
;;
esac
fi
return 0
}
if [ "${IPX_INTERNAL_NET:-no}" = "yes" ]; then
if ! /sbin/ipx_internal_net add "${IPX_NETNUM}" "${IPX_NODENUM}"; then
log_err "failed to create internal IPX network"
retval=1
fi
else
oldifs=${IFS}
IFS='
'
for entry in ${IPX_INTERFACES:-}; do
[ -n "${entry}" ] || continue
case "${entry}" in
\#*)
continue
;;
esac
dev=${entry%%:*}
rest=${entry#*:}
frame=${rest%%:*}
netnum=${rest#*:}
if [ -z "${dev}" ] || [ -z "${frame}" ] || [ -z "${netnum}" ] || [ "${rest}" = "${entry}" ]; then
log_err "invalid IPX_INTERFACES entry: ${entry}"
retval=1
break
fi
if [ ! -d "/sys/class/net/${dev}" ]; then
log_warn "interface ${dev} is not present, skipping"
continue
fi
if ! link_is_usable "${dev}"; then
continue
fi
if [ "${primary_set}" -eq 0 ]; then
if /sbin/ipx_interface add -p "${dev}" "${frame}" "${netnum}"; then
configured=1
primary_set=1
else
log_err "failed to add primary IPX interface on ${dev}"
retval=1
fi
else
if /sbin/ipx_interface add "${dev}" "${frame}" "${netnum}"; then
configured=1
else
log_err "failed to add IPX interface on ${dev}"
retval=1
fi
fi
done
IFS=${oldifs}
if [ "${configured}" -eq 0 ] && [ "${retval}" -eq 0 ]; then
log_warn "no configured IPX interfaces were present"
fi
fi
if [ "${retval}" -eq 0 ]; then
oldifs=${IFS}
IFS='
'
for entry in ${IPX_ROUTES:-}; do
[ -n "${entry}" ] || continue
case "${entry}" in
\#*)
continue
;;
esac
target=${entry%%:*}
rest=${entry#*:}
router_net=${rest%%:*}
router_node=${rest#*:}
if [ -z "${target}" ] || [ -z "${router_net}" ] || [ -z "${router_node}" ] || [ "${rest}" = "${entry}" ]; then
log_err "invalid IPX_ROUTES entry: ${entry}"
retval=1
break
fi
if ! /sbin/ipx_route add "${target}" "${router_net}" "${router_node}"; then
log_err "failed to add IPX route to ${target}"
retval=1
fi
done
IFS=${oldifs}
fi
if ! /sbin/ipx_configure \
--auto_primary="${IPX_AUTO_PRIMARY}" \
--auto_interface="${IPX_AUTO_INTERFACE}"; then
log_err "failed to apply automatic IPX configuration"
retval=1
fi
if [ "${retval}" -ne 0 ]; then
log_warn "startup failed, cleaning up partial IPX configuration"
/usr/libexec/ipx/network-stop.sh || true
fi
exit "${retval}"