manctl.sh revision 1370
11366Scsgr#!/bin/sh 21366Scsgr# 31366Scsgr# Copyright (c) 1994 Geoffrey M. Rehmet, Rhodes University 41366Scsgr# All rights reserved. 51366Scsgr# 61366Scsgr# Redistribution and use in source and binary forms, with or without 71366Scsgr# modification, are permitted provided that the following conditions 81366Scsgr# are met: 91366Scsgr# 1. Redistributions of source code must retain the above copyright 101366Scsgr# notice, this list of conditions and the following disclaimer. 111366Scsgr# 2. Redistributions in binary form must reproduce the above copyright 121366Scsgr# notice, this list of conditions and the following disclaimer in the 131366Scsgr# documentation and/or other materials provided with the distribution. 141366Scsgr# 3. All advertising materials mentioning features or use of this software 151366Scsgr# must display the following acknowledgement: 161366Scsgr# This product includes software developed by Geoffrey M. Rehmet 171366Scsgr# 4. Neither the name of Geoffrey M. Rehmet nor that of Rhodes University 181366Scsgr# may be used to endorse or promote products derived from this software 191366Scsgr# without specific prior written permission. 201366Scsgr# 211366Scsgr# THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 221366Scsgr# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 231366Scsgr# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 241366Scsgr# IN NO EVENT SHALL GEOFFREY M. REHMET OR RHODES UNIVERSITY BE LIABLE 251366Scsgr# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 261366Scsgr# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 271366Scsgr# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 281366Scsgr# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 291366Scsgr# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 301366Scsgr# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 311366Scsgr# SUCH DAMAGE. 321366Scsgr# 331366Scsgr# $Id: manctl,v 1.3 1994/04/17 21:01:18 g89r4222 Exp $ 341366Scsgr# 351366Scsgr# manctl: 361366Scsgr# a utility for manipulating manual pages 371366Scsgr# functions: 381366Scsgr# compress uncompressed man pages (elliminating .so's) 391366Scsgr# uncompress compressed man pages 401366Scsgr# purge old formatted man pages (not implemented yet) 411366Scsgr# Things to watch out for: 421366Scsgr# Hard links - careful with g(un)zipping! 431366Scsgr# .so's - throw everything through soelim before gzip! 441366Scsgr# symlinks - ignore these - eg: expn is its own man page: 451366Scsgr# don't want to compress this! 461366Scsgr# 471366ScsgrPATH=/bin:/sbin:/usr/bin:/usr/sbin 481366Scsgr 491366Scsgr# 501366Scsgr# purge cat? directories 511366Scsgr# 521366Scsgrdo_purge() 531366Scsgr{ 541366Scsgr echo "purge $@" 2>&1 551366Scsgr echo "not implemented yet\n" 2>&1 561366Scsgr} 571366Scsgr 581366Scsgr 591366Scsgr# 601366Scsgr# Uncompress one page 611366Scsgr# 621366Scsgruncompress_page() 631366Scsgr{ 641366Scsgr local pname 651366Scsgr local fname 661366Scsgr local sect 671366Scsgr local ext 681366Scsgr 691366Scsgr # break up file name 701366Scsgr pname=$1 711366Scsgr IFS='.' ; set $pname 721366Scsgr # less than 3 fields - don't know what to do with this 731366Scsgr if [ $# -lt 3 ] ; then 741366Scsgr IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 751366Scsgr fi 761366Scsgr # construct name and section 771366Scsgr fname=$1 ; shift 781366Scsgr while [ $# -gt 2 ] ; do 791366Scsgr fname=$fname.$1 801366Scsgr shift 811366Scsgr done 821366Scsgr sect=$1 831366Scsgr ext=$2 841366Scsgr 851366Scsgr IFS=" " 861366Scsgr case "$ext" in 871366Scsgr gz|Z) { 881366Scsgr IFS=" " ; set `file $pname` 891366Scsgr if [ $2 != "gzip" ] ; then 901366Scsgr echo moving hard link $pname 1>&2 911366Scsgr mv $pname $fname.$ext # link 921366Scsgr else 931366Scsgr if [ $2 != "symbolic" ] ; then 941366Scsgr echo gunzipping page $pname 1>&2 951366Scsgr gunzip -c $pname > /tmp/manager.$$ 961366Scsgr chmod u+w $pname 971366Scsgr cp /tmp/manager.$$ $pname 981366Scsgr chmod 444 $pname 991366Scsgr mv $pname $fname.$sect 1001366Scsgr rm /tmp/manager.$$ 1011366Scsgr else 1021366Scsgr # skip symlinks - this can be 1031366Scsgr # a program like expn, which is 1041366Scsgr # its own man page ! 1051366Scsgr echo skipping symlink $pname 1>&2 1061366Scsgr fi 1071366Scsgr fi };; 1081366Scsgr *) { 1091366Scsgr IFS=" " 1101366Scsgr echo skipping file $pname 1>&2 1111366Scsgr } ;; 1121366Scsgr esac 1131366Scsgr # reset IFS - this is important! 1141366Scsgr IFS=" " 1151366Scsgr} 1161366Scsgr 1171366Scsgr 1181366Scsgr# 1191366Scsgr# Uncompress manpages in paths 1201366Scsgr# 1211366Scsgrdo_uncompress() 1221366Scsgr{ 1231366Scsgr local i 1241366Scsgr local dir 1251369Scsgr local workdir 1261366Scsgr 1271369Scsgr workdir=`pwd` 1281366Scsgr while [ $# != 0 ] ; do 1291366Scsgr if [ -d $1 ] ; then 1301366Scsgr dir=$1 1311369Scsgr cd $dir 1321370Scsgr for i in * ; do 1331366Scsgr case $i in 1341366Scsgr *cat?) ;; # ignore cat directories 1351366Scsgr *) { 1361366Scsgr if [ -d $i ] ; then 1371366Scsgr do_uncompress $i 1381366Scsgr else 1391366Scsgr if [ -e $i ] ; then 1401366Scsgr uncompress_page $i 1411366Scsgr fi 1421366Scsgr fi } ;; 1431366Scsgr esac 1441366Scsgr done 1451369Scsgr cd $workdir 1461366Scsgr else 1471366Scsgr echo "directory $1 not found" 1>&2 1481366Scsgr fi 1491366Scsgr shift 1501366Scsgr done 1511366Scsgr} 1521366Scsgr 1531366Scsgr# 1541366Scsgr# compress one page 1551366Scsgr# We need to watch out for hard links here. 1561366Scsgr# 1571366Scsgrcompress_page() 1581366Scsgr{ 1591366Scsgr local pname 1601366Scsgr local fname 1611366Scsgr local sect 1621366Scsgr 1631366Scsgr # break up file name 1641366Scsgr pname=$1 1651366Scsgr IFS='.' ; set $pname 1661366Scsgr if [ $# -lt 2 ] ; then 1671366Scsgr IFS=" " ; echo ignoring $pname 1>&2 ; return 0 ; 1681366Scsgr fi 1691366Scsgr # construct name and section 1701366Scsgr fname=$1 ; shift 1711366Scsgr while [ $# -gt 1 ] ; do 1721366Scsgr fname=$fname.$1 1731366Scsgr shift 1741366Scsgr done 1751366Scsgr sect=$1 1761366Scsgr 1771366Scsgr IFS=" " 1781366Scsgr case "$sect" in 1791366Scsgr gz) { echo file $pname already gzipped 1>&2 ; } ;; 1801366Scsgr Z) { echo file $pname already compressed 1>&2 ; } ;; 1811366Scsgr [12345678ln]*){ 1821366Scsgr IFS=" " ; set `file $pname` 1831366Scsgr if [ $2 = "gzip" ] ; then 1841366Scsgr echo moving hard link $pname 1>&2 1851366Scsgr mv $pname $pname.gz # link 1861366Scsgr else 1871366Scsgr if [ $2 != "symbolic" ] ; then 1881366Scsgr echo gzipping page $pname 1>&2 1891370Scsgr cat $pname | \ 1901370Scsgr (cd .. ; soelim )| gzip -c -- > /tmp/manager.$$ 1911366Scsgr chmod u+w $pname 1921366Scsgr cp /tmp/manager.$$ $pname 1931366Scsgr chmod 444 $pname 1941366Scsgr mv $pname $pname.gz 1951366Scsgr rm /tmp/manager.$$ 1961366Scsgr else 1971366Scsgr # skip symlink - this can be 1981366Scsgr # a program like expn, which is 1991366Scsgr # its own man page ! 2001366Scsgr echo skipping symlink $pname 1>&2 2011366Scsgr fi 2021366Scsgr fi };; 2031366Scsgr *) { 2041366Scsgr IFS=" " 2051366Scsgr echo skipping file $pname 1>&2 2061366Scsgr } ;; 2071366Scsgr esac 2081366Scsgr # reset IFS - this is important! 2091366Scsgr IFS=" " 2101366Scsgr} 2111366Scsgr 2121366Scsgr# 2131366Scsgr# Compress man pages in paths 2141366Scsgr# 2151366Scsgrdo_compress() 2161366Scsgr{ 2171366Scsgr local i 2181366Scsgr local dir 2191369Scsgr local workdir 2201366Scsgr 2211369Scsgr workdir=`pwd` 2221366Scsgr while [ $# != 0 ] ; do 2231366Scsgr if [ -d $1 ] ; then 2241366Scsgr dir=$1 2251369Scsgr cd $dir 2261369Scsgr for i in * ; do 2271366Scsgr case $i in 2281366Scsgr *cat?) ;; # ignore cat directories 2291366Scsgr *) { 2301366Scsgr if [ -d $i ] ; then 2311366Scsgr do_compress $i 2321366Scsgr else 2331366Scsgr if [ -e $i ] ; then 2341366Scsgr compress_page $i 2351366Scsgr fi 2361366Scsgr fi } ;; 2371366Scsgr esac 2381366Scsgr done 2391369Scsgr cd $workdir 2401366Scsgr else 2411366Scsgr echo "directory $1 not found" 1>&2 2421366Scsgr fi 2431366Scsgr shift 2441366Scsgr done 2451366Scsgr} 2461366Scsgr 2471366Scsgr# 2481366Scsgr# Display a usage message 2491366Scsgr# 2501366Scsgrctl_usage() 2511366Scsgr{ 2521366Scsgr echo "usage : $1 -compress <path> ... " 1>&2 2531366Scsgr echo " $1 -uncompress <path> ... " 1>&2 2541366Scsgr echo " $1 -purge <days> <path> ... " 1>&2 2551366Scsgr echo " $1 -purge expire <path> ... " 1>&2 2561366Scsgr exit 1 2571366Scsgr} 2581366Scsgr 2591366Scsgr 2601366Scsgr# 2611366Scsgr# dispatch options 2621366Scsgr# 2631366Scsgrif [ $# = 0 ] ; then ; ctl_usage $0 ; fi ; 2641366Scsgr 2651366Scsgrcase "$1" in 2661366Scsgr -compress) shift ; do_compress "$@" ;; 2671366Scsgr -uncompress) shift ; do_uncompress "$@" ;; 2681366Scsgr -purge) shift ; do_purge "$@" ;; 2691366Scsgr *) ctl_usage $0 ;; 2701366Scsgresac 271