- fix symlink check
[opensuse:installation-images.git] / bin / mk_image
1 #! /usr/bin/perl
2
3 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
4 # some setup...
5
6 BEGIN { unshift @INC, ( $0 =~ /(.*?)((?<![^\/])bin\/)?[^\/]+$/ )[0] . "lib" }
7 use ReadConfig;
8 use MakeExt2Image;
9 use AddFiles;
10 use Conv2Image;
11 use CompressImage;
12 use Cwd "realpath";
13
14 sub check_link;
15
16 die "usage: $Script\n" if @ARGV;
17
18 # env vars:
19 #
20 # image, src, tmpdir, disjunct, mode, debug, fs, filelist, nolibs, nostrip
21 #
22 #
23
24
25 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
26 # some config data
27
28 $imagename = $ENV{image};
29 die "no image name\n" if $imagename eq "";
30
31 $srcname = $ENV{src};
32 $srcname = $imagename if $srcname eq "";
33
34 $fl = $ENV{filelist};
35 $fl = $imagename if $fl eq "";
36
37 $srcdir = "${DataPath}$srcname";
38 $tmpdir = "${BasePath}tmp/$imagename";
39 $tmpdir = "${BasePath}tmp/$ENV{tmpdir}" if $ENV{tmpdir};
40 $image = "${ImagePath}$imagename";
41
42 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43 # now we really start...
44
45 $ENV{YAST_IS_RUNNING} = 1 unless exists $ENV{YAST_IS_RUNNING};
46
47 if($ENV{disjunct}) {
48   $tmpdisjunct = "${BasePath}tmp/$ENV{disjunct}";
49   die "$tmpdisjunct: so such directory" unless -d $tmpdisjunct;
50   $tmpdir2 = "$tmpdir.not_$ENV{disjunct}";
51   if(-d($tmpdir2)) {
52     SUSystem "rm -rf $tmpdir2" and die "$Script: failed to remove old $tmpdir2";
53   }
54 }
55
56 $debug = exists($ENV{'debug'}) ?  $ENV{'debug'} : "";
57 $imagetype = $ENV{fs};
58 $imagetype = "none" unless $imagetype;
59 $use_gzip = 1 if $imagetype =~ s/\.gz$//;
60
61 # modes: keep, add, "" (default)
62 @mode{split ",", $ENV{mode}} = ( 1 .. 10 );
63
64 if(!$mode{keep} || $mode{add}) {
65   if(!$mode{add}) {
66     # clean up
67     if(-d($tmpdir)) {
68       SUSystem "rm -rf $tmpdir" and die "$Script: failed to remove old $tmpdir";
69     }
70
71     mkdir $tmpdir || die "$Script: failed to create $tmpdir";
72   }
73
74   AddFiles $tmpdir, "${srcdir}/$fl.file_list", $srcdir or
75     die "$Script: failed to setup image";
76
77   if(-f "${BasePath}tmp/$imagename.rpmlog") {
78     SUSystem "perl -pe 's/\\[(.*?)\\].*/\$1/' ${BasePath}tmp/$imagename.rpmlog | sort -u >$tmpdir/.packages.$imagename";
79   }
80
81 #  print "fix locale...\n";
82 #  SUSystem "fix_locale $tmpdir";
83
84   print "fix permissions of directories...\n";
85   SUSystem "fix_perms $tmpdir";
86
87   if(!$ENV{nostrip}) {
88     print "strip everything...\n";
89     SUSystem "strip_dir $tmpdir";
90   }
91
92   if(!$ENV{nolinkcheck}) {
93     print "checking for dangling symlinks...\n";
94     if(check_link $tmpdir) {
95       if(1 || $debug =~ /\bignore\b/) {
96         warn "$Script: please fix symlinks\n";
97       }
98       else {
99         die "$Script: please fix symlinks\n";
100       }
101     }
102   }
103
104   @libdeps = split ',', $ENV{libdeps};
105   if(@libdeps) {
106     $ldirs .= " ${BasePath}tmp/$_" for @libdeps;
107     if($debug =~ /\bignore\b/ || $debug =~ /\bignorelibs\b/) {
108       system "check_libs $ldirs" and
109         warn "$Script: error in shared lib config, please fix\n";
110     }
111     else {
112       system "check_libs $ldirs" and
113         die "$Script: error in shared lib config, please fix\n";
114     }
115   }
116
117   @perldeps = split ',', $ENV{perldeps};
118   if(@perldeps) {
119     $pdirs .= " ${BasePath}tmp/$_" for @perldeps;
120     if($debug =~ /\bignore\b/ || $debug =~ /\bignorelibs\b/) {
121       system "perl_deps --check $pdirs" and
122         warn "$Script: error in perl module config, please fix\n";
123     }
124     else {
125       system "perl_deps --check $pdirs" and
126         die "$Script: error in perl module config, please fix\n";
127     }
128   }
129 }
130
131 if($tmpdir2) {
132   SUSystem "common_tree --dst $tmpdir2 $tmpdir $tmpdisjunct";
133   $tmpdir = "$tmpdir2/1";
134 }
135
136 if($imagetype eq 'dir') {
137   SUSystem "rm -rf $image ; cp -a $tmpdir $image";
138 }
139 elsif($imagetype ne 'none') {
140   $start_size = `du --apparent-size -k -s $tmpdir 2>/dev/null` + 0;
141   $start_inodes = `find $tmpdir | wc -l 2>/dev/null` + 0;
142
143   $start_inodes += 2000;
144   $start_size = ($start_size + $start_inodes * 4096) * 1.2;
145
146   # leave that much space
147   $extra_size = 1000;           # kbyte
148   $extra_inodes = 200;
149
150   if($ENV{theme} eq 'Zen') {
151     $extra_size = 20000;
152     $extra_inodes = 10000;
153   }
154
155   Conv2Image $image, $tmpdir, $imagetype, $start_size, $start_inodes, $extra_size, $extra_inodes;
156   $i = -s $image;
157   print "$Script: created \"$image\" ($i bytes)\n";
158
159   if($use_gzip) {
160     $i = CompressImage $image;
161     print "$Script: compressed \"$image\" ($i bytes)\n";
162   }
163 }
164
165
166 sub check_link
167 {
168   my $dir = shift;
169   my ($x, $err);
170   local $_;
171
172   for (`find $dir -type l`) {
173     chomp;
174
175     next if m#^$dir/usr/lib/cracklib_dict#;
176     next if m#^$dir/usr/share/applications/defaults.list#;
177
178     $x = readlink;
179     if($x =~ /^\//) {
180       next if $x =~ m#^/lbin/#;
181       next if $x =~ m#^/proc/#;
182
183       next if -e "$dir$x";
184     }
185     else {
186       next if -e;
187     }
188     $err = 1;
189     print STDERR "$_ -> $x\n";
190   }
191
192   return $err;
193 }
194