mirror of
https://github.com/systemd/systemd.git
synced 2026-08-09 17:38:42 +00:00
Add a new --no-reconfigure flag to 'networkctl reload' that reloads .network and .netdev files from disk without reconfiguring any network interfaces. This may be useful to avoid reconfiguring multiple interfaces simultaneously when multiple .network files are updated, or when an updated .network file is applied to multiple interfaces. On the networkd side, manager_reload() gains a reconfigure_links parameter that gates the per-link reconfiguration loop. A new io.systemd.Network.Reload varlink method is added that exposes this as an optional reconfigureLinks boolean (defaults to true). Both plain 'networkctl reload' and '--no-reconfigure' now unconditionally call this method first. If an older networkd returns MethodNotFound, plain reload falls back to io.systemd.service.Reload for backward compatibility; '--no-reconfigure' fails with a clear error in that case.
107 lines
3.2 KiB
Bash
107 lines
3.2 KiB
Bash
# shellcheck shell=bash
|
|
# networkctl(1) completion -*- shell-script -*-
|
|
# SPDX-License-Identifier: LGPL-2.1-or-later
|
|
#
|
|
# This file is part of systemd.
|
|
#
|
|
# systemd is free software; you can redistribute it and/or modify it
|
|
# under the terms of the GNU Lesser General Public License as published by
|
|
# the Free Software Foundation; either version 2.1 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# systemd 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 Lesser General Public License
|
|
# along with systemd; If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
__contains_word () {
|
|
local w word=$1; shift
|
|
for w in "$@"; do
|
|
[[ $w = "$word" ]] && return
|
|
done
|
|
return 1
|
|
}
|
|
|
|
__get_links() {
|
|
networkctl list --no-legend --no-pager --all --full 2>/dev/null | { while read -r a b c; do echo " $b"; done; }
|
|
}
|
|
|
|
__get_links_with_prefix() {
|
|
local i
|
|
for i in $(__get_links); do
|
|
echo "@$i"
|
|
done
|
|
}
|
|
|
|
__get_files() {
|
|
ls {/run,/usr/lib,/etc}/systemd/network/*.{network,netdev,link} 2>/dev/null
|
|
}
|
|
|
|
_networkctl() {
|
|
local i verb comps
|
|
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]} words cword
|
|
local -A OPTS=(
|
|
[STANDALONE]='-a --all -h --help --version --no-pager --no-legend --no-ask-password
|
|
-s --stats -l --full --no-reload --no-reconfigure --runtime'
|
|
[ARG]='-n --lines --json --drop-in'
|
|
)
|
|
|
|
local -A VERBS=(
|
|
[STANDALONE]='label reload'
|
|
[LINKS]='status dhcp-lease list lldp delete renew up down forcerenew reconfigure'
|
|
[FILES_OR_LINKS]='edit cat'
|
|
[FILES]='mask unmask'
|
|
[BOOL]='persistent-storage'
|
|
)
|
|
|
|
_init_completion || return
|
|
|
|
for ((i=0; i < COMP_CWORD; i++)); do
|
|
if __contains_word "${COMP_WORDS[i]}" ${VERBS[*]} &&
|
|
! __contains_word "${COMP_WORDS[i-1]}" ${OPTS[ARG]}; then
|
|
verb=${COMP_WORDS[i]}
|
|
break
|
|
fi
|
|
done
|
|
|
|
if __contains_word "$prev" ${OPTS[ARG]}; then
|
|
case $prev in
|
|
--json)
|
|
comps=$(networkctl --json=help 2>/dev/null)
|
|
;;
|
|
*)
|
|
return 0
|
|
;;
|
|
esac
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ "$cur" = -* ]]; then
|
|
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ -z ${verb-} ]]; then
|
|
comps=${VERBS[*]}
|
|
elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
|
|
comps=''
|
|
elif __contains_word "$verb" ${VERBS[LINKS]}; then
|
|
comps=$( __get_links )
|
|
elif __contains_word "$verb" ${VERBS[FILES_OR_LINKS]}; then
|
|
comps=$( __get_files; __get_links_with_prefix )
|
|
elif __contains_word "$verb" ${VERBS[FILES]}; then
|
|
comps=$( __get_files )
|
|
elif __contains_word "$verb" ${VERBS[BOOL]}; then
|
|
comps=$( yes no )
|
|
fi
|
|
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
}
|
|
|
|
complete -F _networkctl networkctl
|