home *** CD-ROM | disk | FTP | other *** search
- #!/bin/sh
- # Copyright 1994, Patrick Volkerding, Moorhead, Minnesota USA
- # All rights reserved.
- #
- # Redistribution and use of this script, with or without modification, is
- # permitted provided that the following conditions are met:
- #
- # 1. Redistributions of this script must retain the above copyright
- # notice, this list of conditions and the following disclaimer.
- #
- # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
- # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
- # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
- # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
- # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- #
- make_install_script() {
- COUNT=1
- LINE="`sed -n "$COUNT p" $1`"
- while [ ! "$LINE" = "" ]; do
- LINKGOESIN="`echo "$LINE" | cut -f 1 -d " "`"
- LINKGOESIN="`dirname $LINKGOESIN`"
- LINKNAMEIS="`echo "$LINE" | cut -f 1 -d ' '`"
- LINKNAMEIS="`basename "$LINKNAMEIS"`"
- LINKPOINTSTO="`echo "$LINE" | cut -f 3 -d ' '`"
- echo "( cd $LINKGOESIN ; rm -rf $LINKNAMEIS )"
- echo "( cd $LINKGOESIN ; ln -sf $LINKPOINTSTO $LINKNAMEIS )"
- COUNT=`expr $COUNT + 1`
- LINE="`sed -n "$COUNT p" $1`"
- done
- }
-
- usage() {
- cat << EOF
- Usage: installpkg package_name
- installpkg -warn package_name
- installpkg -r package_name
- installpkg -m package_name
-
- Usually used to install a .tgz or .tar.gz package like this:
- installpkg xf_bin.tgz
-
- -warn does not install, but tells you what would be deleted or overwritten.
-
- You can also install recursively from the current location, like this:
- installpkg -r uucp
-
- It is also possible to make a "*.tgz" package with a command like this:
- installpkg -m uucp
- (When you use "-m", the package will not be installed.)
-
- In this case, everything from the current directory and all subdirectories
- will be copied onto / as a package. The appropriate files under
- /var/adm/packages and /var/adm/scripts will be created for a new package
- called "uucp", and you will be able to review/remove the package just as
- easily as any other Slackware package.
-
- EOF
- }
-
- # These tests, while by no means exhaustive, will give a usage message
- # and exit with a wide range of bad input.
-
- if [ "$1" = "-warn" -a -f "$2" ]; then # -warn
- echo "Scanning the contents of $2..."
- echo
- mkdir -p /tmp/scan
- ( cd /tmp/scan ; tar xzf - install/doinst.sh ) < $2 2> /dev/null
- if [ -r /tmp/scan/install/doinst.sh ]; then
- if cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' 1>/dev/null 2>/dev/null ; then
- cat /tmp/scan/install/doinst.sh | fgrep 'rm -rf' > /tmp/scan/install/delete
- echo "The following locations will be completely WIPED OUT to allow symbolic"
- echo "links to be made. (We're talking 'rm -rf') These locations may be files,"
- echo "or entire directories."
- echo
- echo "Be sure you've backed up anything at these locations that you want to"
- echo "save before you install this package:"
- echo
- cat /tmp/scan/install/delete | cut -f 3,7 -d ' ' | tr ' ' '/'
- fi
- if [ -d /tmp/scan ]; then
- ( cd /tmp/scan ; rm -rf install ) 2> /dev/null
- ( cd /tmp ; rmdir scan ) 2> /dev/null
- fi
- fi
- echo
- echo "The following files will be overwritten when installing this package."
- echo "Be sure they aren't important before you install this package:"
- echo
- ( tar tzvvf - ) < $2 | fgrep -v 'drwx'
- echo "You've been warned."
- exit
- fi
- if [ $# = 2 -a ! "$1" = "-m" -a ! "$1" = "-r" -a ! -r "$1" ]; then
- usage;
- exit
- elif [ $# = 0 ]; then
- usage;
- exit
- fi
- if [ $# = 1 -a ! -r "$1" ]; then
- echo "Package not found: $1"
- echo
- usage;
- exit
- fi
- if [ "$1" = "-r" -o "$1" = "-m" ]; then
- if [ -r "/var/adm/packages/$2" -a ! "$1" = "-m" ]; then
- echo
- echo "Hey - there's already a package named '$2'! You really should remove"
- echo "that before attempting to install another package with that name,"
- echo "since the old indexes for that package will be overwritten and you'll"
- echo "have to remove any leftover files and links manually."
- echo
- echo -n "Do you want to exit ([y]es, [n]o)? "
- read EXIT;
- if [ "$EXIT" = "y" ]; then
- exit
- fi
- fi
- echo
- echo "Do you want to convert the symbolic links in this package into an"
- echo "installation script named ./install/doinst.sh? If you do, the symbolic"
- echo "links will be removed. You can get them back easily, though, by typing"
- echo
- echo "sh install/doinst.sh"
- echo
- echo "in the package's root directory."
- echo
- echo "It is recommended that you convert your links for best results."
- echo
- echo -n "Convert links to an install script ([y]es, [n]o)? "
- read CONVERT_LINKS;
- echo
- if [ "$CONVERT_LINKS" = "y" ]; then
- echo "Having a good look at your symbolic links..."
- echo
- find . -type l -exec ls -l {} \; | cut -b58- | tee /tmp/iNsT-a.$$
- echo
- if [ ! -d install ]; then
- mkdir install
- fi
- if [ -r install/doinst.sh ]; then
- cat << EOF
- You already have an installation script named install/doinst.sh.
- You have 3 choices:
-
- 1 - append the script code to create these links (if any) to the end of the
- existing installation script.
- 2 - erase the existing installation script, and replace it with the
- code to create these new links.
- 3 - Abort! Exit this script.
-
- EOF
- echo -n "Which choice would you like (1,2,3)? "
- read DOINST;
- if [ "$DOINST" = "1" ]; then
- echo "Appending to existing script..."
- echo
- make_install_script /tmp/iNsT-a.$$ | tee --append install/doinst.sh
- elif [ "$DOINST" = "2" ]; then
- echo "Replacing existing script..."
- echo
- make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
- else
- rm -f /tmp/iNsT-a.$$
- exit
- fi
- else # no script exists:
- echo "Making your install script..."
- echo
- make_install_script /tmp/iNsT-a.$$ | tee install/doinst.sh
- fi # is there already a script?
- rm -f /tmp/iNsT-a.$$
- echo
- echo "Removing the symbolic links:"
- echo
- find . -type l -print -exec rm {} \;
- echo
- fi # make install script?
- # Install the package:
- if [ "$1" = "-r" ]; then # install
- if [ -r install/doinst.sh ]; then # hey, did we do anything?
- # Put the backup of the script in place
- cp install/doinst.sh /var/adm/scripts/$2
- chmod 755 /var/adm/scripts/$2
- fi
- # Write the filelist out:
- echo "PACKAGE NAME: $2" > /var/adm/packages/$2
- echo "FILE LIST:" >> /var/adm/packages/$2
- echo "./" >> /var/adm/packages/$2
- find . -type f -print | cut -b3- >> /var/adm/packages/$2
- # Copy the stuff into place:
- echo "Installing your new package onto /..."
- cp -a . /
- ( cd / ; sh install/doinst.sh ; rm install/doinst.sh ; rmdir install )
- elif [ "$1" = "-m" ]; then
- echo "Making $2.tgz..."
- tar czf $2.tgz .
- fi
- else # we're just going to try to install each argument as a package:
- for package in $* ; do
- echo -n "Installing package $package... "
- # This stuff looks for symbolic links that also belong to other packages and
- # leaves them in place. That way, if you have a couple package pointing to
- # /usr/include on the cdrom and delete one, you'll still have include files.
- shortname=`basename $package .tgz`
- ADM_DIR="/var/adm"
- TMP=/tmp
- if [ -r $ADM_DIR/scripts/$shortname ]; then
- cat $ADM_DIR/scripts/$shortname | fgrep 'rm -rf' | sort -u > $TMP/del_link_list
- if [ ! -d $ADM_DIR/removed_scripts ]; then
- mkdir -p $ADM_DIR/removed_scripts
- fi
- mv $ADM_DIR/scripts/$shortname $ADM_DIR/removed_scripts 1> /dev/null 2>&1
- cat $ADM_DIR/scripts/* | fgrep 'rm -rf' | sort -u > $TMP/required_links
- comm -23 $TMP/del_link_list $TMP/required_links > $TMP/delscript
- ( cd / ; sh $TMP/delscript )
- rm -f $TMP/del_link_list $TMP/required_links $TMP/delscript
- fi
- echo "FILE LIST:" > /var/adm/packages/$shortname
- ( cd / ; tar -xzlpvf - ) < $package >> /var/adm/packages/$shortname
- if [ -f /install/doinst.sh ]; then
- echo -n "executing install script..."
- ( cd / ; sh install/doinst.sh -install; )
- fi
- # Clean up the mess...
- if [ -d /install ]; then
- cp /install/doinst.sh /var/adm/scripts/$shortname
- chmod 755 /var/adm/scripts/$shortname
- (cd /install ; rm -r -f doin* 1> /dev/null 2>&1 )
- rmdir /install 1> /dev/null 2>&1
- fi
- echo
- done
- fi
- echo
-