blob: 4c85365ac2d62410259116310a56ec91d443f591 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#!/bin/bash
# Copyright 2023 Gentoo Authors; Distributed under the GPL v2
# might be earlier copyright, no history available
# NOTE 1: This script is SLOW. It should run at most once per day.
# NOTE 2: This script requires that the signing key has its ownertrust
# set to ultimate. Which makes sense anyway, since we have the
# secret key.
# NOTE 3: This script has to run as gmirror user.
# Keep this variable in sync
_ARCHES="alpha amd64 arm64 arm hppa ia64 loong m68k mips ppc riscv s390 sparc x86"
#alpha amd64 arm64 arm hppa ia64 loong m68k mips ppc riscv s390 sh sparc x86
ARCHES=${ARCHES:-${_ARCHES}}
VERBOSE='0'
INTREE=/release/weekly/binpackages
STAGINGTREE=/release/binpackages-staging
OUTTREE=/var/tmp/gmirror-releases/releases
IN_RSYNC_OPTS=(
--no-motd
--archive
--delete
--delete-after
--ignore-missing-args
--update
--mkpath
)
OUT_RSYNC_OPTS=(
--no-motd
--archive
--ignore-errors
--delete
--delete-after
--ignore-missing-args
--mkpath
)
export BINPKG_GPG_SIGNING_GPG_HOME=/home/gmirror/.gnupg-releng
export BINPKG_GPG_SIGNING_KEY=13EBBDBEDE7A12775DFDB1BABB572E0E2D182910
export BINPKG_GPG_VERIFY_GPG_HOME=${BINPKG_GPG_SIGNING_GPG_HOME}
export LOCKFILE=${STAGINGTREE}/.running
# this script needs to be run as gmirror user
[[ $(whoami) == "gmirror" ]] || exit 111
# we make sure we're not running twice in parallel
if [[ -f ${LOCKFILE} ]] ; then
echo sign-sync-binpackages.sh lockfile ${LOCKFILE} exists, aborting
exit 112
fi
touch "${LOCKFILE}" || exit 110
# ensure the lock is cleaned on exit
trap 'rm -f "${LOCKFILE}"' SIGINT SIGTERM EXIT
# make sure we have an updated gpg-agent
gpgconf --kill all
# prepare some handy variables
_verbose_v=''
[[ ${VERBOSE} == '1' ]] && _verbose_v='-v'
# step 1: rsync from the dirs where the arches copy in
# make sure to *not* overwrite existing newer files (obviously
# the signature changed them)...
for a in ${ARCHES} ; do
rsync ${_verbose_v} "${IN_RSYNC_OPTS[@]}" ${INTREE}/${a}/* ${STAGINGTREE}/${a}/
done
# now the set of files is frozen in the staging dir, and we dont care
# if any arches start uploading in the meantime
# step 2: iterate over all binary package trees, sign
# all unsigned files
# we assume the directory structure to be
# .../binpackages-staging/amd64/17.1/x86-64
# .../binpackages-staging/amd64/17.1/x86-64_musl
# .../binpackages-staging/mips/17.0/mipsel3_n32
# .../binpackages-staging/x86/17.0/x86_musl_hardened
for t in ${STAGINGTREE}/*/*/* ; do
# find all unsigned packages as fast as possible
find "${t}" -name '*.gpkg.tar' -print0 | \
parallel -0 -n1 --will-cite -- "tar tf {} |grep -E -e '/metadata\.tar\..*\.sig$' -L --label={}" \
> ${STAGINGTREE}/.unsigned
if [[ ${VERBOSE} == '1' ]] ; then
echo "List of unsigned pacakges:"
cat ${STAGINGTREE}/.unsigned
echo ; echo
fi
# sign the packages
if [[ ${VERBOSE} == '1' ]]; then
xargs -n1 --no-run-if-empty -- gpkg-sign < ${STAGINGTREE}/.unsigned || exit 113
else
xargs -n1 --no-run-if-empty -- gpkg-sign < ${STAGINGTREE}/.unsigned > /dev/null || exit 113
fi
# regenerate the indices
if [[ ${VERBOSE} == '1' ]]; then
PKGDIR=${t} emaint -f binhost || exit 114
else
PKGDIR=${t} emaint -f binhost > /dev/null || exit 114
fi
done
# unfortunately these commands make much noise... let's hope we notice errors
# step 3: sync the result into the mirror directories from where
# the files are distributed
for a in ${ARCHES}; do
arch_binpackages=${OUTTREE}/${a}/binpackages
[[ -d ${arch_binpackages} ]] || mkdir -p ${_verbose_v} ${arch_binpackages}
rsync ${_verbose_v} "${OUT_RSYNC_OPTS[@]}" ${STAGINGTREE}/${a}/* ${arch_binpackages}/
date -u > ${arch_binpackages}/.timestamp
done
# vim: et ts=2 sts=2 sw=2
|