90915e3c6ea8232d95d9f9e59ca231065d7f16c3
[febootstrap.git] / febootstrap-minimize.sh
1 #!/bin/bash -
2 # febootstrap minimize
3 # (C) Copyright 2009 Red Hat Inc.
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 #
19 # Written by Richard W.M. Jones <rjones@redhat.com>
20
21 TEMP=`getopt \
22         -o '' \
23         --long help,all,none,keep-locales,drop-locales,keep-docs,drop-docs,keep-cracklib,drop-cracklib,keep-i18n,drop-i18n,keep-zoneinfo,drop-zoneinfo,keep-rpmdb,drop-rpmdb,keep-yum-cache,drop-yum-cache,keep-services,drop-services,keep-sln,drop-sln,keep-ldconfig,drop-ldconfig,no-pack-executables,pack-executables \
24         -n febootstrap-minimize -- "$@"`
25 if [ $? != 0 ]; then
26     echo "febootstrap-minimize: problem parsing the command line arguments"
27     exit 1
28 fi
29 eval set -- "$TEMP"
30
31 set_all ()
32 {
33   keep_locales=no
34      keep_docs=no
35  keep_cracklib=no
36      keep_i18n=no
37  keep_zoneinfo=no
38     keep_rpmdb=no
39 keep_yum_cache=no
40  keep_services=no
41       keep_sln=no
42  keep_ldconfig=no
43 }
44
45 set_none ()
46 {
47   keep_locales=yes
48      keep_docs=yes
49  keep_cracklib=yes
50      keep_i18n=yes
51  keep_zoneinfo=yes
52     keep_rpmdb=yes
53 keep_yum_cache=yes
54  keep_services=yes
55       keep_sln=yes
56  keep_ldconfig=yes
57 }
58
59 set_all
60 pack_executables=no
61
62 usage ()
63 {
64     echo "Usage: febootstrap-minimize [--options] DIR"
65     echo "Please read febootstrap-minimize(8) man page for more information."
66 }
67
68 while true; do
69     case "$1" in
70         --all)
71             set_all
72             shift;;
73         --none)
74             set_none
75             shift;;
76         --keep-locales)
77             keep_locales=yes
78             shift;;
79         --drop-locales)
80             keep_locales=no
81             shift;;
82         --keep-docs)
83             keep_docs=yes
84             shift;;
85         --drop-docs)
86             keep_docs=no
87             shift;;
88         --keep-cracklib)
89             keep_cracklib=yes
90             shift;;
91         --drop-cracklib)
92             keep_cracklib=no
93             shift;;
94         --keep-i18n)
95             keep_i18n=yes
96             shift;;
97         --drop-i18n)
98             keep_i18n=no
99             shift;;
100         --keep-zoneinfo)
101             keep_zoneinfo=yes
102             shift;;
103         --drop-zoneinfo)
104             keep_zoneinfo=no
105             shift;;
106         --keep-rpmdb)
107             keep_rpmdb=yes
108             shift;;
109         --drop-rpmdb)
110             keep_rpmdb=no
111             shift;;
112         --keep-yum-cache)
113             keep_yum_cache=yes
114             shift;;
115         --drop-yum-cache)
116             keep_yum_cache=no
117             shift;;
118         --keep-services)
119             keep_services=yes
120             shift;;
121         --drop-services)
122             keep_services=no
123             shift;;
124         --keep-sln)
125             keep_sln=yes
126             shift;;
127         --drop-sln)
128             keep_sln=no
129             shift;;
130         --keep-ldconfig)
131             keep_ldconfig=yes
132             shift;;
133         --drop-ldconfig)
134             keep_ldconfig=no
135             shift;;
136         --no-pack-executables)
137             pack_executables=no
138             shift;;
139         --pack-executables)
140             pack_executables=yes
141             shift;;
142         --help)
143             usage
144             exit 0;;
145         --)
146             shift
147             break;;
148         *)
149             echo "Internal error!"
150             exit 1;;
151     esac
152 done
153
154 if [ $# -lt 1 ]; then
155     usage
156     exit 1
157 fi
158
159 target="$1"
160
161 if [ ! -d "$target" ]; then
162     echo "febootstrap-minimize: $target: target directory not found"
163     exit 1
164 fi
165
166 # Create a temporary directory, make sure it gets cleaned up at the end.
167 tmpdir=$(mktemp -d)
168 remove_tmpdir ()
169 {
170   status=$?
171   rm -rf "$tmpdir" && exit $status
172 }
173 trap remove_tmpdir EXIT
174
175 #----------------------------------------------------------------------
176
177 if [ "$keep_locales" != "yes" ]; then
178     rm -f "$target"/usr/lib/locale/*
179     rm -rf "$target"/usr/share/locale
180     rm -rf "$target"/usr/lib*/gconv
181     rm -f "$target"/usr/bin/localedef
182     rm -f "$target"/usr/sbin/build-locale-archive
183 fi
184
185 if [ "$keep_docs" != "yes" ]; then
186     rm -rf "$target"/usr/share/man
187     rm -rf "$target"/usr/share/doc
188     rm -rf "$target"/usr/share/info
189 fi
190
191 if [ "$keep_cracklib" != "yes" ]; then
192     rm -rf "$target"/usr/share/cracklib
193 fi
194
195 if [ "$keep_i18n" != "yes" ]; then
196     rm -rf "$target"/usr/share/i18n
197 fi
198
199 if [ "$keep_zoneinfo" != "yes" ]; then
200     mv "$target"/usr/share/zoneinfo/{UCT,UTC,Universal,Zulu,GMT*,*.tab} \
201       "$target"
202     rm -rf "$target"/usr/share/zoneinfo/*
203     mv "$target"/{UCT,UTC,Universal,Zulu,GMT*,*.tab} \
204       "$target"/usr/share/zoneinfo/
205 fi
206
207 if [ "$keep_rpmdb" != "yes" ]; then
208     rm -rf "$target"/var/lib/rpm/*
209 fi
210
211 if [ "$keep_yum_cache" != "yes" ]; then
212     rm -rf "$target"/var/cache/yum/*
213 fi
214
215 if [ "$keep_services" != "yes" ]; then
216     # NB: Overwrite the same file so that we have the same inode,
217     # since fakeroot tracks files by inode number.
218     cat > "$target"/etc/services <<'__EOF__'
219 tcpmux 1/tcp
220 tcpmux 1/udp
221 echo 7/tcp
222 echo 7/udp
223 discard 9/tcp sink null
224 discard 9/udp sink null
225 ftp 21/tcp
226 ftp 21/udp fsp fspd
227 ssh 22/tcp
228 ssh 22/udp
229 telnet 23/tcp
230 telnet 23/udp
231 smtp 25/tcp mail
232 smtp 25/udp mail
233 time 37/tcp timserver
234 time 37/udp timserver
235 nameserver 42/tcp name
236 nameserver 42/udp name
237 domain 53/tcp
238 domain 53/udp
239 bootps 67/tcp
240 bootps 67/udp
241 bootpc 68/tcp dhcpc
242 bootpc 68/udp dhcpc
243 tftp 69/tcp
244 tftp 69/udp
245 finger 79/tcp
246 finger 79/udp
247 http 80/tcp www www-http
248 http 80/udp www www-http
249 http 80/sctp
250 kerberos 88/tcp kerberos5 krb5
251 kerberos 88/udp kerberos5 krb5
252 pop3 110/tcp pop-3
253 pop3 110/udp pop-3
254 sunrpc 111/tcp portmapper rpcbind
255 sunrpc 111/udp portmapper rpcbind
256 auth 113/tcp authentication tap ident
257 auth 113/udp authentication tap ident
258 ntp 123/tcp
259 ntp 123/udp
260 imap 143/tcp imap2
261 imap 143/udp imap2
262 snmp 161/tcp
263 snmp 161/udp
264 snmptrap 162/tcp
265 snmptrap 162/udp snmp-trap
266 __EOF__
267 fi
268
269 if [ "$keep_sln" != "yes" ]; then
270     rm -f "$target"/sbin/sln
271 fi
272
273 if [ "$keep_ldconfig" != "yes" ]; then
274     rm -f "$target"/sbin/ldconfig
275     rm -f "$target"/etc/ld.so.cache
276     rm -rf "$target"/var/cache/ldconfig/*
277 fi
278
279 if [ "$pack_executables" = "yes" ]; then
280     # NB. Be careful to keep the same inode number, since fakeroot
281     # tracks files by inode number.
282     for path in $(find "$target" -type f -perm /111 |
283                   xargs file |
284                   grep executable |
285                   awk -F: '{print $1}'); do
286         base=$(basename $path)
287         cp $path $tmpdir
288         (cd $tmpdir && upx -q -q --best $base)
289         cat $tmpdir/$base > $path
290         rm $tmpdir/$base
291     done
292 fi