make upgrade: Clear out installer files conditionally
[dragonfly.git] / usr.sbin / manctl / manctl.sh
1 #!/bin/sh 
2 #
3 # Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
8 # are met:
9 # 1. Redistributions of source code must retain the above copyright
10 #    notice, this list of conditions and the following disclaimer.
11 # 2. Redistributions in binary form must reproduce the above copyright
12 #    notice, this list of conditions and the following disclaimer in the
13 #    documentation and/or other materials provided with the distribution.
14 # 3. All advertising materials mentioning features or use of this software
15 #    must display the following acknowledgement:
16 #       This product includes software developed by Geoffrey M. Rehmet
17 # 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University
18 #    may be used to endorse or promote products derived from this software
19 #    without specific prior written permission.
20 #
21 # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
22 # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
23 # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24 # IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE
25 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 # SUCH DAMAGE.
32 #
33 # $FreeBSD: src/usr.sbin/manctl/manctl.sh,v 1.11.2.1 2001/02/05 13:53:03 jedgar Exp $
34 # $DragonFly: src/usr.sbin/manctl/manctl.sh,v 1.2 2003/06/17 04:29:57 dillon Exp $
35 #
36 # manctl: 
37 #       a utility for manipulating manual pages
38 # functions:
39 #       compress uncompressed man pages (elliminating .so's)
40 #               this is now two-pass.  If possible, .so's
41 #               are replaced with hard links
42 #       uncompress compressed man pages
43 #       purge old formatted man pages (not implemented yet)
44 # Things to watch out for:
45 #       Hard links - careful with g(un)zipping!
46 #       .so's - throw everything through soelim before gzip!
47 #       symlinks - ignore these - eg: expn is its own man page:
48 #                       don't want to compress this!
49 #
50 PATH=/bin:/sbin:/usr/bin:/usr/sbin; export PATH
51
52 #
53 # purge cat? directories
54 #
55 do_purge()
56 {
57         echo "purge $@" 2>&1
58         echo "not implemented yet\n" 2>&1
59 }
60
61
62 #
63 # Uncompress one page
64 #
65 uncompress_page()
66 {
67         local   pname
68         local   fname
69         local   sect
70         local   ext
71
72         # break up file name
73         pname=$1
74         IFS='.' ; set $pname
75         # less than 3 fields - don't know what to do with this
76         if [ $# -lt 3 ] ; then 
77                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
78         fi
79         # construct name and section
80         fname=$1 ; shift
81         while [ $# -gt 2 ] ; do
82                 fname=$fname.$1
83                 shift
84         done
85         sect=$1
86         ext=$2
87
88         IFS="   "
89         case "$ext" in
90         gz|Z)   { 
91                 IFS="   " ; set `file $pname`
92                 if [ $2 != "gzip" ] ; then 
93                         echo moving hard link $pname 1>&2
94                         mv $pname $fname.$ext   # link
95                 else
96                         if [ $2 != "symbolic" ] ; then
97                                 echo gunzipping page $pname 1>&2
98                                 temp=`mktemp -t manager` || exit 1
99                                 gunzip -c $pname > $temp
100                                 chmod u+w $pname
101                                 cp $temp $pname
102                                 chmod 444 $pname
103                                 mv $pname $fname.$sect
104                                 rm -f $temp
105                         else
106                                 # skip symlinks - this can be
107                                 # a program like expn, which is
108                                 # its own man page !
109                                 echo skipping symlink $pname 1>&2
110                         fi
111                 fi };;
112         *)      {
113                 IFS="   "
114                 echo skipping file $pname 1>&2
115                 } ;;
116         esac
117         # reset IFS - this is important!
118         IFS="   "
119 }
120
121
122 #
123 # Uncompress manpages in paths
124 #
125 do_uncompress()
126 {
127         local   i
128         local   dir
129         local   workdir
130
131         workdir=`pwd`
132         while [ $# != 0 ] ; do
133                 if [ -d $1 ] ; then
134                         dir=$1
135                         cd $dir
136                         for i in * ; do
137                                 case $i in
138                                 *cat?)  ;; # ignore cat directories
139                                 *)      {
140                                         if [ -d $i ] ; then 
141                                                 do_uncompress $i
142                                         else
143                                                 if [ -e $i ] ; then
144                                                         uncompress_page $i
145                                                 fi
146                                         fi } ;;
147                                 esac
148                         done
149                         cd $workdir
150                 else
151                         echo "directory $1 not found" 1>&2
152                 fi
153                 shift
154         done
155 }
156
157 #
158 # Remove .so's from one file
159 #
160 so_purge_page()
161 {
162         local   so_entries
163         local   lines
164         local   fname
165
166         so_entries=`grep "^\.so" $1 | wc -l`
167         if [ $so_entries -eq 0 ] ; then return 0 ; fi
168
169         # we have a page with a .so in it
170         echo $1 contains a .so entry 2>&1
171         
172         # now check how many lines in the file
173         lines=`wc -l < $1`
174
175         # if the file is only one line long, we can replace it
176         # with a hard link!
177         if [ $lines -eq 1 ] ; then
178                 fname=$1;
179                 echo replacing $fname with a hard link
180                 set `cat $fname`;
181                 rm -f $fname
182                 ln ../$2 $fname
183         else
184                 echo inlining page $fname 1>&2
185                 temp=`mktemp -t manager` || exit 1
186                 cat $fname | \
187                 (cd .. ; soelim ) > $temp
188                 chmod u+w $fname
189                 cp $temp $fname
190                 chmod 444 $fname
191                 rm -f $temp
192         fi
193 }
194
195 #
196 # Remove .so entries from man pages
197 #       If a page consists of just one line with a .so,
198 #       replace it with a hard link
199 #
200 remove_so()
201 {
202         local   pname
203         local   fname
204         local   sect
205
206         # break up file name
207         pname=$1
208         IFS='.' ; set $pname
209         if [ $# -lt 2 ] ; then 
210                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
211         fi
212         # construct name and section
213         fname=$1 ; shift
214         while [ $# -gt 1 ] ; do
215                 fname=$fname.$1
216                 shift
217         done
218         sect=$1
219
220         IFS="   "
221         case "$sect" in
222         gz)     { echo file $pname already gzipped 1>&2 ; } ;;
223         Z)      { echo file $pname already compressed 1>&2 ; } ;;
224         [12345678ln]*){
225                 IFS="   " ; set `file $pname`
226                 if [ $2 = "gzip" ] ; then 
227                         echo moving hard link $pname 1>&2
228                         mv $pname $pname.gz     # link
229                 else
230                         if [ $2 != "symbolic" ] ; then
231                                 echo "removing .so's in  page $pname" 1>&2
232                                 so_purge_page $pname
233                         else
234                                 # skip symlink - this can be
235                                 # a program like expn, which is
236                                 # its own man page !
237                                 echo skipping symlink $pname 1>&2
238                         fi
239                 fi };;
240         *)      {
241                 IFS="   "
242                 echo skipping file $pname 1>&2
243                 } ;;
244         esac
245         # reset IFS - this is important!
246         IFS="   "
247 }
248
249
250 #
251 # compress one page
252 #       We need to watch out for hard links here.
253 #
254 compress_page()
255 {
256         local   pname
257         local   fname
258         local   sect
259
260         # break up file name
261         pname=$1
262         IFS='.' ; set $pname
263         if [ $# -lt 2 ] ; then 
264                 IFS="   " ; echo ignoring $pname 1>&2 ; return 0 ; 
265         fi
266         # construct name and section
267         fname=$1 ; shift
268         while [ $# -gt 1 ] ; do
269                 fname=$fname.$1
270                 shift
271         done
272         sect=$1
273
274         IFS="   "
275         case "$sect" in
276         gz)     { echo file $pname already gzipped 1>&2 ; } ;;
277         Z)      { echo file $pname already compressed 1>&2 ; } ;;
278         [12345678ln]*){
279                 IFS="   " ; set `file $pname`
280                 if [ $2 = "gzip" ] ; then 
281                         echo moving hard link $pname 1>&2
282                         mv $pname $pname.gz     # link
283                 else
284                         if [ $2 != "symbolic" ] ; then
285                                 echo gzipping page $pname 1>&2
286                                 temp=`mktemp -t manager` || exit 1
287                                 cat $pname | \
288                                 (cd .. ; soelim )| gzip -c -- > $temp
289                                 chmod u+w $pname
290                                 cp $temp $pname
291                                 chmod 444 $pname
292                                 mv $pname $pname.gz
293                                 rm -f $temp
294                         else
295                                 # skip symlink - this can be
296                                 # a program like expn, which is
297                                 # its own man page !
298                                 echo skipping symlink $pname 1>&2
299                         fi
300                 fi };;
301         *)      {
302                 IFS="   "
303                 echo skipping file $pname 1>&2
304                 } ;;
305         esac
306         # reset IFS - this is important!
307         IFS="   "
308 }
309
310 #
311 # Compress man pages in paths
312 #
313 do_compress_so()
314 {
315         local   i
316         local   dir
317         local   workdir
318         local   what
319
320         what=$1
321         shift
322         workdir=`pwd`
323         while [ $# != 0 ] ; do
324                 if [ -d $1 ] ; then
325                         dir=$1
326                         cd $dir
327                         for i in * ; do
328                                 case $i in
329                                 *cat?)  ;; # ignore cat directories
330                                 *)      {
331                                         if [ -d $i ] ; then 
332                                                 do_compress_so $what $i
333                                         else 
334                                                 if [ -e $i ] ; then
335                                                         $what $i
336                                                 fi
337                                         fi } ;;
338                                 esac
339                         done
340                         cd $workdir
341                 else
342                         echo "directory $1 not found" 1>&2
343                 fi
344                 shift
345         done
346 }
347
348 #
349 # Display a usage message
350 #
351 ctl_usage()
352 {
353         echo "usage: $1 -compress <path> ... " 1>&2
354         echo "       $1 -uncompress <path> ... " 1>&2
355         echo "       $1 -purge <days> <path> ... " 1>&2
356         echo "       $1 -purge expire <path> ... " 1>&2
357         exit 1
358 }
359
360 #
361 # remove .so's and do compress
362 #
363 do_compress()
364 {
365         # First remove all so's from the pages to be compressed
366         do_compress_so remove_so "$@"
367         # now do ahead and compress the pages
368         do_compress_so compress_page "$@"
369 }
370
371 #
372 # dispatch options
373 #
374 if [ $# -lt 2 ] ; then ctl_usage $0 ; fi ;
375
376 case "$1" in
377         -compress)      shift ; do_compress "$@" ;;
378         -uncompress)    shift ; do_uncompress "$@" ;;
379         -purge)         shift ; do_purge "$@" ;;
380         *)              ctl_usage $0 ;;
381 esac