update_jdn.sh 24.9 KB
Newer Older
1
#!/bin/bash
2
# vim: set noexpandtab:
3
# Copyright 2012-2019 Holger Levsen <holger@layer-acht.org>
4
#         ©      2018 Mattia Rizzolo <mattia@debian.org>
5
6
# released under the GPLv=2

Holger Levsen's avatar
Holger Levsen committed
7
# puppet / salt / ansible / fai / chef / deployme.app - disclaimer
Holger Levsen's avatar
Holger Levsen committed
8
9
10
11
12
13
14
15
16
17
18
# (IOW: this script has been grown in almost 500 commits and it shows…)
#
# yes, we know… and: "it" should probably still be done.
#
# It just unclear, how/what, and what we have actually mostly works.
#
# Switching to jenkins.debian.org is probably an opportunity
# to write (refactor this into) *yet another deployment script*
# (interacting with the DSA machine setup which is in puppet…),
# thus obsoleting this script gradually, though this is used on
# 47 hosts currently (of which quite some were initially installed
Edward Betts's avatar
Edward Betts committed
19
# manually…)
Holger Levsen's avatar
Holger Levsen committed
20
21
22
#
# so, yes, patches welcome. saying this is crap alone is not helpful,
# nor is just suggesting some new or old technology. patches most welcome!
23
24
#
# that said, there's a new one: init_node ;)
Holger Levsen's avatar
Holger Levsen committed
25

26
27
set -e

28
BASEDIR="$(dirname "$(readlink -e $0)")"
29
STAMP=/var/log/jenkins/update-jenkins.stamp
30
31
# The $@ below means that command line args get passed on to j-j-b
# which allows one to specify --flush-cache or --ignore-cache
32
JJB="jenkins-jobs $@"
33
DPKG_ARCH="$(dpkg --print-architecture)"
Holger Levsen's avatar
Holger Levsen committed
34

35
# so we can later run some commands only if $0 has been updated…
Philip Hands's avatar
Philip Hands committed
36
if [ -f $STAMP ] && [ $STAMP -nt $BASEDIR/$0 ] ; then
Holger Levsen's avatar
Holger Levsen committed
37
	UP2DATE=true
Philip Hands's avatar
Philip Hands committed
38
39
else
	UP2DATE=false
40
41
42
fi


Holger Levsen's avatar
Holger Levsen committed
43
explain() {
Holger Levsen's avatar
Holger Levsen committed
44
	echo "$HOSTNAME: $1"
Holger Levsen's avatar
Holger Levsen committed
45
46
}

47
48
49
set_correct_date() {
		# set correct date
		sudo service ntp stop || true
50
		sudo ntpdate -b $1
51
}
52

53
disable_dsa_check_packages() {
54
	# disable check for outdated packages as someday in the future
55
	# packages from security.d.o will appear outdated always…
56
57
	echo -e "#!/bin/sh\n# disabled dsa-check by update_jdn.sh\nexit 0" | sudo tee /usr/local/bin/dsa-check-packages
	sudo chmod a+rx /usr/local/bin/dsa-check-packages
58
59
}

60
echo "--------------------------------------------"
Holger Levsen's avatar
Holger Levsen committed
61
explain "$(date) - begin deployment update."
62

63
64
65
66
#
# temporarily test to check which hosts don't use systemd
#
if [ -z "$(dpkg -l|grep systemd-sysv||true)" ] ; then 
67
	echo "no systemd-sysv installed on $(hostname), please enter to continue…"
68
69
70
	read
fi

71
# some nodes need special treatment…
72
case $HOSTNAME in
73
	profitbricks-build5-amd64|profitbricks-build6-i386|profitbricks-build15-amd64|profitbricks-build16-i386)
Holger Levsen's avatar
Holger Levsen committed
74
		# set correct date
75
		set_correct_date de.pool.ntp.org
76
		;;
77
	codethink-sled9*|codethink-sled11*|codethink-sled13*|codethink-sled15*)
78
		# set correct date
79
		set_correct_date de.pool.ntp.org
Holger Levsen's avatar
Holger Levsen committed
80
		;;
81
	osuosl-build170-amd64|osuosl-build172-amd64)
82
		# set correct date
83
		set_correct_date time.osuosl.org
84
		;;
85
86
87
	*)	;;
esac

88
89
90
91
92
93
94
95
96
97
98
# ubuntu decided to change kernel perms in the middle of LTS…
case $HOSTNAME in
	codethink-sled*)
		# fixup perms
		sudo chmod +r /boot/vmlinuz-*
		;;
	*)	;;
esac



99
100
101
#
# set up users and groups
#
102
declare -A user_host_groups u_shell
103
sudo_groups='jenkins,jenkins-adm,sudo,adm'
104
105
106

# if there's a need for host groups, a case statement on $HOSTNAME here that sets $GROUPNAME, say, should do the trick
# then you can define user_host_groups['phil','lvm_group']=... below
Edward Betts's avatar
Edward Betts committed
107
# and add checks for the GROUP version wherever the HOSTNAME is checked in the following code
108
109
110
111
112

user_host_groups['helmut','*']="$sudo_groups"
user_host_groups['holger','*']="$sudo_groups"
user_host_groups['holger','jenkins']="reproducible,${user_host_groups['holger','*']}"
user_host_groups['mattia','*']="$sudo_groups"
113
user_host_groups['mattia','jenkins']="reproducible,${user_host_groups['mattia','*']}"
114
user_host_groups['phil','jenkins-test-vm']="$sudo_groups,libvirt,libvirt-qemu"
115
user_host_groups['phil','jenkins']="$sudo_groups"
116
user_host_groups['lunar','jenkins']='reproducible'
117
118
user_host_groups['lynxis','osuosl-build171-amd64']="$sudo_groups"
user_host_groups['lynxis','osuosl-build172-amd64']="$sudo_groups"
119
user_host_groups['hans','osuosl-build168-amd64']="$sudo_groups"
120
121
user_host_groups['vagrant','armhf']="$sudo_groups"
user_host_groups['vagrant','arm64']="$sudo_groups"
122

123
124

u_shell['mattia']='/bin/zsh'
125
u_shell['lynxis']='/bin/fish'
126
u_shell['jenkins-adm']='/bin/bash'
127

128
129
130
# get the users out of the user_host_groups array's index
users=$(for i in ${!user_host_groups[@]}; do echo ${i%,*} ; done | sort -u)

131
( $UP2DATE && [ -z "$(find authorized_keys -newer $0)" ] ) || for user in ${users}; do
132
	# -v is a bashism to check for set variables, used here to see if this user is active on this host
133
	if [ ! -v user_host_groups["$user","$HOSTNAME"] ] && [ ! -v user_host_groups["$user",'*'] ] && [ ! -v user_host_groups["$user","$DPKG_ARCH"] ] ; then
Holger Levsen's avatar
Holger Levsen committed
134
135
		continue
	fi
136

137
138
139
140
141
142
	# create the user
	if ! getent passwd $user > /dev/null ; then
		# adduser, defaulting to /bin/bash as shell
		sudo adduser --gecos "" --shell "${u_shell[$user]:-/bin/bash}" --disabled-password $user
	fi
	# add groups: first try the specific host, or if unset fall-back to default '*' setting
143
	for h in "$HOSTNAME" "$DPKG_ARCH" '*' ; do
144
		if [ -v user_host_groups["$user","$h"] ] ; then
Holger Levsen's avatar
Holger Levsen committed
145
			sudo usermod -G "${user_host_groups["$user","$h"]}" $user
146
			break
147
		fi
148
149
150
151
152
	done
	# add the user's keys (if any)
	if ls authorized_keys/${user}@*.pub >/dev/null 2>&1 ; then
		[ -d /var/lib/misc/userkeys ] || sudo mkdir -p /var/lib/misc/userkeys
		cat authorized_keys/${user}@*.pub | sudo tee /var/lib/misc/userkeys/${user} > /dev/null
153
	fi
154
155
done

156
157
158
159
160
sudo mkdir -p /srv/workspace
[ -d /srv/schroots ] || sudo mkdir -p /srv/schroots
[ -h /chroots ] || sudo ln -s /srv/workspace/chroots /chroots
[ -h /schroots ] || sudo ln -s /srv/schroots /schroots

161
if [ "$HOSTNAME" = "jenkins-test-vm" ] || [ "$HOSTNAME" = "osuosl-build168-amd64" ] ; then
162
	# jenkins needs access to libvirt
163
	sudo adduser jenkins kvm
164
165
	sudo adduser jenkins libvirt
	sudo adduser jenkins libvirt-qemu
166
fi
167

168
169
# prepare tmpfs on some hosts
case $HOSTNAME in
Mattia Rizzolo's avatar
Mattia Rizzolo committed
170
171
172
173
	jenkins)
		TMPFSSIZE=100
		TMPSIZE=15
		;;
Holger Levsen's avatar
Holger Levsen committed
174
	profitbricks-build9-amd64)
175
		TMPFSSIZE=40
Mattia Rizzolo's avatar
Mattia Rizzolo committed
176
177
		TMPSIZE=8
		;;
Holger Levsen's avatar
Holger Levsen committed
178
	profitbricks-build*)
Mattia Rizzolo's avatar
Mattia Rizzolo committed
179
180
181
		TMPFSSIZE=200
		TMPSIZE=15
		;;
182
183
184
185
	codethink*)
		TMPFSSIZE=100
		TMPSIZE=15
		;;
186
187
188
189
	osuosl*)
		TMPFSSIZE=400
		TMPSIZE=50
		;;
190
191
192
	*) ;;
esac
case $HOSTNAME in
193
194
195
196
197
198
	profitbricks-build*i386)
		if ! grep -q '/srv/workspace' /etc/fstab; then
			echo "Warning: you need to manually create a /srv/workspace partition on i386 nodes, exiting."
			exit 1
		fi
		;;
199
	jenkins|profitbricks-build*amd64|codethink*|osuosl*)
200
		if ! grep -q '^tmpfs\s\+/srv/workspace\s' /etc/fstab; then
201
			echo "tmpfs		/srv/workspace	tmpfs	defaults,size=${TMPFSSIZE}g	0	0" | sudo tee -a /etc/fstab >/dev/null  
202
		fi
Mattia Rizzolo's avatar
Mattia Rizzolo committed
203
204
205
		if ! grep -q '^tmpfs\s\+/tmp\s' /etc/fstab; then
			echo "tmpfs		/tmp	tmpfs	defaults,size=${TMPSIZE}g	0	0" | sudo tee -a /etc/fstab >/dev/null
		fi
206
207
		if ! mountpoint -q /srv/workspace; then
			if test -z "$(ls -A /srv/workspace)"; then
208
				sudo mount /srv/workspace
209
			else
210
				explain "WARNING: mountpoint /srv/workspace is non-empty."
211
212
213
214
215
			fi
		fi
		;;
	*) ;;
esac
216

217
# make sure needed directories exists - some directories will not be needed on all hosts...
218
for directory in /schroots /srv/reproducible-results /srv/d-i /srv/udebs /srv/live-build /var/log/jenkins/ /srv/jenkins /srv/jenkins/pseudo-hosts /srv/workspace/chroots ; do
219
220
221
	if [ ! -d $directory ] ; then
		sudo mkdir $directory
	fi
Holger Levsen's avatar
Holger Levsen committed
222
	sudo chown jenkins.jenkins $directory
223
done
Holger Levsen's avatar
Holger Levsen committed
224
for directory in /srv/jenkins ; do
225
226
227
228
229
	if [ ! -d $directory ] ; then
		sudo mkdir $directory
		sudo chown jenkins-adm.jenkins-adm $directory
	fi
done
230

231
if ! test -h /chroots; then
Holger Levsen's avatar
Holger Levsen committed
232
	sudo rmdir /chroots || sudo rm -f /chroots # do not recurse
233
	if test -e /chroots; then
Holger Levsen's avatar
Holger Levsen committed
234
		explain "/chroots could not be cleared."
235
	else
236
		sudo ln -s /srv/workspace/chroots /chroots
237
238
239
	fi
fi

240
241
242
243
244
# only on Debian systems
if [ -f /etc/debian_version ] ; then
	#
	# install packages we need
	#
245
	if [ $BASEDIR/$0 -nt $STAMP ] || [ ! -f $STAMP ] ; then
Holger Levsen's avatar
Holger Levsen committed
246
247
		DEBS=" 
			bash-completion 
248
249
			bc
			bsd-mailx
250
251
			curl
			debian-archive-keyring
252
			debootstrap 
253
254
			devscripts
			eatmydata
255
			etckeeper
256
			figlet
Holger Levsen's avatar
Holger Levsen committed
257
			git
Holger Levsen's avatar
Holger Levsen committed
258
			gnupg
259
			haveged
Holger Levsen's avatar
Holger Levsen committed
260
			htop
261
			less
262
			locales-all
Mattia Rizzolo's avatar
Mattia Rizzolo committed
263
			lsof
264
265
			molly-guard
			moreutils
266
267
268
			munin-node/stretch-backports
			munin-plugins-core/stretch-backports
			munin-plugins-extra/stretch-backports
Holger Levsen's avatar
Holger Levsen committed
269
			needrestart
270
			netcat-traditional
271
272
			ntp
			ntpdate
273
			pbuilder/stretch-backports
274
			pigz 
275
			postfix
276
			procmail
277
			psmisc
278
			python3-psycopg2 
Holger Levsen's avatar
Holger Levsen committed
279
			schroot 
280
281
			screen
			slay
282
			stunnel
Holger Levsen's avatar
Holger Levsen committed
283
284
			subversion 
			subversion-tools 
285
			systemd-sysv
Holger Levsen's avatar
Holger Levsen committed
286
287
288
			sudo 
			unzip 
			vim 
289
			zsh
290
			"
291
		# install squid on a few nodes only
292
		case $HOSTNAME in
293
			profitbricks-build1-a*|profitbricks-build10*|codethink-sled16*|osuosl-build167*) DEBS="$DEBS
294
295
296
297
298
299
				squid" ;;
			*) ;;
		esac
		# notifications are only done from a view nodes
		case $HOSTNAME in
			jenkins|jenkins-test-vm|profitbricks-build*) DEBS="$DEBS
300
301
				kgb-client
				python3-yaml" ;;
302
303
			*) ;;
		esac
304
305
306
		# install debootstrap from stretch-backports on ubuntu nodes as since 20180927 debootstrap 1.0.78+nmu1ubuntu1.6 cannot install sid anymore
		case $HOSTNAME in
			codethink*) DEBS="$DEBS
307
				debootstrap/stretch-backports" ;;
308
309
			*) 	;;
		esac
310
311
		# needed to run the 2nd reproducible builds nodes in the future...
		case $HOSTNAME in
312
			profitbricks-build5-amd64|profitbricks-build6-i386|profitbricks-build15-amd64|profitbricks-build16-i386) DEBS="$DEBS ntpdate" ;;
313
			codethink-sled9*|codethink-sled11*|codethink-sled13*|codethink-sled15*) DEBS="$DEBS ntpdate" ;;
314
			osuosl-build170-amd64|osuosl-build172-amd64) DEBS="$DEBS ntpdate" ;;
315
316
			*) ;;
		esac
317
		# needed to run coreboot/openwrt/netbsd/fedora jobs
318
		case $HOSTNAME in
319
		osuosl-build171-amd64|osuosl-build172-amd64) DEBS="$DEBS
Holger Levsen's avatar
Holger Levsen committed
320
				bison
321
				ca-certificates
Holger Levsen's avatar
Holger Levsen committed
322
323
324
				cmake
				diffutils
				findutils
325
				fish
