mirror of
https://github.com/systemd/systemd.git
synced 2024-11-01 17:51:22 +03:00
e26fe5f911
Add 'reattach' verb to portablectl, and corresponding DBUS interface to systemd-portabled. Takes the same parameters as 'attach', but it will do a 'detach' (and it will refuse to proceed if it cannot be done) first, matching on the unversioned prefix of the new image. Eg: portablectl reattach /tmp/foo_2.raw will cause foo_1.raw to be detached, and foo_2.raw to be attached. The key difference with a manual 'detach old' plus 'attach new' is that the running units are not disturbed until after the attach completed, and if --now is passed they are then restarted. A 'detach' is not allowed normally if the units are running. By using a restart-after-deploy method, 'reattach' allows for minimal interruption of service and also for features that only work on restart (eg: file descriptor store) to work as intended. The DBUS interface returns two lists: first the removals from the detach that were not immediately re-added in the attach, so that the caller can stop the relevant units, and then the list of additions that are either new or updates, so that the caller can restart/enable the relevant units. portablectl already implements this with the existing --now/--enable switches.
112 lines
3.3 KiB
Bash
112 lines
3.3 KiB
Bash
# portablectl(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 <http://www.gnu.org/licenses/>.
|
|
|
|
__contains_word () {
|
|
local w word=$1; shift
|
|
for w in "$@"; do
|
|
[[ $w = "$word" ]] && return
|
|
done
|
|
}
|
|
|
|
__get_machines() {
|
|
local a b
|
|
machinectl list --full --no-legend --no-pager 2>/dev/null |
|
|
{ while read a b; do echo " $a"; done; };
|
|
}
|
|
|
|
_portablectl() {
|
|
local i n comps verb
|
|
local cur=${COMP_WORDS[COMP_CWORD]} prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
local -A OPTS=(
|
|
[STANDALONE]='-q --quiet --runtime --no-reload --cat --no-pager --no-legend
|
|
--no-ask-password --enable --now -h --help --version'
|
|
[ARG]='-p --profile --copy -H --host -M --machine'
|
|
)
|
|
|
|
local -A VERBS=(
|
|
[STANDALONE]='list'
|
|
[IMAGE]='attach detach reattach inspect is-attached set-limit'
|
|
[IMAGES]='remove'
|
|
[IMAGE_WITH_BOOL]='read-only'
|
|
)
|
|
|
|
if __contains_word "$prev" ${OPTS[ARG]}; then
|
|
case $prev in
|
|
--profile|-p)
|
|
comps="default nonetwork strict trusted"
|
|
;;
|
|
--copy)
|
|
comps="copy symlink auto"
|
|
;;
|
|
--host|-H)
|
|
comps=$(compgen -A hostname)
|
|
;;
|
|
--machine|-M)
|
|
comps=$( __get_machines )
|
|
;;
|
|
esac
|
|
COMPREPLY=( $(compgen -W '$comps' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
if [[ "$cur" = -* ]]; then
|
|
COMPREPLY=( $(compgen -W '${OPTS[*]}' -- "$cur") )
|
|
return 0
|
|
fi
|
|
|
|
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
|
|
|
|
n=$(($COMP_CWORD - $i))
|
|
|
|
if [[ -z $verb ]]; then
|
|
comps=${VERBS[*]}
|
|
elif __contains_word "$verb" ${VERBS[STANDALONE]}; then
|
|
comps=''
|
|
elif __contains_word "$verb" ${VERBS[IMAGE]}; then
|
|
if [[ $n == 1 ]]; then
|
|
comps=$( compgen -A file -- "$cur" )
|
|
compopt -o filenames
|
|
else
|
|
comps=''
|
|
fi
|
|
elif __contains_word "$verb" ${VERBS[IMAGES]}; then
|
|
comps=$( compgen -A file -- "$cur" )
|
|
compopt -o filenames
|
|
elif __contains_word "$verb" ${VERBS[IMAGE_WITH_BOOL]}; then
|
|
if [[ $n == 1 ]]; then
|
|
comps=$( compgen -A file -- "$cur" )
|
|
compopt -o filenames
|
|
elif [[ $n == 2 ]]; then
|
|
comps='yes no'
|
|
else
|
|
comps=''
|
|
fi
|
|
fi
|
|
|
|
COMPREPLY=( $(compgen -o filenames -W '$comps' -- "$cur") )
|
|
return 0
|
|
}
|
|
|
|
complete -F _portablectl portablectl
|