0004d03281dc47e0636ab50218bcc55743737310
[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 unset CDPATH
22
23 TEMP=`getopt \
24         -o '' \
25         --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 \
26         -n febootstrap-minimize -- "$@"`
27 if [ $? != 0 ]; then
28     echo "febootstrap-minimize: problem parsing the command line arguments"
29     exit 1
30 fi
31 eval set -- "$TEMP"
32
33 set_all ()
34 {
35   keep_locales=no
36      keep_docs=no
37  keep_cracklib=no
38      keep_i18n=no
39  keep_zoneinfo=no
40     keep_rpmdb=no
41 keep_yum_cache=no
42  keep_services=no
43       keep_sln=no
44  keep_ldconfig=no
45 }
46
47 set_none ()
48 {
49   keep_locales=yes
50      keep_docs=yes
51  keep_cracklib=yes
52      keep_i18n=yes
53  keep_zoneinfo=yes
54     keep_rpmdb=yes
55 keep_yum_cache=yes
56  keep_services=yes
57       keep_sln=yes
58  keep_ldconfig=yes
59 }
60
61 set_all
62 pack_executables=no
63
64 usage ()
65 {
66     echo "Usage: febootstrap-minimize [--options] DIR"
67     echo "Please read febootstrap-minimize(8) man page for more information."
68 }
69
70 while true; do
71     case "$1" in
72         --all)
73             set_all
74             shift;;
75         --none)
76             set_none
77             shift;;
78         --keep-locales)
79             keep_locales=yes
80             shift;;
81         --drop-locales)
82             keep_locales=no
83             shift;;
84         --keep-docs)
85             keep_docs=yes
86             shift;;
87         --drop-docs)
88             keep_docs=no
89             shift;;
90         --keep-cracklib)
91             keep_cracklib=yes
92             shift;;
93         --drop-cracklib)
94             keep_cracklib=no
95             shift;;
96         --keep-i18n)
97             keep_i18n=yes
98             shift;;
99         --drop-i18n)
100             keep_i18n=no
101             shift;;
102         --keep-zoneinfo)
103             keep_zoneinfo=yes
104             shift;;
105         --drop-zoneinfo)
106             keep_zoneinfo=no
107             shift;;
108         --keep-rpmdb)
109             keep_rpmdb=yes
110             shift;;
111         --drop-rpmdb)
112             keep_rpmdb=no
113             shift;;
114         --keep-yum-cache)
115             keep_yum_cache=yes
116             shift;;
117         --drop-yum-cache)
118             keep_yum_cache=no
119             shift;;
120         --keep-services)
121             keep_services=yes
122             shift;;
123         --drop-services)
124             keep_services=no
125             shift;;
126         --keep-sln)
127             keep_sln=yes
128             shift;;
129         --drop-sln)
130             keep_sln=no
131             shift;;
132         --keep-ldconfig)
133             keep_ldconfig=yes
134             shift;;
135         --drop-ldconfig)
136             keep_ldconfig=no
137             shift;;
138         --no-pack-executables)
139             pack_executables=no
140             shift;;
141         --pack-executables)
142             pack_executables=yes
143             shift;;
144         --help)
145             usage
146             exit 0;;
147         --)
148             shift
149             break;;
150         *)
151             echo "Internal error!"
152             exit 1;;
153     esac
154 done
155
156 if [ $# -lt 1 ]; then
157     usage
158     exit 1
159 fi
160
161 target="$1"
162
163 if [ ! -d "$target" ]; then
164     echo "febootstrap-minimize: $target: target directory not found"
165     exit 1
166 fi
167
168 # Create a temporary directory, make sure it gets cleaned up at the end.
169 tmpdir=$(mktemp -d)
170 remove_tmpdir ()
171 {
172   status=$?
173   rm -rf "$tmpdir" && exit $status
174 }
175 trap remove_tmpdir EXIT
176
177 #----------------------------------------------------------------------
178
179 # ***NOTE*** Wildcards cannot be passed to febootstrap-run.
180
181 if [ "$keep_locales" != "yes" ]; then
182     febootstrap-run "$target" -- rm -rf usr/lib/locale
183     febootstrap-run "$target" -- rm -rf usr/share/locale
184     febootstrap-run "$target" -- rm -rf usr/lib/gconv usr/lib64/gconv
185     febootstrap-run "$target" -- rm -f usr/bin/localedef
186     febootstrap-run "$target" -- rm -f usr/sbin/build-locale-archive
187 fi
188
189 if [ "$keep_docs" != "yes" ]; then
190     febootstrap-run "$target" -- rm -rf usr/share/man
191     febootstrap-run "$target" -- rm -rf usr/share/doc
192     febootstrap-run "$target" -- rm -rf usr/share/info
193     febootstrap-run "$target" -- rm -rf usr/share/gnome/help
194 fi
195
196 if [ "$keep_cracklib" != "yes" ]; then
197     febootstrap-run "$target" -- rm -rf usr/share/cracklib
198 fi
199
200 if [ "$keep_i18n" != "yes" ]; then
201     febootstrap-run "$target" -- rm -rf usr/share/i18n
202 fi
203
204 if [ "$keep_zoneinfo" != "yes" ]; then
205     mv "$target"/usr/share/zoneinfo/{UCT,UTC,Universal,Zulu,GMT*,*.tab} \
206       "$target"
207     febootstrap-run "$target" -- rm -rf usr/share/zoneinfo
208     febootstrap-run "$target" -- mkdir -p --mode=0755 usr/share/zoneinfo
209     mv "$target"/{UCT,UTC,Universal,Zulu,GMT*,*.tab} \
210       "$target"/usr/share/zoneinfo/
211 fi
212
213 if [ "$keep_rpmdb" != "yes" ]; then
214     febootstrap-run "$target" -- rm -rf var/lib/rpm
215     febootstrap-run "$target" -- mkdir -p --mode=0755 var/lib/rpm
216     febootstrap-run "$target" -- rm -rf var/lib/yum
217     febootstrap-run "$target" -- mkdir -p --mode=0755 var/lib/yum
218 fi
219
220 if [ "$keep_yum_cache" != "yes" ]; then
221     febootstrap-run "$target" -- rm -rf var/cache/yum
222     febootstrap-run "$target" -- mkdir -p --mode=0755 var/cache/yum
223 fi
224
225 if [ "$keep_services" != "yes" ]; then
226     # NB: Overwrite the same file so that we have the same inode,
227     # since fakeroot tracks files by inode number.
228     cat > "$target"/etc/services <<'__EOF__'
229 tcpmux 1/tcp
230 tcpmux 1/udp
231 echo 7/tcp
232 echo 7/udp
233 discard 9/tcp sink null
234 discard 9/udp sink null
235 ftp 21/tcp
236 ftp 21/udp fsp fspd
237 ssh 22/tcp
238 ssh 22/udp
239 telnet 23/tcp
240 telnet 23/udp
241 smtp 25/tcp mail
242 smtp 25/udp mail
243 time 37/tcp timserver
244 time 37/udp timserver
245 nameserver 42/tcp name
246 nameserver 42/udp name
247 domain 53/tcp
248 domain 53/udp
249 bootps 67/tcp
250 bootps 67/udp
251 bootpc 68/tcp dhcpc
252 bootpc 68/udp dhcpc
253 tftp 69/tcp
254 tftp 69/udp
255 finger 79/tcp
256 finger 79/udp
257 http 80/tcp www www-http
258 http 80/udp www www-http
259 http 80/sctp
260 kerberos 88/tcp kerberos5 krb5
261 kerberos 88/udp kerberos5 krb5
262 pop3 110/tcp pop-3
263 pop3 110/udp pop-3
264 sunrpc 111/tcp portmapper rpcbind
265 sunrpc 111/udp portmapper rpcbind
266 auth 113/tcp authentication tap ident
267 auth 113/udp authentication tap ident
268 ntp 123/tcp
269 ntp 123/udp
270 imap 143/tcp imap2
271 imap 143/udp imap2
272 snmp 161/tcp
273 snmp 161/udp
274 snmptrap 162/tcp
275 snmptrap 162/udp snmp-trap
276 __EOF__
277 fi
278
279 if [ "$keep_sln" != "yes" ]; then
280     febootstrap-run "$target" -- rm -f sbin/sln
281 fi
282
283 if [ "$keep_ldconfig" != "yes" ]; then
284     febootstrap-run "$target" -- rm -f sbin/ldconfig
285     febootstrap-run "$target" -- rm -f etc/ld.so.cache
286     febootstrap-run "$target" -- rm -rf var/cache/ldconfig
287     febootstrap-run "$target" -- mkdir -p --mode=0755 var/cache/ldconfig
288 fi
289
290 if [ "$pack_executables" = "yes" ]; then
291     # NB. Be careful to keep the same inode number, since fakeroot
292     # tracks files by inode number.
293     for path in $(find "$target" -type f -perm /111 |
294                   xargs file |
295                   grep executable |
296                   awk -F: '{print $1}'); do
297         base=$(basename "$path")
298         cp "$path" "$tmpdir"
299         (cd "$tmpdir" && upx -q -q --best "$base")
300         cat "$tmpdir"/"$base" > "$path"
301         rm "$tmpdir"/"$base"
302     done
303 fi