1
0
mirror of https://github.com/projectatomic/atomic.git synced 2026-02-06 12:45:57 +01:00
Files
atomic/bash/atomic
baude 9a5497f93d Atomic/scan.py: Add ability to remediate
In the case of some scanners, they generate a script to remediate the
images|containers they have scanned.  We needed to provide a hook
for this ability. We now read the scanner's configuration file looking
for a "remediation_script" key, whose value should be a fq path to the
remediation script.  The remediation script should be delivered via
the scanning image via atomic install.

As of now, we pass the id of the scanned object and its results directory
as named arguments to the remediation script.

Signed-off-by: baude <bbaude@redhat.com>

Closes: #1090
Approved by: baude
2017-09-22 15:53:57 +00:00

1486 lines
26 KiB
Bash

#!/bin/bash
#
# bash completion file for core atomic commands
# copied from the docker bash completion
#
#
# This script provides completion of:
# - commands and their options
# - container ids and names
# - image repos and tags
# - filepaths
#
# To enable the completions either:
# - place this file in /etc/bash_completion.d
# or
# - copy this file to e.g. ~/.atomic-completion.sh and add the line
# below to your .bashrc after bash completion features are loaded
# . ~/.atomic-completion.sh
#
# Note:
# Currently, the completions will not work if the atomic daemon is not
# bound to the default communication port/socket
# If the atomic daemon is using a unix socket for communication your user
# must have access to the socket for the completions to function correctly
#
# Note for developers:
# Please arrange options sorted alphabetically by long name with the short
# options immediately following their corresponding long form.
# This order should be applied to lists, alternatives and code blocks.
__atomic_previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
__docker_q() {
docker=$(awk -F ": " '/^default_docker/ {print $2}' /etc/atomic.conf 2>/dev/null || echo docker)
docker 2>/dev/null "$@"
}
__atomic_scanners() {
atomic scan --list | grep Scanner | awk '{ print $2 }'
}
_atomic_atomic() {
local boolean_options="
--help -h --version -v --debug --assumeyes -y -i --ignore
"
case "$prev" in
$main_options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
;;
esac
}
__atomic_containers_all() {
local IFS=$'\n'
local containers=( $(__docker_q ps -aq --no-trunc) )
if [ "$1" ]; then
containers=( $(__docker_q inspect --format "{{if $1}}{{.Id}}{{end}}" "${containers[@]}") )
fi
local names=( $(__docker_q inspect --format '{{.Name}}' "${containers[@]}") )
names=( "${names[@]#/}" ) # trim off the leading "/" from the container names
unset IFS
COMPREPLY=( $(compgen -W "${names[*]} ${containers[*]}" -- "$cur") )
}
__atomic_containers_running() {
__atomic_containers_all '.State.Running'
}
__atomic_containers_stopped() {
__atomic_containers_all 'not .State.Running'
}
__atomic_containers_pauseable() {
__atomic_containers_all 'and .State.Running (not .State.Paused)'
}
__atomic_containers_unpauseable() {
__atomic_containers_all '.State.Paused'
}
__atomic_image_repos() {
local repos="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1 }')"
COMPREPLY=( $(compgen -W "$repos" -- "$cur") )
}
__atomic_image_repos_and_tags() {
local reposAndTags="$(__docker_q images | awk 'NR>1 && $1 != "<none>" { print $1; print $1":"$2 }')"
COMPREPLY=( $(compgen -W "$reposAndTags" -- "$cur") )
__ltrim_colon_completions "$cur"
}
__atomic_system_containers_images() {
local images="$(atomic images list --no-trunc -f type=ostree|
awk 'NR>1 { if ($1 == ">" || $1 == "*") print $2; else print $1; }')"
COMPREPLY+=( $(compgen -W "$images" -- "$cur") )
}
__atomic_system_containers_containers() {
local containers
CHECKOUT_DIR=`test -e /etc/atomic.conf && grep "^checkout_path:" /etc/atomic.conf | cut -d' ' -f2`
CHECKOUT_DIR=${CHECKOUT_DIR:-/var/lib/containers/atomic/}
test -e ${CHECKOUT_DIR} && containers="$(ls -1 ${CHECKOUT_DIR} | grep -v \.[01]$)" || containers=""
COMPREPLY+=( $(compgen -W "$containers" -- "$cur") )
}
__atomic_system_containers_containers_running() {
local containers=( $(atomic containers list --no-trunc -q -f runtime=runc) )
COMPREPLY+=( $(compgen -W "${containers[*]}" -- "$cur") )
}
__atomic_image_repos_and_tags_and_ids() {
local images
if test $_system == "0"; then
images="$(__docker_q images -a --no-trunc | awk 'NR>1 { print $3; if ($1 != "<none>") { print $1; print $1":"$2 } }')"
COMPREPLY=( $(compgen -W "$images" -- "$cur") )
else
__atomic_system_containers_images
fi
__ltrim_colon_completions "$cur"
}
__atomic_containers_and_images() {
__atomic_containers_all
local containers=( "${COMPREPLY[@]}" )
__atomic_image_repos_and_tags_and_ids
COMPREPLY+=( "${containers[@]}" )
__atomic_system_containers_images
__atomic_system_containers_containers
}
__atomic_pos_first_nonflag() {
local argument_flags=$1
local counter=$cpos
while [ $counter -le $cword ]; do
if [ -n "$argument_flags" ] && eval "case '${words[$counter]}' in $argument_flags) true ;; *) false ;; esac"; then
(( counter++ ))
else
case "${words[$counter]}" in
-*)
;;
*)
break
;;
esac
fi
(( counter++ ))
done
echo $counter
}
# Transforms a multiline list of strings into a single line string
# with the words separated by "|".
# This is used to prepare arguments to __atomic_pos_first_nonflag().
__atomic_to_alternatives() {
local parts=( $1 )
local IFS='|'
echo "${parts[*]}"
}
# Transforms a multiline list of options into an extglob pattern
# suitable for use in case statements.
__atomic_to_extglob() {
local extglob=$( __atomic_to_alternatives "$1" )
echo "@($extglob)"
}
_atomic_images_help() {
local counter=$(__atomic_pos_first_nonflag)
if [ $cword -eq $counter ]; then
COMPREPLY=( $( compgen -W "${commands[*]}" -- "$cur" ) )
fi
}
_atomic_images_info() {
local options_with_args="
--storage
"
local all_options="$options_with_args
-h --help
--remote
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
;;
esac
}
# Subcommand processing.
# Locates the first occurrence of any of the subcommands contained in the
# first argument. In case of a match, calls the corresponding completion
# function and returns 0.
# If no match is found, 1 is returned. The calling function can then
# continue processing its completion.
#
# TODO if the preceding command has options that accept arguments and an
# argument is equal ot one of the subcommands, this is falsely detected as
# a match.
__atomic_subcommands() {
local subcommands="$1"
local counter=$(($command_pos + 1))
while [ $counter -lt $cword ]; do
case "${words[$counter]}" in
$(__atomic_to_extglob "$subcommands") )
subcommand_pos=$counter
local subcommand=${words[$counter]}
local completions_func=_atomic_${command}_${subcommand}
declare -F $completions_func >/dev/null && $completions_func
return 0
;;
esac
(( counter++ ))
done
return 1
}
_atomic_scan() {
local options_with_args="
--fetch_cves
"
local all_options="$options_with_args
--help -h
--all
--images
--containers
--rootfs
--list
--remediate
--scanner
--scan_type
--verbose
--scanner_args
"
[ "$command" = "scan" ] && all_options="$all_options"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--scanner )
scanners=$(__atomic_scanners)
COMPREPLY=( $( compgen -W $scanners -- "$cur" ) )
return 0
;;
$options_with_args_glob )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
return 0
fi
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_top() {
local options_with_args="
--optional
-o
-d
-n
"
local options="
gid
group
ppid
stime
time
uid
user
"
case "$prev" in
"-o"|"--options")
COMPREPLY=( $( compgen -W "$options" -- "$cur" ) )
return 0
;;
esac
local all_options="$options_with_args"
[ "$command" = "top" ] && all_options="$all_options"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_containers_running
;;
esac
return 0
}
_atomic_images_verify() {
local options_with_args="
--storage
"
local all_options="$options_with_args
-h --help
--no-validate
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
;;
esac
}
_atomic_images_version() {
local options_with_args="
--storage
"
local all_options="$options_with_args
-r --recurse
-h --help
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
__atomic_system_containers_images
;;
esac
}
_atomic_pull() {
local options_with_args="
-t --type
--storage
"
local all_options="$options_with_args
-h --help
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
;;
-t | --type)
COMPREPLY=( $( compgen -W "atomic docker" -- "$cur" ) )
;;
$options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_push() {
local options_with_args="
-U --url
-u --username
-p --password
-a --activation_key
-r --repository_id
--sign-by
-t --type
"
local all_options="$options_with_args
-h --help
--pulp
--satellite
--verify_ssl
--insecure
--debug
--anonymous
--force -f
--help
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
-t | --type)
COMPREPLY=( $( compgen -W "atomic docker" -- "$cur" ) )
;;
$options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
;;
esac
}
_atomic_containers() {
local subcommands="
delete
list
rollback
trim
update
"
__atomic_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
return 0
}
_atomic_containers_delete() {
local all_options="$options_with_args
--all -a
--force -f
--storage
--help
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_containers_all
;;
esac
}
_atomic_containers_list() {
local options_with_args="
--filter -f
"
local all_options="$options_with_args
--all -a
--help
--json
--noheading -n
--no-trunc
--quiet -q
"
local filterables="
container
image
command
created
state
backend
runtime
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
$options_with_args_glob )
compopt -o nospace
COMPREPLY=( $( compgen -S\= -W "$filterables" "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_containers_rollback() {
local all_options="
--help
"
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_system_containers_containers
;;
esac
}
_atomic_containers_trim() {
local all_options="
--help
"
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_containers_update() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help --set --rebase" -- "$cur" ) )
;;
*)
__atomic_system_containers_containers
;;
esac
}
_atomic_uninstall() {
local all_options="
--display
--force
--help
--storage
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W -- "$cur" ) )
;;
*)
__atomic_containers_all
__atomic_system_containers_containers
;;
esac
}
_atomic_diff() {
local options_with_args="
--keywords, -k
"
local all_options="$options_with_args
--help
--json
--display
--metadata, -m
--names-only
--no-files -n
--rpms -r
--verbose -v
"
local keywords="
all
gid
link
mode
nlink
sha256digest
size
time
type
uid
"
[ "$command" = "diff" ] && all_options="$all_options"
case "$prev" in
"-k"|"--keywords")
COMPREPLY=( $( compgen -W "$keywords" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_image_repos_and_tags_and_ids
fi
;;
esac
}
_atomic_run() {
local options_with_args="
--name -n
"
local all_options="$options_with_args
--help
--spc
--display
--quiet
--replace
--storage
"
[ "$command" = "run" ] && all_options="$all_options"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$prev" in
$options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
fi
;;
esac
}
_atomic_install() {
local options_with_args="
--name -n
"
local all_options="$options_with_args
--help
--display
--rootfs
--storage
--system
--system-package
--set
--user
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$prev" in
$options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
if test $_system == "0"; then
__atomic_image_repos_and_tags_and_ids
else
__atomic_system_containers_images
fi
;;
esac
}
_atomic_images() {
local subcommands="
delete
generate
help
info
list
prune
tag
update
version
verify
"
__atomic_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
return 0
}
_atomic_images_list() {
local options_with_args="
--filter -f
"
local all_options="$options_with_args
--all -a
--help -h
--noheading -n
--no-trunc
--quiet -q
--json
"
local filterables="
repo
tag
id
image
created
size
type
is_dangling
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
$options_with_args_glob )
compopt -o nospace
COMPREPLY=( $( compgen -S\= -W "$filterables" "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_images_delete() {
local options_with_args="
--storage
"
local all_options="$options_with_args
--force -f
--help -h
--remote
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
__atomic_system_containers_images
;;
esac
}
_atomic_images_tag() {
local options_with_args="
--storage
"
local all_options="$options_with_args
--help -h
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
__atomic_system_containers_images
;;
esac
}
_atomic_images_update() {
local options_with_args="
--storage
"
local all_options="$options_with_args
--force -f
--help -h
"
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_image_repos_and_tags
__atomic_system_containers_images
;;
esac
}
_atomic_sign() {
local options_with_args="
--sign-by
-d --directory
-g, --gnupghome
"
local all_options="$options_with_args
--help -h
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
"-d"|"--directory")
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
"-g"|"--gnupghome")
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
$options_with_args_glob )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
return 0
fi
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_trust() {
local subcommands="
add
delete
default
reset
show
"
__atomic_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
return 0
}
_atomic_trust_default() {
local subcommands="
accept
reject
"
local all_options="$options_with_args
--help -h
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
}
_atomic_trust_add() {
local options_with_args="
--pubkeys -k
--pubkeysfile -f
--sigstoretype
--type -t
--keytype
--sigstore -s
"
local all_options="$options_with_args
--help -h
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--keytype)
COMPREPLY=( $( compgen -W "GPGKeys" -- "$cur" ) )
;;
--sigstoretype)
COMPREPLY=( $( compgen -W "atomic local web" -- "$cur" ) )
;;
--type|-t)
COMPREPLY=( $( compgen -W "signedBy insecureAcceptAnything reject" -- "$cur" ) )
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
;;
esac
}
_atomic_trust_show() {
local all_options="$options_with_args
-j --json
--raw
"
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_trust_delete() {
local options_with_args="
--sigstoretype
"
local all_options="$options_with_args
--help -h
--sigstore
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--sigstoretype)
COMPREPLY=( $( compgen -W "atomic local web" -- "$cur" ) )
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
;;
esac
}
_atomic_mount() {
local options_with_args="
--options -o
--storage
"
local all_options="$options_with_args
--help -h
--live
--shared
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--storage)
COMPREPLY=( $( compgen -W "docker ostree" -- "$cur" ) )
return 0
;;
$options_with_args_glob )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
return 0
fi
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_upload() {
local options_with_args="
--URL -U
--username -u
--password -p
--repo_id --repository_id
--activation_key -a
"
local all_options="$options_with_args
--help -h
--pulp
--satellite
--verify_ssl
--debug
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
$options_with_args_glob )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
return 0
fi
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_unmount() {
case "$prev" in
"unmount")
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_stop() {
local options_with_args="
--name -n
"
local all_options="$options_with_args
--display
"
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
__atomic_containers_running
__atomic_system_containers_containers_running
;;
esac
}
_atomic_host_deploy() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-r --reboot --os --preview -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_host_rollback() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-r --reboot -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_host_status() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-j --json -p --pretty -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_host_upgrade() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "-r --reboot --os --allow-downgrade --check-diff -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_host_unlock() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--hotfix -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_host_host() {
local boolean_options="
--help -h
"
case "$prev" in
$main_options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
;;
esac
}
_atomic_images_help() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
*)
local counter=$( __atomic_pos_first_nonflag $( __atomic_to_alternatives "$options_with_args" ) )
if [ $cword -eq $counter ]; then
__atomic_containers_and_images
return 0
fi
COMPREPLY=( $( compgen -d "$cur" ) )
return 0
;;
esac
return 0
}
_atomic_host() {
local commands=(
deploy
rollback
status
upgrade
unlock
)
local completions_func=_atomic_host_${prev}
declare -F $completions_func >/dev/null && $completions_func
return 0
}
_atomic_storage() {
local subcommands="
export
import
reset
modify
"
__atomic_subcommands "$subcommands" && return
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--help" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "$subcommands" -- "$cur" ) )
;;
esac
return 0
}
_atomic_storage_modify() {
local options_with_args="
--driver
--add-device
--rootfs
--lvname
--lvsize
"
local all_options="$options_with_args
--help
-h
"
local options_with_args_glob=$(__atomic_to_extglob "$options_with_args")
case "$prev" in
--add-device)
COMPREPLY=( $( compgen -f "/dev/" ) )
return 0
;;
--driver)
COMPREPLY=( $( compgen -W "devicemapper overlay overlay2" -- "$cur" ) )
return 0
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$all_options" -- "$cur" ) )
;;
esac
}
_atomic_storage_storage() {
local boolean_options="
--help -h
"
case "$prev" in
$main_options_with_args_glob )
return
;;
esac
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "$boolean_options $main_options_with_args" -- "$cur" ) )
;;
*)
COMPREPLY=( $( compgen -W "${commands[*]} help" -- "$cur" ) )
;;
esac
}
_atomic_storage_reset() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--graph -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_storage_export() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--graph --dir -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic_storage_import() {
case "$cur" in
-*)
COMPREPLY=( $( compgen -W "--graph --dir -h --help" -- "$cur" ) )
;;
*)
;;
esac
}
_atomic() {
local previous_extglob_setting=$(shopt -p extglob)
shopt -s extglob
local commands=(
containers
host
diff
install
images
storage
mount
pull
push
run
scan
sign
stop
top
trust
uninstall
unmount
upload
)
local main_options_with_args="
--help
"
local main_options_with_args_glob=$(__atomic_to_extglob "$main_options_with_args")
COMPREPLY=()
local cur prev words cword
_get_comp_words_by_ref -n : cur prev words cword
local command='atomic' cpos=0
local counter=1
_system=0
_container=0
while [ $counter -lt $cword ]; do
if test "${words[$counter]}" == "--system"; then
_system=1
break
fi
if test "${words[$counter]}" == "--container"; then
_container=1
break
fi
(( counter++ ))
done
counter=1
while [ $counter -lt $cword ]; do
case "${words[$counter]}" in
$main_options_with_args_glob )
(( counter++ ))
;;
"--system")
_system=1;;
-*)
;;
*)
command="${words[$counter]}"
cpos=$counter
(( cpos++ ))
break
;;
esac
(( counter++ ))
done
local completions_func=_atomic_${command}
declare -F $completions_func >/dev/null && $completions_func
eval "$previous_extglob_setting"
return 0
}
complete -F _atomic atomic