do not support (very old) yum-arch, only createrepo
[bootstrapfs.git] / plc.d / packages
1 #!/bin/bash
2 #
3 # priority: 1200
4 #
5 # Update node package repository metadata and sign packages
6 #
7 # Mark Huang <mlhuang@cs.princeton.edu>
8 # Copyright (C) 2006 The Trustees of Princeton University
9 #
10
11 # Source function library and configuration
12 . /etc/plc.d/functions
13 . /etc/planetlab/plc_config
14
15 # Be verbose
16 set -x
17
18 case "$1" in
19     start)
20         if [ "$PLC_BOOT_ENABLED" != "1" ] ; then
21             exit 0
22         fi
23
24         MESSAGE=$"Signing and indexing node packages"
25         dialog "$MESSAGE"
26
27         shopt -s nullglob
28
29         shift
30         if [[ -z "$@" ]] ; then
31             # use all subdirs in install-rpms by default
32             repositories=/var/www/html/install-rpms/*
33         else
34             # else use argv
35             repositories="$@"
36         fi
37
38         ### availability of repo indexing tools
39         # new one
40         type -p createrepo > /dev/null && have_createrepo="true"
41
42
43         ### symlink vserver-PLDISTRO* and vserver-systemslices-PLDISTRO*
44         ### packages to each repository to be able to create different
45         ### flavours of vservers on nodes
46         for repository1 in $repositories; do
47             DISTRO=${PLC_FLAVOUR_SLICE_PLDISTRO}
48             VSERVER_PKG=vserver-$(basename $repository1)
49             VSERVER_SYS_SLICES_PKG=vserver-systemslices-$(basename $repository1)
50             for repository2 in $repositories; do
51                 if [[ $(basename $repository1) == ${DISTRO}* ]]  \
52                     && [[ $(basename $repository2) == ${DISTRO}* ]] \
53                     && [[ $repository1 != $repository2 ]] ; then
54                         rm -rf $repository2/${VSERVER_PKG}*
55                         rm -rf $repository2/${VSERVER_SYS_SLICES_PKG}*
56
57                         ln -s $repository1/${VSERVER_PKG}* $repository2
58                         ln -s $repository1/${VSERVER_SYS_SLICES_PKG}* $repository2
59                 fi
60             done
61         done
62
63         for repository in $repositories ; do
64             # the rpms that need signing
65             new_rpms=
66             # and the corresponding stamps
67             new_stamps=
68             # is there a need to refresh yum metadata
69             need_createrepo=true # always run createrepo as links may change for vserver packages
70
71             # right after installation, no package is present
72             # but we still need to create index 
73             [ -n "$have_createrepo" -a ! -f $repository/repodata/repomd.xml ] && need_createrepo=true
74             
75             for package in $(find $repository/ -name '*.rpm') ; do
76                 stamp=$repository/signed-stamps/$(basename $package).signed
77                 # If package is newer than signature stamp
78                 if [ $package -nt $stamp ] ; then
79                     new_rpms="$new_rpms $package"
80                     new_stamps="$new_stamps $stamp"
81                 fi
82                 # Or than createrepo database
83                 [ -n "$have_createrepo" ] && [ $package -nt $repository/repodata/repomd.xml ] && need_createrepo=true
84             done
85
86             if [ -n "$new_rpms" ] ; then
87                 # Create a stamp once the package gets signed
88                 mkdir $repository/signed-stamps 2> /dev/null
89
90                 # Sign RPMS. setsid detaches rpm from the terminal,
91                 # allowing the (hopefully blank) GPG password to be
92                 # entered from stdin instead of /dev/tty.
93                 echo | setsid rpm \
94                     --define "_signature gpg" \
95                     --define "_gpg_path /etc/planetlab" \
96                     --define "_gpg_name $PLC_MAIL_SUPPORT_ADDRESS" \
97                     --resign $new_rpms && touch $new_stamps
98                 check
99             fi
100
101             # Update repository index / yum metadata. 
102
103             if [ -n "$need_createrepo" ] ; then
104                 if [ -f $repository/yumgroups.xml ] ; then
105                     createrepo --quiet -g yumgroups.xml $repository 
106                 else
107                     createrepo --quiet $repository
108                 fi
109                 check
110             fi
111         done
112
113         result "$MESSAGE"
114         ;;
115     clean)
116         shift
117         if [[ -z "$@" ]] ; then
118             # use all subdirs in install-rpms by default
119             repositories=/var/www/html/install-rpms/*
120         else
121             # else use argv
122             repositories=$@
123         fi
124
125         for repository in $repositories ; do
126             rm -rf $repository/signed-stamps
127             rm -rf $repository/repodata
128             rm -rf $repository/headers
129         done
130         ;;
131     *)
132         echo "Usage: $0 start|clean [repo ..]"
133         ;;
134 esac
135
136 exit $ERRORS