diff --git a/cdist/conf/type/__package_apt/explorer/state b/cdist/conf/type/__package_apt/explorer/state index 04926b60..658429ac 100755 --- a/cdist/conf/type/__package_apt/explorer/state +++ b/cdist/conf/type/__package_apt/explorer/state @@ -31,7 +31,8 @@ fi packages="$(apt-cache showpkg "$name" | sed -e "1,/Reverse Provides:/d" | cut -d ' ' -f 1) $name" for p in $packages; do if [ -n "$(dpkg -s "$p" 2>/dev/null | grep "^Status: install ok installed$")" ]; then - echo "present $p" + version=$(dpkg -s "$p" 2>/dev/null | grep "^Version:" | cut -d ' ' -f 2) + echo "present $p $version" exit 0 fi done diff --git a/cdist/conf/type/__package_apt/gencode-remote b/cdist/conf/type/__package_apt/gencode-remote index 1a86e72c..d9cc52b7 100755 --- a/cdist/conf/type/__package_apt/gencode-remote +++ b/cdist/conf/type/__package_apt/gencode-remote @@ -29,6 +29,13 @@ fi state_should="$(cat "$__object/parameter/state")" +version_param="$__object/parameter/version" + +version="" +if [ -f "$version_param" ]; then + version="$(cat "$version_param")" +fi + if [ -f "$__object/parameter/target-release" ]; then target_release="--target-release $(cat "$__object/parameter/target-release")" else @@ -47,18 +54,29 @@ state_is="$(cat "$__object/explorer/state")" case "$state_is" in present*) name="$(echo "$state_is" | cut -d ' ' -f 2)" + version_is="$(echo "$state_is" | cut -d ' ' -f 3)" state_is="present" ;; + *) + version_is="" + ;; esac # Hint if we need to avoid questions at some point: # DEBIAN_PRIORITY=critical can reduce the number of questions aptget="DEBIAN_FRONTEND=noninteractive apt-get --quiet --yes --no-install-recommends -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\"" -[ "$state_is" = "$state_should" ] && exit 0 +if [ "$state_is" = "$state_should" ]; then + if [ -z "$version" ] || [ "$version" = "$version_is" ]; then + exit 0; + fi +fi case "$state_should" in present) + if [ -n "$version" ]; then + name="${name}=${version}" + fi echo $aptget install $target_release \"$name\" ;; absent) diff --git a/cdist/conf/type/__package_apt/man.rst b/cdist/conf/type/__package_apt/man.rst index 991962e5..a3a70d91 100644 --- a/cdist/conf/type/__package_apt/man.rst +++ b/cdist/conf/type/__package_apt/man.rst @@ -28,10 +28,19 @@ state target-release Passed on to apt-get install, see apt-get(8). Essentially allows you to retrieve packages from a different release + +version + The version of the package to install. Default is to install the version + chosen by the local package manager. + + +BOOLEAN PARAMETERS +------------------ purge-if-absent If this parameter is given when state is `absent`, the package is purged from the system (using `--purge`). + EXAMPLES --------