#!/bin/sh # # author: hackbard@hackdaworld.dyndns.org # # hdw-tools: # this is hdw-get script, used to install/remove/(update) binary packages # usage() { echo echo "usage:" echo "$0 [install/remove] [root] [package]" echo "$0 [dist-install] [root] [dist file]" echo } package="" ; inst_root="" d_install="" ; install="" verbose="" while [ "$1" ] ; do case "$1" in install) install="1" inst_root="$2" ; package="$3" ; shift 3 ;; remove) remove="1" inst_root="$2" ; package="$3" ; shift 3 ;; dist-install) d_install="1" inst_root="$2" ; dist_file="$3" ; shift 3 ;; -v) verbose=1 ; shift 1 ;; *) usage ; exit 1 ;; esac done if [ -z "inst_root" -o -z "$package" ] ; then usage ; exit 1 fi # read hdw-get configs net_addr="" ; bin_dir="" ; distf_dir="" if [ -f /etc/hdw-get.conf ] ; then . /etc/hdw-get.conf if [ -z "$hdw_version" -o -z "$hdw_arch" -o -z "$hdw_arch_opt" ] ; then echo "version, arch and arch_opt need to be specified." echo "adjust /etc/hdw-get.conf file" exit else echo "hdw-get.conf file looks good ..." fi else echo "/etc/hdw-get.conf file not found, aborting" exit 1 fi # create temp directory mkdir -p /tmp/.hdw-get # remove if [ "$remove" = "1" ] ; then # looking for flist file fl_pris="" for fl_file in $inst_root/var/adm/flists/$package-[0-9]*; do fl_pris="`echo $fl_file | awk -F- '{ print $NF }'` $fl_pris" done fl_max="0" for pri in $fl_pris; do if [ "$pri" = "x" ] ; then fl_max="x" break fi [ "$pri" -gt "$fl_max" ] && fl_max=$pri done fl_file="$inst_root/var/adm/flists/$package-$fl_max" [ "$verbose" ] && echo "expecting flist file $fl_file" if [ ! -f $fl_file ] ; then echo "package $apckage is not installed (moved the flist file?)" exit 1 fi # care about info/dir file rm -f /tmp/.hdw-get/dir* ; modify_info_dir="" if [ -n "`grep usr/share/info/dir $fl_file`" ] ; then modify_info_dir="1" cp $inst_root/usr/share/info/dir /tmp/.hdw-get/ for info_obj in `grep 'usr/share/info/.*.info' $fl_file | \ awk -F/ '{ print $4 }'`; do info_o=`echo $info_obj | sed 's/.info//'` [ "$verbose" ] && echo "deleting $info_o from info/dir" grep -v \($info_o\)\. /tmp/.hdw-get/dir | \ grep -v ^$package\ info\ -\ added\ by\ hdw > \ /tmp/.hdw-get/dir~ mv /tmp/.hdw-get/dir~ /tmp/.hdw-get/dir done fi # remove the files/dirs ((supposed = 0)) ((counter = 0)) cat $fl_file | while read pkg file; do ((supposed += 1)) if [ -e $inst_root/$file ] ; then if [ "$file" != "tmp" ] ; then if [ -d $inst_root/$file ] ; then rmdir -p $inst_root/$file > /dev/null 2>&1 else rm -f $inst_root/$file > /dev/null 2>&1 rmdir -p `dirname $file` > /dev/null 2>&1 fi ((counter += 1)) fi fi echo -en "\rremoved $counter from $supposed supposed files" done echo -en "\ndone.\n" # reinstall info/dir file if [ "$modify_info_dir" ] ; then [ "$verbose" ] && echo "restoring modified info/dir file" cp /tmp/.hdw-get/dir $inst_root/usr/share/info/dir rm -f /tmp/.hdw-get/dir* fi # install elif [ "$install" = "1" ] ; then # does inst_root exist if [ ! -d $inst_root ] ; then echo echo "the install directory doesnt exist, create it first" echo exit 1 fi # store info/dir file rm -f /tmp/.hdw-get/dir* if [ -f $inst_root/usr/share/info/dir ] ; then [ "$verbose" ] && echo "backing up info/dir file" cp $inst_root/usr/share/info/dir /tmp/.hdw-get/ fi # check/install package if [ -f $package ] ; then echo "extracting `basename $package` to $inst_root ..." tar --use-compress-program=bzip2 -xf $package \ -C $inst_root echo "done" elif [ ! -z "$bin_dir" -a -f $bin_dir/${hdw_arch}-${hdw_arch_opt}/$package/$package.tar.bz2 ] ; then echo "extracting $package to $inst_root ..." tar --use-compress-program=bzip2 \ -xf $bin_dir/$package/$package.tar.bz2 -C $inst_root elif [ ! -z "$net_addr" ] ; then #echo "trying to get package $package via net ..." wget $net_addr/hdw-linux/hdw-linux-$hdw_version/binaries/${hdw_arch}-${hdw_arch_opt}/$package/${package}.tar.bz2 > /dev/null 2>&1 if [ "$?" ] ; then echo "package not found at $net_addr, aborting ..." else tar --use-compress-program=bzip2 \ -xf ${package}.tar.bz2 -C $inst_root rm ${package}.tar.bz2 echo "done" fi else echo "sorry, package $package not found" fi # merging info/dir file pkg=`basename $package | sed 's/.tar.bz2//'` fl_file=`ls -A $inst_root/var/adm/flists/$pkg-[0-9]* | tail -1` if [ -n "`grep usr/share/info/dir $fl_file`" ] ; then echo "" >> /tmp/.hdw-get/dir echo "$pkg info - added by hdw `date`" >> /tmp/.hdw-get/dir for info_obj in `grep 'usr/share/info/.*.info' $fl_file | \ awk -F/ '{ print $4 }'`; do info_o=`echo $info_obj | sed 's/.info//'` if [ -z "`grep \($info_o\)\. /tmp/.hdw-get/dir`" ] then [ "$verbose" ] && \ echo "merging $info_o to info/dir" grep \($info_o\)\. \ $inst_root/usr/share/info/dir >> \ /tmp/.hdw-get/dir fi done fi cp /tmp/.hdw-get/dir $inst_root/usr/share/info/dir rm -f /tmp/.hdw-get/dir # dist-install elif [ "$dist_install" = "1" ] ; then # check dist file if [ ! -f $dist_file ] ; then echo "$dist_file not found, aborting" else # install all distribution related packages for package in `cat $dist_file`; do # execute myelf $0 install $inst_root $package done fi fi # remove temp directory rm -rf /tmp/.hdw-get