]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Add `__lxc_get_selinux_contexts()`.
authorEdênis Freindorfer Azevedo <edenisfa@gmail.com>
Tue, 31 Aug 2021 15:45:51 +0000 (12:45 -0300)
committerEdênis Freindorfer Azevedo <edenisfa@gmail.com>
Wed, 8 Sep 2021 01:24:06 +0000 (22:24 -0300)
List SElinux contexts available. Not clear if this could be only for
root or if normal user with `sudo` is also supported.

Using `Fedora34` for basic testing.

Signed-off-by: Edênis Freindorfer Azevedo <edenisfa@gmail.com>
config/bash/lxc.in

index fa82c39fdccda86eee2661e82d23bf50e63fcfb3..e134d82bf021191b41d5eaab83fc8a70c6e3e214 100644 (file)
@@ -239,6 +239,31 @@ __lxc_piped_args() {
     [[ "${#extcompletion[@]}" -gt 1 ]] && compopt -o nospace
 }
 
+__lxc_get_selinux_contexts() {
+    declare -a sepolicies=()
+    local sepolicy
+    # Check for SElinux tool.
+    if ! command -v semanage > /dev/null 2>&1; then
+        return
+    fi
+    # Skip header + following empty line.
+    mapfile -s 2 -t output < <(command semanage fcontext -l 2>/dev/null)
+    local -r none="<<None>>"
+    for line in "${output[@]}"; do
+        if [[ "${line}" =~ "SELinux Distribution fcontext Equivalence" ]]; then
+            break
+        fi
+        read -r -e -a current <<< "${line}"
+        if [[ "${#current[@]}" -gt 0 ]]; then
+            sepolicy="${current[${#current[@]}-1]}"
+            [[ ! "${sepolicy}" =~ ${none} ]] && sepolicies+=("${sepolicy}")
+        fi
+    done
+    # Default context.
+    sepolicies+=("unconfined_u:object_r:default_t:s0")
+    COMPREPLY=( $( compgen -P'"' -S'"' -W "${sepolicies[*]}" -- "${cur}" ) )
+}
+
 _lxc_attach() {
     local cur prev words cword split
     COMPREPLY=()
@@ -292,7 +317,7 @@ _lxc_attach() {
             return
             ;;
         --context | -c )
-            # @TODO: list all SElinux contexts available.
+            __lxc_get_selinux_contexts
             return
             ;;
     esac