/[pdpsoft]/trunk/userspace-package-management/pkgsrc-cmd.sh
ViewVC logotype

Annotation of /trunk/userspace-package-management/pkgsrc-cmd.sh

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1904 - (hide annotations) (download) (as text)
Tue Aug 31 12:32:09 2010 UTC (12 years ago) by dennisvd
File MIME type: application/x-shellscript
File size: 13012 byte(s)
initial checkin of scripts

1 dennisvd 1904 #!/bin/sh
2    
3     # The umask setting makes everything we do group writable, which is a requirement for stuff
4     # we leave in the VO software area. If we didn't, only the original user would be able to
5     # modify or remove these files.
6     umask 002
7    
8     # This is the location to fetch pkgsrc.tar.gz from. It's a fast mirror.
9     #pkgsrc_url=ftp://ftp.nl.netbsd.org/pub/NetBSD/packages/pkgsrc.tar.gz
10     pkgsrc_url=http://poc.vl-e.nl/pkgsrc/pkgsrc.tar.gz
11    
12    
13     # bunch stdout and stderr together
14     exec 2>&1
15    
16     # Parse the command-line options. Right now only two options are supported:
17     # -u update the pkgsrc instance (which is normally skipped because it could take a long time)
18     # -h print help
19     # -v explicitly set the VO (normally this is found by inspecting the proxy)
20    
21     printhelp() {
22     cat <<EOF
23     usage: pkgsrc-cmd.sh [-u] [-v vo] [-h] <command> [arguments]
24    
25     Options:
26     -u force update of the pkgsrc installation
27     -v explicitly set VO (use if not recognised automatically)
28     -h print this help
29     -d print debug output
30    
31     Commands:
32     init Set up pkgsrc for the first time
33     check Check the pkgsrc installation
34     install [ pkg ... ] Install the given packages
35     remove [ pkg ... ] Remove the given packages
36     update [ pkg ... ] Update the given packages
37     version print version information
38    
39     EOF
40    
41     }
42    
43     # should we update pkgsrc itself?
44     update=0
45     # what is the VO?
46     vo=
47     printhelp=0
48     debugging=0
49     bmakedebug=
50     while getopts udhv: opt; do
51     case $opt in
52     u)
53     update=1
54     ;;
55     v) vo=$OPTARG
56     ;;
57     h) printhelp
58     exit 0;
59     ;;
60     d) debugging=1 ; bmakedebug="-d cmvx" ;;
61     ?) printhelp
62     exit 1;
63     ;;
64     esac
65     done
66     shift $(($OPTIND - 1))
67    
68     # the debug function prints output if debugging==1
69     debug() {
70     test $debugging -eq 1 && echo debug: "$@" >&2
71     }
72    
73     # the log function prints output with a timestamp
74     log() {
75     ts=`date "+%b %e %H:%M:%S %Z"`
76     echo "$ts $@"
77     }
78    
79     # A similar function to produce an error message and exit
80     error() {
81     log "ERROR: $@"
82     exit 1
83     }
84    
85     # infer VO from the proxy if not set
86     if [ -z $vo ]; then
87     debug "VO not set, looking at proxy"
88     vo=`voms-proxy-info -vo`
89     if [ $? -ne 0 ]; then
90     error "Could not get VO with voms-proxy-info; try -v <vo>."
91     fi
92     debug "VO set from proxy: '$vo'"
93     else
94     debug "VO set on command line: '$vo'"
95     fi
96    
97     log "Started pkgsrc-cmd.sh. VO=$vo, debugging=$debugging"
98    
99     # We need an indirection to set the directory of the VO specific software area
100     vo_sw_dir_var=VO_`echo $vo | tr a-z. A-Z.`_SW_DIR
101     eval vo_sw_dir=\$$vo_sw_dir_var
102    
103     debug "VO software area looked for in environment variable: $vo_sw_dir_var"
104     debug "set vo_sw_dir to $vo_sw_dir"
105    
106     PKGSRC_LOCATION=$vo_sw_dir/pkgsrc
107     PKG_PREFIX=$vo_sw_dir/pkg
108     PATH=$PKG_PREFIX/bin:$PKG_PREFIX/sbin:$PATH
109     export PATH PKG_PREFIX PKGSRC_LOCATION
110    
111     debug "PATH set to: $PATH"
112    
113     log "Running on host: $HOSTNAME"
114     log "Site name: $SITE_NAME"
115     log "command: $0 $@"
116    
117     # This sanity check makes sure we are allowed to write to the software area.
118     # This check should be done before init, install, delete or any other operation
119     # that writes data, but not for operations that only read data.
120     # Also, we need to prevent simultaneous conflicting write operations, so we set
121     # a lock file at this point. We should remove the lockfile at the end, but
122     # if that fails we'll check whether it has become 'stale', which means older than
123     # half an hour.
124     get_write_lock() {
125     log "Checking if the vo software area is writable."
126     if [ -z $vo_sw_dir ] ; then
127     error "\$$vo_sw_dir_var not set."
128     fi
129    
130     if [ ! -w $vo_sw_dir ] ; then
131     error "\$$vo_sw_dir_var ($vo_sw_dir) is not writable. (Check your proxy: are you the VO software manager?)"
132     fi
133     log "$vo_sw_dir writable OK."
134     # now do the lockfile shuffle
135     lockfile=$vo_sw_dir/pkgsrc-lock
136     log "checking lockfile $lockfile"
137     if [ -f $lockfile ]; then
138     log "lockfile exists."
139     ls -l $lockfile
140     if [ ! -z `find $lockfile -mmin -30 2> /dev/null` ]; then
141     log "lockfile is still fresh."
142     return 1
143     else
144     log "removing stale lockfile (older than 30 minutes)"
145     rm -f $lockfile
146     fi
147     else
148     log "no lockfile found. Setting lock"
149     fi
150     # At this point, we've concluded we should try and set the lockfile.
151     # be careful to avoid race conditions (although rare).
152     log "attempting to get lock."
153     a=`mktemp $vo_sw_dir/pkgsrc-lock.XXXXXXXXXX` || error "mktemp failed"
154     ln $a $lockfile
155     if [ $? -ne 0 ]; then
156     log "failed to obtain lock"
157     rm $a
158     return 1
159     fi
160     log "lock set"
161     rm $a
162     unset a
163     trap "rm -f $lockfile" INT TERM EXIT
164     return 0
165     }
166    
167     check_installation() {
168     debug "Test if $PKGSRC_LOCATION exists"
169     if [ ! -d $PKGSRC_LOCATION ]; then
170     error "pkgsrc seems not to be installed; run <init> first."
171     fi
172     for i in pkg_admin pkg_create pkg_info ; do
173     if [ ! -x $PKG_PREFIX/sbin/$i ]; then
174     error "$PKG_PREFIX/sbin/$i is missing. Run <init> first."
175     fi
176     done
177    
178     # check the vulnerabilities databases and run an audit
179     debug "fetching vulnerabilities and auditing system"
180     pkg_admin fetch-pkg-vulnerabilities
181     pkg_admin audit
182     }
183    
184    
185     # fetch the pkgsrc tarball if necessary
186     get_pkgsrc() {
187     if [ ! -r $PKGSRC_LOCATION/pkgsrc.tar.gz ]; then
188     log "$PKGSRC_LOCATION/pkgsrc.tar.gz is not found, downloading for the first time"
189     elif [ -z `find $PKGSRC_LOCATION/pkgsrc.tar.gz -mtime -30` ]; then
190     log "$PKGSRC_LOCATION/pkgsrc.tar.gz is older than 30 days, fetching new version"
191     else
192     log "$PKGSRC_LOCATION/pkgsrc.tar.gz is found and fresh."
193     ls -l $PKGSRC_LOCATION/pkgsrc.tar.gz
194     log "unpacking tarball in `pwd`"
195     tar xfz $PKGSRC_LOCATION/pkgsrc.tar.gz
196     log "unpacking tarball done."
197     return 0
198     fi
199    
200     # fetch from fast mirror
201     log "Fetching pkgsrc.tar.gz from $pkgsrc_url"
202     mkdir -p $PKGSRC_LOCATION
203     wget --no-verbose -O $PKGSRC_LOCATION/pkgsrc.tar.gz $pkgsrc_url
204     if [ $? -ne 0 ]; then
205     error "Fetching pkgsrc.tar.gz from $pkgsrc_url failed."
206     fi
207     log "$pkgsrc_url saved as $PKGSRC_LOCATION/pkgsrc.tar.gz"
208     log "unpacking tarball in `pwd`"
209     tar xfz $PKGSRC_LOCATION/pkgsrc.tar.gz
210     log "unpacking tarball done."
211    
212     }
213    
214    
215     # The command functions. One of these functions will be called from
216     # the case...esac switch later on.
217    
218     do_init() {
219     log "Starting init."
220     get_pkgsrc
221    
222     log "Creating temporary work directory for bootstrapping"
223     workdir=`mktemp -d -t pkgsrc-bootstrap.XXXXXXXX`/work
224    
225     if [ $? -ne 0 ]; then
226     error "failed to create temporary working directory"
227     fi
228    
229     log bootstrapping: pkgsrc/bootstrap/bootstrap --prefix $PKG_PREFIX --unprivileged --workdir $workdir
230     pkgsrc/bootstrap/bootstrap --prefix $PKG_PREFIX --unprivileged --workdir $workdir
231     if [ $? -ne 0 ]; then
232     error "Bootstrapping pkgsrc failed"
233     fi
234    
235     # set ALLOW_VULNERABLE_PACKAGES
236     tmpcnf=`mktemp`
237     sed '/^.endif/ iALLOW_VULNERABLE_PACKAGES=yes' $PKG_PREFIX/etc/mk.conf > $tmpcnf
238     mv $tmpcnf $PKG_PREFIX/etc/mk.conf
239    
240     # Make sure that fetching is going to work. The pkgsrc provided tnftp requires
241     # libtermcap-devel, which is not commonly found on systems; although pkgsrc also
242     # provides ncurses, which could work just fine, fetching the ncurses sources requires
243     # tnftp, which means a circular dependency.
244     # So we check if the system has wget installed, which is almost always the case, and
245     # configure pkgsrc to use wget as an alternative method of fetching sources.
246     log "trying to build net/tnftp"
247     ( cd pkgsrc/net/tnftp && bmake ${bmakedebug} install && bmake clean && bmake clean-depends )
248     if [ $? -ne 0 ] ; then
249     log "failed building net/tnftp."
250     log "trying alternatives."
251     if [ -x /usr/bin/wget ] ; then
252     log "/usr/bin/wget found. Setting configuration in $PKG_PREFIX/etc/mk.conf"
253     tmpcnf=`mktemp` || exit "failed to create temporary file"
254     sed '/^.endif/ iPREFER_PKGSRC=termcap\
255     FETCH_USING= custom\
256     FETCH_CMD= /usr/bin/wget\
257     FETCH_BEFORE_ARGS= ${PASSIVE_FETCH:D--passive-ftp}\
258     FETCH_AFTER_ARGS= # empty\
259     FETCH_RESUME_ARGS= -c\
260     FETCH_OUTPUT_ARGS= -O' $PKG_PREFIX/etc/mk.conf > $tmpcnf
261     mv $tmpcnf $PKG_PREFIX/etc/mk.conf
262     elif [ -x /usr/bin/curl ] ; then
263     log "/usr/bin/curl found. Setting configuration in $PKG_PREFIX/etc/mk.conf"
264     tmpcnf=`mktemp` || exit "failed to create temporary file"
265     sed '/^.endif/ iPREFER_PKGSRC=termcap\
266     FETCH_USING= custom\
267     FETCH_CMD= /usr/bin/curl
268     FETCH_BEFORE_ARGS= ${PASSIVE_FETCH:D--ftp-pasv}
269     FETCH_AFTER_ARGS= -O # must be here to honor -o option
270     FETCH_RESUME_ARGS= -C -
271     FETCH_OUTPUT_ARGS= -o' $PKG_PREFIX/etc/mk.conf > $tmpcnf
272     mv $tmpcnf $PKG_PREFIX/etc/mk.conf
273     else
274     exit "could not find wget or curl, giving up"
275     fi
276     else
277     log "building net/tnftp succeeded"
278     fi
279    
280     log "installation OK. Init is done."
281    
282    
283     }
284    
285     # In case you ever feel the need to start over, this operation will trash the entire installation
286     #
287     do_clear() {
288     log "Starting Clear"
289     if [ -f $PKGSRC_LOCATION/pkgsrc.tar.gz ]; then
290     log "deleting $PKGSRC_LOCATION/pkgsrc.tar.gz"
291     rm -f $PKGSRC_LOCATION/pkgsrc.tar.gz
292     fi
293     if [ -d $PKG_PREFIX ]; then
294     log "Removing $PKG_PREFIX"
295     rm -rf $PKG_PREFIX/*
296     fi
297     log "Done with Clear"
298     }
299    
300     do_check() {
301     log "Starting check; output goes to status.txt"
302     exec 3> status.txt
303     {
304     echo "Site: $SITE_NAME"
305     echo
306     echo "Environment:"
307     env
308     echo
309     echo "Installed RPMS:"
310     rpm -qa
311     echo
312     echo "Our VO: $vo"
313     echo "VO Software area set in variable \$$vo_sw_dir_var = $vo_sw_dir"
314     } >&3
315    
316     if [ -z $vo_sw_dir ] ; then
317     echo "\$$vo_sw_dir_var not set. Contact the site administrator."
318     # do we need to go on at all at this point?
319     echo "It's impossible to install pkgsrc at this site until this is fixed."
320     return
321     fi
322     if [ ! -w $vo_sw_dir ] ; then
323     echo "$vo_sw_dir) is not writable, check your proxy (are you the VO software manager?)."
324     ls -ld $vo_sw_dir
325     echo "I am: "
326     id -a
327     fi
328     # test the pkgsrc installation
329     echo >&3
330     echo "Pkgsrc installation" >&3
331     echo "PKGSRC_LOCATION=$PKGSRC_LOCATION" >&3
332     if [ ! -d $PKGSRC_LOCATION ]; then
333     echo "pkgsrc seems not to be installed."
334     elif [ ! -f $PKGSRC_LOCATION/pkgsrc.tar.gz ]; then
335     echo "$PKGSRC_LOCATION/pkgsrc.tar.gz not found"
336     else
337     echo "pkgsrc.tar.gz:" >&3
338     ls -l $PKGSRC_LOCATION/pkgsrc.tar.gz >&3
339     fi
340     echo "PKG_PREFIX=$PKG_PREFIX" >&3
341     if [ ! -d $PKG_PREFIX ]; then
342     echo "$PKG_PREFIX does not exist. Need to bootstrap."
343     else
344     for i in pkg_admin pkg_create pkg_info ; do
345     filecheck=$PKG_PREFIX/sbin/$i
346     echo -n "Checking for $filecheck..."
347     if [ ! -x $filecheck ]; then
348     echo "missing"
349     else
350     echo OK
351     fi
352     done
353     fi
354     echo "Configuration: $PKG_PREFIX/etc/mk.conf" >&3
355     cat $PKG_PREFIX/etc/mk.conf >&3
356    
357     echo "End of Configuration file" >&3
358    
359     # check the vulnerabilities databases and run an audit
360     log "fetching vulnerabilities and auditing system"
361     pkg_admin fetch-pkg-vulnerabilities
362     {
363     echo "Audit:"
364     pkg_admin audit
365     echo "End audit:"
366     echo
367     echo "Installed packages:"
368     pkg_info -a
369     echo "End of installed packages"
370     } >&3
371    
372     # if lintpkgsrc is installed, run it.
373     if [ -x $PKG_PREFIX/bin/lintpkgsrc ]; then
374     debug "running lintpkgsrc -i"
375     {
376     echo "lintpkgsrc -i"
377     $PKG_PREFIX/bin/lintpkgsrc -i
378     echo "end of lintpkgsrc"
379     echo
380     } >&3
381     else
382     log "Skipping lintpkgsrc; install pkgtools/lintpkgsrc to include this test"
383     fi
384     log "Check done."
385     return
386     }
387    
388     do_install() {
389     get_pkgsrc
390     # install the packages in $@.
391     for i in "$@" ; do
392     if [ ! -d pkgsrc/$i ]; then
393     echo "WARNING: unknown package $i" >&2
394     continue
395     fi
396     ( cd pkgsrc/$i && bmake ${bmakedebug} install && bmake clean && bmake clean-depends )
397     if [ $? -ne 0 ] ; then
398     error "bmake failed on $i"
399     fi
400     done
401    
402     }
403    
404     do_remove() {
405     check_installation
406     # delete the given packages
407     pkg_delete "$@"
408     }
409    
410     do_update() {
411     get_pkgsrc
412     for i in "$@" ; do
413     if [ ! -d pkgsrc/$i ]; then
414     echo "WARNING: unknown package $i" >&2
415     continue
416     fi
417     ( cd pkgsrc/$i && bmake update && bmake clean && bmake clean-depends )
418     done
419    
420     }
421    
422     do_version() {
423     log "version() not implemented."
424     return 0
425     }
426    
427    
428     # all operations need to write to the software area in some way or other, so we
429     # might as well try to get the write lock here and get it out of the way
430     get_write_lock || exit 1
431    
432    
433     # Parse the command-line arguments. Current understood commands are:
434     #
435     # init - set up pkgsrc for the first time
436     # check - check the pkgsrc setup
437     # install <packages> - install the given packages
438     # remove <package> - remove the given packages
439     # update - update the packages
440     # version - display version information
441    
442     if [ $# -gt 0 ] ; then
443     case $1 in
444     init) do_init ;;
445     reinit) do_clear && do_init ;;
446     check) do_check ;;
447     install) shift; do_install "$@" ;;
448     remove) shift; do_remove "$@" ;;
449     update) do_update "$@" ;;
450     version) do_version ;;
451     *)
452     log "ERROR: unknown command given: $1" >&2
453     printhelp
454     exit 1
455     ;;
456     esac
457     shift
458     else
459     log "No command given. Stop."
460     printhelp
461     exit 1
462     fi
463    
464     log "Script ends."

grid.support@nikhef.nl
ViewVC Help
Powered by ViewVC 1.1.28