Skip to content
Snippets Groups Projects
Select Git revision
  • cacbdad94fbfc69008dc8796b23df387c44c6915
  • master default protected
  • simple-task/7248-eol-check-add-node-22
  • 6877_check_iml_deployment
4 results

inc_dockerfunctions.sh

Blame
  • inc_dockerfunctions.sh 3.38 KiB
    #!/bin/bash
    # ======================================================================
    #
    # Shared functions for DOCKER checks
    #
    # requirements:
    # - docker
    # - jq
    #
    # ----------------------------------------------------------------------
    # Cli docs:
    # https://docs.docker.com/engine/reference/commandline/docker/
    # ----------------------------------------------------------------------
    # 2024-01-19  v1.0  <axel.hahn@unibe.ch>      init
    # 2024-01-29  v1.1  <axel.hahn@unibe.ch>      _detectDockererror
    # ======================================================================
    
    
    . $(dirname $0)/inc_pluginfunctions
    
    _is_docker_rootless=0
    _is_docker_detected=0
    
    # ----------------------------------------------------------------------
    # FUNCTIONS
    # ----------------------------------------------------------------------
    
    # filter json data with jq
    # param  string  json data
    # param  string  jq filter
    function _filterJson(){
        echo "$1" | jq -r "$2"
    }
    
    # filter json data with jq (by expecting a single result) and remove quotes
    # param  string  json data
    # param  string  jq filter
    function _getString(){
        _filterJson "$1" "$2" | sed "s#^null\$##g"
    }
    
    # if DOCKER_HOST is not set we try to detect the user running "containerd"
    # create an env var DOCKER_HOST="unix:///run/user/<ID>/docker.sock"
    function _detectDockerenv(){
        local dockeruid=
        if [ -z "$DOCKER_HOST" ]; then
            dockeruid=$( ps -ef | grep containerd | grep -Eo "/run/user/([0-9]*)/" | head -1 | cut -f 4 -d '/' )
            if [ -n "$dockeruid" ]; then
                _is_docker_detected=1
                export DOCKER_HOST="unix:///run/user/$dockeruid/docker.sock"
            fi
            # Don't abort - it is allowed that the variable DOCKER_HOST is missing
        fi
        if grep "/run/user/[0-9]*" <<< "$DOCKER_HOST" >/dev/null; then
            _is_docker_rootless=1
        fi
    }
    
    # show some debug infos to be shown if needed.
    function _debugInfos(){
        echo
        echo "DEBUG INFOS:"
        echo "DOCKER_HOST = $DOCKER_HOST"
        test "$_is_docker_detected" -eq 0 && echo "It was set in the environment."
        test "$_is_docker_detected" -eq 1 && echo "It was detected from process list."
        echo
    }
    # detect error after dicker command. It stops if
    # - no content was fetched
    # - content contains key "ServerErrors"
    # param  string  output of docker command (json)
    # param  bool    flag: is output from docker system info
    function _detectDockererror(){
    
        local data="$1"
        if [ -z "$data" ] ; then
            if [ "$2" != "1" ]; then
                # zero output could mean:
                # - connect to docker failed
                # - no data because no container is running
                # --> let's detect it...
                infos=$( sudo -n --preserve-env docker system info --format '{{ json . }}' )
                _detectDockererror "$infos"
    
                typeset -i iCRunning;
                iCRunning=$(_getString "$data" ".ContainersRunning" )
                if [ "$iCRunning" -eq "0" ]; then
                    ph.status "No data. No container is running"
                    ph.exit
                fi
            fi
    
            ph.setStatus unknown
            ph.status "No data. Unable to fetch Docker information."
            ph.exit
        fi
    
        if grep '"ServerErrors"' <<<"$data" >/dev/null; then
            ph.setStatus unknown
            ph.status "Unable to connect to Docker:"
            _filterJson "$data" ".ServerErrors" | grep "^ "
            ph.exit
        fi
    
    }
    # ----------------------------------------------------------------------