beebbb1c072bfbceb7f081f5acdab6deb0b7841a
[shellsnippets/shellsnippets.git] / mksh / sysadmin / kuhbauer
1 #!/bin/mksh
2 # $Id: kuhbauer 2990 2012-06-12 10:51:32Z tglase $
3 #-
4 # Copyright © 2011, 2012
5 #       Thorsten Glaser <t.glaser@tarent.de>
6 # Licenced under the AGPLv3
7 #-
8 # root@dev-hudson:/usr/local/bin/kuhbauer via sudoers
9 # ALL     ALL=(ALL) NOPASSWD: /usr/local/bin/kuhbauer
10
11 unset LANG LANGUAGE LC_ADDRESS LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
12     LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
13     LC_TELEPHONE LC_TIME
14 export LC_ALL=C
15
16 xrepos=
17 issnapshot=0
18 while getopts 'r:S' ch; do
19         case $ch {
20         (r)     xrepos=$OPTARG ;;
21         # passed from vcs2deb, do not pass manually
22         (S)     issnapshot=1 ;;
23         }
24 done
25 shift $((OPTIND - 1))
26
27 if [[ $1 != @(sarge|etch|lenny|squeeze|wheezy|sid|dapper|hardy|karmic|lucid|maverick|natty|oneiric|precise)?(-backports?(-sloppy))?(/i386) || \
28     $2 != *.dsc || ! -s $2 || $SUDO_UID != +([0-9]) || $SUDO_GID != +([0-9]) ]]; then
29         print -u2 "Syntax: sudo $0 [-r xr] lenny-backports file.dsc [-B -m...]"
30         print -u2 "The third argument onwards are dpkg-buildpackage options."
31         print -u2 "The second argument is the target distribution and can be"
32         print -u2 "something like etch/i386 as well; appropriate chroots for"
33         print -u2 "that must be created by the admins."
34         print -u2 "The -r argument allows to pass extra APT repositories, as"
35         print -u2 "complete sources.list(5) 'deb' or 'deb-src' lines, with a"
36         print -u2 "pipe sign '|' as separator."
37         exit 255
38 fi
39
40 if ! now=$(date +%s) || [[ $now != +([0-9]) ]]; then
41         print -u2 Cannot determine current time.
42         exit 255
43 fi
44 typeset -Uui16 -Z11 now
45 if ! wd=$(realpath .) || [[ -z $wd ]]; then
46         print -u2 Cannot determine current working directory.
47         exit 255
48 fi
49 if ! T=$(mktemp -d /tmp/kuhbauer.XXXXXXXXXX); then
50         print -u2 Cannot create temporary directory.
51         exit 255
52 fi
53
54 export DIST=$1
55 shift
56 fn=$1
57 shift
58 dbargs=
59 binarch=0
60
61 for arg in "$@"; do
62         case $arg {
63         (-B)    binarch=1 ;;
64         }
65         dbargs="$dbargs '${arg//\'/\'\\\'\'}'"
66 done
67
68 set -A cbargs
69 [[ $DIST = */i386 ]] && cbargs[${#cbargs[*]}]=linux32
70 cbargs[${#cbargs[*]}]=cowbuilder
71 (( binarch )) && cbargs[${#cbargs[*]}]=--binary-arch
72 [[ -n $dbargs ]] && cbargs[${#cbargs[*]}]=--debbuildopts
73 [[ -n $dbargs ]] && cbargs[${#cbargs[*]}]=${dbargs# }
74 cbargs[${#cbargs[*]}]=--configfile
75 cbargs[${#cbargs[*]}]=$T/config
76 cbargs[${#cbargs[*]}]=--hookdir
77 cbargs[${#cbargs[*]}]=$T/hooks
78 cbargs[${#cbargs[*]}]=--build
79 cbargs[${#cbargs[*]}]=$fn
80
81 cat >"$T/config" <<-EOF
82         export BUILDRESULT='${T//\'/\'\\\'\'}/res'
83         export BUILDRESULTUID=0
84         export BUILDRESULTGID=0
85         export PKGNAME_LOGFILE_EXTENTION=_\${ARCHITECTURE}.${now#16#}.${DIST//'/'/!}.holzscheit
86 EOF
87
88 mkdir "$T/hooks" "$T/res"
89 print '#!/bin/sh' >"$T/hooks/D02repos"
90 print 'dpkg -i /tmp/tarent-keyring*.deb' >>"$T/hooks/D02repos"
91 has_ssl_repos=0
92 if [[ -n $xrepos ]]; then
93         saveIFS=$IFS
94         IFS='|'
95         print -r -- 'cat >>/etc/apt/sources.list <<"EOD"'
96         for repo in $xrepos; do
97                 [[ $repo = *'https://'* ]] && has_ssl_repos=1
98                 print -r -- "$repo"
99         done
100         print EOD
101         IFS=$saveIFS
102 fi >>"$T/hooks/D02repos"
103 print 'apt-get update' >>"$T/hooks/D02repos"
104 if (( issnapshot )); then
105         extraargs='-X nmu'
106 else
107         extraargs=
108 fi
109 cat >"$T/hooks/B00lintian" <<-EOF
110         #!/bin/sh
111         # \$MirOS: contrib/hosted/tg/deb/hookdir/B20lintian,v 1.2 2011/12/17 22:33:34 tg Exp $
112         # \$Id: kuhbauer 2990 2012-06-12 10:51:32Z tglase $
113
114         unset LANGUAGE
115         LC_ALL=C; export LC_ALL
116
117         ir=--install-recommends
118         # arrrrrgh!
119         apt-get install \$ir -s apt >/dev/null 2>&1 || ir=
120         apt-get --purge -y install \$ir lintian
121
122         argE=
123         argP=
124         if lintian -h 2>&1 | grep -F -- --display-experimental >/dev/null 2>&1; then
125                 argE=--display-experimental
126         fi
127         if lintian -h 2>&1 | grep -F -- --pedantic >/dev/null 2>&1; then
128                 argP=--pedantic
129         fi
130         echo
131         echo ==================================================================
132         echo Running lintian...
133         echo
134         lintian -vIi \$argE \$argP $extraargs --allow-root /tmp/buildd/*.changes 2>&1
135         echo
136         echo ==================================================================
137         echo
138 EOF
139 chmod +x "$T/hooks/D02repos" "$T/hooks/B00lintian"
140 if (( has_ssl_repos )); then
141         print '#!/bin/sh' >"$T/hooks/D01https"
142         print 'apt-get --purge -y install apt-transport-https' >>"$T/hooks/D01https"
143         chmod +x "$T/hooks/D01https"
144 fi
145
146 print -nr -- "=== running"
147 for arg in "${cbargs[@]}"; do
148         print -nr -- " '${arg//\'/\'\\\'\'}'"
149 done
150 print
151 "${cbargs[@]}"
152 rv=$?
153 print "=== errorlevel: $rv"
154
155 cd "$T/res"
156 ls -l
157 (( rv )) || for f in *; do
158         [[ -s $f ]] || continue
159         print -r "=== moving build result to: $wd"
160         chown $SUDO_UID:$SUDO_GID *
161         mv * "$wd/"
162         break
163 done
164
165 cd "$wd"
166 rm -rf "$T"
167 exit $rv