New type __staged_file: Manage staged files
Signed-off-by: Steven Armstrong <steven@icarus.ethz.ch>
This commit is contained in:
parent
041569b41c
commit
4f7ae8425d
9 changed files with 252 additions and 0 deletions
98
cdist/conf/type/__staged_file/gencode-local
Executable file
98
cdist/conf/type/__staged_file/gencode-local
Executable file
|
@ -0,0 +1,98 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# 2015 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist is free software: 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.
|
||||
#
|
||||
# cdist is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
#set -x
|
||||
|
||||
destination="$__object_id"
|
||||
source="$(cat "$__object/parameter/source")"
|
||||
cksum="$(cat "$__object/parameter/cksum")"
|
||||
stage_dir="$(cat "$__object/parameter/stage-dir")"
|
||||
state="$(cat "$__object/parameter/state")"
|
||||
fetch_command="$(cat "$__object/parameter/fetch-command")"
|
||||
stage_file="${stage_dir}/${destination}"
|
||||
stage_file_dir="${stage_file%/*}"
|
||||
source_file_name="${source##*/}"
|
||||
|
||||
if [ "$state" = "absent" ]; then
|
||||
# nothing to do
|
||||
exit 0
|
||||
fi
|
||||
|
||||
#printf 'set -x\n'
|
||||
|
||||
if [ ! -d "$stage_dir" ]; then
|
||||
printf 'mkdir -p "%s"\n' "$stage_dir"
|
||||
printf 'chmod 700 "%s"\n' "$stage_dir"
|
||||
fi
|
||||
|
||||
if [ ! -d "$stage_file_dir" ]; then
|
||||
printf 'mkdir -p "%s"\n' "$stage_file_dir"
|
||||
fi
|
||||
|
||||
|
||||
get_file() {
|
||||
if [ -f "$__object/parameter/prepare-command" ]; then
|
||||
fetch_and_prepare_file
|
||||
else
|
||||
fetch_file
|
||||
fi
|
||||
}
|
||||
|
||||
fetch_file() {
|
||||
printf "$fetch_command" "$source"
|
||||
printf ' > "%s"\n' "$stage_file"
|
||||
}
|
||||
|
||||
fetch_and_prepare_file() {
|
||||
printf 'tmpdir="$(mktemp -d --tmpdir="/tmp" "%s")"\n' "${__type##*/}.XXXXXXXXXX"
|
||||
printf 'cd "$tmpdir"\n'
|
||||
printf "$fetch_command > \"%s\"\n" "$source" "$source_file_name"
|
||||
prepare_command="$(cat "$__object/parameter/prepare-command")"
|
||||
printf "$prepare_command > \"%s\"\n" "$source_file_name" "$stage_file"
|
||||
printf 'cd - >/dev/null\n'
|
||||
printf 'rm -rf "$tmpdir"\n'
|
||||
}
|
||||
|
||||
cat << DONE
|
||||
verify_cksum() {
|
||||
cksum_is="\$(cksum "$stage_file" | cut -d' ' -f1,2)"
|
||||
cksum_should="$(cat "$__object/parameter/cksum" | cut -d' ' -f1,2)"
|
||||
if [ "\$cksum_is" == "\$cksum_should" ]; then
|
||||
return 0
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
DONE
|
||||
|
||||
if [ ! -f "$stage_file" ]; then
|
||||
get_file
|
||||
else
|
||||
printf 'verify_cksum || {\n'
|
||||
get_file
|
||||
printf '}\n'
|
||||
fi
|
||||
|
||||
cat << DONE
|
||||
verify_cksum || {
|
||||
echo "Failed to verify checksum for $__object_name" >&2
|
||||
exit 1
|
||||
}
|
||||
DONE
|
103
cdist/conf/type/__staged_file/man.text
Normal file
103
cdist/conf/type/__staged_file/man.text
Normal file
|
@ -0,0 +1,103 @@
|
|||
cdist-type__staged_file(7)
|
||||
==========================
|
||||
Steven Armstrong <steven-cdist--@--armstrong.cc>
|
||||
|
||||
|
||||
NAME
|
||||
----
|
||||
cdist-type__staged_file - manage staged files
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
-----------
|
||||
Manages a staged file that is downloaded on the server (the machine running
|
||||
cdist) and then deployed to the target host using the __file type.
|
||||
|
||||
|
||||
REQUIRED PARAMETERS
|
||||
-------------------
|
||||
source::
|
||||
the URL from which to retreive the source file.
|
||||
e.g.
|
||||
https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip
|
||||
file:///path/to/local/file
|
||||
cksum::
|
||||
the output of running the command: `cksum $source-file`
|
||||
e.g.
|
||||
$ echo foobar > /tmp/foobar
|
||||
$ cksum /tmp/foobar
|
||||
857691210 7 /tmp/foobar
|
||||
If either checksum or file size has changed the file will be
|
||||
(re)fetched from the --source. The file name can be omitted and is
|
||||
ignored if given.
|
||||
|
||||
|
||||
OPTIONAL PARAMETERS
|
||||
-------------------
|
||||
fetch-command::
|
||||
the command used to fetch the staged file using printf formatting.
|
||||
Where a single %s will be replaced with the value of the given --source
|
||||
parameter. The --fetch-command is expected to output the fetched file to
|
||||
stdout.
|
||||
Defaults to 'curl -s -L "%s"'.
|
||||
group::
|
||||
see cdist-type__file
|
||||
owner::
|
||||
see cdist-type__file
|
||||
mode::
|
||||
see cdist-type__file
|
||||
prepare-command::
|
||||
the optional command used to prepare or preprocess the staged file for later
|
||||
use by the file type.
|
||||
If given, it must be a string in printf formatting where a single %s will
|
||||
be replaced with the last segment (filename) of the value of the given
|
||||
--source parameter.
|
||||
It is executed in the same directory into which the fetched file has been
|
||||
saved. The --prepare-command is expected to output the final file to stdout.
|
||||
|
||||
So for example given a --source of https://example.com/my-zip.zip, and a
|
||||
--prepare-command of 'unzip -p "%s"', the code `unzip -p "my-zip.zip"` will
|
||||
be executed in the folder containing the downloaded file my-zip.zip.
|
||||
A more complex example might be --prepare-command 'tar -xz "%s"; cat path/from/archive'
|
||||
stage-dir::
|
||||
the directory in which to store downloaded and prepared files.
|
||||
Defaults to '/var/tmp/cdist/__staged_file'
|
||||
state::
|
||||
see cdist-type__file
|
||||
|
||||
|
||||
EXAMPLES
|
||||
--------
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
__staged_file /usr/local/bin/consul \
|
||||
--source file:///path/to/local/copy/consul \
|
||||
--cksum '428915666 15738724' \
|
||||
--state present \
|
||||
--group root \
|
||||
--owner root \
|
||||
--mode 755
|
||||
|
||||
__staged_file /usr/local/bin/consul \
|
||||
--source https://dl.bintray.com/mitchellh/consul/0.4.1_linux_amd64.zip \
|
||||
--cksum '428915666 15738724' \
|
||||
--fetch-command 'curl -s -L "%s"' \
|
||||
--prepare-command 'unzip -p "%s"' \
|
||||
--state present \
|
||||
--group root \
|
||||
--owner root \
|
||||
--mode 755
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
- cdist-type(7)
|
||||
- cdist-type__file(7)
|
||||
|
||||
|
||||
COPYING
|
||||
-------
|
||||
Copyright \(C) 2015 Steven Armstrong. Free use of this software is
|
||||
granted under the terms of the GNU General Public License version 3 (GPLv3).
|
38
cdist/conf/type/__staged_file/manifest
Executable file
38
cdist/conf/type/__staged_file/manifest
Executable file
|
@ -0,0 +1,38 @@
|
|||
#!/bin/sh
|
||||
#
|
||||
# 2015 Steven Armstrong (steven-cdist at armstrong.cc)
|
||||
#
|
||||
# This file is part of cdist.
|
||||
#
|
||||
# cdist is free software: 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.
|
||||
#
|
||||
# cdist is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with cdist. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
destination="$__object_id"
|
||||
source="$(cat "$__object/parameter/source")"
|
||||
cksum="$(cat "$__object/parameter/cksum")"
|
||||
stage_dir="$(cat "$__object/parameter/stage-dir")"
|
||||
state="$(cat "$__object/parameter/state")"
|
||||
fetch_command="$(cat "$__object/parameter/fetch-command")"
|
||||
stage_file="${stage_dir}/${destination}"
|
||||
|
||||
set -- "/${destination}"
|
||||
for param in owner group mode state; do
|
||||
if [ -f "$__object/parameter/$param" ]; then
|
||||
set -- "$@" "--${param}" "$(cat "$__object/parameter/$param")"
|
||||
fi
|
||||
done
|
||||
set -- "$@" --source "$stage_file"
|
||||
|
||||
require="$__object_name" \
|
||||
__file "$@"
|
|
@ -0,0 +1 @@
|
|||
curl -s -L "%s"
|
|
@ -0,0 +1 @@
|
|||
/var/tmp/cdist/__staged_file
|
1
cdist/conf/type/__staged_file/parameter/default/state
Normal file
1
cdist/conf/type/__staged_file/parameter/default/state
Normal file
|
@ -0,0 +1 @@
|
|||
present
|
7
cdist/conf/type/__staged_file/parameter/optional
Normal file
7
cdist/conf/type/__staged_file/parameter/optional
Normal file
|
@ -0,0 +1,7 @@
|
|||
fetch-command
|
||||
group
|
||||
owner
|
||||
mode
|
||||
prepare-command
|
||||
stage-dir
|
||||
state
|
2
cdist/conf/type/__staged_file/parameter/required
Normal file
2
cdist/conf/type/__staged_file/parameter/required
Normal file
|
@ -0,0 +1,2 @@
|
|||
cksum
|
||||
source
|
|
@ -5,6 +5,7 @@ Changelog
|
|||
* Exception: No braces means author == Nico Schottelius
|
||||
|
||||
next:
|
||||
* New type __staged_file: Manage staged files
|
||||
* New type __config_file: Manage configuration files and run code on change
|
||||
|
||||
3.1.11:
|
||||
|
|
Loading…
Reference in a new issue