Merge branch '__download_improvements' into 'master'
__download improvements See merge request ungleich-public/cdist!895
This commit is contained in:
		
				commit
				
					
						fde5627721
					
				
			
		
					 10 changed files with 173 additions and 27 deletions
				
			
		
							
								
								
									
										19
									
								
								cdist/conf/type/__download/explorer/remote_cmd
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								cdist/conf/type/__download/explorer/remote_cmd
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,19 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
if [ -f "$__object/parameter/cmd-get" ]
 | 
			
		||||
then
 | 
			
		||||
    cmd="$( cat "$__object/parameter/cmd-get" )"
 | 
			
		||||
 | 
			
		||||
elif command -v curl > /dev/null
 | 
			
		||||
then
 | 
			
		||||
    cmd="curl -L -o - '%s'"
 | 
			
		||||
 | 
			
		||||
elif command -v fetch > /dev/null
 | 
			
		||||
then
 | 
			
		||||
    cmd="fetch -o - '%s'"
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
    cmd="wget -O - '%s'"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "$cmd"
 | 
			
		||||
| 
						 | 
				
			
			@ -2,19 +2,71 @@
 | 
			
		|||
 | 
			
		||||
dst="/$__object_id"
 | 
			
		||||
 | 
			
		||||
# shellcheck disable=SC2059
 | 
			
		||||
cmd="$( printf "$( cat "$__object/parameter/cmd-sum" )" "$dst" )"
 | 
			
		||||
 | 
			
		||||
sum="$( cat "$__object/parameter/sum" )"
 | 
			
		||||
 | 
			
		||||
if [ -f "$dst" ]
 | 
			
		||||
if [ ! -f "$dst" ]
 | 
			
		||||
then
 | 
			
		||||
    if [ "$( eval "$cmd" )" = "$sum" ]
 | 
			
		||||
    then
 | 
			
		||||
        echo 'present'
 | 
			
		||||
    else
 | 
			
		||||
        echo 'mismatch'
 | 
			
		||||
    fi
 | 
			
		||||
else
 | 
			
		||||
    echo 'absent'
 | 
			
		||||
    exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
sum_should="$( cat "$__object/parameter/sum" )"
 | 
			
		||||
 | 
			
		||||
if [ -f "$__object/parameter/cmd-sum" ]
 | 
			
		||||
then
 | 
			
		||||
    # shellcheck disable=SC2059
 | 
			
		||||
    sum_is="$( eval "$( printf \
 | 
			
		||||
        "$( cat "$__object/parameter/cmd-sum" )" \
 | 
			
		||||
        "$dst" )" )"
 | 
			
		||||
else
 | 
			
		||||
    os="$( "$__explorer/os" )"
 | 
			
		||||
 | 
			
		||||
    if echo "$sum_should" | grep -Eq '^[0-9]+\s[0-9]+$'
 | 
			
		||||
    then
 | 
			
		||||
        sum_is="$( cksum "$dst" | awk '{print $1" "$2}' )"
 | 
			
		||||
 | 
			
		||||
    elif echo "$sum_should" | grep -Eiq '^md5:[a-f0-9]{32}$'
 | 
			
		||||
    then
 | 
			
		||||
        case "$os" in
 | 
			
		||||
            freebsd)
 | 
			
		||||
                sum_is="md5:$( md5 -q "$dst" )"
 | 
			
		||||
            ;;
 | 
			
		||||
            *)
 | 
			
		||||
                sum_is="md5:$( md5sum "$dst" | awk '{print $1}' )"
 | 
			
		||||
            ;;
 | 
			
		||||
        esac
 | 
			
		||||
 | 
			
		||||
    elif echo "$sum_should" | grep -Eiq '^sha1:[a-f0-9]{40}$'
 | 
			
		||||
    then
 | 
			
		||||
        case "$os" in
 | 
			
		||||
            freebsd)
 | 
			
		||||
                sum_is="sha1:$( sha1 -q "$dst" )"
 | 
			
		||||
            ;;
 | 
			
		||||
            *)
 | 
			
		||||
                sum_is="sha1:$( sha1sum "$dst" | awk '{print $1}' )"
 | 
			
		||||
            ;;
 | 
			
		||||
        esac
 | 
			
		||||
 | 
			
		||||
    elif echo "$sum_should" | grep -Eiq '^sha256:[a-f0-9]{64}$'
 | 
			
		||||
    then
 | 
			
		||||
        case "$os" in
 | 
			
		||||
            freebsd)
 | 
			
		||||
                sum_is="sha256:$( sha256 -q "$dst" )"
 | 
			
		||||
            ;;
 | 
			
		||||
            *)
 | 
			
		||||
                sum_is="sha256:$( sha256sum "$dst" | awk '{print $1}' )"
 | 
			
		||||
            ;;
 | 
			
		||||
        esac
 | 
			
		||||
    fi
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -z "$sum_is" ]
 | 
			
		||||
then
 | 
			
		||||
    echo 'no checksum from target' >&2
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ "$sum_is" = "$sum_should" ]
 | 
			
		||||
then
 | 
			
		||||
    echo 'present'
 | 
			
		||||
else
 | 
			
		||||
    echo 'mismatch'
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,20 +1,41 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
download="$( cat "$__object/parameter/download" )"
 | 
			
		||||
 | 
			
		||||
state_is="$( cat "$__object/explorer/state" )"
 | 
			
		||||
 | 
			
		||||
if [ "$state_is" = 'present' ]
 | 
			
		||||
if [ "$download" != 'local' ] || [ "$state_is" = 'present' ]
 | 
			
		||||
then
 | 
			
		||||
    exit 0
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
url="$( cat "$__object/parameter/url" )"
 | 
			
		||||
 | 
			
		||||
cmd="$( cat "$__object/parameter/cmd-get" )"
 | 
			
		||||
 | 
			
		||||
tmp="$( mktemp )"
 | 
			
		||||
 | 
			
		||||
dst="/$__object_id"
 | 
			
		||||
 | 
			
		||||
if [ -f "$__object/parameter/cmd-get" ]
 | 
			
		||||
then
 | 
			
		||||
    cmd="$( cat "$__object/parameter/cmd-get" )"
 | 
			
		||||
 | 
			
		||||
elif command -v wget > /dev/null
 | 
			
		||||
then
 | 
			
		||||
    cmd="wget -O - '%s'"
 | 
			
		||||
 | 
			
		||||
elif command -v curl > /dev/null
 | 
			
		||||
then
 | 
			
		||||
    cmd="curl -L -o - '%s'"
 | 
			
		||||
 | 
			
		||||
elif command -v fetch > /dev/null
 | 
			
		||||
then
 | 
			
		||||
    cmd="fetch -o - '%s'"
 | 
			
		||||
 | 
			
		||||
else
 | 
			
		||||
    echo 'no usable locally installed utility for downloading' >&2
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
printf "$cmd > %s\n" \
 | 
			
		||||
    "$url" \
 | 
			
		||||
    "$tmp"
 | 
			
		||||
| 
						 | 
				
			
			@ -33,3 +54,5 @@ printf '%s %s %s:%s\n' \
 | 
			
		|||
    "$dst"
 | 
			
		||||
 | 
			
		||||
echo "rm -f '$tmp'"
 | 
			
		||||
 | 
			
		||||
echo 'downloaded' > "$__messages_out"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										25
									
								
								cdist/conf/type/__download/gencode-remote
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										25
									
								
								cdist/conf/type/__download/gencode-remote
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
download="$( cat "$__object/parameter/download" )"
 | 
			
		||||
 | 
			
		||||
state_is="$( cat "$__object/explorer/state" )"
 | 
			
		||||
 | 
			
		||||
if [ "$download" = 'remote' ] && [ "$state_is" != 'present' ]
 | 
			
		||||
then
 | 
			
		||||
    cmd="$( cat "$__object/explorer/remote_cmd" )"
 | 
			
		||||
 | 
			
		||||
    url="$( cat "$__object/parameter/url" )"
 | 
			
		||||
 | 
			
		||||
    dst="/$__object_id"
 | 
			
		||||
 | 
			
		||||
    printf "$cmd > %s\n" \
 | 
			
		||||
        "$url" \
 | 
			
		||||
        "$dst"
 | 
			
		||||
 | 
			
		||||
    echo 'downloaded' > "$__messages_out"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [ -f "$__object/parameter/onchange" ] && [ "$state" != "present" ]
 | 
			
		||||
then
 | 
			
		||||
    cat "$__object/parameter/onchange"
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -3,36 +3,56 @@ cdist-type__download(7)
 | 
			
		|||
 | 
			
		||||
NAME
 | 
			
		||||
----
 | 
			
		||||
cdist-type__download - Download file to local storage and copy it to target host
 | 
			
		||||
cdist-type__download - Download a file
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DESCRIPTION
 | 
			
		||||
-----------
 | 
			
		||||
