#!/bin/sh -e # # 2011-2013 Nico Schottelius (nico-cdist at schottelius.org) # # 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 . # # # Manage packages on Debian and co. # if [ -f "$__object/parameter/name" ]; then name="$(cat "$__object/parameter/name")" else name="$__object_id" 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 target_release="" fi if [ -f "$__object/parameter/install-recommends" ]; then # required if __apt_norecommends is used recommendsparam="-o APT::Install-Recommends=1" else recommendsparam="-o APT::Install-Recommends=0" fi if [ -f "$__object/parameter/purge-if-absent" ]; then purgeparam="--purge" else purgeparam="" fi # FIXME: use grep directly, state is a list, not a line! 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 if [ "$state_is" = "$state_should" ]; then if [ -z "$version" ] || [ "$version" = "$version_is" ]; then exit 0; fi fi # 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 -o Dpkg::Options::=\"--force-confdef\" -o Dpkg::Options::=\"--force-confold\"" case "$state_should" in present) # There are special arguments to apt(8) to prevent aborts if apt woudn't been # updated after the 19th April 2021 till the bullseye release. The additional # arguments acknoledge the happend suite change (the apt(8) update does the # same by itself). # # Using '-o $config' instead of the --allow-releaseinfo-change-* parameter # allows backward compatablility to pre-buster Debian versions. # # See more: ticket #861 # https://code.ungleich.ch/ungleich-public/cdist/-/issues/861 apt_opts="-o Acquire::AllowReleaseInfoChange::Suite=true -o Acquire::AllowReleaseInfoChange::Version=true" # following is bit ugly, but important hack. # due to how cdist config run works, there isn't # currently better way to do it :( cat << EOF if [ ! -f /var/cache/apt/pkgcache.bin ] || [ "\$( stat --format %Y /var/cache/apt/pkgcache.bin )" -lt "\$( date +%s -d '-1 day' )" ] then echo apt-get $apt_opts update > /dev/null 2>&1 || true fi EOF if [ -n "$version" ]; then name="${name}=${version}" fi echo "$aptget $recommendsparam install $target_release '$name'" echo "installed" >> "$__messages_out" ;; absent) echo "$aptget remove $purgeparam '$name'" echo "removed" >> "$__messages_out" ;; *) echo "Unknown state: $state_should" >&2 exit 1 ;; esac