Holger Levsen's avatar
Holger Levsen committed
326
327
328
329
330
331
332
333
334
335
336
337
338
				flex
				g++
				gawk
				gcc
				grep
				iasl
				libc6-dev
				libncurses5-dev
				libssl-dev
				locales-all
				kgb-client
				m4
				make
339
340
				python3-clint
				python3-git
341
				python3-pystache
342
				python3-requests
Holger Levsen's avatar
Holger Levsen committed
343
344
				python3-yaml
				subversion
345
				tree
Holger Levsen's avatar
Holger Levsen committed
346
347
348
				unzip
				util-linux
				zlib1g-dev"
349
350
351
			;;
			*) ;;
		esac
352
353
		# needed to run fdroid jobs
		case $HOSTNAME in
354
			osuosl-build168-amd64) DEBS="$DEBS
355
				androguard/stretch-backports
356
				android-sdk
357
358
				bzr
				git-svn
359
				fdroidserver/stretch-backports
360
				libvirt-clients
361
362
				libvirt-daemon
				libvirt-daemon-system
363
				mercurial
364
365
				python3-babel
				python3-defusedxml
366
				python3-libvirt
367
				python3-mwclient/stretch-backports
368
369
				python3-qrcode
				python3-ruamel.yaml
370
				python3-setuptools
371
				python3-vagrant
372
				qemu-kvm
373
				subversion
374
375
376
				vagrant
				vagrant-mutate
				vagrant-libvirt"
377
			;;
378
			*) ;;
379
		esac
380
381
382
383
		if [ "$HOSTNAME" = "jenkins-test-vm" ] ; then
			# for phil only
			DEBS="$DEBS postfix-pcre"
		fi
384
		if [ "$HOSTNAME" = "jenkins" ] || [ "$HOSTNAME" = "jenkins-test-vm" ] ; then
Holger Levsen's avatar
Holger Levsen committed
385
386
387
388
			MASTERDEBS=" 
				apache2 
				apt-file 
				apt-listchanges 
389
				asciidoc
Holger Levsen's avatar
Holger Levsen committed
390
				binfmt-support 
391
392
				bison
				botch
Holger Levsen's avatar
Holger Levsen committed
393
394
395
396
397
398
399
				build-essential 
				cmake 
				cron-apt 
				csvtool 
				dnsmasq-base 
				dstat 
				figlet 
Holger Levsen's avatar
Holger Levsen committed
400
				flex
Holger Levsen's avatar
Holger Levsen committed
401
				gawk 
402
				ghc
403
				git-lfs
404
				git-notifier 
Holger Levsen's avatar
Holger Levsen committed
405
406
407
408
				gocr 
				graphviz 
				iasl 
				imagemagick 
409
410
				ip2host
				jekyll
411
				kgb-client
Holger Levsen's avatar
Holger Levsen committed
412
413
414
415
416
417
418
419
420
				libcap2-bin 
				libfile-touch-perl 
				libguestfs-tools 
				libjson-rpc-perl 
				libsoap-lite-perl 
				libxslt1-dev 
				moreutils 
				mr 
				mtr-tiny 
421
				munin/stretch-backports
Holger Levsen's avatar
Holger Levsen committed
422
				ntp 
423
				obfs4proxy
Holger Levsen's avatar
Holger Levsen committed
424
425
				openbios-ppc 
				openbios-sparc 
426
				openjdk-8-jre 
427
				pandoc
428
				postgresql
429
				postgresql-autodoc
430
				postgresql-client 
Holger Levsen's avatar
Holger Levsen committed
431
432
433
				poxml 
				procmail 
				python3-debian 
434
				python3-pystache
435
				python3-requests
436
437
438
				python3-sqlalchemy
				python3-xdg
				python3-yaml
Holger Levsen's avatar
Holger Levsen committed
439
440
441
442
443
444
445
446
447
448
449
450
451
452
				python-arpy 
				python-hachoir-metadata 
				python-imaging 
				python-lzma 
				python-pip 
				python-rpy2 
				python-setuptools 
				python-twisted 
				python-yaml 
				qemu 
				qemu-kvm 
				qemu-system-x86 
				qemu-user-static 
				radvd 
453
454
				ruby-rspec
				rustc
Holger Levsen's avatar
Holger Levsen committed
455
456
457
458
				seabios 
				shorewall 
				shorewall6 
				sqlite3 
459
460
				syslinux
				systemd/stretch-backports
461
				thin-provisioning-tools
462
				tor
Holger Levsen's avatar
Holger Levsen committed
463
				vncsnapshot 
464
465
				vnstat
				whohas
Holger Levsen's avatar
Holger Levsen committed
466
				x11-apps 
467
				xtightvncviewer
468
				xvfb
469
				xvkbd
470
				zutils"
471
472
473
		else
			MASTERDEBS=""
		fi
474
		$UP2DATE || sudo apt-get update
475
		$UP2DATE || sudo apt-get install $DEBS $MASTERDEBS
Edward Betts's avatar
Edward Betts committed
476
		# don't (re-)install pbuilder if it's on hold
477
		if [ "$(dpkg-query -W -f='${db:Status-Abbrev}\n' pbuilder)" != "hi " ] ; then
478
			$UP2DATE || sudo apt-get install pbuilder
479
		fi
480
		# remove unattended-upgrades if it's installed
481
		if [ "$(dpkg-query -W -f='${db:Status-Abbrev}\n' unattended-upgrades 2>/dev/null || true)" = "ii "  ] ; then