You must use persistent storage in target host for destination file
 | 
			
		||||
(``$__object_id``) because it will be used for checksum calculation
 | 
			
		||||
in order to decide if file must be downloaded.
 | 
			
		||||
Destination (``$__object_id``) in target host must be persistent storage
 | 
			
		||||
in order to calculate checksum and decide if file must be (re-)downloaded.
 | 
			
		||||
 | 
			
		||||
By default type will try to use ``wget``, ``curl`` or ``fetch``.
 | 
			
		||||
If download happens in target (see ``--download``) then type will
 | 
			
		||||
fallback to (and install) ``wget``.
 | 
			
		||||
 | 
			
		||||
If download happens in local machine, then environment variables like
 | 
			
		||||
``{http,https,ftp}_proxy`` etc can be used on cdist execution
 | 
			
		||||
(``http_proxy=foo cdist config ...``).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
REQUIRED PARAMETERS
 | 
			
		||||
-------------------
 | 
			
		||||
url
 | 
			
		||||
   URL from which to download the file.
 | 
			
		||||
   File's URL.
 | 
			
		||||
 | 
			
		||||
sum
 | 
			
		||||
   Checksum of downloaded file.
 | 
			
		||||
   Checksum of file going to be downloaded.
 | 
			
		||||
   By default output of ``cksum`` without filename is expected.
 | 
			
		||||
   Other hash formats supported with prefixes: ``md5:``, ``sha1:`` and ``sha256:``.
 | 
			
		||||
 | 
			
		||||
onchange
 | 
			
		||||
   Execute this command after download.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OPTIONAL PARAMETERS
 | 
			
		||||
-------------------
 | 
			
		||||
download
 | 
			
		||||
   If ``local`` (default), then download file to local storage and copy
 | 
			
		||||
   it to target host. If ``remote``, then download happens in target.
 | 
			
		||||
 | 
			
		||||
cmd-get
 | 
			
		||||
   Command used for downloading.
 | 
			
		||||
   Default is ``wget -O- '%s'``.
 | 
			
		||||
   Command must output to ``stdout``.
 | 
			
		||||
   Parameter will be used for ``printf`` and must include only one
 | 
			
		||||
   format specification ``%s`` which will become URL.
 | 
			
		||||
   For example: ``wget -O - '%s'``.
 | 
			
		||||
 | 
			
		||||
cmd-sum
 | 
			
		||||
   Command used for checksum calculation.
 | 
			
		||||
   Default is ``md5sum '%s' | awk '{print $1}'``.
 | 
			
		||||
   Command output and ``--sum`` parameter must match.
 | 
			
		||||
   Parameter will be used for ``printf`` and must include only one
 | 
			
		||||
   format specification ``%s`` which will become destination.
 | 
			
		||||
   For example: ``md5sum '%s' | awk '{print $1}'``.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
EXAMPLES
 | 
			
		||||
| 
						 | 
				
			
			@ -45,7 +65,7 @@ EXAMPLES
 | 
			
		|||
    require='__directory/opt/cpma' \
 | 
			
		||||
        __download /opt/cpma/cnq3.zip \
 | 
			
		||||
            --url https://cdn.playmorepromode.com/files/cnq3/cnq3-1.51.zip \
 | 
			
		||||
            --sum 46da3021ca9eace277115ec9106c5b46
 | 
			
		||||
            --sum md5:46da3021ca9eace277115ec9106c5b46
 | 
			
		||||
 | 
			
		||||
    require='__download/opt/cpma/cnq3.zip' \
 | 
			
		||||
        __unpack /opt/cpma/cnq3.zip \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										6
									
								
								cdist/conf/type/__download/manifest
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										6
									
								
								cdist/conf/type/__download/manifest
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
if grep -Eq '^wget' "$__object/explorer/remote_cmd"
 | 
			
		||||
then
 | 
			
		||||
    __package wget
 | 
			
		||||
fi
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
wget -O- '%s'
 | 
			
		||||
| 
						 | 
				
			
			@ -1 +0,0 @@
 | 
			
		|||
md5sum '%s' | awk '{print $1}'
 | 
			
		||||
							
								
								
									
										1
									
								
								cdist/conf/type/__download/parameter/default/download
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								cdist/conf/type/__download/parameter/default/download
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
local
 | 
			
		||||
| 
						 | 
				
			
			@ -1,2 +1,4 @@
 | 
			
		|||
cmd-get
 | 
			
		||||
cmd-sum
 | 
			
		||||
download
 | 
			
		||||
onchange
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue