]> git.decadent.org.uk Git - dak.git/blob - scripts/debian/byhand-di
af03af4c8f3d3bfb12fbeab67139ae3cedc90791
[dak.git] / scripts / debian / byhand-di
1 #!/bin/bash
2
3 set -u
4 set -e
5 set -o pipefail
6
7 if [ $# -lt 4 ]; then
8         echo "Usage: $0 filename version arch changes_file"
9         exit 1
10 fi
11
12 TARBALL="$1"    # Tarball to read, compressed with gzip
13 VERSION="$2"
14 ARCH="$3"
15 CHANGES="$4"    # Changes file for the upload
16
17 error() {
18         echo "$*"
19         exit 1
20 }
21
22 # Check validity of version number
23 # Expected are: YYYYMMDD, YYYYMMDD.x, YYYYMMDD<suite>x, YYYYMMDD+<suite>x and the +b[0-9] on the end
24 if ! echo "$VERSION" | grep -Eq "^[0-9]{8}(|(\.|\+?[a-z]+)[0-9]+)(\+b[0-9])?$"; then
25         error "Invalid version: '$VERSION'"
26 fi
27
28 # Get the target suite from the Changes file
29 # NOTE: it may be better to pass this to the script as a parameter!
30 SUITE="$(grep "^Distribution:" "$CHANGES" | awk '{print $2}')"
31 case $SUITE in
32     "")
33         error "Error: unable to determine suite from Changes file"
34         ;;
35     unstable|sid)
36         : # nothing to do
37         ;;
38     *)
39         SUITE="${SUITE}-proposed-updates"
40         ;;
41 esac
42
43 # This must end with /
44 TARGET="/srv/ftp-master.debian.org/ftp/dists/$SUITE/main/installer-$ARCH/"
45
46 # Check validity of the target directory
47 # This could fail, for example for new architectures; doing
48 # a regular BYHAND is safer in that case
49 if [ ! -d "$TARGET" ]; then
50         mkdir -p "$TARGET"
51 fi
52 # Check that there isn't already a directory for this version
53 if [ -d "$TARGET/$VERSION" ]; then
54         error "Directory already exists: $TARGET/$VERSION"
55 fi
56
57 # We know the VERSION is sane by here, we just need to make sure we escape the + in +b1 (if any)
58 # It needs 'g' as well as we may have +$DIST+b[0-9]
59 VERSIONREGEXP="$(echo $VERSION | sed 's@+@\\\+@g')"
60
61 # We know all data to be in ./installer-<arch>/<version>; see if there's
62 # anything else in the tarball except that and the 'current' symlink
63 if tar tzf "$TARBALL" | \
64    grep -Eqv "^\./(installer-$ARCH/($VERSIONREGEXP/.*|current|)|)$"; then
65         error "Tarball contains unexpected contents"
66 fi
67
68 # Create a temporary directory where to store the images
69 umask 002
70 TMPDIR="$(mktemp -td byhand-di.XXXXXX)"
71
72 # If we fail somewhere, cleanup the temporary directory
73 cleanup() {
74         rm -rf "$TMPDIR"
75 }
76 trap cleanup EXIT
77
78 # Extract the data into the temporary directory
79 tar xzf "$TARBALL" --directory="$TMPDIR" "./installer-$ARCH/"
80
81 # Check the 'current' symlink
82 if [ ! -L $TMPDIR/installer-$ARCH/current ]; then
83         error "Missing 'current' symlink"
84 elif [ X"$(readlink "$TMPDIR/installer-$ARCH/current")" != X"$VERSION" ]; then
85         error "Incorrect 'current' symlink"
86 fi
87
88 # We should have an MD5SUMS file; use that for a final check
89 if [ -r "$TMPDIR/installer-$ARCH/$VERSION/images/MD5SUMS" ]; then
90         (
91                 cd "$TMPDIR/installer-$ARCH/$VERSION/images"
92                 md5sum -c --status MD5SUMS || error "Error while checking MD5SUMS"
93         )
94 else
95         error "Missing MD5SUMS file"
96 fi
97
98 # Move the data to the final location
99 mv "$TMPDIR/installer-$ARCH/$VERSION" "$TARGET"
100 mv "$TMPDIR/installer-$ARCH/current"  "$TARGET"
101
102 # Fixup permissions
103 find "$TARGET/$VERSION" -type d -exec chmod 755 {} +
104 find "$TARGET/$VERSION" -type f -exec chmod 644 {} +
105
106 # Make sure nothing symlinks outside of the ftpdir
107 # Shouldnt happen, but better be sure.
108 symlinks -d -r /srv/ftp-master.debian.org/ftp
109
110 trap - EXIT
111 cleanup
112
113 exit 0