482
			 sudo apt-get -y purge unattended-upgrades
483
		fi
484
		# we need mock to build fedora
485
		if [ "$HOSTNAME" = "osuosl-build171-amd64" ] || [ "$HOSTNAME" = "osuosl-build172-amd64" ] || [ "$HOSTNAME" = "jenkins" ] ; then
486
			$UP2DATE || sudo apt-get install mock
487
		fi
488
		# for varying kernels:
489
		# - we use bpo kernels on pb-build5+15 (and the default amd64 kernel on pb-build6+16-i386)
490
		# - we also use the bpo kernel on osuosl-build172 (but not osuosl-build171)
491
		if [ "$HOSTNAME" = "profitbricks-build5-amd64" ] || [ "$HOSTNAME" = "profitbricks-build15-amd64" ] \
492
			|| [ "$HOSTNAME" = "osuosl-build172-amd64" ] ; then
493
			$UP2DATE || sudo apt-get install -t stretch-backports linux-image-amd64
494
495
496
		elif [ "$HOSTNAME" = "profitbricks-build6-i386" ] || [ "$HOSTNAME" = "profitbricks-build16-i386" ] \
			|| [ "$HOSTNAME" = "profitbricks-build2-i386" ] || [ "$HOSTNAME" = "profitbricks-build12-i386" ] ; then
			# we dont vary the kernel on i386 atm, see #875990 + #876035
497
			$UP2DATE || sudo apt-get install linux-image-amd64:amd64
498
499
500
		elif [ "$HOSTNAME" = "osuosl-build169-amd64" ] || [ "$HOSTNAME" = "osuosl-build170-amd64" ] ; then
			# Arch Linux builds latest stuff which sometimes (eg, currentlt Qt) needs newer kernel to build...
			$UP2DATE || sudo apt-get install -t stretch-backports linux-image-amd64
501
		fi
Holger Levsen's avatar
Holger Levsen committed
502
		# only needed on the main nodes
Holger Levsen's avatar
Holger Levsen committed
503
		if [ "$HOSTNAME" = "jenkins-test-vm" ] ; then
504
			$UP2DATE || sudo apt-get install jenkins-job-builder/stretch-backports
Holger Levsen's avatar
Holger Levsen committed
505
		elif [ "$HOSTNAME" = "jenkins" ] ; then
506
			$UP2DATE || sudo apt-get install ffmpeg libav-tools python3-popcon jenkins-job-builder/stretch-backports dose-extra
507
		fi
508
		sudo apt-get clean
Holger Levsen's avatar
Holger Levsen committed
509
		explain "packages installed."
510
	else
Holger Levsen's avatar
Holger Levsen committed
511
		explain "no new packages to be installed."
512
	fi
513
fi
514

515
#
Holger Levsen's avatar
Holger Levsen committed
516
# deploy package configuration in /etc and /usr
517
#
Holger Levsen's avatar
Holger Levsen committed
518
cd $BASEDIR
519
520
521
522
523
524
525
526
527
for h in common common-amd64 common-i386 common-arm64 common-armhf "$HOSTNAME" ; do
	# $HOSTNAME has precedence over common-$DPKG_ARCH over common
	case $h in
		common-amd64) [ $DPKG_ARCH = "amd64" ] || continue ;;
		common-i386)  [ $DPKG_ARCH = "i386" ] || continue ;;
		common-arm64) [ $DPKG_ARCH = "arm64" ] || continue ;;
		common-armhf) [ $DPKG_ARCH = "armhf" ] || continue ;;
		*) ;;
	esac
528
529
	if [ -d "hosts/$h/etc/sudoers.d/" ]; then
		for f in "hosts/$h/etc/sudoers.d/"* ; do
530
			/usr/sbin/visudo -c -f "$f" > /dev/null
531
532
533
		done
	fi
	for d in etc usr ; do
Mattia Rizzolo's avatar
Mattia Rizzolo committed
534
		if [ -d "hosts/$h/$d" ]; then
535
			sudo cp --preserve=mode,timestamps -r "hosts/$h/$d/"* "/$d"
536
537
538
		fi
	done
done
539
540
# we ship one or two service files…
sudo systemctl daemon-reload &
541
542
543
544
545

#
# more configuration than a simple cp can do
#
sudo chown root.root /etc/sudoers.d/jenkins ; sudo chmod 700 /etc/sudoers.d/jenkins
546
sudo chown root.root /etc/sudoers.d/jenkins-adm ; sudo chmod 700 /etc/sudoers.d/jenkins-adm
Holger Levsen's avatar
Holger Levsen committed
547
[ -f /etc/mailname ] || ( echo $HOSTNAME.debian.net | sudo tee /etc/mailname )
548
549

if [ "$HOSTNAME" = "jenkins" ] ; then
550
	if ! $UP2DATE || [ $BASEDIR/hosts/$HOSTNAME/etc/apache2 -nt $STAMP ]  ; then
551
552
553
554
555
556
557
558
559
560
561
		if [ ! -e /etc/apache2/mods-enabled/proxy.load ] ; then
			sudo a2enmod proxy
			sudo a2enmod proxy_http
			sudo a2enmod rewrite
			sudo a2enmod ssl
			sudo a2enmod headers
			sudo a2enmod macro
			sudo a2enmod filter
		fi
		sudo a2ensite -q jenkins.debian.net
		sudo a2enconf -q munin
562
		sudo chown jenkins-adm.jenkins-adm /etc/apache2/sites-enabled/jenkins.debian.net.conf
563
564
565
		# for reproducible.d.n url rewriting:
		[ -L /var/www/userContent ] || sudo ln -sf /var/lib/jenkins/userContent /var/www/userContent
		sudo service apache2 reload
566
	fi
567
568
569
570
571
572
	if ! grep controlmaster ~jenkins/.ssh/config || ! grep controlpath ~jenkins/.ssh/config ; then
		echo
		echo "Please define controlmaster and controlpath in ~jenkins/.ssh/config manually, see https://debian-administration.org/article/290/Reusing_existing_OpenSSH_v4_connections"
		echo
		exit 1
	fi
573
574
fi

575
if ! $UP2DATE || [ $BASEDIR/hosts/$HOSTNAME/etc/munin -nt $STAMP ] ; then
576
	cd /etc/munin/plugins
Holger Levsen's avatar
Holger Levsen committed
577
	sudo rm -f postfix_* open_inodes interrupts irqstats threads proc_pri vmstat if_err_* exim_* netstat fw_forwarded_local fw_packets forks open_files users nfs* iostat_ios ntp* 2>/dev/null
578
	case $HOSTNAME in
579
			profitbricks-build1-a*|profitbricks-build10*|codethink-sled16*|osuosl-build167*) [ -L /etc/munin/plugins/squid_cache ] || for i in squid_cache squid_objectsize squid_requests squid_traffic ; do sudo ln -s /usr/share/munin/plugins/$i $i ; done ;;
580
581
			*)	;;
	esac
Holger Levsen's avatar
Holger Levsen committed
582
583
584
585
	case $HOSTNAME in
			jenkins) [ -L /etc/munin/plugins/postfix_mailstats ] || for i in postfix_mailstats postfix_mailvolume postfix_mailqueue ; do sudo ln -s /usr/share/munin/plugins/$i $i ; done ;;
			*)	;;
	esac
586
587
588
	if [ "$HOSTNAME" != "jenkins" ] && [ -L /etc/munin/plugins/iostat ] ; then
		sudo rm /etc/munin/plugins/iostat
	fi
589
590
	if [ "$HOSTNAME" = "jenkins" ] && [ ! -L /etc/munin/plugins/apache_accesses ] ; then
		for i in apache_accesses apache_volume ; do sudo ln -s /usr/share/munin/plugins/$i $i ; done
591
		sudo ln -s /usr/share/munin/plugins/loggrep jenkins_oom
592
	fi
593
	sudo service munin-node restart
594
fi
Holger Levsen's avatar
Holger Levsen committed
595
explain "packages configured."
Holger Levsen's avatar
Holger Levsen committed
596
597
598
599

#
# install the heart of jenkins.debian.net
#
Holger Levsen's avatar
Holger Levsen committed
600
cd $BASEDIR
601
[ -d /srv/jenkins/features ] && sudo rm -rf /srv/jenkins/features
602
# check for bash syntax *before* actually deploying anything
603
shopt -s nullglob
604
for f in bin/*.sh bin/**/*.sh ; do bash -n "$f" ; done
605
shopt -u nullglob
606
for dir in bin logparse live mustache-templates ; do
607
608
	sudo mkdir -p /srv/jenkins/$dir
	sudo rsync -rpt --delete $dir/ /srv/jenkins/$dir/
Holger Levsen's avatar
Holger Levsen committed
609
	sudo chown -R jenkins-adm.jenkins-adm /srv/jenkins/$dir
610
done
611
612
HOST_JOBS="hosts/$HOSTNAME/job-cfg"
if [ -e "$HOST_JOBS" ] ; then
613
	sudo -u jenkins-adm rsync -rpt --copy-links --delete "$HOST_JOBS/" /srv/jenkins/job-cfg/
614
else
Philip Hands's avatar
Philip Hands committed
615
616
	# tidying up ... assuming that we don't want clutter on peripheral servers
	[ -d /srv/jenkins/job-cfg ] && sudo rm -rf /srv/jenkins/job-cfg
617
618
fi

619

620
sudo mkdir -p -m 700 /var/lib/jenkins/.ssh
621
sudo chown jenkins.jenkins /var/lib/jenkins/.ssh
622
if [ "$HOSTNAME" = "jenkins" ] ; then
623
624
	sudo -u jenkins install -m 600 jenkins-home/authorized_keys /var/lib/jenkins/.ssh/authorized_keys
	sudo -u jenkins cp jenkins-home/procmailrc /var/lib/jenkins/.procmailrc
625
	sudo -u jenkins cp jenkins-home/offline_nodes /var/lib/jenkins/offline_nodes
626
627
628
else
	sudo cp jenkins-nodes-home/authorized_keys /var/lib/jenkins/.ssh/authorized_keys
fi
629
sudo -u jenkins cp jenkins-home/ssh_config /var/lib/jenkins/.ssh/config
Holger Levsen's avatar
Holger Levsen committed
630
explain "scripts and configurations for jenkins updated."
631

632
if [ "$HOSTNAME" = "jenkins" ] ; then
Holger Levsen's avatar
Holger Levsen committed
633
	sudo cp -pr README INSTALL TODO CONTRIBUTING d-i-preseed-cfgs /var/lib/jenkins/userContent/
