source: soft/build_system/build_system/mkcd/tags/V3_6_0_1mdk/pm/Mkcd/Functions.pm @ 1

Last change on this file since 1 was 1, checked in by fasma, 12 years ago

Initial Import from Mandriva's soft revision 224062 and package revision 45733

File size: 61.8 KB
Line 
1package Mkcd::Functions;
2
3our $VERSION = '1.2.0';
4
5use strict;
6use File::Path;
7use MDK::Common qw(substInFile);
8use File::NCopy qw(copy);       
9use Mkcd::Tools qw(cpal du checkDiscs imageSize printDiscsFile config readBatchFile log_ convert_size compute_files_md5);
10use Mkcd::Package qw(mkcd_build_hdlist);
11
12=head1 NAME
13
14Functions - mkcd module
15
16=head1 SYNOPSYS
17
18    require Mkcd::Functions;
19
20=head1 DESCRIPTION
21
22<Mkcd::Functions> include the disc building standard functions.
23
24=head1 SEE ALSO
25
26mkcd
27
28=head1 COPYRIGHT
29
30Copyright (C) 2000,2001 MandrakeSoft <warly@mandrakesoft.com>
31
32This program is free software; you can redistribute it and/or modify
33it under the terms of the GNU General Public License as published by
34the Free Software Foundation; either version 2, or (at your option)
35any later version.
36
37This program is distributed in the hope that it will be useful,
38but WITHOUT ANY WARRANTY; without even the implied warranty of
39MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
40GNU General Public License for more details.
41
42You should have received a copy of the GNU General Public License
43along with this program; if not, write to the Free Software
44Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
45
46=cut
47my (%functions, $config);
48
49# need to do it to have its address
50#my %functions = ();
51# [ function name, matching regexp, [arguments list (same as above)]]
52
53$functions{disc} = [ 
54    [ "", "disc", 5, "[options] <disc config number> <size> <serial> <longname> <label>", "disc configuration file parameters", 
55    sub { my ($cd, $name, $size, $serial, $longname, $label) = @_;
56        $size = convert_size($size);
57        log_("disc: disc $cd size $size\n", $config->{verbose}, $config->{LOG},3);
58        $config->{disc}[$cd]{size} = $size;
59        $config->{disc}[$cd]{serial} = substr $serial, 0, 128;
60        $config->{disc}[$cd]{longname} = $longname;
61        $config->{disc}[$cd]{label} = substr $label, 0, 32;
62        if (!$config->{disc}[$cd]{appname}) { $config->{disc}[$cd]{appname} = substr $longname, 0, 128 }
63        1
64    }, "Setting disc configuration" ],
65    [ "d", "discnumber", 1 , "<disc real number>", "Set the real disc number", 
66    sub { my ($cd, $discnb) = @_;
67        log_("disc: disc $cd setting real disc number to $discnb\n", $config->{verbose}, $config->{LOG},3);
68        $config->{disc}[$cd]{name} = $discnb;
69    }, "Setting the real disc number" ],
70    [ "p", "publisher", 1 , "<disc publisher id>", "Set the disc publisher", 
71    sub { my ($cd, $publisher) = @_;
72        log_("disc: disc $cd setting publisher as $publisher\n", $config->{verbose}, $config->{LOG},3);
73        $config->{disc}[$cd]{Publisher} = substr $publisher, 0, 128;
74    }, "Setting the publisher ID flag" ]
75];
76
77$functions{list} = [ 
78    [ "", "list", -1, "[options] <list config number> <list config file 1> <list config file 2> ... <list config file n>", "list configuration file parameters", 
79    sub { 
80        my ($list, undef, @list_file) = @_;
81        log_("list: list $list file list @list_file\n", $config->{verbose}, $config->{LOG},3);
82        push @{$config->{list}[$list]{filelist}}, @list_file;
83        1
84    }, "Setting list configuration" ],
85    [ "k", "key", 1 , "<pubkey file>", "Select public key file associated with this list", 
86    sub { my ($list, $keyfile) = @_;
87        log_("list: list $list setting pubkey file $keyfile\n", $config->{verbose}, $config->{LOG},3);
88        push @{$config->{list}[$list]{keyfiles}}, $keyfile;
89        1
90    }, "Setting pubkey file" ],
91];
92
93$functions{rpmlist} = [ 
94   [ "", "rpmlist", 0, "[options]", "rpm list associated with a list", 
95   sub { 
96       my ($list) = @_;
97       push @{$config->{list}[$list]{packages}}, { };
98       1 
99   }, "Setting rpm list" ],
100   [ "b", "binaries", -1, "<rpm path 1> <rpm path 2> ... <rpm path n>", "rpm list associated with a list", 
101   sub { 
102       my ($list, undef, @rpms) = @_;
103       my $idx = $#{$config->{list}[$list]{packages}};
104       push @{$config->{list}[$list]{packages}[$idx]{rpm}}, @rpms;
105       1 
106   }, "Setting rpm list" ],
107   [ "d", "dynamic", -1, "<disc1/dir1> <disc2/dir2> ... <discn/dirn>", "dynamic rpm list based on disc generated by this config file", 
108   sub { 
109       my ($list, undef, @rpms) = @_;
110       foreach my $l (@rpms) {
111           my ($cd, $rep) = $l =~ m,(\d+)/(\S+), or log_("ERROR rpmlist: $l is not a valid <disc>/<rep> dynamic list definition\n", $config->{verbose}, $config->{LOG}, 1) and next;
112           #$config->{list}[$list]{prelist} = [ [ ".*", { regexp => 1 } ] ];
113           push @{$config->{list}[$list]{virtual}}, { disc => $cd, repname => $rep };
114       }
115       1
116   }, "Setting dynamic rpm list" ],
117   [ "s", "sources", -1, "<source path 1> <source path 2> ... <source path n>", "rpm list associated with a list",
118   sub {
119       my ($list, undef, @srpms) = @_;
120       my $idx = $#{$config->{list}[$list]{packages}};
121       push @{$config->{list}[$list]{packages}[$idx]{srpm}}, @srpms;
122       1
123   }, "Setting source rpm list" ],
124];
125
126$functions{dir} =
127        [
128            #0
129            [ "", "dir",2, "<directory name> <directory location>", "Set directory name",
130            sub {       my ($cd, $fn, $repname, $reploc) = @_;
131                my @a = ("dir", { repname => $repname, reploc => $reploc });
132                $config->{disc}[$cd]{function}{data}{dir}{$repname} and log_("WARNING: disc $cd: duplicate directory $repname ($reploc)\n", $config->{verbose}, $config->{LOG}, 3);
133                $config->{disc}[$cd]{function}{list}[$fn] = \@a;
134                $config->{disc}[$cd]{function}{data}{dir}{$repname} = \@a;
135                log_("dir: disc $cd rep $repname ($reploc)\n", $config->{verbose}, $config->{LOG}, 3);
136                push @{$config->{disc}[$cd]{steps}}, \@a;
137                1
138            }, "Setting directory" ],
139            # 1
140            [ "", "sep_arch", 0, "", "Create separate subdirs for each architecture", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{sep_arch} = 1 }, "Setting separate architecture flag for this dir" ]
141];
142#
143# generic options
144#
145# source => source dir
146#
147# done  => done
148#
149
150$functions{generic} =
151        [
152            # 0
153            ["", "generic", -2, "<directory name> <list1 name> <list2 name> ... <listn name>", "Copy rpms from one list or several lists to a directory. List is either a predefined list number of the configuration file or an other disc directory (e.g. 13/rpms2)",
154                sub {   
155                    my ($cd, $fn, $repname, @lists) = @_;
156                    $config->{disc}[$cd]{function}{data}{dir}{$repname} or log_("ERROR: disc $cd: $repname not defined\n", $config->{verbose}, $config->{LOG}, 0);
157                    my @a = ("generic", { repname => $repname });
158                    foreach my $list (@lists) {
159                        if ($list =~ /^\d+$/) {
160                            $config->{list}[$list] or log_("ERROR: lists $list does not exist, ignoring\n", $config->{verbose}, $config->{LOG}, 0) and next;
161                            push @{$a[1]{lists}}, $list;
162                        } else {
163                            log_("ERROR generic: $list is not a valid list name for rep $cd/$repname\n", $config->{verbose}, $config->{LOG}, 0) and next;
164                        }
165                    }
166                    log_("generic: disc $cd repname $repname lists @lists\n", $config->{verbose}, $config->{LOG}, 3);
167                    ref $a[1]{lists} or log_("ERROR generic: $cd/$repname has no valid list, ignoring\n", $config->{verbose}, $config->{LOG}, 0) and return;
168                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
169                    push @{$config->{disc}[$cd]{function}{data}{generic}{$repname}}, \@a;
170                    push @{$config->{disc}[$cd]{fastgeneric}}, \@a;
171                    push @{$config->{disc}[$cd]{steps}}, \@a;
172                    1
173                }, "Copying rpms to directory"],
174            # 1
175            ["s", "source", [
176            [ "", "source", 0, "", "Source mode configuration",
177                sub {   my ($tmp) = @_;
178                    $tmp->[0]{source} = 1;
179                }, "Source mode" ],
180# 2002 03 14 deprecated
181#           [ "p", "priority", 1, "<priority>", "Set the repository priority", sub { my ($tmp, $prio) = @_; $tmp->[0]{priority} = $prio}, "Setting source repository priority"]
182            ], "[options]", "Source mode setting",
183                sub { my ($cd, $fn, $options) = @_;
184                    foreach (keys %$options) { $config->{disc}[$cd]{function}{list}[$fn][1]{$_} = $options->{$_} }
185                    1
186                }, "Source mode option configuration"],
187            # 2
188            [ "", "synthesis", 0, "", "Add synthesis file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag" ],
189            # 3
190            [ "", "hdlist", 0, "", "Add hdlist file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{hdlist} = 1 }, "Setting hdlist tag" ],
191            # 4
192            [ "l", "limit", [
193                [ "", "limit", 1, "<limit>", "Source mode configuration",
194                    sub {       my ($tmp, $limit) = @_;
195                        $tmp->[0]{limit} = 1;
196                        $tmp->[0]{value} = $limit;
197                    }, "Limit mode" ],
198                [ "s", "soft",0, "", "Soft mode, do not limit size if disc is not full", sub { my ($tmp) = @_; $tmp->[0]{soft} = 1 } , "Setting soft limit flag" ]
199           
200            ], "[options] <limit>", "Limit the space of this directory on the disc",
201                sub { my ($cd, $fn, $options) = @_;
202                    $config->{disc}[$cd]{function}{list}[$fn][1]{limit} = $options
203                }, "Setting limit option" ],
204            # 5
205            [ "", "nodeps", 0, "", "Do not include deps", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nodeps} = 1 }, "Setting nodeps flag for this generic rep" ]
206        ];
207           
208           
209        #
210        # installation data
211        #
212$functions{installation} =
213        [
214        # 0
215            [ "", "installation", 0, "", "Preparing the installation directory and dependencies files",
216                sub {   my ($cd, $fn) = @_;
217                    my @a = ('installation', { });
218                    ref $config->{disc}[$cd]{function}{data}{installation} and log_("ERROR: disc $cd: duplicate installation procedure, ignored\n", $config->{verbose}, $config->{LOG}) and return 0;
219                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
220                    $config->{disc}[$cd]{function}{data}{installation} = \@a;
221                    push @{$config->{disc}[$cd]{steps}}, \@a;
222                    1
223                }, "Setting up installation files" ],
224    # 1
225            [ "b", "bootimg", 1, "<boot image>", "boot image for the cd", sub { my ($cd, $fn, $img) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = $img; 1 }, "Setting boot image" ],
226    # 2
227            [ "c", "compss", 1, "<compsUser file>", "Choose alternative compssUser file", sub { my ($cd, $fn, $compss) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{compssUsers} = $compss; 1 }, "Setting alternative compssUser file" ],
228    # 3
229            [ "f", "fixed", [
230                ["", "fixed", -1, "<repository> <extra RPMS directory 1> <extra RPMS directory 2> ... <extra RPMS directory n>", "Fixed repository option configuration",
231                    sub {       my ($tmp, @arg) = @_;
232                        $tmp->[0]{fixed} = 1;
233                        push @$tmp, @arg;
234                        1
235                    }, "Setting fixed option arguments"],
236                ["d", "dup", 0, "", "Duplicate mode, accept to put package present in already done discs", sub { my ($tmp) = @_; $tmp->[0]{dup} = 1; 1 }, "Setting duplicate mode"],
237                ["", "nodeps", 0, "", "Do not handle other discs dependencies", sub { my ($tmp) = @_; $tmp->[0]{nodeps} = 1; 1 }, "Setting nodeps mode"],
238                ["", "update", 0, "", "Update mode, update already done packages", sub { my ($tmp) = @_; $tmp->[0]{update} = 1; 1 }, "Setting update mode"]
239                ], "[options] <fixed dir 1> <fixed dir 2> ... <fixed dir n>", "repositories that must not be computed but integrated in the installation group",
240                    sub { my ($cd, $fn, $options, @fixed) = @_;
241                        get_rpmsdir('rpmsdir', $cd, $fn, \@fixed, $options);
242                        $config->{disc}[$cd]{function}{list}[$fn][1]{fixed} = 1;
243                    1 }, "Setting fixed option" ],
244            # 4 
245            [ "l", "lang", 1, "<languages to include>", "languages that are conisdered by the install", sub { my ($cd, $fn, $lang) = @_; my @l = split ',', $lang; push @{$config->{disc}[$cd]{function}{list}[$fn][1]{lang}},  @l; 1 }, "Setting language supported" ],
246            # 5
247            [ "i", "installdir", 1, "<installation directory source>", "Installation directory source", sub { my ($cd, $fn, $dir) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{install} = $dir; 1 }, "Setting install source directory" ],
248            # 6
249            [ "", "nosources", 0, "", "Do not add source rpm for this installation group", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nosources} = 1; 1 }, "Setting nosources tag for this installation group" ],
250            # 7
251            [ "", "nosrcfit", 0, "", "Do not stop if sources discs are full", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nosrcfit} = 1; 1 }, "Setting nosourcefit tag for this installation group" ],
252            # 8
253            [ "o", "sortweight", 1, "<list of respective ordering weight (size,dependencies,rpmsrate)>", "Set the weight for automatic sorting rules", sub { my ($cd, $fn, $weight) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{score} = [split ',', $weight]; 1 }, "Setting sorting weights" ],
254            # 9
255            [ "r", "rpmsrate", 1, "<rpmsrate file>", "Choose alternative rpmsrate", sub { my ($cd, $fn, $rpmsrate) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{rpmsrate} = $rpmsrate }, "Setting alternative rpmsrate file" ],
256            # 10
257            [ "t", "tag name", 1, "<tag name>", "Tag added to the VERSION file", sub { my ($cd, $fn, $tag) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{tag} = $tag }, "Setting the tag name" ],
258            # 11
259            [ "", "dup", 0, "", "Authorize duplicate version for this install", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{data}[$fn][1]{dup} = 1 }, "Setting the tag name" ],
260            # 12
261            [ "", "nodeps", 0, "", "Do not include deps", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{nodeps} = 1 }, "Setting nodeps flag for this installation" ],
262            # 13
263            [ "", "isolinux", 0, "", "Isolinux mode", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} = 1 }, "Build an isolinux install" ],
264            # 14
265            [ "", "synthesis", 0, "", "Add synthesis file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag" ],
266            # 15
267            [ "", "sequential", 0, "", "Build disc in a sequential way", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{sequential} = 1 }, "Setting sequential tag" ],
268            # 16
269            # FIXME oem mode never tested nor debugged
270            [ "", "oem", [
271                ["", "oem", 1, "[options] <rpms dir>", "OEM mode configuration",
272                    sub {       my ($tmp, @arg) = @_;
273                        $tmp->[0]{oem} = 1;
274                        push @$tmp, @arg;
275                        1
276                    }, "Setting oem option arguments"],
277                ["d", "dir", -1, "<installation dir> <root dir 1> ... <root dir n>", "Create OEM disc based on existing directories list",
278                    sub {
279                        my ($tmp, $instdir, @dir) = @_;
280                        $tmp->[0]{file} and log_("ERROR installation oem: could not use file and dir option in the same time, ignoring dir\n", $config->{verbose}, $config->{LOG}) and return 0;
281                        log_("dir $instdir @dir\n", $config->{verbose}, $config->{LOG}, 3);
282                        $tmp->[0]{instdir} = $instdir;
283                        $tmp->[0]{dir} = \@dir;
284                        1 }, "Selecting directories"],
285                ["h", "hdlists", 1, "<hdlists to include>", "Select hdlists to include (all if omitted)", sub { my ($tmp, $hdlists) = @_; $tmp->[0]{hdlists} = $hdlists; 1 }, "Selecting hdlists to include"],
286                ["f", "file", 2, "<script file> <installation disc>", "Script file describing the discs (generated with printscript)",
287                    sub {
288                        my ($tmp, $file, $instdisc) = @_;
289                        $tmp->[0]{dir} and log_("ERROR installation oem: could not use file and dir option in the same time, ignoring file\n", $config->{verbose}, $config->{LOG}) and return 0;
290                        $tmp->[0]{file} = $file;
291                        $tmp->[0]{instdisc} = $instdisc; 1
292                    }, "Setting update mode"],
293                ["l", "listfile", 1, "<list of package to choose>", "Choose an alternative method to select package to select in OEM mode (default is to use packages with rate greater than 2 in rpmsrate ", sub { my ($tmp, $file) = @_; $tmp->[0]{file} = $file; 1 }, "Selecting list file"],
294                ["n", "norebuild", 0, "", "Do not rebuild hdlists", sub { my ($tmp, $file) = @_; $tmp->[0]{norebuild} = 1; 1 }, "Setting no rebuilding flag"],
295                ["r", "rpmsrate", 1, "<rpmsrate file>", "Rpmsrate file to use for OEM mode (use the installation one if omitted)", sub { my ($tmp, $rpmsrate) = @_; $tmp->[0]{rpmsrate} = $rpmsrate; 1 }, "Setting rpmsrate file OEM file"]
296                ], "[options] <rpms dir>", "OEM mode",
297                    sub { my ($cd, $fn, $options, $rpmsdir) = @_;
298                    $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = $options;
299                    if ($options->{dir}) {
300                        my $list = @{$config->{list}};
301                        $config->{list}[$list]{prelist} = [
302                                [ "INSTALL", { section => 1, force => 1 } ],
303                                [ "SERVER", { section => 1, regexp => 1, exclude => 1 } ],
304                                [ ".*", { section => 4, regexp => 1 } ]
305                                        ];
306                        log_("installation oem: adding list $list for OEM mode\n", $config->{verbose}, $config->{LOG}, 3);
307                        my $hdlists = "$options->{instdir}/Mandrake/base/hdlists";
308                        local *A; open A, $hdlists or die "ERROR oem: could not open hdlists $hdlists file";
309                        my $i;
310                        while (<A>) {
311                            my ($hdlist, $rep, $mname) = /(\S+)\s+(\S+)\s+(.*)/ or next;
312                            log_("$i -- $hdlist -- $rep -- $options->{dir}[$i]\n", $config->{verbose}, $config->{LOG}, 4);
313                            $options->{dir}[$i] or last;
314                            push @{$options->{hdlist}}, [ "$options->{instdir}/Mandrake/base/", $hdlist, $rep, $mname ];
315                            push @{$config->{list}[$list]{packages}}, [ { rpm => [ "$options->{dir}[$i]/$rep"]  } ];
316                            $i++
317                        }
318                        for ($rpmsdir) {
319                            my ($cdrep, $repname) = m,^(\d+)/([^/]+)$,;
320                            my $gfn = @{$config->{disc}[$cdrep]{function}{list}};
321                            log_("installation oem: adding function $gfn for generic oem packages on cd $cdrep\n", $config->{verbose}, $config->{LOG}, 4);
322                            $functions{generic}[0][5]($cdrep, $gfn, $repname, $list);
323                            if ($cd == $cdrep) {
324                                # FIXME trick to have this generic function done before the installation
325                                my $a = pop @{$config->{disc}[$cdrep]{steps}};
326                                unshift @{$config->{disc}[$cdrep]{steps}}, $a
327                            }
328                            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir}}, [ $list, $cdrep, $repname, { oem => 1 } ];
329                        }
330                    } elsif ($options->{file}) {
331                        my $oemconfig;
332                        config($options->{file}, $oemconfig, \%functions);
333                        my ($discsFiles) = readBatchFile($options->{file}) or log_("ERROR installation oem: cannot read script file $options->{file}\n", $config->{verbose}, $config->{LOG}) and return 0;
334                        my $list = @{$config->{list}};
335                        log_("installation oem: adding list $list for OEM mode\n", $config->{verbose}, $config->{LOG}, 3);
336                        foreach (@{$config->{list}}) {
337                            $_ or next;
338                            push @{$config->{list}[$list]{packages}}, @{$_->{packages}}
339                        }
340                        my $gfn = @{$config->{disc}[$cd]{function}{list}};
341                        $config->{list}[$list]{prelist} = [[ ".*", { section => 3, regexp => 1 } ]];
342                        log_("installation oem: adding function $gfn for generic oem packages\n", $config->{verbose}, $config->{LOG}, 3);
343                        $functions{generic}[0][5]($cd, $gfn, "rpms", $list);
344                    } else {
345                        log_("ERROR installation oem: no disc to build OEM on (either file or dir option are needed)\n", $config->{verbose}, $config->{LOG});
346                        $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = 0;
347                        return 0
348                    }
349                    1 }, "Setting oem option" ],
350            # 17
351            [ "s", "sources", -1, "<srpms directory name 1> <srpms directory name 2> ... <srpms directory name n>", "Select the sources list where to put packages",
352                sub { my ($cd, $fn, @sources) = @_;
353                    get_rpmsdir('srpmsdir', $cd, $fn, \@sources);
354                    $config->{disc}[$cd]{function}{list}[$fn][1]{sources} = 1;
355                    1 }, "Setting fixed option" ],
356            # 18
357            [ "d", "rpmsdir", -1, "<rpms directory 1 cd/rpms directory 1 name/rpms directory 1 list> <rpms directory 2 cd/rpms directory 2 name/rpms directory 2 list> ... <rpms directory n cd/rpms directory n name/rpms directory n list>", "Select rpms dir to take into account",
358                sub {   my ($cd, $fn, @rpms) = @_;
359                    get_rpmsdir('rpmsdir', $cd, $fn, \@rpms);
360                    1
361                }, "Setting rpms dir" ],
362            # 19
363            [ "", "boot_medium", 1, "<boot medium number>", "select alternatives boot medium",
364                sub {   my ($cd, $fn, $nb) = @_;
365                    $config->{disc}[$cd]{function}{list}[$fn][1]{boot_medium} = $nb;
366                    1
367                }, "Setting rpms dir" ] ];
368#
369#
370# advertising option
371#
372#    img
373#    lang (new advertising mode in 8.2 deprecates this option)
374#   
375
376$functions{advertising} =
377        [
378            [ "", "advertising", -1, "<picture 1> <picture 2> ... <picture n>", "Setting the advertising pictures used by the installation",
379                sub { my ($cd, $fn, @img) = @_;
380                    my @a = ('advertising', { img => \@img }); 
381                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
382                    push @{$config->{disc}[$cd]{function}{data}{advertising}}, \@a;
383                    push @{$config->{disc}[$cd]{steps}}, \@a
384                }, "Setting the advertising pictures" ],
385         [ "l", "lang", 1, "<language>", "Set the advertising picture language", sub { my ($cd, $fn, $lang) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{lang} = $lang; 1 }, "Setting the picture language" ]
386];
387
388#
389# cdcom data
390#
391#      dir
392#
393#      source
394#
395$functions{cdcom} =
396         [
397            [ "", "cdcom", 2, "<directory name> <disc directory location>", "Commercial disc",
398                sub { my ($cd, $fn, $dir, $source) = @_;
399                    my @a = ('cdcom', { dir => $dir, source => $source });
400                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
401                    push @{$config->{disc}[$cd]{function}{data}{cdcom}}, \@a;
402                    my $list = @{$config->{list}};
403                    log_("cdcom: disc $cd adding list $list for $source/Mandrake/RPMS\n", $config->{verbose}, $config->{LOG}, 3);
404                    $config->{list}[$list]{packages} = [ { rpm => [ "$source/Mandrake/RPMS" ] } ];
405                    # $config->{list}[$list]{prelist} = [[ ".*", { regexp => 1 }]];
406                    $config->{list}[$list]{done} = 1;
407                    $config->{list}[$list]{nosize} = 1;
408                    push @{$config->{disc}[$cd]{fastgeneric}}, [ '', { repname => $dir , lists => [ $list ] } ];
409                    push @{$config->{disc}[$cd]{steps}}, \@a;
410                    1
411                }, "Configuring a commercial disc" ],
412            [ "d", "dest", 1, "<destination on the disc>", "Select the destination directory on the disc", sub { my ($cd, $fn, $dest) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{dest} = $dest; 1 }, "Selecting destination directory" ]
413];
414#
415# cp
416#
417$functions{cp} =
418        [
419            [ "", "cp", 2, "<file source> <file destination>", "Copy",
420                sub { my ($cd, $fn, $src, $dest) = @_;
421                    my @a = ('cp', { src => $src, dest => $dest });
422                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
423                    push @{$config->{disc}[$cd]{function}{data}{cp}}, \@a;
424                    push @{$config->{disc}[$cd]{steps}}, \@a;
425                    1
426        }, "Copying files" ],
427     # 1
428        [ "", "first", 0, "", "Remove files in the files copied with first option",
429            sub {
430                my ($cd, $fn) = @_;
431                $config->{disc}[$cd]{function}{list}[$fn][1]{first} = 1;
432                1
433            }, "Setting first flag"
434        ],
435];
436 #
437 # boot
438 #
439$functions{boot} =
440    [
441    # 0
442        [ "", "boot", 0, "<options> <files or dir to copy 1> <files or dir to copy 2> .. <files or dir to copy 3>", "Boot parameters and files",
443            sub {   my ($cd, $fn) = @_;
444                    my @a = ('boot', { });
445                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
446                    push @{$config->{disc}[$cd]{function}{data}{boot}}, \@a;
447                    push @{$config->{disc}[$cd]{steps}}, \@a;
448                    1
449          }, "Setting boot parameters"
450        ],
451          # 1
452        [ "", "isolinux", [
453                ["", "isolinux", 1, "<isolinux directory>", "Create an isolinux bootable disc",
454                    sub {       my ($tmp, @args) = @_;
455                        $tmp->[0]{isolinux} = 1;
456                        push @$tmp, @args
457                    }, "Setting an isolinux boot disc"],
458                ], "<options> <isolinux directory>", "isolinux boot disc",
459                    sub { my ($cd, $fn, $options, $dir) = @_;
460                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot} }) {
461                                ref $_->[1]{isolinux} and log_("ERROR: disc $cd: duplicate isolinux boot image, ignored\n", $config->{verbose}, $config->{LOG}) and return 0;
462                        }
463                        $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} =  [$dir, $options]
464                    }, "Setting isolinux image"
465        ],
466          #2
467        [ "b", "bootimg", [
468            [ "", "bootimg", 1, "<boot image name>", "set boot image name",
469                    sub { my ($tmp, @args) = @_;
470                        $tmp->[0]{bootimg} = 1;
471                        push @$tmp, @args
472                    }, "setting boot image name"
473            ],
474            [ "d", "dir", 1, "<directory>", "duplicate the boot image in directory and put it first in the ISO",
475               sub { my ($tmp, $dir) = @_; $tmp->[0]{dir} = $dir }, "" 
476            ]
477                ], "<options> <boot image>", "Create a bootable iso with given image",
478                    sub { my ($cd, $fn, $options, $img) = @_;
479                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot} }) {
480                                ref $_->[1]{bootimg} and log_("ERROR: disc $cd: duplicate boot image, ignored\n", $config->{verbose}, $config->{LOG}) and return 0;
481                        }
482                        $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = [$img, $options]
483                    }, "Setting boot image options"
484        ],
485          #3
486        [ "d", "dest", [
487                [ "", "dest", -2, "<destination> <file 1> <file 2> .. <file n>", "Set options for files copied to a given destination",
488                    sub { my ($tmp, @args) = @_;
489                        $tmp->[0]{dest} = $args[0];
490                        push @$tmp, @args
491                   
492                    }, "Setting dest options" ],
493                [ "f", "first", 0 , "", "Put this files first in the ISO", sub { my ($tmp) = @_; $tmp->[0]{first} = 1; 1 }, "Setting first flag for files" ]
494            ], "[options] <destination> <files 1> <files 2> .. <files n>", "Copy files to a special destination",
495                sub { my ($cd, $fn, $options, @files) = @_;
496                    foreach (@files) {
497                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_, $options ]
498                    }
499                    1
500                },
501            "Setting isolinux boot file"
502            ],
503          #4
504        [ "f", "files", -1, "<file 1> <file 2> <file 3>", "Files to copy",
505            sub { my ($cd, $fn, @files) = @_;
506                foreach (@files) {
507                    push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_ ]
508                }; 1
509            }, "files to copy"
510        ],
511          #5
512        [ "", "first", -1, "<file 1> <file 2> <file 3>", "Set first flag to put files in the beginning of the ISO",
513            sub { my ($cd, $fn, @files) = @_;
514                foreach (@files) {
515                    push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_, { first => 1 } ]
516                }
517                1
518            }, "Setting first flag"
519        ],
520        #5
521        [ "", "oem", 0, "", "Set default boot to oem mode",
522            sub { my ($cd, $fn) = @_;
523                $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = 1
524            }, "Setting oem boot mode"
525        ],
526
527];
528
529#
530# clone
531#
532$functions{clone} =
533    [
534    # 0
535        [ "", "clone", 1, "<disc to clone>", "Clone the given disc",
536            sub {   my ($cd, $fn, $disc) = @_;
537                    my @a = ('clone', { disc => $disc });
538                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
539                    push @{$config->{disc}[$cd]{function}{data}{clone}}, \@a;
540                    push @{$config->{disc}[$cd]{steps}}, \@a;
541                    1
542          }, "Setting clone parameters"
543        ],
544          # 1
545        [ "i", "include", -2, "<directory name 1> <directory path 1> <directory name 2> <directory path 2> ... <directory name n> <directory path n>", "include declaration of copied directory",
546            sub {   my ($cd, $fn, @dir) = @_;
547                    my $list = @{$config->{list}};
548                    while (@dir) {
549                        my $rpmdir = shift @dir;
550                        my $path = shift @dir or last;
551                        $config->{disc}[$cd]{function}{data}{dir}{$rpmdir} = [ "clone_dir", { reploc => $path }  ] ;
552                        $config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir} = $path;
553                        log_("clone: disc $cd adding list $list for virtual rep $rpmdir path $path\n", $config->{verbose}, $config->{LOG},3);
554                        $config->{list}[$list]{virtual} = [ { disc => $cd, repname => $rpmdir } ];
555                        push @{$config->{disc}[$cd]{fastgeneric}}, [ '', { repname => $rpmdir, lists => [ $list ] } ];
556                    }
557                    $config->{list}[$list]{done} = 1;
558                    1
559            }, "Setting directory name and path parameters"
560        ]
561#       [ "d", "delete", -1, "<function 1 nb to delete> <function 1 nb to delete> ... <function n nb to delete>", "delete these functions in the cloned disc",
562#           sub {   my ($cd, $fn,@to_del) = @_;
563#                   $config->{disc}[$cd]{function}{list}[$fn][1]{to_del} = \@to_del;
564#                   1
565#           }, "Setting delete parametes"
566#       ]
567];
568
569#
570# rm
571#
572$functions{rm} =
573    [
574     # 0
575        [ "", "rm", -1, "<disc to rm>", "Delete the given file or directory on the disc image",
576            sub {   my ($cd, $fn, @files) = @_;
577                    my @a = ('rm', { files => \@files });
578                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
579                    push @{$config->{disc}[$cd]{function}{data}{files}}, \@a;
580                    push @{$config->{disc}[$cd]{steps}}, \@a;
581                    1
582          }, "Setting rm parameters"
583        ],
584     # 1
585        [ "", "first", 0, "", "Remove files in the files copied with first option",
586            sub {
587                my ($cd, $fn) = @_;
588                $config->{disc}[$cd]{function}{list}[$fn][1]{first} = 1;
589                1
590            }, "Setting first flag"
591        ],
592];
593
594sub new {
595    my ($class, $conf) = @_;
596    $config = $conf;
597    bless {
598        config       => $conf,
599        functions    => \%functions
600    }, $class;
601}
602
603sub get_rpmsdir {
604    my ($type, $cd, $fn, $rpms, $opts) = @_;
605    foreach (@$rpms)  {
606        log_("get_rpmsdir: $_\n", $config->{verbose}, $config->{LOG}, 3);
607        if (my ($hdlist, $hdlist_path, $hdlist_name) = m/hdlist:([^,]+),([^,]+),(.*)/) {
608            if (!$config->{disc}[$cd]{function}{list}[$fn][1]{fixed}) {
609                $config->{disc}[$cd]{function}{list}[$fn][1]{fixed} = 1;
610                log_("WARNING get_rpmsdir: hdlist rpmsdir could only be fixed, forcing fixed flag\n", $config->{verbose}, $config->{LOG}, 0);
611            }
612            my $list = add_list($cd, "hdlist_rpm", $hdlist);
613            my $new_cd = @{$config->{disc}};
614            log_("get_rpmsdir: adding virtual disc $new_cd for hdlist $hdlist (path $hdlist_path disc_name $hdlist_name)\n", $config->{verbose}, $config->{LOG}, 3);
615            push @{$config->{virtual_disc}}, $new_cd;
616            $functions{disc}[0][5]->($new_cd, $hdlist_name, 0, 0, $hdlist_name, 0);
617            $functions{dir}[0][5]->($new_cd, 1, "rpms", $hdlist_path);
618            $functions{generic}[0][5]->($new_cd, 2, "rpms", $list);
619            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{$type}}, [ $list, $new_cd, 'rpms', { hdlist => $hdlist } ]
620        } elsif (my ($opt, $cdrep, $repname, $list) = m,(noauto:)?(\d+)/([^/]+)(?:/(\d+))?,) {
621            chop $opt;
622            my %options;
623            foreach (split ',', $opt)  { $options{$_} = 1 }
624            foreach (keys %$opts)  { $options{$_} = $opts->{$_} }
625            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{$type}}, [ $list, $cdrep, $repname, \%options ]
626        } else {
627            log_("ERROR get_rpmsdir: could not parse rpmsdir value $_\n", $config->{verbose}, $config->{LOG}, 0);
628        }
629    }
630}
631
632sub add_list {
633    my ($cd, $type, $pkg_list) = @_;
634    my $list = @{$config->{list}};
635    log_("add_list: disc $cd adding list $list for $type $pkg_list\n", $config->{verbose}, $config->{LOG}, 3);
636    $config->{list}[$list]{packages} = [ { $type => [ $pkg_list ] } ];
637    $config->{list}[$list]{done} = 1;
638    $config->{list}[$list]{nosize} = 1;
639    $list
640}
641
642sub template {
643    my ($class, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
644    if (!$fixed) {
645        my $size;
646        if ($nolive) {
647            return $size
648        } else {
649
650        }
651    } elsif ($fixed == 1) {
652        my $mkiso;
653        if ($nolive) {
654        } else {
655           
656        }
657    } elsif ($fixed == 2) {
658        my $mkiso;
659        if ($nolive) {
660        } else {
661           
662        }
663    }   
664}
665
666sub clone {
667    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
668    my $graft = $totgraft->{$cdnum};
669    my $disc_src = $fct->[1]{disc};
670    if ($fixed == 0) {
671        if ($nolive) {
672            if ($fct->[1]{full_copy}) {
673                log_("clone: full copy of disc $disc_src nolive mode\n", $config->{verbose}, $config->{LOG},2);
674                if ($totgraft->{$disc_src}) {
675                    log_("clone: getting disc from current build\n", $config->{verbose}, $config->{LOG},3);
676                    $graft = $totgraft->{$disc_src}
677                } elsif (-d "$dir/$disc_src") {
678                    log_("clone: getting disc from filesystem\n", $config->{verbose}, $config->{LOG},3);
679                    $graft->{"/"}{"$dir/$disc_src"} = 1
680                } else {
681                    log_("ERROR clone: source disc not available\n", $config->{verbose}, $config->{LOG},3);
682                }
683            }
684        } else {
685            if ($fct->[1]{full_copy}) {
686                log_("clone: full copy of disc $disc_src\n", $config->{verbose}, $config->{LOG},2);
687                if (-d "$dir/$disc_src") {
688                    log_("clone: getting disc from filesystem\n", $config->{verbose}, $config->{LOG},3);
689                    $graft->{"/"}{"$dir/$disc_src"};
690                    cpal("$dir/$disc_src/", "$dir/$cdnum");
691                } else {
692                    log_("ERROR clone: source disc not available\n", $config->{verbose}, $config->{LOG},3);
693                }
694            }
695        }
696    }
697    1
698}
699
700sub rm {
701    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
702    my $graft = $totgraft->{$cdnum};
703    my $files = $fct->[1]{files};
704#    use File::Find;
705    if ($fixed == 0) {
706        if ($nolive) {
707            # FIXME this does not really works in no live mode (exclude files does not work with mkisofs properly)
708            my $size;
709            foreach my $r (@$files) {
710                log_("rm: trying $r\n", $config->{verbose}, $config->{LOG},2);
711                $graft->{$r} = 3;
712                $r =~ s/\*/.+/;
713                foreach my $g (keys %$graft) {
714                    ref $graft->{$g} or next;
715                    log_("rm: graft $g ($r)\n", $config->{verbose}, $config->{LOG},3);
716                    if ($g =~ m,^/?$r/?$,) {
717                        foreach my $f (keys %{$graft->{$g}}) {
718                             $size -= du $f
719                        }
720                        $graft->{$g} = 0;
721                        log_("rm: deleting $g (size $size)\n", $config->{verbose}, $config->{LOG},4);
722                    }
723                }
724            }
725#           my @find;
726#           foreach my $k (keys %$graft){
727#               ref $graft->{$k} or next;
728#               foreach my $f (keys %{$graft->{$k}}){
729#                   $f =~ s|/{2,}|/|g;
730#                   find({ wanted => sub { s,/?\Q$f,,; $_ = "$k/$_"; s|/{2,}|/|g; push @find, [ $f, $_ ] }, no_chdir => 1 }, $f);
731#               }
732#           }
733#           foreach (@$files) { s|/{2,}|/|g }
734#           foreach my $t (@find){
735#               my ($k, $f) = @$t;
736#               foreach my $r (@$files){
737#                   next if $f =~ m,^/?$r/[^/]+,;
738#                   if ($f =~ m,^/?$r/?$,){
739#                       log_("rm: deleting $f (path $k regexp $r)\n", $config->{verbose}, $config->{LOG});
740#                       $graft->{$f} = 0;
741#                       $size -= du $k;
742#                       $size -= du "$k/$f";
743#                   }
744#               }
745#           }
746            return $size
747        } else {
748            my $first = "first/" if $fct->[1]{first};
749            foreach (@$files) {
750                my @file = glob "$dir/$first$cdnum/$_";
751                foreach my $f (@file) {
752                    if (-d $f) {
753                        log_("rm: deleting directory $f\n", $config->{verbose}, $config->{LOG}, 2);
754                        my $err = rmtree $f;
755                        if (!$err) { log_("ERROR rm: deleting $f failed: $!,\n", $config->{verbose}, $config->{LOG}) }
756                    } else {
757                        log_("rm: deleting file $f\n", $config->{verbose}, $config->{LOG},2);
758                        my $err = unlink $f;
759                        if (!$err) { log_("ERROR rm: deleting $f failed: $!,\n", $config->{verbose}, $config->{LOG}) }
760                    }
761                }
762            }
763            return 
764        }
765    }
766    1
767}
768
769sub cp {
770    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode) = @_;
771    my $graft = $totgraft->{$cdnum};
772    if (!$fixed) {
773        my $size;
774        my $source = $fct->[1]{src};
775        my $dest = $fct->[1]{dest};
776        if ($nolive) {
777            $size += du($source, $inode);
778            log_("cp: copying $source => $dest (size $size)\n", $config->{verbose}, $config->{LOG},1);
779            $graft->{"/$dest"}{$source} = 1;
780            return $size
781        } else {
782            my $first = "first/" if $fct->[1]{first};
783            cpal($source, "$dir/$first$cdnum/$dest");
784            $graft->{"$dir/$cdnum/$dest"}{$source} = 1;
785            return
786        }
787    }
788}
789
790sub cdcom {
791    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode) = @_;
792    my $graft = $totgraft->{$cdnum};
793    if (!$fixed) {
794        my $size;
795        my $source = $fct->[1]{source};
796        my $dest = $config->{disc}[$cdnum]{function}{data}{dir}{$fct->[1]{dir}}[1]{reploc};
797        my $destination = $fct->[1]{dest};
798        my $uppath = $destination;
799        $uppath =~ s,([^/]+),../,g;
800        $uppath =~ s,/+,/,g;
801        log_("DEST: $destination uppath $uppath dest $dest\n", $config->{verbose}, $config->{LOG},3);
802        my $fdest = "$dir/$cdnum/$destination";
803        if ($nolive) {
804            my $path = "$dir/$cdnum/$dest";
805            -d $path or mkpath $path;
806            opendir my $A, $source;
807            log_("cdcom: $source\n", $config->{verbose}, $config->{LOG},3);
808            foreach (readdir $A) {
809                /^\.{1,2}$/ and next;
810                if (! /^Mandrake$/) {
811                    $size += du("$source/$_", $inode);
812                    log_("cdcom: adding $_ (size $size)\n", $config->{verbose}, $config->{LOG},4);
813                    $graft->{"/$destination/$_/"}{"$source/$_"} = 1
814                } else {
815                    $graft->{"/$dest/"}{"$source/Mandrake/RPMS/"} = 1
816                }
817            }
818            #local *A; opendir A, "$source/Mandrake/RPMS";
819            #foreach (readdir A){
820            #    /^\.{1,2}$/ and next;
821            #    my $newdest = readlink "$source/Mandrake/RPMS/$_";
822            #    $newdest =~ s,((?:../))*(.*), $1/$destination/$2,;
823            #    log_("cdcom: creating symlink $dest/$_ => $newdest\n", $config->{verbose}, $config->{LOG});
824            #    my $err = symlink $newdest, "$dir/$cdnum/$dest/$_";
825            #    !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG}) and next;
826            #    $graft->{"/$dest/"}{"$dir/$cdnum/$dest/$_"} = 1
827            #}
828            #$graft->{"/$dest/"}{"$source/Mandrake/RPMS"} = 1;
829            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n", $config->{verbose}, $config->{LOG}, 4);
830            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
831            !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG});
832            $graft->{"/"}{"$fdest/RPMS"} = 1;
833            return $size
834        } else {
835            -f $fdest or mkpath $fdest;
836            cpal($source, $fdest, "Mandrake/RPMS");
837            local *A; opendir A, "$source/Mandrake/RPMS";
838            foreach (readdir A) {
839                /^\.{1,2}$/ and next;
840                my $newdest = readlink "$source/Mandrake/RPMS/$_";
841                $newdest =~ s,((?:../)*)(.*),$1$destination/$2,;
842                log_("cdcom: creating symlink $dir/$cdnum/$dest/$_ => $dir/$cdnum/$dest/$newdest\n", $config->{verbose}, $config->{LOG},2);
843                my $err = link "$dir/$cdnum/$dest/$newdest", "$dir/$cdnum/$dest/$_";
844                # should be OK with new du with inode checking
845                #$size -= du("$dir/$cdnum/$dest/$newdest");
846                !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG})
847            }
848            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n", $config->{verbose}, $config->{LOG});
849            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
850            !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG});
851            return $size
852        }
853    }
854}
855
856sub printSize {
857    my ($img, $file) = @_;
858    local *A; open A, ">$file";
859    my $size = imageSize($img);
860    log_("printSize: creating $file for $img\n", $config->{verbose}, $config->{LOG});
861    if ($size) {
862        print A <<EOF
863#!/usr/bin/perl
864
865\$width = $size->[0];
866\$height = $size->[1];
867\@data = ()
868EOF
869    } else {
870        print "ERROR advertising: $size/n";
871        return 0
872    }
873}
874
875sub advertising {
876    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode) = @_;
877    my $graft = $totgraft->{$cdnum};
878    if (!$fixed) {
879        my $size;
880        if ($nolive) {
881            log_("Getting advertising images size\n", $config->{verbose}, $config->{LOG});
882            my $addir = "Mandrake/share/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
883            my $rep = "$dir/$cdnum/$addir";
884            -d $rep or mkpath $rep;
885            local *L; open L, ">$rep/list";
886            foreach (@{$fct->[1]{img}}) {
887                s/\.png$//;
888                my ($name) = m,([^/]*)$,;
889                $size += du($_, $inode);
890                print L "$name\n";
891                if (-f "$_.png") { $graft->{"$addir/$name.png"}{"$_.png"} = 1 } else { next }
892                if (-f "$_.pl") { $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
893                } else {
894                    printSize("$_.png", "$rep/$name.pl");
895                    $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
896                }
897                -f "${_}_icon.png" and $graft->{"$addir/$name-icon.png"}{"${_}_icon.png"} = 1
898            } 
899            close L;
900            $graft->{"$addir/list"}{"$rep/list"} = 1;
901            $size += du("$rep/list");
902            return $size
903        } else {
904            log_("Creating advertising images directory\n", $config->{verbose}, $config->{LOG});
905            my $rep = "$dir/$cdnum/Mandrake/share/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
906            -d $rep or mkpath $rep;
907            local *L; open L, ">$rep/list";
908            foreach (@{$fct->[1]{img}}) {
909                s/\.png$//;
910                my ($name) = m,([^/]*)$,;
911                if (-f "$_.png") { cpal("$_.png", "$rep/$name.png") } else { next }
912                if (-f "$_.pl") { cpal("$_.pl", "$rep/$name.pl") } else { printSize("$_.png", "$rep/$name.pl") }
913                -f "${_}_icon.png" and cpal("${_}_icon.png", "$rep/${name}_icon.png");
914                print L "$name.png\n"
915            }
916            close L;
917            return
918        }
919    }
920}
921
922sub dir {
923    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd) = @_;
924    if (!$fixed) {
925        if ($nolive) {
926            return 0
927        } else {
928            my $reploc = "$dir/$cdnum/$fct->[1]{reploc}";
929            log_("dir: creating $reploc\n", $config->{verbose}, $config->{LOG});
930            -d $reploc or mkpath $reploc;
931            return 0   
932        }
933    }
934}
935
936sub generic {
937    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFile) = @_;
938    my $graft = $totgraft->{$cdnum};
939    if ($fixed) {
940        my $rep = $fct->[1]{repname};
941        my $lists = $fct->[1]{lists};
942        log_("generic: rep $rep\n", $config->{verbose}, $config->{LOG});
943        my $dest_dir = $cd->{function}{data}{dir}{$rep}[1];
944        my $reploc = "$dir/$cdnum/$dest_dir->{reploc}/";
945        my $sep_arch = $dest_dir->{sep_arch};
946        if ($nolive) {
947            my $size;
948            my $nolive_rep = $dest_dir->{reploc};
949            if ($fixed > 0) {
950                foreach my $list (@$lists) {
951                    foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
952                        log_("generic: src $src\n", $config->{verbose}, $config->{LOG});
953                        foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
954                            if ($_->[0] == 1) {
955                                my $d = $nolive_rep;
956                                if ($sep_arch) {
957                                    $_->[1] =~ /([^.]+)\.rpm$/;
958                                    $d .= "/$1";
959                                }
960                                $graft->{"$d/$_->[1]"}{"$src/$_->[1]"} = 1
961                            } elsif ($_->[0] == 2) {
962                                my $d = $nolive_rep;
963                                if ($sep_arch) {
964                                    $_->[1] =~ /([^.]+)\.rpm$/;
965                                    $d .= "/$1";
966                                }
967                                delete $graft->{"$d/$_->[1]"}{"$src/$_->[1]"} 
968                            }
969                        }
970                    }
971                    if ($fct->[1]{synthesis} || $fct->[1]{hdlist}) {
972                        if (ref $discsFile->[$cdnum]{$rep}{$list}) {
973                            buildGenericHdlist($dir, $cdnum, $fct, $rep, $reploc, $discsFile->[$cdnum]{$rep}{$list}, $sep_arch);
974                            if ($fct->[1]{hdlist})  {
975                                #$size += du("$dir/$cdnum/$reploc/hdlist$cdnum$rep.cz");
976                                #$graft->{"Mandrake/base/hdlist$cdnum$rep.cz"}{"$reploc/hdlist$cdnum$rep.c"} = 1
977                                $size += du("$dir/$cdnum/$reploc/hdlist.cz");
978                                $graft->{"Mandrake/base/hdlist.cz"}{"$reploc/hdlist.cz"} = 1
979                            }
980                            if ($fct->[1]{synthesis}) {
981                                #$size += du("$dir/$cdnum/$reploc/synthesis.hdlist$cdnum$rep.cz");
982                                #$graft->{"$nolive_rep/synthesis.hdlist$cdnum$rep.cz"}{"$reploc/synthesis.hdlist$cdnum$rep.cz"} = 1
983                                $size += du("$dir/$cdnum/$reploc/synthesis.hdlist.cz");
984                                $graft->{"$nolive_rep/synthesis.hdlist.cz"}{"$reploc/synthesis.hdlist.cz"} = 1
985                            }
986                        } else {
987                            log_("WARNING generic: disc $cd rep $rep list $list is empty, no hdlist or synthesis created\n", $config->{verbose}, $config->{LOG});
988                        }
989                    }
990                }
991            }
992            return $size
993        } else {
994            foreach my $list (@$lists) {
995                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
996                    log_("generic: src $src\n", $config->{verbose}, $config->{LOG});
997                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
998                        if ($_->[0] == 1) {
999                            my $d = $reploc;
1000                            if ($sep_arch) {
1001                                $_->[1] =~ /([^.]+)\.rpm$/;
1002                                $d .= "/$1";
1003                                -d $d or mkdir $d;
1004                            }
1005                            cpal("$src/$_->[1]", $d)   
1006                        }  elsif ($_->[0] == 2) {
1007                            log_("generic: deleting $reploc/$_->[1]\n", $config->{verbose}, $config->{LOG});
1008                            my $d = $reploc;
1009                            if ($sep_arch) {
1010                                $_->[1] =~ /([^.]+)\.rpm$/;
1011                                $d = "$reploc/$1";
1012                            }
1013                            unlink "$d/$_->[1]";
1014                        }
1015                    }
1016                }
1017                if ($fct->[1]{synthesis} || $fct->[1]{hdlist}) {
1018                    if (ref $discsFile->[$cdnum]{$rep}{$list}) {
1019                        buildGenericHdlist($dir, $cdnum, $fct, $rep, $reploc, $discsFile->[$cdnum]{$rep}{$list}, $sep_arch);
1020                    } else {
1021                        log_("WARNING generic: disc $cd rep $rep list $list is empty, no hdlist or synthesis created\n", $config->{verbose}, $config->{LOG});
1022                    }
1023                }
1024            }
1025            return 0
1026        }
1027    }
1028}
1029
1030sub printVERSION {
1031    my ($name, $file, $tag) = @_;
1032    local *A; open A, ">$file";
1033    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
1034    $year += 1900;
1035    printf A "Mandrake Linux $name $tag %04d%02d%02d $hour:%02d\n", $year, $mon+1, $mday, $min;
1036}
1037
1038sub buildGenericHdlist {
1039    my ($dir, $cdnum, $fct, $rep, $reploc, $discsFilescdrep, $sep_arch) = @_;
1040    my @rpm = map { "$discsFilescdrep->{$_}/$_.rpm" } keys %$discsFilescdrep;
1041   
1042    if ($fct->[1]{synthesis}) {
1043        -d $reploc or mkpath $reploc;
1044    }
1045    # $hdlist = "$reploc/hdlist$cdnum$rep.cz" if $fct->[1]{hdlist};
1046    # my $synthesis = "$reploc/synthesis.hdlist$cdnum$rep.cz" if $fct->[1]{synthesis};
1047    my $hdlist = "$reploc/hdlist.cz" if $fct->[1]{hdlist};
1048    my $synthesis = "$reploc/synthesis.hdlist.cz" if $fct->[1]{synthesis};
1049    mkcd_build_hdlist(1, [ 0, { hdlist => $hdlist, rpms => \@rpm , synthesis => $synthesis } ], "$config->{tmp}/.mkcd_build_hdlist");
1050}
1051
1052sub buildInstallHdlist {
1053    my ($dir, $cdnum, $inst, $list, $discsFiles) = @_;
1054    my (@hdlist, @hdlist_list);
1055    -d "$dir/$cdnum/Mandrake/base/" or mkpath "$dir/$cdnum/Mandrake/base/";
1056    open my $A, ">$dir/$cdnum/Mandrake/base/hdlists";
1057    my %rpmdone;
1058    my $repnum = 1;
1059    my (@thisInstallRep, @check, @md5files);
1060    my $headers_dir = "$config->{tmp}/.mkcd_build_hdlist";
1061    my $path = "$dir/$cdnum/Mandrake/base";
1062    foreach my $rd (@{$inst->[1]{rpmsdir}}) {
1063        my ($ls, $cdrep, $repname, $opts) = @$rd;
1064        $list->{$cdrep} or log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n", $config->{verbose}, $config->{LOG}) and next;
1065        my $a = $discsFiles->[$cdrep]{$repname};
1066        if (!(ref($a) && %$a)) { log_("WARNING buildInstallHdlist: $cdrep/$repname is empty\n", $config->{verbose}, $config->{LOG}); next }
1067        my $realcd = $config->{disc}[$cdrep]{name};
1068        my $rpmdir = $config->{disc}[$cdrep]{function}{data}{dir}{$repname}[1]{reploc};
1069        $rpmdir .= "/%{ARCH}" if $config->{disc}[$cdrep]{function}{data}{dir}{$repname}[1]{sep_arch};
1070        $rpmdir or log_("ERROR buildInstallHdlist: disc $cdrep: $repname not defined\n", $config->{verbose}, $config->{LOG}) and next;
1071        if ($opts->{oem}) {
1072            log_("buildInstallHdlist: oem mode for $cdrep/$repname ($rpmdir)\n", $config->{verbose}, $config->{LOG});
1073            foreach (@{$inst->[1]{oem}{hdlist}}) {
1074                my ($oemdir, $hl, $rep, $name) = @$_;
1075                print $A "noauto:" if $opts->{noauto};
1076                print $A "$hl $rep $name\n";
1077                my $hdlist = "$path/$hl";
1078                log_("buildInstallHdlist: adding oem hdlist $hdlist from $dir\n", $config->{verbose}, $config->{LOG});
1079                if ($inst->[1]{oem}{norebuild}) {
1080                    cpal("$oemdir/$hl", $hdlist)
1081                }
1082                $hdlist[$repnum]{hdlist} = $hdlist;
1083                $hdlist_list[$repnum] = $hdlist;
1084                $hdlist[$repnum]{synthesis} = "$path/synthesis.$hl";
1085                push @md5files, ($hdlist, "$path/synthesis.$hl");
1086                $repnum++
1087            }
1088        } else {
1089            #
1090            # even for live sources rpm are taken, this may lead to errors in some special case, where
1091            # the sources change after the live is created, but this could help in combined live/nolive
1092            # situation
1093            #
1094            log_("installation: $cdrep - $repname\n", $config->{verbose}, $config->{LOG});
1095            foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1096                next if $ls && $ls != $list;
1097                $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
1098                push @{$check[$repnum]}, [$cdrep, $repname, $list];
1099                my $cdsfilesrpms = $discsFiles->[$cdrep]{$repname}{$list};
1100                if ($opts->{update}) {
1101                    my %localdone;
1102                    log_("buildInstallHdlist: update mode for $cdrep/$repname list $list\n", $config->{verbose}, $config->{LOG}, 3);
1103                    push @{$hdlist[$repnum]{rpms}}, map { if (/(.*)-[^-]+-[^-]+\.[^.]+$/) { $rpmdone{$_} = 1; $rpmdone{$1} = 1; "$cdsfilesrpms->{$_}/$_.rpm" } } grep { if (/(.*)-[^-]+-[^-]+\.[^.]+$/) { if ($localdone{$1}) { 0 } else { $localdone{$1} = 1; ! $rpmdone{$_} } } } keys %$cdsfilesrpms;
1104                } else {
1105                    my %localdone;
1106                    log_("buildInstallHdlist: normal mode for $cdrep/$repname list $list\n", $config->{verbose}, $config->{LOG}, 3);
1107                    push @{$hdlist[$repnum]{rpms}}, map { if (/(.*)-[^-]+-[^-]+\.[^.]+$/) { $rpmdone{$_} = 1; $rpmdone{$1} = 1;  "$cdsfilesrpms->{$_}/$_.rpm" } } grep { if (/(.*)-[^-]+-[^-]+\.[^.]+$/) { if ($localdone{$1}) { 0 } else { $localdone{$1} = 1; ! ($rpmdone{$_} || $rpmdone{$1}) } } } keys %$cdsfilesrpms;
1108                }
1109            }
1110            if (@{$hdlist[$repnum]{rpms}}) {
1111                print $A "noauto:" if $opts->{noauto};
1112                if ($realcd) {
1113                    print $A "hdlist$repnum.cz $rpmdir disc $realcd $config->{disc}[$cdrep]{longname}\n";
1114                } else {
1115                    print $A "hdlist$repnum.cz $rpmdir $config->{disc}[$cdrep]{longname}\n";
1116                }
1117                my %keys;
1118                my $text;
1119                foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1120                    foreach my $keyfile (@{$config->{list}[$list]{keyfiles}}) {
1121                        if (-f $keyfile) {
1122                            log_("buildInstallHdlist: dumping $keyfile in $dir/$cdnum/Mandrake/base/pubkey$repnum\n", $config->{verbose}, $config->{LOG}, 3);
1123                            open my $KF, $keyfile;
1124                            my $key;
1125                            while (<$KF>){
1126                                $key .= $_;
1127                                if (/^-----END PGP PUBLIC KEY BLOCK-----/) {
1128                                    if (! $keys{$key}) {
1129                                        $keys{$key} = 1;
1130                                        $text .= $key
1131                                    }
1132                                    $key = ''
1133                                }
1134                            }
1135                            close $KF
1136                        } else { 
1137                            log_("ERROR buildInstallHdlist: $keyfile file does not exist\n", $config->{verbose}, $config->{LOG}, 0);
1138                        }
1139                    }
1140                }
1141                if ($text) {
1142                    open my $KEY, ">$dir/$cdnum/Mandrake/base/pubkey$repnum";
1143                    print $KEY $text;
1144                    close $KEY;
1145                }
1146                $hdlist_list[$repnum] = "$path/hdlist$repnum.cz";
1147                $hdlist[$repnum]{hdlist} = $hdlist_list[$repnum];
1148                push @md5files, $hdlist_list[$repnum];
1149                if ($inst->[1]{synthesis}) { 
1150                    $hdlist[$repnum]{synthesis} = "$path/synthesis.hdlist$repnum.cz";
1151                    push @md5files, $hdlist[$repnum]{synthesis}
1152                }
1153                $repnum++
1154            } else {
1155                log_("WARNING installation: $cdrep $repname is empty, ignoring\n", $config->{verbose}, $config->{LOG});
1156            }
1157        }
1158    }
1159    # FIXME OEM mode not tested, moreover this norebuild test is wrong, new URPM need to rebuild hdlist.
1160    if (!$inst->[1]{oem}{norebuild}) {
1161        mkcd_build_hdlist($repnum - 1, \@hdlist, $headers_dir, "$path/depslist.ordered", "$path/provides", "$path/compss");
1162    }
1163    log_("installation: compute_files_md5 @md5files\n", $config->{verbose}, $config->{LOG});
1164    compute_files_md5("$dir/$cdnum/Mandrake/base/MD5SUM", \@md5files);
1165
1166    if (!$inst->[1]{oem}) {
1167        checkDiscs(\@hdlist_list, "$path/depslist.ordered", \@thisInstallRep, \@check, $config->{LOG}) or die "depslist.ordered, hdlists and RPMS mismatch\n";
1168    }
1169# Add sources
1170    foreach my $rd (@{$inst->[1]{srpmsdir}}) {
1171        my ($ls, $cdrep, $repname, $opts) = @$rd;
1172        $list->{$cdrep} or log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n", $config->{verbose}, $config->{LOG}) and next;
1173        foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1174            next if $ls && $ls == $list;
1175            $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
1176        }
1177    }
1178    my $pfile = "$dir/$cdnum/pkg-$config->{name}" . ($inst->[1]{tag} ? "-$inst->[1]{tag}" : "") . ".idx";
1179    printDiscsFile($config, \@thisInstallRep, $pfile);
1180   
1181    return ($repnum, $path, $pfile);
1182}
1183
1184sub boot {
1185    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
1186    my $graft = $totgraft->{$cdnum};
1187    my $isolinux = $fct->[1]{isolinux};
1188    my $bootimg = $fct->[1]{bootimg};
1189    log_("Boot: $fixed nolive $nolive\n", $config->{verbose}, $config->{LOG});
1190    if (!$fixed) {
1191        my $size;
1192        if ($nolive) {
1193            my $mkiso;
1194            my $img;
1195            my $dir;
1196            my $path;
1197            if ($isolinux) {
1198                my $dir = $isolinux->[0];
1199                my $img = $bootimg ? $bootimg->[0] : "isolinux/isolinux.bin"; 
1200                $mkiso = qq( -b $img -c $dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table);
1201                $graft->{"$dir/boot.cat"} = 0;
1202                $graft->{"/isolinux/isolinux.bin"} = 0
1203            } elsif ($bootimg) {
1204                $img = $bootimg->[0];
1205                $dir = $bootimg->[1]{dir};
1206                $img =~ s,(.*)/([^/]+)$,$2,;
1207                $dir or ($dir) = $1;
1208                $mkiso = qq( -b $dir/$img -c ${dir}/boot.cat);
1209                $graft->{"$dir/boot.cat"} = 0
1210            }
1211            foreach (@{$fct->[1]{files}}) {
1212                my ($files, $opt) = @$_;
1213                my $dest = $opt->{dest};
1214                $size += du($files);
1215                my ($dirname) = $files =~ m,([^/]*)$,;
1216                log_("boot: files $files dest $dest dirname $dirname\n", $config->{verbose}, $config->{LOG});
1217                if ($img) { 
1218                    my $bimg = $bootimg->[0];
1219                    $bimg =~ s/^$dirname//;
1220                    log_("boot: boot image $files/$bimg in $dir/$img (" . (stat "$files/$bimg")[7] . ")\n", $config->{verbose}, $config->{LOG});
1221                    if (-f "$files/$bimg") { 
1222                        if ((stat "$files/$bimg")[7] > 3000000) { 
1223                            $mkiso .= qq( -no-emul-boot)
1224                        }
1225                        # $mkiso .= qq( $dir/$img=$files/$bimg)
1226                        $graft->{"$dir/$img"}{"$files/$bimg"} = 1
1227                    }
1228                }
1229                # if (-d "$files") { $mkiso .= " $dest/$dirname/=$files"; next }
1230                # $mkiso .= " $dest/=$files";
1231                if (-d $files) { $graft->{"$dest/$dirname/"}{$files} = 1; next }
1232                $graft->{"$dest/"}{$files} = 1
1233            }
1234            # it is = and not .= because mkcdisos->[$cdnum] has been added already at the beginning
1235            $mkisos->[$cdnum] = "$mkiso $mkisos->[$cdnum]";
1236        } else {
1237            log_("FILES $fct->[1]{files}\n", $config->{verbose}, $config->{LOG});
1238            foreach (@{$fct->[1]{files}}) {
1239                my ($files, $opt) = @$_;
1240                log_("boot: file $files\n", $config->{verbose}, $config->{LOG});
1241                my $dest = "$config->{topdir}/build/$config->{name}/" . ($opt->{first} ? "first/" : "") . "$cdnum/";
1242                -d $dest or mkpath $dest;
1243                my $odest = $opt->{dest};
1244                if ($odest) {
1245                    $dest .= "/$odest";
1246                    if ($odest =~ m,/$,) { mkpath $dest }
1247                } else {
1248                    my ($dirname) = $files =~ m,([^/]*)$,;
1249                    $dest .= "/$dirname"
1250                }
1251                cpal($files, $dest)
1252            }
1253            if ($fct->[1]{oem}) {
1254                log_("boot: setting default boot to oem\n", $config->{verbose}, $config->{LOG});
1255                my $dest = "$config->{topdir}/build/$config->{name}/first/$cdnum/isolinux";
1256                -d $dest or mkpath $dest;
1257                my $old = "$dest/isolinux.cfg";
1258                my $new = "$dest/isolinux.cfg.new";
1259                copy $old, $new;
1260                unlink $old;
1261                link $new, $old;
1262                unlink $new;
1263                substInFile { s/default linux/default oem/ } $old
1264            }
1265            $graft->{"/"}{"$dir/first/$cdnum/"} = 1;
1266            $size = du("$dir/first/$cdnum/", $inode);
1267        }
1268        return $size
1269    } elsif ($fixed == 1) {
1270        if (!$nolive) {
1271            if ($isolinux) {
1272                my $dir = $isolinux->[0];
1273                my $img = $bootimg ? $bootimg->[0] : "isolinux/isolinux.bin"; 
1274                $mkisos->[$cdnum] .= qq( -b $img -c $dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table "$config->{topdir}/build/$config->{name}/first/$cdnum");
1275                $graft->{"/isolinux/isolinux.bin"} = 0;
1276                $graft->{"$dir/boot.cat"} = 0
1277            } elsif ($bootimg) {
1278                my $img = $bootimg->[0];
1279                my $sdir = $bootimg->[1]{dir};
1280                $img =~ s,(.*/)([^/]+)$,$2,;
1281                $sdir or ($sdir) = $1;
1282                $sdir =~ s,//+,/,g;
1283                $sdir =~ s,/$,,g;
1284                log_("boot: boot image $sdir/$img\n", $config->{verbose}, $config->{LOG});
1285                $mkisos->[$cdnum] .= qq(-b $sdir/$img);
1286                my $cdimages = "$dir/$cdnum/";
1287                if ((stat "$cdimages/$bootimg->[0]")[7] > 3000000) { 
1288                    $mkisos->[$cdnum] .= qq( -no-emul-boot)
1289                }
1290                my $Bootdir = "$dir/first/$cdnum/$sdir/";
1291                $Bootdir =~ s,//+,/,g;
1292                $Bootdir =~ s,/$,,g;
1293                if (! -f "$Bootdir/$img") {
1294                    if (! -d $Bootdir) { mkpath $Bootdir or die "cannot create $Bootdir\n" }
1295                    my $err = link "$cdimages/$bootimg->[0]", "$Bootdir/$img";
1296                    if (!$err) { log_("Linking failed $cdimages/$bootimg->[0]: $!\n", $config->{verbose}, $config->{LOG}) };
1297                }
1298                $mkisos->[$cdnum] .= qq( -c $sdir/boot.cat $dir/first/$cdnum);
1299                $graft->{"$sdir/boot.cat"} = 0;
1300                log_("BOOT $mkisos->[$cdnum]\n", $config->{verbose}, $config->{LOG});
1301            }
1302        }
1303    }
1304}
1305
1306sub installation {
1307    my ($class, $inst, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
1308    my $graft = $totgraft->{$cdnum};
1309    my $install = $inst->[1]{install};
1310    if (!$fixed) {
1311        $install or return;
1312        my $size;
1313        if ($nolive) {
1314            opendir my $A, $install;
1315            foreach (readdir $A) {
1316                /~$/ and next;
1317                /^(\.{1,2}|Mandrake|LICENSE-APPS.txt|isolinux|images|VERSION)$/ and next;
1318                $size += du("$install/$_");
1319                # if (-d "$install/$_") { $mkiso .= " /$_/=$install/$_"; next }
1320                # $mkiso .= " /=$install/$_"
1321                if (-d "$install/$_") { $graft->{"/$_/"}{"$install/$_"} = 1; next }
1322                $graft->{"/"}{"$install/$_"} = 1
1323            }
1324
1325            local *A; opendir A, "$install/Mandrake";
1326            foreach (readdir A) {
1327                log_("Mandrake -- $_\n", $config->{verbose}, $config->{LOG}, 3);
1328                /~$/ and next;
1329                /(^(\.{1,2}|base)$|RPMS|share)/ and next;
1330                $size += du("$install/Mandrake/$_");
1331                # if (-d "$install/Mandrake/$_") { $mkiso .= " Mandrake/$_/=$install/Mandrake/$_"; next }
1332                # $graft->{"Mandrake/"}{"$install/Mandrake/$_"} = 1;
1333                if (-d "$install/Mandrake/$_") { $graft->{"Mandrake/$_/"}{"$install/Mandrake/$_"} = 1; next }
1334                $graft->{"Mandrake/"}{"$install/Mandrake/$_"} = 1;
1335            }
1336
1337            local *A; opendir A, "$install/Mandrake/base";
1338            foreach (readdir A) {
1339                /~$/ and next; 
1340                /(^(\.{1,2}|compss|provides|depslist.ordered|MD5SUM|pubkey.*|synthesis|compssUsers|rpmsrate|rpmslist|filelist|Serial|hashfile)|hdlist|cooker)/ and next;
1341                $size += du("$install/Mandrake/base/$_");
1342                # if (-d "$install/Mandrake/base/$_") { $mkiso .= " Mandrake/base/$_/=$install/Mandrake/base/$_"; next}
1343                # $mkiso .= " Mandrake/base/=$install/Mandrake/base/$_";
1344                if (-d "$install/Mandrake/base/$_") { $graft->{"Mandrake/base/$_/"}{"$install/Mandrake/base/$_"} = 1; next }
1345                $graft->{"Mandrake/base/"}{"$install/Mandrake/base/$_"} = 1
1346            }
1347            my $compss = $cd->{function}{data}{installation}[1]{compssUsers} || "$install/Mandrake/base/compssUsers";
1348            if (-f $compss) { 
1349                $size += du($compss);
1350                # $mkiso .= " Mandrake/base/compssUsers=$compss"
1351                $graft->{"Mandrake/base/compssUsers"}{$compss} = 1
1352            } else { log_("ERROR installation: $compss file does not exist", $config->{verbose}, $config->{LOG}, 0) }
1353            if ($inst->[1]{boot_medium}) {
1354                -d "$dir/$cdnum/Mandrake/base/" or mkpath "$dir/$cdnum/Mandrake/base/";
1355                my $file = "$dir/$cdnum/Mandrake/base/patch-oem.pl";
1356                my $A;
1357                if (-f "$install/Mandrake/base/patch-oem.pl") {
1358                    copy "$install/Mandrake/base/patch-oem.pl", $file;
1359                    open $A, ">>$file" or print "ERROR installation: could not open $file for writing\n";
1360                } else {
1361                    open $A, ">$file" or print "ERROR installation: could not open $file for writing\n";
1362                }
1363                print $A "use install_any;
1364package install_any;
1365
1366\$current_medium = $inst->[1]{boot_medium};
1367\$asked_medium = $inst->[1]{boot_medium};
1368";
1369                $graft->{"Mandrake/base/"}{$file} = 1;
1370                $size += du("Mandrake/base/$file", $inode)
1371            }
1372        } else {
1373            cpal("$install/", "$dir/$cdnum", "($install/+(Mandrake/+base/+(hdlist|MD5SUM|pubkey|depslist|synthesis|rpmslist|filelist|Serial|hashfile|compssUsers|rpmsrate)|Mandrake/+RPMS|Mandrake/+share|isolinux|images|tutorial|misc|doc|LICENSE-APPS.txt))");
1374            if (!$inst->[1]{oem}) {
1375                cpal("$install/tutorial", "$dir/$cdnum/tutorial") if -d "$install/tutorial";
1376                cpal("$install/misc", "$dir/$cdnum/misc") if -d "$install/misc";
1377                cpal("$install/doc", "$dir/$cdnum/doc") if -d "$install/doc";
1378            }
1379            if ($inst->[1]{boot_medium}) {
1380                my $file = "$dir/$cdnum/Mandrake/base/patch-oem.pl";
1381                my $A;
1382                if (-f $file) {
1383                    unlink $file;
1384                    copy "$install/Mandrake/base/patch-oem.pl", $file;
1385                    open $A, ">>$file" or print "ERROR installation: could not open $file for writing\n";
1386                } else {
1387                    open $A, ">$file" or print "ERROR installation: could not open $file for writing\n";
1388                }
1389                print $A "use install_any;
1390package install_any;
1391
1392\$current_medium = $inst->[1]{boot_medium};
1393\$asked_medium = $inst->[1]{boot_medium};
1394";
1395            }
1396            my $compss = $cd->{function}{data}{installation}[1]{compssUsers} || "$install/Mandrake/base/compssUsers";
1397            if (-f $compss) {
1398                log_("installation: compssUsers $compss\n", $config->{verbose}, $config->{LOG}, 2);
1399                cpal($compss, "$dir/$cdnum/Mandrake/base/compssUsers");
1400            } else { log_("ERROR installation: $compss file does not exist", $config->{verbose}, $config->{LOG}, 0) }
1401        }
1402        return $size
1403    } else {
1404        if ($nolive) {
1405            my $size;
1406            my ($repnum, $path, $pfile) = buildInstallHdlist($dir, $cdnum, $inst, $list, $discsFiles);
1407            if ($install && $fixed == 1) {
1408                my $rpmsrate = $cd->{function}{data}{installation}[1]{rpmsrate} || "$install/Mandrake/base/rpmsrate";
1409                # $mkiso = " Mandrake/base/=$path/compss Mandrake/base/=$path/depslist.ordered Mandrake/base/=$path/provides Mandrake/base/=$path/hdlists /=$pfile";
1410                $graft->{"Mandrake/base/"}{"$path/compss"} = 1;
1411                $graft->{"Mandrake/base/"}{"$path/depslist.ordered"} = 1; 
1412                $graft->{"Mandrake/base/"}{"$path/provides"} = 1;
1413                $graft->{"Mandrake/base/"}{"$path/hdlists"} = 1;
1414                $graft->{"Mandrake/base/"}{"$path/MD5SUM"} = 1;
1415                $graft->{"/"}{$pfile} = 1;
1416                if (-f $rpmsrate) {
1417                    $size += du($rpmsrate);
1418                    # $mkiso .= " Mandrake/base/rpmsrate=$rpmsrate"
1419                    $graft->{"Mandrake/base/rpmsrate"}{$rpmsrate} = 1
1420                } else { log_("ERROR installation: $rpmsrate file does not exist", $config->{verbose}, $config->{LOG}, 0); return 0 }
1421                $size += du("$path/compss", $inode);
1422                $size += du("$path/depslist.ordered");
1423                $size += du("$path/provides");
1424                $size += du($pfile, $inode);
1425            }
1426            my $version = "$dir/$cdnum/VERSION";
1427            $size += du("$path/hdlists");
1428            printVERSION($config->{name}, $version, $inst->[1]{tag});
1429            $graft->{VERSION}{$version} = 1;
1430            $size += du($version);     
1431            foreach my $n (1 .. $repnum - 1) {
1432                # $mkiso .= " Mandrake/base/=$path/hdlist$n.cz";
1433                $graft->{"Mandrake/base/"}{"$path/hdlist$n.cz"} = 1;
1434                # FIXME This is wrong, previous hdlist size must be deduced in iterative rebuild mode
1435                $size += du("Mandrake/base/$path/hdlist$n.cz");
1436                if (-f "$path/pubkey$n") { 
1437                    $graft->{"Mandrake/base/"}{"$path/pubkey$n"} = 1;
1438                    $size += du("Mandrake/base/$path/pubkey$n");
1439                }
1440                if ($inst->[1]{synthesis}) {
1441                    # $mkiso .= " Mandrake/base/=$path/synthesis.hdlist$n.cz";
1442                    $graft->{"Mandrake/base/"}{"$path/synthesis.hdlist$n.cz"} = 1;
1443                    $size += du("Mandrake/base/$path/synthesys.hdlist$n.cz")
1444                }
1445            }
1446            return $size;
1447        } else {
1448            if (!$install) { mkpath "$dir/$cdnum/Mandrake/base/" }
1449            unlink "$dir/$cdnum/Mandrake/base/hdlists";
1450            buildInstallHdlist($dir, $cdnum, $inst, $list, $discsFiles);
1451            if ($install && $fixed == 1) {
1452                my $rpmsrate = $cd->{function}{data}{installation}[1]{rpmsrate} || "$install/Mandrake/base/rpmsrate";
1453                if (-f $rpmsrate) {
1454                    log_("installation: rpmsrate: $rpmsrate\n", $config->{verbose}, $config->{LOG}, 2);
1455                    cpal($rpmsrate, "$dir/$cdnum/Mandrake/base/rpmsrate");
1456                } else { log_("ERROR installation: $rpmsrate file does not exist", $config->{verbose}, $config->{LOG}, 0); return 0 }
1457            }
1458            my $version = "$dir/$cdnum/VERSION";
1459            unlink $version;
1460            printVERSION($config->{name}, $version, $inst->[1]{tag});
1461        }
1462    }
1463}
1464
14651
1466
1467#
1468# Changeloh
1469#
1470# 2002 03 15
1471# new sources handling in installation
1472#
1473# 2002 03 19
1474# cdcom are now build as normal ones not to force deps, use standard list
1475#
1476# 2002 03 29
1477# fix a bug in nolive mode that prevent rpmsrate to be put on discs
1478#
1479# 2002 05 13
1480# finish md5 check
1481# fix commented du in sub installation
1482#
1483# 2002 08 01
1484# add noauto options for rpmsdir
1485#
1486# 2002 08 14
1487# fix little bug in buildGenericHdlists
1488#
1489# 2002 10 02
1490# allow glob in rm function for live mode (need to do it for nolive mode)
1491#
1492# 20030401
1493# get_rpmsdir now manages hdlist dir
Note: See TracBrowser for help on using the repository browser.