From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <gentoo-commits+bounces-1087515-garchives=archives.gentoo.org@lists.gentoo.org>
Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by finch.gentoo.org (Postfix) with ESMTPS id 6524B138334
	for <garchives@archives.gentoo.org>; Fri,  3 May 2019 18:27:06 +0000 (UTC)
Received: from pigeon.gentoo.org (localhost [127.0.0.1])
	by pigeon.gentoo.org (Postfix) with SMTP id 716CCE0101;
	Fri,  3 May 2019 18:27:05 +0000 (UTC)
Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by pigeon.gentoo.org (Postfix) with ESMTPS id 24ECAE0101
	for <gentoo-commits@lists.gentoo.org>; Fri,  3 May 2019 18:27:04 +0000 (UTC)
Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52])
	(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
	(No client certificate requested)
	by smtp.gentoo.org (Postfix) with ESMTPS id 6DC45343582
	for <gentoo-commits@lists.gentoo.org>; Fri,  3 May 2019 18:27:03 +0000 (UTC)
Received: from localhost.localdomain (localhost [IPv6:::1])
	by oystercatcher.gentoo.org (Postfix) with ESMTP id 1DE7C449
	for <gentoo-commits@lists.gentoo.org>; Fri,  3 May 2019 18:27:01 +0000 (UTC)
From: "Robin H. Johnson" <robbat2@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Content-Transfer-Encoding: 8bit
Content-type: text/plain; charset=UTF-8
Reply-To: gentoo-dev@lists.gentoo.org, "Robin H. Johnson" <robbat2@gentoo.org>
Message-ID: <1556908008.99ceddc02672cbca6e530dbca4cd804e00e4b8d1.robbat2@gentoo>
Subject: [gentoo-commits] proj/qa-scripts:master commit in: /
X-VCS-Repository: proj/qa-scripts
X-VCS-Files: create-dev-keyrings.bash keyrings-export.bash keyrings.inc.bash
X-VCS-Directories: /
X-VCS-Committer: robbat2
X-VCS-Committer-Name: Robin H. Johnson
X-VCS-Revision: 99ceddc02672cbca6e530dbca4cd804e00e4b8d1
X-VCS-Branch: master
Date: Fri,  3 May 2019 18:27:01 +0000 (UTC)
Precedence: bulk
List-Post: <mailto:gentoo-commits@lists.gentoo.org>
List-Help: <mailto:gentoo-commits+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-commits+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-commits+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-commits.gentoo.org>
X-BeenThere: gentoo-commits@lists.gentoo.org
X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply
X-Archives-Salt: 08b05a3a-279a-4687-a168-0a0c0551680f
X-Archives-Hash: a0a2dacb003750e45c809950388ffb70

commit:     99ceddc02672cbca6e530dbca4cd804e00e4b8d1
Author:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
AuthorDate: Fri May  3 18:26:39 2019 +0000
Commit:     Robin H. Johnson <robbat2 <AT> gentoo <DOT> org>
CommitDate: Fri May  3 18:26:48 2019 +0000
URL:        https://gitweb.gentoo.org/proj/qa-scripts.git/commit/?id=99ceddc0

keyrings: prepare to split out keyring export for faster cycles

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

 create-dev-keyrings.bash                      | 90 +++------------------------
 keyrings-export.bash                          | 33 ++++++++++
 create-dev-keyrings.bash => keyrings.inc.bash | 49 +++------------
 3 files changed, 48 insertions(+), 124 deletions(-)

diff --git a/create-dev-keyrings.bash b/create-dev-keyrings.bash
index 1a9fd76..3f65550 100755
--- a/create-dev-keyrings.bash
+++ b/create-dev-keyrings.bash
@@ -1,91 +1,15 @@
 #!/bin/bash
+# Import key updates from Keyservers
+#
+# TODO:
+# - Turn off export in this script
 
 OUTPUT_DIR=${1:-.}
-
-DEV_BASE='ou=devs,dc=gentoo,dc=org'
-SYSTEM_BASE='ou=system,dc=gentoo,dc=org'
-
-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))'
-
-KS_GENTOO=hkps://keys.gentoo.org/
-KS_SKS=hkps://hkps.pool.sks-keyservers.net/
-
-GPG_TMPDIR=$(mktemp -d)
-clean_tmp() {
-	rm -rf "$GPG_TMPDIR"
-}
-
-# grab_ldap_fingerprints <ldap-rule>
-grab_ldap_fingerprints() {
-	ldapsearch "${@}" -Z gpgfingerprint -LLL |
-		sed -n -e '/^gpgfingerprint: /{s/^.*://;s/ //g;p}' |
-		sort -u |
-		grep -v undefined
-}
-
-# grab_keys <fingerprint>...
-grab_keys() {
-	local retries=0
-	local missing=()
-	local remaining=( "${@}" )
-
-	while :; do
-		timeout 5m  gpg --keyserver $KS_GENTOO -q --recv-keys "${remaining[@]}" || :
-		timeout 20m gpg --keyserver $KS_SKS -q --recv-keys "${remaining[@]}" || :
-		missing=()
-		for key in "${remaining[@]}"; do
-			gpg --list-public "${key}" &>/dev/null || missing+=( "${key}" )
-		done
-
-		[[ ${#missing[@]} -ne 0 ]] || break
-
-		# if we did not make progress, give it a few seconds and retry
-		if [[ ${#missing[@]} -eq ${#remaining[@]} ]]; then
-			if [[ $(( retries++ )) -gt 3 ]]; then
-				echo "Unable to fetch the following keys:"
-				printf '%s\n' "${missing[@]}"
-				break # if we hard-exit, the entire export will fail
-			fi
-			sleep 5
-		fi
-
-		remaining=( "${missing[@]}" )
-	done
-}
-
-# push_keys <fingerprint>...
-push_keys() {
-	# Only send keys that we have
-	local remaining=( $(gpg --with-colon --list-public "${@}" | sed -n '/^pub/{n; /fpr/p }' |cut -d: -f10) )
-	timeout 5m  gpg --keyserver $KS_GENTOO -q --send-keys "${remaining[@]}" || :
-	#timeout 5m  gpg --keyserver $KS_SKS -q --send-keys "${remaining[@]}" || :
-}
-
-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 "${TMP}"
-		mv "${TMP}" "${DST}"
-	else
-		echo "Unable to export keys to $DST"
-		exit 1
-	fi
-}
+BASEDIR="$(dirname "$0")"
+source "${BASEDIR}"/keyrings.inc.bash
 
 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}") )
-SYSTEM_KEYS=( $(grab_ldap_fingerprints -b "${SYSTEM_BASE}" "${NONCOMMIT_RULE}") )
+export_ldap_data_to_env
 
 grab_keys "${SYSTEM_KEYS[@]}"
 export_keys "${OUTPUT_DIR}"/service-keys.gpg \

diff --git a/keyrings-export.bash b/keyrings-export.bash
new file mode 100755
index 0000000..06f5bab
--- /dev/null
+++ b/keyrings-export.bash
@@ -0,0 +1,33 @@
+#!/bin/bash
+# Export keys to keyrings
+#
+# TODO:
+# - only run the export if there was really a change
+# - requires keeping state to detect changes in keys, there is no usable mtime data in a key itself
+
+OUTPUT_DIR=${1:-.}
+BASEDIR="$(dirname "$0")"
+source "${BASEDIR}"/keyrings.inc.bash
+
+set -e
+export_ldap_data_to_env
+
+export_keys "${OUTPUT_DIR}"/service-keys.gpg \
+	"${SYSTEM_KEYS[@]}"
+
+export_keys "${OUTPUT_DIR}"/committing-devs.gpg \
+	"${COMMITTING_DEVS[@]}"
+
+export_keys "${OUTPUT_DIR}"/active-devs.gpg \
+	"${COMMITTING_DEVS[@]}" \
+	"${NONCOMMITTING_DEVS[@]}"
+
+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[@]}"

diff --git a/create-dev-keyrings.bash b/keyrings.inc.bash
old mode 100755
new mode 100644
similarity index 63%
copy from create-dev-keyrings.bash
copy to keyrings.inc.bash
index 1a9fd76..052550d
--- a/create-dev-keyrings.bash
+++ b/keyrings.inc.bash
@@ -1,7 +1,5 @@
 #!/bin/bash
 
-OUTPUT_DIR=${1:-.}
-
 DEV_BASE='ou=devs,dc=gentoo,dc=org'
 SYSTEM_BASE='ou=system,dc=gentoo,dc=org'
 
@@ -16,6 +14,7 @@ GPG_TMPDIR=$(mktemp -d)
 clean_tmp() {
 	rm -rf "$GPG_TMPDIR"
 }
+trap clean_tmp EXIT
 
 # grab_ldap_fingerprints <ldap-rule>
 grab_ldap_fingerprints() {
@@ -80,42 +79,10 @@ export_keys() {
 	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}") )
-SYSTEM_KEYS=( $(grab_ldap_fingerprints -b "${SYSTEM_BASE}" "${NONCOMMIT_RULE}") )
-
-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[@]}"
-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[@]}"
-
-# Populate keys.gentoo.org with the keys we have, since they might have come from SKS
-push_keys "${SYSTEM_KEYS[@]}"
-push_keys "${COMMITTING_DEVS[@]}"
-push_keys "${NONCOMMITTING_DEVS[@]}"
-push_keys "${RETIRED_DEVS[@]}"
+# populate common variables
+export_ldap_data_to_env() {
+	export COMMITTING_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${COMMIT_RULE}") )
+	export NONCOMMITTING_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${NONCOMMIT_RULE}") )
+	export RETIRED_DEVS=( $(grab_ldap_fingerprints -b "${DEV_BASE}" "${RETIRED_RULE}") )
+	export SYSTEM_KEYS=( $(grab_ldap_fingerprints -b "${SYSTEM_BASE}" "${NONCOMMIT_RULE}") )
+}