commit:     f037307d91669bbc1221c27d7e6893ead8fce97a
Author:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
AuthorDate: Mon Nov 12 22:09:03 2018 +0000
Commit:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
CommitDate: Mon Nov 12 22:09:03 2018 +0000
URL:        https://gitweb.gentoo.org/proj/qa-scripts.git/commit/?id=f037307d

create-dev-keyrings: export improvements

- Place new keyrings atomicly.
- Export system/committing/active/retired/all in seperate batches

Signed-off-by: Robin H. Johnson <robbat2 <AT> gentoo.org>

 create-dev-keyrings.bash | 55 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 48 insertions(+), 7 deletions(-)

diff --git a/create-dev-keyrings.bash b/create-dev-keyrings.bash
index 9bc2fde..01f15b2 100755
--- a/create-dev-keyrings.bash
+++ b/create-dev-keyrings.bash
@@ -9,6 +9,11 @@ 
COMMIT_RULE='(&(gentooAccess=git.gentoo.org/repo/gentoo.git)(gentooStatus=active
 
NONCOMMIT_RULE='(&(!(gentooAccess=git.gentoo.org/repo/gentoo.git))(gentooStatus=active))'
 RETIRED_RULE='(!(gentooStatus=active))'
 
+GPG_TMPDIR=$(mktemp -d)
+clean_tmp() {
+       rm -rf "$GPG_TMPDIR"
+}
+
 # grab_ldap_fingerprints <ldap-rule>
 grab_ldap_fingerprints() {
        ldapsearch "${@}" -Z gpgfingerprint -LLL |
@@ -37,7 +42,7 @@ grab_keys() {
                        if [[ $(( retries++ )) -gt 3 ]]; then
                                echo "Unable to fetch the following keys:"
                                printf '%s\n' "${missing[@]}"
-                               exit 0 # if we exit non-zero, the entire export 
will fail
+                               break # if we hard-exit, the entire export will 
fail
                        fi
                        sleep 5
                fi
@@ -46,17 +51,53 @@ grab_keys() {
        done
 }
 
+export_keys() {
+       DST="$1"
+       TMP="${GPG_TMPDIR}"/$(basename "${DST}")
+       # Must not exist, otherwise GPG will give error
+       [[ -f "${TMP}" ]] && rm -f "${TMP}"
+       # 'gpg --export' returns zero if there was no error with the command 
itself
+       # If there are no keys in the export set, then it ALSO does not write 
the destination file
+       # and prints 'gpg: WARNING: nothing exported' to stderr
+       if gpg --output "$TMP" --export "${@}" && test -s "${TMP}"; then
+               chmod a+r "${DST}"
+               mv "${TMP}" "${DST}"
+       else
+               echo "Unable to export keys to $DST"
+               exit 1
+       fi
+}
+
 set -e
 
 COMMITTING_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${COMMIT_RULE}") )
 NONCOMMITTING_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" 
"${NONCOMMIT_RULE}") )
-#RETIRED_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${RETIRED_RULE}") )
+RETIRED_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${RETIRED_RULE}") )
 SYSTEM_KEYS=( $(grab_ldap_fingerprints -b "${SYSTEM_BASE}" 
"${NONCOMMIT_RULE}") )
 
-grab_keys "${COMMITTING_DEVS[@]}" "${NONCOMMITTING_DEVS[@]}" 
"${SYSTEM_KEYS[@]}"
-gpg --export "${COMMITTING_DEVS[@]}" > "${OUTPUT_DIR}"/committing-devs.gpg
-gpg --export "${COMMITTING_DEVS[@]}" "${NONCOMMITTING_DEVS[@]}" > 
"${OUTPUT_DIR}"/active-devs.gpg
-gpg --export "${SYSTEM_KEYS[@]}" > "${OUTPUT_DIR}"/service-keys.gpg
+grab_keys "${SYSTEM_KEYS[@]}"
+export_keys "${OUTPUT_DIR}"/service_keys.gpg \
+       "${SYSTEM_KEYS[@]}"
+
+grab_keys "${COMMITTING_DEVS[@]}"
+export_keys "${OUTPUT_DIR}"/committing-devs.gpg \
+       "${COMMITTING_DEVS[@]}"
+
+grab_keys "${NONCOMMITTING_DEVS[@]}"
+export_keys "${OUTPUT_DIR}"/active-devs.gpg \
+       "${COMMITTING_DEVS[@]}" \
+       "${NONCOMMITTING_DEVS[@]}"
+
 # -- not all are on keyservers
+# -- and are unlikely to turn up now
+# -- this needs to fetch from some archive instead
 #grab_keys "${RETIRED_DEVS[@]}"
-#gpg --export > "${OUTPUT_DIR}"/all-devs.gpg
+export_keys "${OUTPUT_DIR}"/retired-devs.gpg \
+       "${RETIRED_DEVS[@]}"
+
+# Everybody together now
+export_keys "${OUTPUT_DIR}"/all-devs.gpg \
+       "${SYSTEM_KEYS[@]}" \
+       "${COMMITTING_DEVS[@]}" \
+       "${NONCOMMITTING_DEVS[@]}" \
+       "${RETIRED_DEVS[@]}"

Reply via email to