634
	TMPFILE=$(mktemp)
635
	git log | grep ^Author| cut -d " " -f2-|sort -u -f > $TMPFILE
636
	echo "----" >> $TMPFILE
637
	sudo tee /var/lib/jenkins/userContent/THANKS > /dev/null < THANKS.head
638
639
	# samuel, lunar, jelle, josch and phil committed with several committers, only display one
	grep -v -e "samuel.thibault@ens-lyon.org" -e Lunar -e "j.schauer@email.de" -e "mattia@mapreri.org" -e "phil@jenkins-test-vm" -e "jelle@vdwaa.nl" $TMPFILE | sudo tee -a /var/lib/jenkins/userContent/THANKS > /dev/null
640
	rm $TMPFILE
641
	TMPDIR=$(mktemp -d -t update-jdn-XXXXXXXX)
642
	sudo cp -pr userContent $TMPDIR/
Holger Levsen's avatar
Holger Levsen committed
643
644
645
	sudo chown -R jenkins.jenkins $TMPDIR
	sudo cp -pr $TMPDIR/userContent  /var/lib/jenkins/
	sudo rm -r $TMPDIR > /dev/null
646
647
648
649
650
651
652
653
654
	cd /var/lib/jenkins/userContent/
	ASCIIDOC_PARAMS="-a numbered -a data-uri -a iconsdir=/etc/asciidoc/images/icons -a scriptsdir=/etc/asciidoc/javascripts -b html5 -a toc -a toclevels=4 -a icons -a stylesheet=$(pwd)/theme/debian-asciidoc.css"
	[ about.html -nt README ] || asciidoc $ASCIIDOC_PARAMS -o about.html README
	[ todo.html -nt TODO ] || asciidoc $ASCIIDOC_PARAMS -o todo.html TODO
	[ setup.html -nt INSTALL ] || asciidoc $ASCIIDOC_PARAMS -o setup.html INSTALL
	[ contributing.html -nt CONTRIBUTING ] || asciidoc $ASCIIDOC_PARAMS -o contributing.html CONTRIBUTING
	diff THANKS .THANKS >/dev/null || asciidoc $ASCIIDOC_PARAMS -o thanks.html THANKS
	mv THANKS .THANKS
	rm TODO README INSTALL CONTRIBUTING
