[__unpack] no mkdir by default, because destination can be file, but tar needs mkdir andrar needs slash at the end
This commit is contained in:
		
					parent
					
						
							
								fdef468f1a
							
						
					
				
			
			
				commit
				
					
						73f1937636
					
				
			
		
					 10 changed files with 306 additions and 0 deletions
				
			
		
							
								
								
									
										37
									
								
								cdist/conf/type/__unpack/explorer/state
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										37
									
								
								cdist/conf/type/__unpack/explorer/state
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,37 @@
 | 
				
			||||||
 | 
					#!/bin/sh -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					src="/$__object_id"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -f "$__object/parameter/sum-file" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    src_sum_was_file="$( cat "$__object/parameter/sum-file" )"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    src_sum_was_file="$src.cdist__unpack_sum"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! -f "$src" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    if [ -n "$__cdist_dry_run" ]
 | 
				
			||||||
 | 
					    then
 | 
				
			||||||
 | 
					        echo 'mismatch'
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        echo 'missing'
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    if [ ! -f "$src_sum_was_file" ]
 | 
				
			||||||
 | 
					    then
 | 
				
			||||||
 | 
					        echo 'mismatch'
 | 
				
			||||||
 | 
					        exit 0
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    src_sum_was="$( cat "$src_sum_was_file" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    src_sum_is="$( cksum "$src" | awk '{ print $1$2 }' )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if [ "$src_sum_was" = "$src_sum_is" ]
 | 
				
			||||||
 | 
					    then
 | 
				
			||||||
 | 
					        echo 'match'
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        echo 'mismatch'
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										75
									
								
								cdist/conf/type/__unpack/gencode-remote
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										75
									
								
								cdist/conf/type/__unpack/gencode-remote
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,75 @@
 | 
				
			||||||
 | 
					#!/bin/sh -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if grep -Eq '^(missing|match)$' "$__object/explorer/state"
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    exit 0
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					os="$( cat "$__global/explorer/os" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					src="/$__object_id"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dst="$( sed 's/\/$//' "$__object/parameter/destination" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cmd=''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case "$src" in
 | 
				
			||||||
 | 
					    *.tar|*.tgz|*.tar.*)
 | 
				
			||||||
 | 
					        cmd="mkdir -p '$dst' && tar --directory='$dst' --extract --file='$src'"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [ -f "$__object/parameter/tar-strip" ]
 | 
				
			||||||
 | 
					        then
 | 
				
			||||||
 | 
					            tar_strip="$( cat "$__object/parameter/tar-strip" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            cmd="$cmd --strip-components=$tar_strip"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.7z)
 | 
				
			||||||
 | 
					        case "$os" in
 | 
				
			||||||
 | 
					            centos|fedora|redhat)
 | 
				
			||||||
 | 
					                cmd='7za'
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            *)
 | 
				
			||||||
 | 
					                cmd='7zr'
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        cmd="$cmd e -aoa -o'$dst' '$src'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.bz2)
 | 
				
			||||||
 | 
					        cmd="bunzip2 --stdout '$src' > '$dst'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.gz)
 | 
				
			||||||
 | 
					        cmd="gunzip --stdout '$src' > '$dst'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.lzma|*.xz)
 | 
				
			||||||
 | 
					        cmd="xz --uncompress --stdout '$src' > '$dst'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.rar)
 | 
				
			||||||
 | 
					        cmd="unrar x -o+ '$src' '$dst/'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.zip)
 | 
				
			||||||
 | 
					        cmd="unzip -o '$src' -d '$dst'"
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -f "$__object/parameter/backup-destination" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    echo "if [ -e '$dst' ]; then mv '$dst' '$dst.cdist__unpack_backup_$( date +%s )'; fi"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "$cmd"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ -f "$__object/parameter/sum-file" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    sum_file="$( cat "$__object/parameter/sum-file" )"
 | 
				
			||||||
 | 
					else
 | 
				
			||||||
 | 
					    sum_file="$src.cdist__unpack_sum"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "cksum '$src' | awk '{ print \$1\$2 }' > '$sum_file'"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if [ ! -f "$__object/parameter/preserve-archive" ]
 | 
				
			||||||
 | 
					then
 | 
				
			||||||
 | 
					    echo "rm -f '$src'"
 | 
				
			||||||
 | 
					fi
 | 
				
			||||||
							
								
								
									
										79
									
								
								cdist/conf/type/__unpack/man.rst
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								cdist/conf/type/__unpack/man.rst
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,79 @@
 | 
				
			||||||
 | 
					cdist-type__unpack(7)
 | 
				
			||||||
 | 
					=====================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					NAME
 | 
				
			||||||
 | 
					----
 | 
				
			||||||
 | 
					cdist-type__unpack - Unpack archives
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DESCRIPTION
 | 
				
			||||||
 | 
					-----------
 | 
				
			||||||
 | 
					Unpack ``.tar``, ``.tgz``, ``.tar.*``, ``.7z``, ``.bz2``, ``.gz``,
 | 
				
			||||||
 | 
					``.lzma``, ``.xz``, ``.rar`` and ``.zip`` archives. Archive type is
 | 
				
			||||||
 | 
					detected by extension.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To achieve idempotency, checksum file will be created in target. See
 | 
				
			||||||
 | 
					``--sum-file`` parameter for details.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					REQUIRED PARAMETERS
 | 
				
			||||||
 | 
					-------------------
 | 
				
			||||||
 | 
					destination
 | 
				
			||||||
 | 
					   Depending on archive format file or directory to where archive
 | 
				
			||||||
 | 
					   contents will be written.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OPTIONAL PARAMETERS
 | 
				
			||||||
 | 
					-------------------
 | 
				
			||||||
 | 
					sum-file
 | 
				
			||||||
 | 
					    Override archive's checksum file in target. By default
 | 
				
			||||||
 | 
					    ``XXX.cdist__unpack_sum`` will be used, where ``XXX`` is source
 | 
				
			||||||
 | 
					    archive path. This file must be kept in target's persistent storage.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					tar-strip
 | 
				
			||||||
 | 
					    Tarball specific. See ``man tar`` for ``--strip-components``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					OPTIONAL BOOLEAN PARAMETERS
 | 
				
			||||||
 | 
					---------------------------
 | 
				
			||||||
 | 
					backup-destination
 | 
				
			||||||
 | 
					    By default destination file will be overwritten. In case destination
 | 
				
			||||||
 | 
					    is directory, files from archive will be added to or overwritten in
 | 
				
			||||||
 | 
					    directory. This parameter moves existing destination to
 | 
				
			||||||
 | 
					    ``XXX.cdist__unpack_backup_YYY``, where ``XXX`` is destination and
 | 
				
			||||||
 | 
					    ``YYY`` current UNIX timestamp.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					preserve-archive
 | 
				
			||||||
 | 
					    Don't delete archive after unpacking.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					EXAMPLES
 | 
				
			||||||
 | 
					--------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.. code-block:: sh
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    __directory /opt/cpma
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    require='__directory/opt/cpma' \
 | 
				
			||||||
 | 
					        __download /opt/cpma/cnq3.zip \
 | 
				
			||||||
 | 
					            --url https://cdn.playmorepromode.com/files/cnq3/cnq3-1.51.zip \
 | 
				
			||||||
 | 
					            --sum md5:46da3021ca9eace277115ec9106c5b46
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    require='__download/opt/cpma/cnq3.zip' \
 | 
				
			||||||
 | 
					        __unpack /opt/cpma/cnq3.zip \
 | 
				
			||||||
 | 
					            --backup-destination \
 | 
				
			||||||
 | 
					            --preserve-archive \
 | 
				
			||||||
 | 
					            --destination /opt/cpma/server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AUTHORS
 | 
				
			||||||
 | 
					-------
 | 
				
			||||||
 | 
					Ander Punnar <ander-at-kvlt-dot-ee>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COPYING
 | 
				
			||||||
 | 
					-------
 | 
				
			||||||
 | 
					Copyright \(C) 2020 Ander Punnar. You can redistribute it
 | 
				
			||||||
 | 
					and/or modify it under the terms of the GNU General Public License as
 | 
				
			||||||
 | 
					published by the Free Software Foundation, either version 3 of the
 | 
				
			||||||
 | 
					License, or (at your option) any later version.
 | 
				
			||||||
							
								
								
									
										41
									
								
								cdist/conf/type/__unpack/manifest
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										41
									
								
								cdist/conf/type/__unpack/manifest
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,41 @@
 | 
				
			||||||
 | 
					#!/bin/sh -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					os="$( cat "$__global/explorer/os" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					src="/$__object_id"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					case "$src" in
 | 
				
			||||||
 | 
					    *.7z)
 | 
				
			||||||
 | 
					        __package p7zip
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.bz2)
 | 
				
			||||||
 | 
					        case "$os" in
 | 
				
			||||||
 | 
					            freebsd)
 | 
				
			||||||
 | 
					                # bzip2 is part of freebsd base system
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            *)
 | 
				
			||||||
 | 
					                __package bzip2
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.lzma|*.xz|*.txz)
 | 
				
			||||||
 | 
					        case "$os" in
 | 
				
			||||||
 | 
					            debian|ubuntu|devuan)
 | 
				
			||||||
 | 
					                __package xz-utils
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					            alpine|centos)
 | 
				
			||||||
 | 
					                __package xz
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.rar)
 | 
				
			||||||
 | 
					        case "$os" in
 | 
				
			||||||
 | 
					            debian|ubuntu|devuan|alpine|freebsd)
 | 
				
			||||||
 | 
					                __package unrar
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					    *.zip)
 | 
				
			||||||
 | 
					        __package unzip
 | 
				
			||||||
 | 
					    ;;
 | 
				
			||||||
 | 
					esac
 | 
				
			||||||
							
								
								
									
										2
									
								
								cdist/conf/type/__unpack/parameter/boolean
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								cdist/conf/type/__unpack/parameter/boolean
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					backup-destination
 | 
				
			||||||
 | 
					preserve-archive
 | 
				
			||||||
							
								
								
									
										2
									
								
								cdist/conf/type/__unpack/parameter/optional
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								cdist/conf/type/__unpack/parameter/optional
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,2 @@
 | 
				
			||||||
 | 
					sum-file
 | 
				
			||||||
 | 
					tar-strip
 | 
				
			||||||
							
								
								
									
										1
									
								
								cdist/conf/type/__unpack/parameter/required
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								cdist/conf/type/__unpack/parameter/required
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1 @@
 | 
				
			||||||
 | 
					destination
 | 
				
			||||||
							
								
								
									
										3
									
								
								cdist/conf/type/__unpack/test/README
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								cdist/conf/type/__unpack/test/README
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,3 @@
 | 
				
			||||||
 | 
					./make-test-files.sh
 | 
				
			||||||
 | 
					./make-init-manifest.sh | cdist config -i - localhost
 | 
				
			||||||
 | 
					sudo find /tmp/cdist__unpack_test/ -type f -exec cat {} \; | sort
 | 
				
			||||||
							
								
								
									
										22
									
								
								cdist/conf/type/__unpack/test/make-init-manifest.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								cdist/conf/type/__unpack/test/make-init-manifest.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					#!/bin/sh -e
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					p="$( pwd )"
 | 
				
			||||||
 | 
					d=/tmp/cdist__unpack_test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo 'export CDIST_ORDER_DEPENDENCY=1'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "__directory $d"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					find "$p" -name 'test.*' -and -not -name '*.cdist__unpack_sum' \
 | 
				
			||||||
 | 
					    | sort \
 | 
				
			||||||
 | 
					    | while read -r l
 | 
				
			||||||
 | 
					do
 | 
				
			||||||
 | 
					    n="$( basename "$l" )"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    printf '__unpack %s --destination %s/%s\n' \
 | 
				
			||||||
 | 
					        "$l" \
 | 
				
			||||||
 | 
					        "$d" \
 | 
				
			||||||
 | 
					        "$n"
 | 
				
			||||||
 | 
					done
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo "__clean_path $p --pattern '.+/test\..+'"
 | 
				
			||||||
							
								
								
									
										44
									
								
								cdist/conf/type/__unpack/test/make-test-files.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										44
									
								
								cdist/conf/type/__unpack/test/make-test-files.sh
									
										
									
									
									
										Executable file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					#!/bin/sh -ex
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.7z > test
 | 
				
			||||||
 | 
					7z a test.7z test > /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.bz2 > test
 | 
				
			||||||
 | 
					bzip2 test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.gz > test
 | 
				
			||||||
 | 
					gzip test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.lzma > test
 | 
				
			||||||
 | 
					lzma test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.rar > test
 | 
				
			||||||
 | 
					rar a test.rar test > /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.tar.bz2 > test
 | 
				
			||||||
 | 
					tar cf test.tar test
 | 
				
			||||||
 | 
					bzip2 test.tar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.tar.xz > test
 | 
				
			||||||
 | 
					tar cf test.tar test
 | 
				
			||||||
 | 
					xz test.tar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.tgz > test
 | 
				
			||||||
 | 
					tar cf test.tar test
 | 
				
			||||||
 | 
					gzip test.tar
 | 
				
			||||||
 | 
					mv test.tar.gz test.tgz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.tar.gz > test
 | 
				
			||||||
 | 
					tar cf test.tar test
 | 
				
			||||||
 | 
					gzip test.tar
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.tar > test
 | 
				
			||||||
 | 
					tar cf test.tar test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.xz > test
 | 
				
			||||||
 | 
					xz test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					echo test.zip > test
 | 
				
			||||||
 | 
					zip test.zip test > /dev/null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rm test
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue