From 27d38a28abfe79657828953c365b62bd1ab14a55 Mon Sep 17 00:00:00 2001
From: Thomas Eckert <clustaman@gmail.com>
Date: Tue, 30 Jan 2018 13:16:29 +0100
Subject: [PATCH] __package_update_index: optional `--maxage
 <seconds>`-parameter for apt

`--maxage 3600` ensures that `apt-get --quiet update` is only done if
the previous run was at least 1 hour ago.

This also adds messaging
---
 .../__package_update_index/explorer/currage   | 15 ++++++++++++++
 .../__package_update_index/gencode-remote     | 20 ++++++++++++++++++-
 .../conf/type/__package_update_index/man.rst  | 10 +++++++++-
 .../__package_update_index/parameter/optional |  1 +
 4 files changed, 44 insertions(+), 2 deletions(-)
 create mode 100644 cdist/conf/type/__package_update_index/explorer/currage

diff --git a/cdist/conf/type/__package_update_index/explorer/currage b/cdist/conf/type/__package_update_index/explorer/currage
new file mode 100644
index 00000000..bd53a789
--- /dev/null
+++ b/cdist/conf/type/__package_update_index/explorer/currage
@@ -0,0 +1,15 @@
+#!/bin/sh -e
+
+os="$("$__explorer/os")"
+
+case "$os" in
+        debian|ubuntu|devuan)
+		if [ -f "/var/cache/apt/pkgcache.bin" ]; then
+			echo $(($(date +"%s")-$(stat --format '%Y' /var/cache/apt/pkgcache.bin)))
+		else
+			echo 0
+		fi
+                ;;
+        *)      ## not supported $os
+                ;;
+esac
diff --git a/cdist/conf/type/__package_update_index/gencode-remote b/cdist/conf/type/__package_update_index/gencode-remote
index 20beed5b..d84e7953 100755
--- a/cdist/conf/type/__package_update_index/gencode-remote
+++ b/cdist/conf/type/__package_update_index/gencode-remote
@@ -22,6 +22,10 @@
 #
 
 type="$__object/parameter/type"
+if [ -f "$__object/parameter/maxage" ]; then
+    maxage="$(cat "$__object/parameter/maxage")"
+    currage="$(cat "$__object/explorer/currage")"
+fi
 
 if [ -f "$type" ]; then
     type="$(cat "$type")"
@@ -39,9 +43,23 @@ else
     esac
 fi
 
+if [ -n "$maxage" ] && [ "$type" != "apt" ]; then
+    echo "ERROR: \"--maxage\" only supported for \"apt\" pkg-manager." >&2
+    exit 1
+fi
+
 case "$type" in
     yum) ;;
-    apt) echo "apt-get --quiet update" ;;
+    apt) if [ -n "$maxage" ]; then
+             ## check if we need to update:
+             if [ $currage -ge $maxage ]; then
+                echo "apt-get --quiet update"
+             fi
+         else
+                echo "apt-get --quiet update"
+         fi
+         echo "apt-cache updated (age was: $currage)" >> "$__messages_out"
+         ;;
     pacman) echo "pacman --noprogressbar --sync --refresh" ;;
     *)
         echo "Don't know how to manage packages on: $os" >&2
diff --git a/cdist/conf/type/__package_update_index/man.rst b/cdist/conf/type/__package_update_index/man.rst
index 454aa05b..ac954faa 100644
--- a/cdist/conf/type/__package_update_index/man.rst
+++ b/cdist/conf/type/__package_update_index/man.rst
@@ -27,6 +27,9 @@ type
     * yum for Red Hat
     * pacman for Arch Linux
 
+maxage
+    Available for package manager apt, max time in seconds since last update.
+    Repo update is skipped if maxage is not reached yet.
 
 EXAMPLES
 --------
@@ -39,10 +42,15 @@ EXAMPLES
     # Force use of a specific package manager
     __package_update_index --type apt
 
+    # Only update every hour:
+    __package_update_index --maxage 3600 --type apt
+    # same as avove (on apt-type systems):
+    __package_update_index --maxage 3600
 
 AUTHORS
 -------
-Ricardo Catalinas Jiménez <jimenezrick--@--gmail.com>
+| Ricardo Catalinas Jiménez <jimenezrick--@--gmail.com>
+| Thomas Eckert <tom--@--it-eckert.de>
 
 
 COPYING
diff --git a/cdist/conf/type/__package_update_index/parameter/optional b/cdist/conf/type/__package_update_index/parameter/optional
index aa80e646..7a0be716 100644
--- a/cdist/conf/type/__package_update_index/parameter/optional
+++ b/cdist/conf/type/__package_update_index/parameter/optional
@@ -1 +1,2 @@
 type
+maxage