655
	sudo chown jenkins.jenkins /var/lib/jenkins/userContent/*html
Holger Levsen's avatar
Holger Levsen committed
656
	explain "user content for jenkins updated."
657
fi
658

659
if [ "$HOSTNAME" = "jenkins" ] || [ "$HOSTNAME" = "jenkins-test-vm" ] ; then
660
661
662
663
664
665
	#
	# run jenkins-job-builder to update jobs if needed
	#     (using sudo because /etc/jenkins_jobs is root:root 700)
	#
	cd /srv/jenkins/job-cfg
	for metaconfig in *.yaml.py ; do
Holger Levsen's avatar
Holger Levsen committed
666
667
668
669
670
671
		if [ -f $metaconfig ] ; then
			TMPFILE=$(sudo -u jenkins-adm mktemp)
			./$metaconfig | sudo -u jenkins-adm tee "$TMPFILE" >/dev/null
			if ! sudo -u jenkins-adm cmp -s ${metaconfig%.py} "$TMPFILE" ; then
				sudo -u jenkins-adm mv "$TMPFILE" "${metaconfig%.py}"
			fi
672
673
674
		fi
	done
	for config in *.yaml ; do
675
676
677
678
679
680
681
		# do update, if
		# no stamp file exist or
		# no .py file exists and config is newer than stamp or
		# a .py file exists and .py file is newer than stamp
		if [ ! -f $STAMP ] || \
		 ( [ ! -f $config.py ] && [ $config -nt $STAMP ] ) || \
		 ( [ -f $config.py ] && [ $config.py -nt $STAMP ] ) ; then
682
			echo "$config has changed, executing updates."
683
			$JJB update $config
684
685
		fi
	done
Holger Levsen's avatar
Holger Levsen committed
686
	explain "jenkins jobs updated."
687
fi
688

689
#
Holger Levsen's avatar
Holger Levsen committed
690
# configure git for jenkins
691
#
Holger Levsen's avatar
Holger Levsen committed
692
693
694
695
if [ "$(sudo su - jenkins -c 'git config --get user.email')" != "jenkins@jenkins.debian.net" ] ; then
	sudo su - jenkins -c "git config --global user.email jenkins@jenkins.debian.net"
	sudo su - jenkins -c "git config --global user.name Jenkins"
fi
Holger Levsen's avatar
Holger Levsen committed
696

697
698
699
#
# generate the kgb-client configurations
#
700
if [ "$HOSTNAME" = "jenkins" ] || [ "$HOSTNAME" = "osuosl-build168-amd64" ] || [ "$HOSTNAME" = "osuosl-build171-amd64" ] || [ "$HOSTNAME" = "osuosl-build172-amd64" ] || [ "$HOSTNAME" = "profitbricks-build2-i386" ] || [ "$HOSTNAME" = "profitbricks-build12-i386" ] ; then
701
702
703
	cd $BASEDIR
	KGB_SECRETS="/srv/jenkins/kgb/secrets.yml"
	if [ -f "$KGB_SECRETS" ] && [ $(stat -c "%a:%U:%G" "$KGB_SECRETS") = "640:jenkins-adm:jenkins-adm" ] ; then
Philip Hands's avatar
Philip Hands committed
704
		# the last condition is to assure the files are owned by the right user/team
705
		if [ "$KGB_SECRETS" -nt $STAMP ] || [ "deploy_kgb.py" -nt "$STAMP" ] || [ ! -f $STAMP ] ; then
Philip Hands's avatar
Philip Hands committed
706
707
708
709
			sudo -u jenkins-adm "./deploy_kgb.py"
		else
			explain "kgb-client configuration unchanged, nothing to do."
		fi
710
	else
Philip Hands's avatar
Philip Hands committed
711
712
713
		figlet -f banner Warning
		echo "Warning: $KGB_SECRETS either does not exist or has bad permissions. Please fix. KGB configs not generated"
		echo "We expect the secrets file to be mode 640 and owned by jenkins-adm:jenkins-adm."
Holger Levsen's avatar
Holger Levsen committed
714
715
		echo "/srv/jenkins/kgb should be mode 755 and owned by jenkins-adm:root."
		echo "/srv/jenkins/kgb/client-status should be mode 755 and owned by jenkins:jenkins."
716
	fi
717
	KGB_STATUS="/srv/jenkins/kgb/client-status"
718
719
	sudo mkdir -p $KGB_STATUS
	sudo chown jenkins:jenkins $KGB_STATUS
720
721
fi

722
723
724
#
# Create GPG key for jenkins user if they do not already exist (eg. to sign .buildinfo files)
#
725
if sudo -H -u jenkins gpg --with-colons --fixed-list-mode --list-secret-keys | cut -d: -f1 | grep -qsFx 'sec' >/dev/null 2>&1 ; then
Holger Levsen's avatar
Holger Levsen committed
726
	explain "$(date) - Not generating GPG key as one already exists for jenkins user."
727
else
Holger Levsen's avatar
Holger Levsen committed
728
	explain "$(date) - Generating GPG key for jenkins user."
729

730
	sudo -H -u jenkins gpg --no-tty --batch --gen-key <<EOF
731
732
733
Key-Type: RSA
Key-Length: 4096
Key-Usage: sign
734
Name-Real: $HOSTNAME
735
736
737
738
739
740
Name-Comment: Automatically generated key for signing .buildinfo files
Expire-Date: 0
%no-ask-passphrase
%no-protection
%commit
EOF
741

742
	GPG_KEY_ID="$(sudo -H -u jenkins gpg --with-colons --fixed-list-mode --list-secret-keys | grep '^sec' | cut -d: -f5 | tail -n1)"
743
744
745
746
747
748

	if [ "$GPG_KEY_ID" = "" ]
	then
		explain "$(date) - Generated GPG key but could not parse key ID"
	else
		explain "$(date) - Generated GPG key $GPG_KEY_ID - submitting to keyserver"
749
		sudo -H -u jenkins gpg --send-keys $GPG_KEY_ID
750
	fi
751
752
fi

Holger Levsen's avatar
Holger Levsen committed
753
754
755
756
757
#
# There's always some work left...
#	echo FIXME is ignored so check-jobs scripts can output templates requiring manual work
#
if [ "$HOSTNAME" = "jenkins" ] || [ "$HOSTNAME" = "jenkins-test-vm" ] ; then
758
	TMPFILE=$(mktemp)
Holger Levsen's avatar
Holger Levsen committed
759
760
761
	rgrep FI[X]ME $BASEDIR/* | grep -v echo > $TMPFILE || true
	if [ -s $TMPFILE ] ; then
		echo
762
		cat $TMPFILE
Holger Levsen's avatar
Holger Levsen committed
763
764
		echo
	fi
765
	rm -f $TMPFILE
Holger Levsen's avatar
Holger Levsen committed
766
767
fi

768
#
769
# almost finally…
770
#
771
sudo touch $STAMP	# so on the next run, only configs newer than this file will be updated
Holger Levsen's avatar
Holger Levsen committed
772
explain "$(date) - finished deployment."
773

774
# finally!
775
case $HOSTNAME in
776
	# set time back to the future
777
	profitbricks-build5-amd64|profitbricks-build6-i386|profitbricks-build15-amd64|profitbricks-build16-i386)
778
		disable_dsa_check_packages
779
780
		sudo date --set="+398 days +6 hours + 23 minutes"
		;;
781
	codethink-sled9*|codethink-sled11*|codethink-sled13*|codethink-sled15*)
782
		disable_dsa_check_packages
783
784
		sudo date --set="+398 days +6 hours + 23 minutes"
		;;
785
	osuosl-build170-amd64|osuosl-build172-amd64)
786
787
788
		disable_dsa_check_packages
		sudo date --set="+398 days +6 hours + 23 minutes"
		;;
789
	jenkins)
790
		# notify irc on updates of jenkins.d.n
791
792
		MESSAGE="jenkins.d.n updated to $(cd $BASEDIR ; git describe --always)."
		kgb-client --conf /srv/jenkins/kgb/debian-qa.conf --relay-msg "$MESSAGE"
Holger Levsen's avatar
Holger Levsen committed
793
		;;
794
795
	*)	;;
esac
796
797
798
799

echo
figlet ok
echo
Holger Levsen's avatar
Holger Levsen committed
800
801
echo "__$HOSTNAME=ok__"