0f785fb353be6e225946b2bab2098ff524130ebd
[hdw-linux/hdw-linux.git] / misc / hdw-tools / hdw-get
1 #!/bin/sh
2 #
3 # author: hackbard@hackdaworld.dyndns.org
4 #
5 # hdw-tools: 
6 # this is hdw-get script, used to install/remove/(update) binary packages
7
8
9 usage() {
10         echo
11         echo "usage:"
12         echo "$0 [install/remove] [root] [package]"
13         echo "$0 [dist-install] [root] [dist file]"
14         echo
15 }
16 package="" ; inst_root=""
17 d_install="" ; install=""
18 verbose=""
19
20 while [ "$1" ] ; do
21         case "$1" in
22                 install)        install="1" 
23                                 inst_root="$2" ; package="$3" ; shift 3 ;;
24                 remove)         remove="1" 
25                                 inst_root="$2" ; package="$3" ; shift 3 ;;
26                 dist-install)   d_install="1"
27                                 inst_root="$2" ; dist_file="$3" ; shift 3 ;;
28                 -v)             verbose=1 ; shift 1 ;;
29                 *)              usage ; exit 1 ;;
30         esac
31 done
32                         
33 if [ -z "inst_root" -o -z "$package" ] ; then
34         usage ; exit 1
35 fi
36         
37 # read hdw-get configs
38 net_addr="" ; bin_dir="" ; distf_dir=""
39 if [ -f /etc/hdw-get.conf ] ; then
40         . /etc/hdw-get.conf
41         if [ -z "$hdw_version" -o -z "$hdw_arch" -o -z "$hdw_arch_opt" ] ; then
42                 echo "version, arch and arch_opt need to be specified."
43                 echo "adjust /etc/hdw-get.conf file"
44                 exit
45         else
46                 [ "$verbose" ] && echo "hdw-get.conf file looks good ..."
47         fi
48 else
49         echo "/etc/hdw-get.conf file not found, aborting"
50         exit 1
51 fi
52
53 # create temp directory
54 mkdir -p /tmp/.hdw-get
55
56 # remove
57 if [ "$remove" = "1" ] ; then
58         # looking for flist file
59         fl_pris=""
60         for fl_file in $inst_root/var/adm/flists/$package-[0-9]*; do
61                 fl_pris="`echo $fl_file | awk -F- '{ print $NF }'` $fl_pris"
62         done
63         fl_max="0"
64         for pri in $fl_pris; do
65                 if [ "$pri" = "x" ] ; then
66                         fl_max="x"
67                         break
68                 fi
69                 [ "$pri" -gt "$fl_max" ] && fl_max=$pri
70         done
71         fl_file="$inst_root/var/adm/flists/$package-$fl_max"
72         [ "$verbose" ] && echo "expecting flist file $fl_file"
73         if [ ! -f $fl_file ] ; then
74                 echo "package $apckage is not installed (moved the flist file?)"
75                 exit 1
76         fi
77
78         # care about info/dir file
79         rm -f /tmp/.hdw-get/dir* ; modify_info_dir=""
80         if [ -n "`grep usr/share/info/dir $fl_file`" ] ; then
81         modify_info_dir="1"
82         cp $inst_root/usr/share/info/dir /tmp/.hdw-get/
83         for info_obj in `grep 'usr/share/info/.*.info' $fl_file | \
84                          awk -F/ '{ print $4 }'`; do
85                 info_o=`echo $info_obj | sed 's/.info//'`
86                 [ "$verbose" ] && echo "deleting $info_o from info/dir"
87                 grep -v \($info_o\)\. /tmp/.hdw-get/dir | \
88                 grep -v ^$package\ info\ -\ added\ by\ hdw > \
89                 /tmp/.hdw-get/dir~
90                 mv /tmp/.hdw-get/dir~ /tmp/.hdw-get/dir
91         done
92         fi
93
94         # remove the files/dirs
95         ((supposed = 0))
96         ((counter = 0))
97         cat $fl_file | while read pkg file; do
98                 ((supposed += 1))
99                 if [ -e $inst_root/$file ] ; then
100                         if [ "$file" != "tmp" ] ; then
101                         if [ -d $inst_root/$file ] ; then
102                                 rmdir -p $inst_root/$file > /dev/null 2>&1
103                         else
104                                 rm -f $inst_root/$file > /dev/null 2>&1
105                                 rmdir -p `dirname $file` > /dev/null 2>&1
106                         fi
107                         ((counter += 1))
108                         fi
109                 fi
110                 echo -en "\rremoved $counter from $supposed supposed files"
111         done
112         echo -en "\ndone.\n"
113
114         # reinstall info/dir file
115         if [ "$modify_info_dir" ] ; then
116                 [ "$verbose" ] && echo "restoring modified info/dir file"
117                 cp /tmp/.hdw-get/dir $inst_root/usr/share/info/dir
118                 rm -f /tmp/.hdw-get/dir*
119         fi
120
121 # install
122 elif [ "$install" = "1" ] ; then
123         # does inst_root exist
124         if [ ! -d $inst_root ] ; then
125                 echo
126                 echo "the install directory doesnt exist, create it first"
127                 echo
128                 exit 1
129         fi
130
131         # store info/dir file
132         rm -f /tmp/.hdw-get/dir*
133         if [ -f $inst_root/usr/share/info/dir ] ; then
134                 [ "$verbose" ] && echo "backing up info/dir file"
135                 cp $inst_root/usr/share/info/dir /tmp/.hdw-get/
136         fi
137         
138         # check/install package
139         if [ -f $package ] ; then
140                 echo "extracting `basename $package` to $inst_root ..."
141                 tar --use-compress-program=bzip2 -xf $package \
142                         -C $inst_root
143                 echo "done"
144         elif [ ! -z "$bin_dir" -a -f $bin_dir/${hdw_arch}-${hdw_arch_opt}/$package/$package.tar.bz2 ] ; then
145                 echo "extracting $package to $inst_root ..."
146                 tar --use-compress-program=bzip2 \
147                 -xf $bin_dir/$package/$package.tar.bz2 -C $inst_root
148         elif [ ! -z "$net_addr" ] ; then
149                 #echo "trying to get package $package via net ..."
150                 wget $net_addr/hdw-linux/hdw-linux-$hdw_version/binaries/${hdw_arch}-${hdw_arch_opt}/$package/${package}.tar.bz2 > /dev/null 2>&1
151                 if [ "$?" ] ; then
152                         echo "package not found at $net_addr, aborting ..."
153                 else
154                 
155                         tar --use-compress-program=bzip2 \
156                                 -xf ${package}.tar.bz2 -C $inst_root
157                         rm ${package}.tar.bz2
158                         echo "done"
159                 fi
160         else
161                 echo "sorry, package $package not found"
162         fi
163
164         # merging info/dir file
165         pkg=`basename $package | sed 's/.tar.bz2//'`
166         fl_file=`ls -A $inst_root/var/adm/flists/$pkg-[0-9]* | tail -1`
167         if [ -n "`grep usr/share/info/dir $fl_file`" ] ; then
168                 echo "" >> /tmp/.hdw-get/dir
169                 echo "$pkg info - added by hdw `date`" >> /tmp/.hdw-get/dir
170                 for info_obj in `grep 'usr/share/info/.*.info' $fl_file | \
171                                         awk -F/ '{ print $4 }'`; do
172                         info_o=`echo $info_obj | sed 's/.info//'`
173                         if [ -z "`grep \($info_o\)\. /tmp/.hdw-get/dir`" ]
174                         then
175                                 [ "$verbose" ] && \
176                                         echo "merging $info_o to info/dir"
177                                 grep \($info_o\)\. \
178                                         $inst_root/usr/share/info/dir >> \
179                                         /tmp/.hdw-get/dir
180                         fi
181                 done
182         fi
183         cp /tmp/.hdw-get/dir $inst_root/usr/share/info/dir
184         rm -f /tmp/.hdw-get/dir
185
186 # dist-install
187 elif [ "$dist_install" = "1" ] ; then
188         # check dist file
189         if [ ! -f $dist_file ] ; then
190                 echo "$dist_file not found, aborting"
191         else
192                 # install all distribution related packages
193                 for package in `cat $dist_file`; do
194                         # execute myelf
195                         $0 install $inst_root $package
196                 done
197         fi
198 fi
199
200 # remove temp directory
201 rm -rf /tmp/.hdw-get
202