source: soft/build_system/build_system/mkcd/tags/V4_0_11_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: 81.4 KB
Line 
1#
2# Copyright (C) 2000,2001,2002,2003,2004 Mandrakesoft
3#
4# Author: Florent Villard <warly@mandraesoft.com>
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2, or (at your option)
9# any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, write to the Free Software
18# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19#
20# to prepare, create and burn iso images
21#
22
23package Mkcd::Functions;
24
25our $VERSION = '1.3.0';
26
27use strict;
28use File::Path;
29use MDK::Common qw(substInFile);
30use File::NCopy qw(copy);       
31use Mkcd::Tools qw(cpal du checkDiscs imageSize printDiscsFile config readBatchFile log_ convert_size compute_files_md5 fix_dir);
32use Mkcd::Package qw(mkcd_build_hdlist get_sorted_packages);
33
34=head1 NAME
35
36Functions - mkcd module
37
38=head1 SYNOPSYS
39
40    require Mkcd::Functions;
41
42=head1 DESCRIPTION
43
44<Mkcd::Functions> include the disc building standard functions.
45
46=head1 SEE ALSO
47
48mkcd
49
50=head1 COPYRIGHT
51
52Copyright (C) 2000,2001,2002,2003,2004 Mandrakesoft <warly@mandrakesoft.com>
53
54This program is free software; you can redistribute it and/or modify
55it under the terms of the GNU General Public License as published by
56the Free Software Foundation; either version 2, or (at your option)
57any later version.
58
59This program is distributed in the hope that it will be useful,
60but WITHOUT ANY WARRANTY; without even the implied warranty of
61MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
62GNU General Public License for more details.
63
64You should have received a copy of the GNU General Public License
65along with this program; if not, write to the Free Software
66Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
67
68=cut
69my (%functions, $config);
70
71# need to do it to have its address
72#my %functions = ();
73# [ function name, matching regexp, [arguments list (same as above)]]
74
75$functions{disc} = [ 
76    [ "", "disc", 5, "[options] <disc config number> <size> <serial> <longname> <label> <volume set>", "disc configuration file parameters", 
77    sub { my ($cd, $name, $size, $serial, $longname, $label) = @_;
78        $size = convert_size($size);
79        log_("disc: disc $cd size $size\n", $config->{verbose}, $config->{LOG},3);
80        $config->{disc}[$cd]{size} = $size;
81        $config->{disc}[$cd]{serial} = substr $serial, 0, 128;
82        $config->{disc}[$cd]{longname} = $longname;
83        $config->{disc}[$cd]{label} = substr $label, 0, 32;
84        if (!$config->{disc}[$cd]{appname}) { $config->{disc}[$cd]{appname} = substr $longname, 0, 128 }
85        1
86    }, "Setting disc configuration" ],
87    [ "d", "discnumber", 1 , "<disc real number>", "Set the real disc number", 
88    sub { my ($cd, $discnb) = @_;
89        log_("disc: disc $cd setting real disc number to $discnb\n", $config->{verbose}, $config->{LOG},3);
90        $config->{disc}[$cd]{name} = $discnb;
91    }, "Setting the real disc number" ],
92    [ "p", "publisher", 1 , "<disc publisher id>", "Set the disc publisher", 
93    sub { my ($cd, $publisher) = @_;
94        log_("disc: disc $cd setting publisher as $publisher\n", $config->{verbose}, $config->{LOG},3);
95        $config->{disc}[$cd]{Publisher} = substr $publisher, 0, 128;
96    }, "Setting the publisher ID flag" ],
97    [ "v", "volset", 1 , "<disc volume set ID>", "Set the disc volume set ID", 
98    sub { my ($cd, $volset) = @_;
99        log_("disc: disc $cd setting volset as $volset\n", $config->{verbose}, $config->{LOG},3);
100        $config->{disc}[$cd]{volset} = substr $volset, 0, 128;
101    }, "Setting the volset ID flag" ]
102];
103
104$functions{list} = [ 
105    [ "", "list", -1, "[options] <list config number> <list config file 1> <list config file 2> ... <list config file n>", "list configuration file parameters", 
106    sub { 
107        my ($list, undef, @list_file) = @_;
108        log_("list: list $list file list @list_file\n", $config->{verbose}, $config->{LOG},3);
109        push @{$config->{list}[$list]{filelist}}, @list_file;
110        1
111    }, "Setting list configuration" ],
112    [ "k", "key", 1 , "<pubkey file>", "Select public key file associated with this list", 
113    sub { my ($list, $keyfile) = @_;
114        log_("list: list $list setting pubkey file $keyfile\n", $config->{verbose}, $config->{LOG},3);
115        push @{$config->{list}[$list]{keyfiles}}, $keyfile;
116        1
117    }, "Setting pubkey file" ],
118];
119
120$functions{rpmlist} = [ 
121   [ "", "rpmlist", 0, "[options]", "rpm list associated with a list", 
122   sub { 
123       my ($list) = @_;
124       push @{$config->{list}[$list]{packages}}, { };
125       log_("rpmlist: main\n", $config->{verbose}, $config->{LOG}, 1);
126       $config->{list}[$list]{arg}{update} = 0;
127       1 
128   }, "Setting rpm list" ],
129   [ "b", "binaries", -1, "<rpm path 1> <rpm path 2> ... <rpm path n>", "rpm list associated with a list", 
130   sub { 
131       my ($list, undef, @rpms) = @_;
132       my $idx = $#{$config->{list}[$list]{packages}};
133       push @{$config->{list}[$list]{packages}[$idx]{rpm}}, @rpms;
134       log_("rpmlist: main (update $config->{list}[$list]{update})\n", $config->{verbose}, $config->{LOG}, 1);
135       if ($config->{list}[$list]{arg}{update}) {
136           foreach my $dir (@rpms) {
137               log_("rpmlist: adding for list $list update rep $dir\n", $config->{verbose}, $config->{LOG}, 1);
138               push @{$config->{list}[$list]{prelist}},  map { s/\.rpm//; [ $_, { regexp => 1 } ] } all $dir
139           }
140           push @{$config->{list}[$list]{prelist}},  [ "basesystem", { regexp => 1 } ]
141       }
142
143       1 
144   }, "Setting rpm list" ],
145   [ "d", "dynamic", -1, "<disc1/dir1> <disc2/dir2> ... <discn/dirn>", "dynamic rpm list based on disc generated by this config file", 
146   sub { 
147       my ($list, undef, @rpms) = @_;
148       foreach my $l (@rpms) {
149           my ($cd, $rep) = $l =~ m,(\d+)/(\S+), or do { log_("ERROR rpmlist: $l is not a valid <disc>/<rep> dynamic list definition\n", $config->{verbose}, $config->{LOG}, 1); next };
150           #$config->{list}[$list]{prelist} = [ [ ".*", { regexp => 1 } ] ];
151           push @{$config->{list}[$list]{virtual}}, { disc => $cd, repname => $rep };
152       }
153       1
154   }, "Setting dynamic rpm list" ],
155   [ "s", "sources", -1, "<source path 1> <source path 2> ... <source path n>", "rpm list associated with a list",
156   sub {
157       my ($list, undef, @srpms) = @_;
158       my $idx = $#{$config->{list}[$list]{packages}};
159       push @{$config->{list}[$list]{packages}[$idx]{srpm}}, @srpms;
160       1
161   }, "Setting source rpm list" ],
162   [ "u", "update", 0, "", "select all the rpm in these directories to be in the filelist",
163   sub {
164       my ($list, undef) = @_;
165       log_("rpmlist: update\n", $config->{verbose}, $config->{LOG}, 1);
166       $config->{list}[$list]{arg}{update} = 1;
167       1
168   }, "Setting update mode" ],
169
170];
171
172$functions{dir} =
173        [
174            #0
175            [ "", "dir",2, "<directory name> <directory location>", "Set directory name",
176            sub {       my ($cd, $fn, $repname, $reploc) = @_;
177                my @a = ("dir", { repname => $repname, reploc => $reploc });
178                $config->{disc}[$cd]{function}{data}{dir}{$repname} and log_("WARNING: disc $cd: duplicate directory $repname ($reploc)\n", $config->{verbose}, $config->{LOG}, 3);
179                $config->{disc}[$cd]{function}{list}[$fn] = \@a;
180                $config->{disc}[$cd]{function}{data}{dir}{$repname} = \@a;
181                log_("dir: disc $cd rep $repname ($reploc)\n", $config->{verbose}, $config->{LOG}, 3);
182                push @{$config->{disc}[$cd]{steps}}, \@a;
183                1
184            }, "Setting directory" ],
185            # 1
186            [ "", "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" ]
187];
188#
189# generic options
190#
191# source => source dir
192#
193# done  => done
194#
195
196$functions{generic} =
197        [
198            # 0
199            ["", "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)",
200                sub {   
201                    my ($cd, $fn, $repname, @lists) = @_;
202                    $config->{disc}[$cd]{function}{data}{dir}{$repname} or log_("ERROR: disc $cd: $repname not defined\n", $config->{verbose}, $config->{LOG}, 0);
203                    my @a = ("generic", { repname => $repname });
204                    foreach my $list (@lists) {
205                        if ($list =~ /^\d+$/) {
206                            if (!$config->{list}[$list]) { log_("ERROR: lists $list does not exist, ignoring\n", $config->{verbose}, $config->{LOG}, 0); next }
207                            push @{$a[1]{lists}}, $list;
208                        } else {
209                            log_("ERROR generic: $list is not a valid list name for rep $cd/$repname\n", $config->{verbose}, $config->{LOG}, 0);
210                            next
211                        }
212                    }
213                    log_("generic: disc $cd repname $repname lists @lists\n", $config->{verbose}, $config->{LOG}, 3);
214                    if (!ref $a[1]{lists}) { log_("ERROR generic: $cd/$repname has no valid list, ignoring\n", $config->{verbose}, $config->{LOG}, 0); return }
215                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
216                    push @{$config->{disc}[$cd]{function}{data}{generic}{$repname}}, \@a;
217                    push @{$config->{disc}[$cd]{fastgeneric}}, \@a;
218                    push @{$config->{disc}[$cd]{steps}}, \@a;
219                    1
220                }, "Copying rpms to directory"],
221            # 1
222            ["s", "source", [
223            [ "", "source", 0, "", "Source mode configuration",
224                sub {   my ($tmp) = @_;
225                    $tmp->[0]{source} = 1;
226                }, "Source mode" ],
227# 2002 03 14 deprecated
228#           [ "p", "priority", 1, "<priority>", "Set the repository priority", sub { my ($tmp, $prio) = @_; $tmp->[0]{priority} = $prio}, "Setting source repository priority"]
229            ], "[options]", "Source mode setting",
230                sub { my ($cd, $fn, $options) = @_;
231                    foreach (keys %$options) { $config->{disc}[$cd]{function}{list}[$fn][1]{$_} = $options->{$_} }
232                    1
233                }, "Source mode option configuration"],
234            # 2
235            [ "", "synthesis", 0, "", "Add synthesis file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag" ],
236            # 3
237            [ "", "hdlist", 0, "", "Add hdlist file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{hdlist} = 1 }, "Setting hdlist tag" ],
238            # 4
239            [ "l", "limit", [
240                [ "", "limit", 1, "<limit>", "Limit repository size",
241                    sub {       my ($tmp, $limit) = @_;
242                        $tmp->[0]{limit} = 1;
243                        $tmp->[0]{value} = $limit;
244                        1
245                    }, "Limit mode" ],
246                [ "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" ]
247           
248            ], "[options] <limit>", "Limit the space of this directory on the disc",
249                sub { my ($cd, $fn, $options) = @_;
250                    $config->{disc}[$cd]{function}{list}[$fn][1]{limit} = $options
251                }, "Setting limit option" ],
252            # 5
253            [ "", "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" ],
254            # 6
255            [ "g", "group", 1, "<group name>", "Add this generic repository in an alone group",
256            sub { my ($cd, $fn, $group) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{group} = $group },
257            "Setting an alone group name for this generic rep" ],
258        ];
259           
260           
261#
262# installation data
263#
264$functions{installation} =
265        [
266        # 0
267            [ "", "installation", 0, "", "Preparing the installation directory and dependencies files",
268                sub {   my ($cd, $fn) = @_;
269                    my @a = ('installation', { });
270                    if (ref $config->{disc}[$cd]{function}{data}{installation}) { log_("ERROR: disc $cd: duplicate installation procedure, ignored\n", $config->{verbose}, $config->{LOG}); return 0 };
271                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
272                    $config->{disc}[$cd]{function}{data}{installation} = \@a;
273                    push @{$config->{disc}[$cd]{steps}}, \@a;
274                    1
275                }, "Setting up installation files" ],
276    # 1
277            [ "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" ],
278    # 2
279            [ "c", "compssUsers", 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" ],
280    # 3
281            [ "f", "fixed", [
282                ["", "fixed", -1, "<repository> <extra RPMS directory 1> <extra RPMS directory 2> ... <extra RPMS directory n>", "Fixed repository option configuration",
283                    sub {       my ($tmp, @arg) = @_;
284                        $tmp->[0]{fixed} = 1;
285                        push @$tmp, @arg;
286                        1
287                    }, "Setting fixed option arguments"],
288                ["d", "dup", 0, "", "Duplicate mode, accept to put package present in already done discs",
289                        sub {
290                            my ($tmp) = @_;
291                            $tmp->[0]{dup} = 1; 1
292                        }, "Setting duplicate mode"],
293                ["", "noprovide", 0, "", "Do not handle other discs dependencies",
294                        sub {
295                            my ($tmp) = @_;
296                            $tmp->[0]{noprovide} = 1; 1
297                        }, "Setting noprovide mode"],
298                ["", "relocatable", 0, "", "Create virtual rep to save as much space as possible on updates discs",
299                        sub {
300                            my ($tmp) = @_;
301                            $tmp->[0]{relocatable} = 1; 1
302                        }, "Setting relocatable mode"],
303                ["", "update", 0, "", "Update mode, update already done packages",
304                        sub {
305                            my ($tmp) = @_;
306                            $tmp->[0]{update} = 1; 1 }, "Setting update mode"],
307                ["", "nodupkernel", 0, "", "Remove old kernel from hdlists",
308                        sub {
309                            my ($tmp) = @_;
310                            $tmp->[0]{nodupkernel} = 1; 1 }, "Setting nodupkernel mode"],
311                ], "[options] <fixed dir 1> <fixed dir 2> ... <fixed dir n>", "repositories that must not be computed but integrated in the installation group",
312                    sub { my ($cd, $fn, $options, @fixed) = @_;
313                        get_rpmsdir('rpmsdir', $cd, $fn, \@fixed, $options);
314                        $config->{disc}[$cd]{function}{list}[$fn][1]{fixed} = 1;
315                    1 }, "Setting fixed option" ],
316            # 4 
317            [ "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" ],
318            # 5
319            [ "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" ],
320            # 6
321            [ "", "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" ],
322            # 7
323            [ "", "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" ],
324            # 8
325            [ "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" ],
326            # 9
327            [ "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" ],
328            # 10
329            [ "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" ],
330            # 11
331            [ "", "dup", 0, "", "Authorize duplicate version for this install", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{dup} = 1 }, "Setting the tag name" ],
332            # 12
333            [ "", "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" ],
334            # 13
335            [ "", "isolinux", 0, "", "Isolinux mode", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} = 1 }, "Build an isolinux install" ],
336            # 14
337            [ "", "synthesis", 0, "", "Add synthesis file in the repository", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1 }, "Setting synthesis tag" ],
338            # 15
339            [ "", "sequential", 0, "", "Build disc in a sequential way", sub { my ($cd, $fn) = @_; $config->{disc}[$cd]{function}{list}[$fn][1]{sequential} = 1 }, "Setting sequential tag" ],
340            # 16
341            # FIXME oem mode never tested nor debugged
342            [ "", "oem", [
343                ["", "oem", 1, "[options] <rpms dir>", "OEM mode configuration",
344                    sub {       my ($tmp, @arg) = @_;
345                        $tmp->[0]{oem} = 1;
346                        push @$tmp, @arg;
347                        1
348                    }, "Setting oem option arguments"],
349                ["d", "dir", -1, "<installation dir> <root dir 1> ... <root dir n>", "Create OEM disc based on existing directories list",
350                    sub {
351                        my ($tmp, $instdir, @dir) = @_;
352                        if ($tmp->[0]{file}) {
353                            log_("ERROR installation oem: could not use file and dir option in the same time, ignoring dir\n", $config->{verbose}, $config->{LOG});
354                            return 0 }
355                        log_("dir $instdir @dir\n", $config->{verbose}, $config->{LOG}, 3);
356                        $tmp->[0]{instdir} = $instdir;
357                        $tmp->[0]{dir} = \@dir;
358                        1 }, "Selecting directories"],
359                ["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"],
360                ["f", "file", 2, "<script file> <installation disc>", "Script file describing the discs (generated with printscript)",
361                    sub {
362                        my ($tmp, $file, $instdisc) = @_;
363                        if ($tmp->[0]{dir}) {
364                            log_("ERROR installation oem: could not use file and dir option in the same time, ignoring file\n", $config->{verbose}, $config->{LOG});
365                            return 0 }
366                        $tmp->[0]{file} = $file;
367                        $tmp->[0]{instdisc} = $instdisc; 1
368                    }, "Setting update mode"],
369                ["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"],
370                ["n", "norebuild", 0, "", "Do not rebuild hdlists", sub { my ($tmp, $file) = @_; $tmp->[0]{norebuild} = 1; 1 }, "Setting no rebuilding flag"],
371                ["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"]
372                ], "[options] <rpms dir>", "OEM mode",
373                    sub { my ($cd, $fn, $options, $rpmsdir) = @_;
374                    $config->{disc}[$cd]{function}{list}[$fn][1]{oem}{oem} = 1;
375                    $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = $options;
376                    if ($options->{dir}) {
377                        my $list = @{$config->{list}};
378                        $config->{list}[$list]{prelist} = [
379                                [ "INSTALL", { section => 1, force => 1 } ],
380                                [ "SERVER", { section => 1, regexp => 1, exclude => 1 } ],
381                                [ ".*", { section => 4, regexp => 1 } ]
382                                        ];
383                        log_("installation oem: adding list $list for OEM mode\n", $config->{verbose}, $config->{LOG}, 3);
384                        my $struct_v = $config->{struct_version};
385                        my $install_dir = $config->{struct}{$struct_v}{media_info};
386                        my $hdlists = "$options->{instdir}/$install_dir/hdlists";
387                        local *A; open A, $hdlists or die "ERROR oem: could not open hdlists $hdlists file";
388                        my $i;
389                        while (<A>) {
390                            my ($hdlist, $rep, $mname) = /(\S+)\s+(\S+)\s+(.*)/ or next;
391                            log_("$i -- $hdlist -- $rep -- $options->{dir}[$i]\n", $config->{verbose}, $config->{LOG}, 4);
392                            $options->{dir}[$i] or last;
393                            push @{$options->{hdlist}}, [ "$options->{instdir}/$install_dir/", $hdlist, $rep, $mname ];
394                            push @{$config->{list}[$list]{packages}}, [ { rpm => [ "$options->{dir}[$i]/$rep" ] } ];
395                            $i++
396                        }
397                        for ($rpmsdir) {
398                            my ($cdrep, $repname) = m,^(\d+)/([^/]+)$,;
399                            my $gfn = @{$config->{disc}[$cdrep]{function}{list}};
400                            log_("installation oem: adding function $gfn for generic oem packages on cd $cdrep\n", $config->{verbose}, $config->{LOG}, 4);
401                            $functions{generic}[0][5]($cdrep, $gfn, $repname, $list);
402                            if ($cd == $cdrep) {
403                                # FIXME trick to have this generic function done before the installation
404                                my $a = pop @{$config->{disc}[$cdrep]{steps}};
405                                unshift @{$config->{disc}[$cdrep]{steps}}, $a
406                            }
407                            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir}}, [ $list, $cdrep, $repname, { oem => 1 } ];
408                        }
409                    } elsif ($options->{file}) {
410                        my $oemconfig;
411                        config($options->{file}, $oemconfig, \%functions);
412                        my ($discsFiles) = readBatchFile($options->{file}) or do { log_("ERROR installation oem: cannot read script file $options->{file}\n", $config->{verbose}, $config->{LOG}); return 0 };
413                        my $list = @{$config->{list}};
414                        log_("installation oem: adding list $list for OEM mode\n", $config->{verbose}, $config->{LOG}, 3);
415                        foreach (@{$config->{list}}) {
416                            $_ or next;
417                            push @{$config->{list}[$list]{packages}}, @{$_->{packages}}
418                        }
419                        my $gfn = @{$config->{disc}[$cd]{function}{list}};
420                        $config->{list}[$list]{prelist} = [[ ".*", { section => 3, regexp => 1 } ]];
421                        log_("installation oem: adding function $gfn for generic oem packages\n", $config->{verbose}, $config->{LOG}, 3);
422                        $functions{generic}[0][5]($cd, $gfn, "rpms", $list);
423                    } else {
424                        log_("ERROR installation oem: no disc to build OEM on (either file or dir option are needed)\n", $config->{verbose}, $config->{LOG});
425                        $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = 0;
426                        return 0
427                    }
428                    1 }, "Setting oem option" ],
429            # 17
430            [ "s", "sources", -1, "<srpms directory name 1> <srpms directory name 2> ... <srpms directory name n>", "Select the sources list where to put packages",
431                sub { my ($cd, $fn, @sources) = @_;
432                    get_rpmsdir('srpmsdir', $cd, $fn, \@sources);
433                    $config->{disc}[$cd]{function}{list}[$fn][1]{sources} = 1;
434                    1 }, "Setting fixed option" ],
435            # 18
436            [ "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",
437                sub {   my ($cd, $fn, @rpms) = @_;
438                    get_rpmsdir('rpmsdir', $cd, $fn, \@rpms);
439                    1
440                }, "Setting rpms dir" ],
441            # 19
442            [ "", "boot_medium", 1, "<boot medium number>", "select alternatives boot medium",
443                sub {   my ($cd, $fn, $nb) = @_;
444                    $config->{disc}[$cd]{function}{list}[$fn][1]{boot_medium} = $nb;
445                    1
446                }, "Setting rpms dir" ],
447            # 20
448            [ "", "suppl", 0, "", "ask for new media during installation",
449                sub {   my ($cd, $fn) = @_;
450                    $config->{disc}[$cd]{function}{list}[$fn][1]{suppl} = 1;
451                    1
452                }, "Setting the suppl switch in hdlists" ],
453            # 21
454            [ "", "suppl_cd", 0, "", "to create a extra packages disc",
455                sub {   my ($cd, $fn) = @_;
456                    $config->{disc}[$cd]{function}{list}[$fn][1]{suppl_cd} = 1;
457                    1
458                }, "Setting the suppl_cd for this disk" ],
459            # 22
460            [ "", "askmedia", 0, "", "to ask which media are configured during installation",
461                sub {   my ($cd, $fn) = @_;
462                    $config->{disc}[$cd]{function}{list}[$fn][1]{askmedia} = 1;
463                    1
464                }, "Setting the askmedia for this disk" ],
465        ];
466#
467#
468# advertising option
469#
470#    img
471#    lang (new advertising mode in 8.2 deprecates this option)
472#   
473
474$functions{advertising} =
475        [
476            [ "", "advertising", -1, "<picture 1> <picture 2> ... <picture n>", "Setting the advertising pictures used by the installation",
477                sub { my ($cd, $fn, @img) = @_;
478                    my @a = ('advertising', { img => \@img }); 
479                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
480                    push @{$config->{disc}[$cd]{function}{data}{advertising}}, \@a;
481                    push @{$config->{disc}[$cd]{steps}}, \@a
482                }, "Setting the advertising pictures" ],
483         [ "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" ]
484];
485
486#
487# cdcom data
488#
489#      dir
490#
491#      source
492#
493$functions{cdcom} =
494         [
495         #0
496            [ "", "cdcom", 2, "<directory name> <disc directory location>", "Commercial disc",
497                sub { my ($cd, $fn, $dir, $source, @list_files) = @_;
498                    my @a = ('cdcom', { dir => $dir, source_dir => $source });
499                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
500                    push @{$config->{disc}[$cd]{function}{data}{cdcom}}, \@a;
501                    my $list = @{$config->{list}};
502                    $a[1]{list} = $list;
503                    my $struct_v = $config->{struct_version};
504                    my $media = $config->{struct}{$struct_v}{media};
505                    log_("cdcom: disc $cd adding list $list for $source/$media\n", $config->{verbose}, $config->{LOG}, 3);
506                    $config->{list}[$list]{packages} = [ { rpm => [ "$source/$media" ] } ];
507                    # $config->{list}[$list]{prelist} = [[ ".*", { regexp => 1 }]];
508                    $config->{list}[$list]{done} = 1;
509                    $config->{list}[$list]{nosize} = 1;
510                    push @{$config->{disc}[$cd]{fastgeneric}}, [ '', { repname => $dir , lists => [ $list ] } ];
511                    push @{$config->{disc}[$cd]{steps}}, \@a;
512                    1
513                }, "Configuring a commercial disc" ],
514        #1
515           [ "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" ],
516        #2
517           [ "k", "key", 1 , "<pubkey file>", "Select public key file associated with this list",
518           sub {
519               my ($cd, $fn, $keyfile) = @_;
520               my $list = $config->{disc}[$cd]{function}{list}[$fn][1]{list};
521               log_("cdcom: list $list setting pubkey file $keyfile\n", $config->{verbose}, $config->{LOG},3);
522               push @{$config->{list}[$list]{keyfiles}}, $keyfile;
523               1
524           }, "Setting pubkey file" ],
525         # 3
526            [ "", "synthesis", 0, "", "Add synthesis file in the repository",
527                sub {
528                    my ($cd, $fn) = @_;
529                    $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1
530                }, "Setting synthesis tag" ],
531         # 4
532            [ "", "hdlist", 0, "", "Add hdlist file in the repository",
533                sub {
534                    my ($cd, $fn) = @_;
535                    $config->{disc}[$cd]{function}{list}[$fn][1]{hdlist} = 1
536                }, "Setting hdlist tag" ],
537];
538#
539# fixed
540#
541$functions{fixed} =
542         [
543         #0
544            [ "", "fixed", -2, "<directory name> <disc directory location> <filter list 1> <filter list 2> ... <filter list n>", "Commercial disc",
545                sub { my ($cd, $fn, $dir, $source, @list_files) = @_;
546                    my @a = ('fixed', { dir => $dir, source_dir => $source, repname => $dir, fixed => 1});
547                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
548                    push @{$config->{disc}[$cd]{function}{data}{fixed}}, \@a;
549                    my $list = @{$config->{list}};
550                    # FIXME something must be duplicated here
551                    $a[1]{list} = $list;
552                    $a[1]{lists} = [ $list ];
553                    log_("fixed: disc $cd adding list $list for $source\n", $config->{verbose}, $config->{LOG}, 3);
554                    $config->{list}[$list]{packages} = [ { rpm => [ $source ] } ];
555                    # $config->{list}[$list]{prelist} = [[ ".*", { regexp => 1 }]];
556                    $config->{list}[$list]{pseudo_done} = 1;
557                    $config->{list}[$list]{nosize} = 1;
558                    $config->{list}[$list]{fixed} = 1;
559                    push @{$config->{list}[$list]{filelist}}, @list_files;
560                    push @{$config->{disc}[$cd]{fastgeneric}}, \@a;
561                    push @{$config->{disc}[$cd]{steps}}, \@a;
562                    1
563                }, "Configuring a fixed disc" ],
564        #1
565           [ "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" ],
566        #2
567           [ "k", "key", 1 , "<pubkey file>", "Select public key file associated with this list",
568           sub {
569               my ($cd, $fn, $keyfile) = @_;
570               my $list = $config->{disc}[$cd]{function}{list}[$fn][1]{list};
571               log_("fixed: list $list setting pubkey file $keyfile\n", $config->{verbose}, $config->{LOG},3);
572               push @{$config->{list}[$list]{keyfiles}}, $keyfile;
573               1
574           }, "Setting pubkey file" ],
575         # 3
576            [ "", "synthesis", 0, "", "Add synthesis file in the repository",
577                sub {
578                    my ($cd, $fn) = @_;
579                    $config->{disc}[$cd]{function}{list}[$fn][1]{synthesis} = 1
580                }, "Setting synthesis tag" ],
581         # 4
582            [ "", "hdlist", 0, "", "Add hdlist file in the repository",
583                sub {
584                    my ($cd, $fn) = @_;
585                    $config->{disc}[$cd]{function}{list}[$fn][1]{hdlist} = 1
586                }, "Setting hdlist tag" ],
587        # 5
588            [ "", "nodeps", 0, "", "Do not include deps",
589                sub {
590                    my ($cd, $fn) = @_;
591                    $config->{disc}[$cd]{function}{list}[$fn][1]{nodeps} = 1
592                }, "Setting nodeps flag for this fixed rep" ],
593];
594#
595# cp
596#
597$functions{cp} =
598        [
599            [ "", "cp", 2, "<file source> <file destination>", "Copy",
600                sub { my ($cd, $fn, $src, $dest) = @_;
601                    my @a = ('cp', { src => $src, dest => $dest });
602                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
603                    push @{$config->{disc}[$cd]{function}{data}{cp}}, \@a;
604                    push @{$config->{disc}[$cd]{steps}}, \@a;
605                    1
606        }, "Copying files" ],
607     # 1
608        [ "", "first", 0, "", "Remove files in the files copied with first option",
609            sub {
610                my ($cd, $fn) = @_;
611                $config->{disc}[$cd]{function}{list}[$fn][1]{first} = 1;
612                1
613            }, "Setting first flag"
614        ],
615];
616 #
617 # boot
618 #
619$functions{boot} =
620    [
621    # 0
622        [ "", "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",
623            sub {   my ($cd, $fn) = @_;
624                    my @a = ('boot', { });
625                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
626                    push @{$config->{disc}[$cd]{function}{data}{boot}}, \@a;
627                    push @{$config->{disc}[$cd]{steps}}, \@a;
628                    1
629          }, "Setting boot parameters"
630        ],
631          # 1
632        [ "", "isolinux", [
633                ["", "isolinux", 0, "", "Create an isolinux bootable disc",
634                    sub {       
635                        my ($tmp, @args) = @_;
636                        $tmp->[0]{isolinux} = 1;
637                        push @$tmp, @args
638                    }, "Setting an isolinux boot disc"],
639                ], "<options>", "isolinux boot disc",
640                    sub { my ($cd, $fn, $options) = @_;
641                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot} }) {
642                                if (ref $_->[1]{isolinux}) { log_("ERROR: disc $cd: duplicate isolinux boot image, ignored\n", $config->{verbose}, $config->{LOG}); return 0 }
643                        }
644                        $config->{disc}[$cd]{function}{list}[$fn][1]{isolinux} = [ $options ]
645                    }, "Setting isolinux image"
646        ],
647          #2
648        [ "b", "bootimg", [
649            [ "", "bootimg", 1, "<boot image name>", "set boot image name",
650                    sub { my ($tmp, @args) = @_;
651                        $tmp->[0]{bootimg} = 1;
652                        push @$tmp, @args
653                    }, "setting boot image name"
654            ],
655            [ "d", "dir", 1, "<directory>", "duplicate the boot image in directory and put it first in the ISO",
656               sub { my ($tmp, $dir) = @_; $tmp->[0]{dir} = $dir }, "" 
657            ]
658                ], "<options> <boot image>", "Create a bootable iso with given image",
659                    sub { my ($cd, $fn, $options, $img) = @_;
660                        foreach (@{ $config->{disc}[$cd]{function}{data}{boot} }) {
661                                if (ref $_->[1]{bootimg}) { log_("ERROR: disc $cd: duplicate boot image, ignored\n", $config->{verbose}, $config->{LOG}); return 0 }
662                        }
663                        $config->{disc}[$cd]{function}{list}[$fn][1]{bootimg} = [ $img, $options ]
664                    }, "Setting boot image options"
665        ],
666          #3
667        [ "f", "files", [
668                [ "", "files", -1, "<file 1> <file 2> .. <file n>", "Set options for files copied",
669                    sub {
670                        my ($tmp, @args) = @_;
671                        $tmp->[0] = {};
672                        push @$tmp, @args
673                    }, "Setting files options" ],
674                [ "", "first", 0 , "", "Put this files first in the ISO",
675                        sub {
676                            my ($tmp) = @_;
677                            $tmp->[0]{first} = 1;
678                            1
679                        }, "Setting first flag for files" ],
680                [ "d", "dest", 1 , "<destination on the targe disc>", "Choose where to copy the files",
681                        sub {
682                            my ($tmp, $dest) = @_;
683                            $tmp->[0]{dest} = $dest;
684                            1
685                        }, "Setting destination location for files" ],
686            ], "[options] <files 1> <files 2> .. <files n>", "Setting files to copy",
687                sub { my ($cd, $fn, $options, @files) = @_;
688                    foreach (fix_dir(@files)) {
689                        log_("boot: file $_ (to $options->{dest})\n", $config->{verbose}, $config->{LOG});
690                        push @{$config->{disc}[$cd]{function}{list}[$fn][1]{files}}, [ $_, $options ]
691                    }
692                    1
693                },
694            "Setting files to copy"
695            ],
696        #4
697        [ "", "oem", 0, "", "Set default boot to oem mode",
698            sub { my ($cd, $fn) = @_;
699                $config->{disc}[$cd]{function}{list}[$fn][1]{oem} = 1
700            }, "Setting oem boot mode"
701        ],
702
703];
704
705#
706# clone
707#
708$functions{clone} =
709    [
710    # 0
711        [ "", "clone", 1, "<disc to clone>", "Clone the given disc",
712            sub {   my ($cd, $fn, $disc) = @_;
713                    my @a = ('clone', { disc => $disc });
714                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
715                    push @{$config->{disc}[$cd]{function}{data}{clone}}, \@a;
716                    push @{$config->{disc}[$cd]{steps}}, \@a;
717                    1
718          }, "Setting clone parameters"
719        ],
720          # 1
721        [ "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",
722            sub {   my ($cd, $fn, @dir) = @_;
723                    my $list = @{$config->{list}};
724                    while (@dir) {
725                        my $rpmdir = shift @dir;
726                        my $path = shift @dir or last;
727                        $config->{disc}[$cd]{function}{data}{dir}{$rpmdir} = [ "clone_dir", { reploc => $path } ];
728                        $config->{disc}[$cd]{function}{list}[$fn][1]{rpmsdir} = $path;
729                        log_("clone: disc $cd adding list $list for virtual rep $rpmdir path $path\n", $config->{verbose}, $config->{LOG},3);
730                        $config->{list}[$list]{virtual} = [ { disc => $cd, repname => $rpmdir } ];
731                        push @{$config->{disc}[$cd]{fastgeneric}}, [ '', { repname => $rpmdir, lists => [ $list ] } ];
732                    }
733                    $config->{list}[$list]{done} = 1;
734                    1
735            }, "Setting directory name and path parameters"
736        ]
737#       [ "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",
738#           sub {   my ($cd, $fn,@to_del) = @_;
739#                   $config->{disc}[$cd]{function}{list}[$fn][1]{to_del} = \@to_del;
740#                   1
741#           }, "Setting delete parametes"
742#       ]
743];
744
745#
746# rm
747#
748$functions{rm} =
749    [
750     # 0
751        [ "", "rm", -1, "<disc to rm>", "Delete the given file or directory on the disc image",
752            sub {   my ($cd, $fn, @files) = @_;
753                    my @a = ('rm', { files => \@files });
754                    $config->{disc}[$cd]{function}{list}[$fn] = \@a;
755                    push @{$config->{disc}[$cd]{function}{data}{files}}, \@a;
756                    push @{$config->{disc}[$cd]{steps}}, \@a;
757                    1
758          }, "Setting rm parameters"
759        ],
760     # 1
761        [ "", "first", 0, "", "Remove files in the files copied with first option",
762            sub {
763                my ($cd, $fn) = @_;
764                $config->{disc}[$cd]{function}{list}[$fn][1]{first} = 1;
765                1
766            }, "Setting first flag"
767        ],
768];
769
770sub new {
771    my ($class, $conf) = @_;
772    $config = $conf;
773    bless {
774        config       => $conf,
775        functions    => \%functions
776    }, $class;
777}
778
779sub get_rpmsdir {
780    my ($type, $cd, $fn, $rpms, $opts) = @_;
781    my $options = '(?:(noauto):)?';
782    # FIXME taken from Tools.pm
783    my $match_val2 = q(((?:[^"\s]*(?:[^"\s]+|"[^\"]+")[^"\s]*)+));
784    foreach (@$rpms)  {
785        log_("get_rpmsdir: $_\n", $config->{verbose}, $config->{LOG}, 3);
786        my %options;
787        foreach (keys %$opts)  { $options{$_} = $opts->{$_} }
788        if (my ($opt, $hdlist, $hdlist_path, $hdlist_name, $pubkey) = m/${options}hdlist:([^,]+),([^,]+),$match_val2(?:,(.*))?/) {
789            if (!$config->{disc}[$cd]{function}{list}[$fn][1]{fixed}) {
790                $config->{disc}[$cd]{function}{list}[$fn][1]{fixed} = 1;
791                log_("WARNING get_rpmsdir: hdlist rpmsdir could only be fixed, forcing fixed flag\n", $config->{verbose}, $config->{LOG}, 0);
792            }
793            my $list = add_list($cd, "hdlist_rpm", $hdlist, $pubkey);
794            my $new_cd = @{$config->{disc}};
795            log_("get_rpmsdir: adding virtual disc $new_cd for hdlist $hdlist (path $hdlist_path disc_name $hdlist_name)\n", $config->{verbose}, $config->{LOG}, 3);
796            push @{$config->{virtual_disc}}, $new_cd;
797            $functions{disc}[0][5]->($new_cd, $hdlist_name, 0, 0, $hdlist_name, 0);
798            $functions{dir}[0][5]->($new_cd, 1, "rpms", $hdlist_path);
799            $functions{generic}[0][5]->($new_cd, 2, "rpms", $list);
800            $options{hdlist} = $hdlist;
801            foreach (split ',', $opt)  { $options{$_} = 1 }
802            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{$type}}, [ $list, $new_cd, 'rpms', \%options ]
803        } elsif (my ($opt, $cdrep, $repname, $list) = m,$options(\d+)/([^/]+)(?:/(\d+))?,) {
804            foreach (split ',', $opt)  { $options{$_} = 1 }
805            push @{$config->{disc}[$cd]{function}{list}[$fn][1]{$type}}, [ $list, $cdrep, $repname, \%options ]
806        } else {
807            log_("ERROR get_rpmsdir: could not parse rpmsdir value $_\n", $config->{verbose}, $config->{LOG}, 0);
808        }
809    }
810}
811
812sub add_list {
813    my ($cd, $type, $pkg_list, $pubkey) = @_;
814    my $list = @{$config->{list}};
815    log_("add_list: disc $cd adding list $list for $type $pkg_list\n", $config->{verbose}, $config->{LOG}, 3);
816    $config->{list}[$list]{packages} = [ { $type => [ $pkg_list ] } ];
817    $config->{list}[$list]{done} = 1;
818    $config->{list}[$list]{nosize} = 1;
819    if ($pubkey) {
820        log_("add_list: adding pubkey file $pubkey for list $list\n", $config->{verbose}, $config->{LOG}, 3);
821        push @{$config->{list}[$list]{keyfiles}}, $pubkey;
822    }
823    $list
824}
825
826sub template {
827    my ($class, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
828    if (!$fixed) {
829        my $size;
830        if ($nolive) {
831            return $size
832        } else {
833
834        }
835    } elsif ($fixed == 1) {
836        my $mkiso;
837        if ($nolive) {
838        } else {
839           
840        }
841    } elsif ($fixed == 2) {
842        my $mkiso;
843        if ($nolive) {
844        } else {
845           
846        }
847    }   
848}
849
850sub clone {
851    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
852    my $graft = $totgraft->{$cdnum};
853    my $disc_src = $fct->[1]{disc};
854    if ($fixed == 0) {
855        if ($nolive) {
856            if ($fct->[1]{full_copy}) {
857                log_("clone: full copy of disc $disc_src nolive mode\n", $config->{verbose}, $config->{LOG},2);
858                if ($totgraft->{$disc_src}) {
859                    log_("clone: getting disc from current build\n", $config->{verbose}, $config->{LOG},3);
860                    $graft = $totgraft->{$disc_src}
861                } elsif (-d "$dir/$disc_src") {
862                    log_("clone: getting disc from filesystem\n", $config->{verbose}, $config->{LOG},3);
863                    $graft->{"/"}{"$dir/$disc_src"} = 1
864                } else {
865                    log_("ERROR clone: source disc not available\n", $config->{verbose}, $config->{LOG},3);
866                }
867            }
868        } else {
869            if ($fct->[1]{full_copy}) {
870                log_("clone: full copy of disc $disc_src\n", $config->{verbose}, $config->{LOG},2);
871                if (-d "$dir/$disc_src") {
872                    log_("clone: getting disc from filesystem\n", $config->{verbose}, $config->{LOG},3);
873                    $graft->{"/"}{"$dir/$disc_src"} = undef;
874                    cpal("$dir/$disc_src/", "$dir/$cdnum");
875                } else {
876                    log_("ERROR clone: source disc not available\n", $config->{verbose}, $config->{LOG},3);
877                }
878            }
879        }
880    }
881    1
882}
883
884sub rm {
885    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles) = @_;
886    my $graft = $totgraft->{$cdnum};
887    my $files = $fct->[1]{files};
888#    use File::Find;
889    if ($fixed == 0) {
890        if ($nolive) {
891            # FIXME this does not really works in no live mode (exclude files does not work with mkisofs properly)
892            my $size;
893            foreach my $r (@$files) {
894                log_("rm: trying $r\n", $config->{verbose}, $config->{LOG},2);
895                $r = "/$r" if $r !~ m,^/,;
896                #$graft->{$r} = 3;
897                $r =~ s/\*/.+/;
898                foreach my $g (keys %$graft) {
899                    ref $graft->{$g} or next;
900                    log_("rm: graft $g ($r)\n", $config->{verbose}, $config->{LOG},3);
901                    if ($g =~ m,^/?$r/?$,) {
902                        foreach my $f (keys %{$graft->{$g}}) {
903                             $size -= du $f
904                        }
905                        $g =~ m,^/, and $g = "/$g";
906                        $graft->{$g} = 0;
907                        log_("rm: deleting $g (size $size)\n", $config->{verbose}, $config->{LOG},4);
908                    }
909                }
910                my @up = grep { $_ } split '/', $r;
911                my $last = pop @up;
912                while (@up) {
913                    my $uppath = join '/', @up;
914                    $uppath = "/$uppath";
915                    log_("rm: testing $uppath\n", $config->{verbose}, $config->{LOG},4);
916                    $uppath = $graft->{$uppath} ? $uppath : $graft->{"/$uppath"} ? "/$uppath" : $graft->{"$uppath/"} ? "$uppath/" : "/$uppath/";
917                    log_("rm: graft $graft->{$uppath}\n", $config->{verbose}, $config->{LOG},4);
918                    if (ref $graft->{$uppath}) {
919                        foreach (keys %{$graft->{$uppath}}) {
920                            log_("rm: testing $uppath ($_)\n", $config->{verbose}, $config->{LOG},4);
921                            if (-d $_) {
922                                log_("rm: opening $_\n", $config->{verbose}, $config->{LOG},4);
923                                opendir my $dir, $_ or next;
924                                foreach my $first (readdir $dir) {
925                                    $first =~ /^\.{1,2}$/ and next;
926                                    log_("rm: FIRST 2 $first in $uppath$first ($r) " . $graft->{"$uppath$first"} . "\n", $config->{verbose}, $config->{LOG},4);
927                                    if ("$uppath$first" ne $r) {
928                                        log_("rm: adding $_/$first in $uppath\n", $config->{verbose}, $config->{LOG},4);
929                                        $graft->{"$uppath$first"} ||= {};
930                                        $graft->{"$uppath$first"}{"$_/$first"} = 1;
931                                    }
932                                }
933                                delete $graft->{$uppath}{$_}
934                            }
935                        }
936                        last
937                    }
938                    $last = pop @up;
939                }
940            }
941#           my @find;
942#           foreach my $k (keys %$graft){
943#               ref $graft->{$k} or next;
944#               foreach my $f (keys %{$graft->{$k}}){
945#                   $f =~ s|/{2,}|/|g;
946#                   find({ wanted => sub { s,/?\Q$f,,; $_ = "$k/$_"; s|/{2,}|/|g; push @find, [ $f, $_ ] }, no_chdir => 1 }, $f);
947#               }
948#           }
949#           foreach (@$files) { s|/{2,}|/|g }
950#           foreach my $t (@find){
951#               my ($k, $f) = @$t;
952#               foreach my $r (@$files){
953#                   next if $f =~ m,^/?$r/[^/]+,;
954#                   if ($f =~ m,^/?$r/?$,){
955#                       log_("rm: deleting $f (path $k regexp $r)\n", $config->{verbose}, $config->{LOG});
956#                       $graft->{$f} = 0;
957#                       $size -= du $k;
958#                       $size -= du "$k/$f";
959#                   }
960#               }
961#           }
962            return $size
963        } else {
964            my $first = "first/" if $fct->[1]{first};
965            foreach (@$files) {
966                my @file = glob "$dir/$first$cdnum/$_";
967                foreach my $f (@file) {
968                    if (-d $f) {
969                        log_("rm: deleting directory $f\n", $config->{verbose}, $config->{LOG}, 2);
970                        my $err = rmtree $f;
971                        if (!$err) { log_("ERROR rm: deleting $f failed: $!,\n", $config->{verbose}, $config->{LOG}) }
972                    } else {
973                        log_("rm: deleting file $f\n", $config->{verbose}, $config->{LOG},2);
974                        my $err = unlink $f;
975                        if (!$err) { log_("ERROR rm: deleting $f failed: $!,\n", $config->{verbose}, $config->{LOG}) }
976                    }
977                }
978            }
979            return 
980        }
981    }
982    1
983}
984
985sub cp {
986    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles, $sort) = @_;
987    my $graft = $totgraft->{$cdnum};
988    if (!$fixed) {
989        my $size;
990        my $source = $fct->[1]{src};
991        my $dest = $fct->[1]{dest};
992        if ($nolive) {
993            $size += du($source, $inode);
994            log_("cp: copying $source => $dest (size $size)\n", $config->{verbose}, $config->{LOG},1);
995            $graft->{"/$dest"}{$source} = 1;
996            return $size
997        } else {
998            my $first = "first/" if $fct->[1]{first};
999            cpal($source, "$dir/$first$cdnum/$dest");
1000            $graft->{"$dir/$cdnum/$dest"}{$source} = 1;
1001            push @{$sort->{$cdnum}}, [ "$dir/$first$cdnum/$dest" ] if $fct->[1]{first};
1002            return
1003        }
1004    }
1005}
1006
1007sub fixed {
1008    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discs_file) = @_;
1009    my $graft = $totgraft->{$cdnum};
1010    my $destination = $fct->[1]{dest};
1011    my ($fdest, $nocopy);
1012    my $rep = $fct->[1]{dir}; 
1013    my $dest_dir = $cd->{function}{data}{dir}{$rep}[1];
1014    my $reploc = $dest_dir->{reploc};
1015    my $reploc_full = "$dir/$cdnum/$reploc/";
1016    if ($destination) {
1017        $fdest = "$dir/$cdnum/$destination";
1018    } else {
1019        $fdest = "$dir/$cdnum/$reploc";
1020        $nocopy = 1
1021    }
1022    my $size;
1023    if (!$fixed) {
1024        my $source = $fct->[1]{source_dir};
1025        my $uppath = $destination;
1026        $uppath =~ s,([^/]+),../,g;
1027        $uppath =~ s,/+,/,g;
1028        log_("DEST: $destination uppath $uppath dest $reploc_full\n", $config->{verbose}, $config->{LOG},3);
1029        -d $fdest or mkpath $fdest;
1030        if ($nolive) {
1031            -d $reploc_full or mkpath $reploc_full;
1032            opendir my $A, $source;
1033            log_("fixed: $source\n", $config->{verbose}, $config->{LOG},3);
1034            my $struct_v = $config->{struct_version};
1035            my $media = $config->{struct}{$struct_v}{media};
1036            my $install_dir = $config->{struct}{$struct_v}{install};
1037            foreach (readdir $A) {
1038                /^\.{1,2}$/ and next;
1039                if (! /^$install_dir$/) {
1040                    $size += du("$source/$_", $inode);
1041                    log_("fixed: adding $_ (size $size)\n", $config->{verbose}, $config->{LOG},4);
1042                    $graft->{"/$destination/$_/"}{"$source/$_"} = 1
1043                } else {
1044                    $graft->{"/$reploc/"}{"$source/$media/"} = 1
1045                }
1046            }
1047            log_("fixed: creating symlink $uppath$reploc => $fdest/RPMS\n", $config->{verbose}, $config->{LOG}, 4);
1048            my $err = symlink "$uppath$reploc", "$fdest/RPMS";                                           
1049            !$err and log_("ERROR fixed: $!\n", $config->{verbose}, $config->{LOG});
1050            $graft->{"/"}{"$fdest/RPMS"} = 1;
1051        } else {
1052            log_("fixed: copying $source to $fdest\n", $config->{verbose}, $config->{LOG});
1053            cpal($source, $fdest);
1054            if (!$nocopy) {
1055                log_("fixed: creating symlink $uppath$reploc => $fdest/RPMS\n", $config->{verbose}, $config->{LOG});
1056                my $err = symlink "$uppath$reploc", "$fdest/RPMS";                                           
1057                !$err and log_("ERROR fixed: $!\n", $config->{verbose}, $config->{LOG});
1058            }
1059        }
1060        return $size
1061    } else {
1062        # there is only one (virtual) list for fixed
1063        my $list = $fct->[1]{list};
1064        log_("fixed: list $list\n", $config->{verbose}, $config->{LOG});
1065        my $rep = $fct->[1]{dir}; 
1066        my $sep_arch = $dest_dir->{sep_arch};
1067        my $nolive_rep = $reploc;
1068        if ($nolive) {
1069            if (!$nocopy) {
1070                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
1071                    log_("fixed: src $src\n", $config->{verbose}, $config->{LOG});
1072                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
1073                        $graft->{"$nolive_rep/$_->[1]"}{"$src/$_->[1]"} = 1
1074                    }
1075                }
1076            }
1077        } else {
1078            if (!$nocopy) {
1079                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
1080                    log_("fixed: src $src\n", $config->{verbose}, $config->{LOG});
1081                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
1082                        link("$fdest/$_->[1]", "$reploc_full/$_->[1]") 
1083                    }
1084                }
1085            }
1086        }
1087        $size += process_hdlist_flags($nolive, $fct->[1]{synthesis}, $fct->[1]{hdlist}, $discs_file->[$cdnum]{$rep}{$list}, $dir, $cdnum, $fct, $rep, $reploc_full, $sep_arch, $graft, $list, $reploc);
1088        $size
1089    }
1090}
1091
1092sub cdcom {
1093    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discs_file) = @_;
1094    my $graft = $totgraft->{$cdnum};
1095    if (!$fixed) {
1096        my $size;
1097        my $source = $fct->[1]{source_dir};
1098        my $dest = $config->{disc}[$cdnum]{function}{data}{dir}{$fct->[1]{dir}}[1]{reploc};
1099        my $destination = $fct->[1]{dest};
1100        my $uppath = $destination;
1101        $uppath =~ s,([^/]+),../,g;
1102        $uppath =~ s,/+,/,g;
1103        log_("DEST: $destination uppath $uppath dest $dest\n", $config->{verbose}, $config->{LOG},3);
1104        my $fdest = "$dir/$cdnum/$destination";
1105        my $struct_v = $config->{struct_version};
1106        my $media = $config->{struct}{$struct_v}{media};
1107        my $install_dir = $config->{struct}{$struct_v}{install};
1108        if ($nolive) {
1109            my $path = "$dir/$cdnum/$dest";
1110            -d $path or mkpath $path;
1111            opendir my $A, $source;
1112            log_("cdcom: $source\n", $config->{verbose}, $config->{LOG},3);
1113            foreach (readdir $A) {
1114                /^\.{1,2}$/ and next;
1115                if (! /^$install_dir$/) {
1116                    $size += du("$source/$_", $inode);
1117                    log_("cdcom: adding $_ (size $size)\n", $config->{verbose}, $config->{LOG},4);
1118                    $graft->{"/$destination/$_/"}{"$source/$_"} = 1
1119                } else {
1120                    $graft->{"/$dest/"}{"$source/$media/"} = 1
1121                }
1122            }
1123            #local *A; opendir A, "$source/Mandrake/RPMS";
1124            #foreach (readdir A){
1125            #    /^\.{1,2}$/ and next;
1126            #    my $newdest = readlink "$source/Mandrake/RPMS/$_";
1127            #    $newdest =~ s,((?:../))*(.*), $1/$destination/$2,;
1128            #    log_("cdcom: creating symlink $dest/$_ => $newdest\n", $config->{verbose}, $config->{LOG});
1129            #    my $err = symlink $newdest, "$dir/$cdnum/$dest/$_";
1130            #    !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG}) and next;
1131            #    $graft->{"/$dest/"}{"$dir/$cdnum/$dest/$_"} = 1
1132            #}
1133            #$graft->{"/$dest/"}{"$source/Mandrake/RPMS"} = 1;
1134            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n", $config->{verbose}, $config->{LOG}, 4);
1135            -d $fdest or mkpath $fdest;
1136            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
1137            !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG});
1138            $graft->{"/"}{"$fdest/RPMS"} = 1;
1139            return $size
1140        } else {
1141            -f $fdest or mkpath $fdest;
1142            cpal($source, $fdest, $media);
1143            local *A; opendir A, "$source/$media";
1144            foreach (readdir A) {
1145                /^\.{1,2}$/ and next;
1146                my $newdest = readlink "$source/$media/$_";
1147                $newdest =~ s,((?:../)*)(.*),$1$destination/$2,;
1148                log_("cdcom: creating symlink $dir/$cdnum/$dest/$_ => $dir/$cdnum/$dest/$newdest\n", $config->{verbose}, $config->{LOG},2);
1149                my $err = link "$dir/$cdnum/$dest/$newdest", "$dir/$cdnum/$dest/$_";
1150                # should be OK with new du with inode checking
1151                #$size -= du("$dir/$cdnum/$dest/$newdest");
1152                !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG})
1153            }
1154            log_("cdcom: creating symlink $uppath$dest => $fdest/RPMS\n", $config->{verbose}, $config->{LOG});
1155            my $err = symlink "$uppath$dest", "$fdest/RPMS";                                           
1156            !$err and log_("ERROR cdcom: $!\n", $config->{verbose}, $config->{LOG});
1157               
1158            return $size
1159        }
1160        my $rep = $fct->[1]{dir}; 
1161        my $lists = $fct->[1]{lists};
1162        my $dest_dir = $cd->{function}{data}{dir}{$rep}[1];
1163        my $reploc = "$dir/$cdnum/$dest_dir->{reploc}/";
1164        my $sep_arch = $dest_dir->{sep_arch};
1165        foreach my $list (@$lists) {
1166            $size += process_hdlist_flags($nolive, $fct->[1]{synthesis}, $fct->[1]{hdlist}, $discs_file->[$cdnum]{$rep}{$list}, $dir, $cdnum, $fct, $rep, $reploc, $sep_arch, $graft, $list, $dest_dir->{reploc});
1167        }
1168        return $size
1169    }
1170}
1171
1172sub process_hdlist_flags {
1173    my ($nolive, $synthesis, $hdlist, $discs_files, $dir, $cdnum, $fct, $rep, $reploc, $sep_arch, $graft, $list, $nolive_rep) = @_;
1174    my $size;
1175    log_("process_hdlist_flags: synthesis $synthesis hdlist $hdlist disc $cdnum reploc $reploc\n", $config->{verbose}, $config->{LOG});
1176    my $media_hdlist = $config->{struct}{$config->{struct_version}}{media_hdlist};
1177    if ($nolive) {
1178        if ($synthesis || $hdlist) {
1179            if (ref $discs_files) {
1180                my (undef, $path) = buildGenericHdlist($dir, $cdnum, $fct, $rep, "$reploc/$media_hdlist", $discs_files, $sep_arch);
1181                if ($fct->[1]{hdlist})  {
1182                    $size += du("$reploc/$media_hdlist/hdlist.cz");
1183                    $graft->{"$nolive_rep/$media_hdlist/hdlist.cz"}{"$reploc/$media_hdlist/hdlist.cz"} = 1
1184                }
1185                if ($fct->[1]{synthesis}) {
1186                    $size += du("$reploc/$media_hdlist/synthesis.hdlist.cz");
1187                    $graft->{"$nolive_rep/$media_hdlist/synthesis.hdlist.cz"}{"$reploc/$media_hdlist/synthesis.hdlist.cz"} = 1
1188                }
1189            } else {
1190                log_("WARNING process_hdlist_flags: disc $cdnum rep $rep list $list is empty, no hdlist or synthesis created\n", $config->{verbose}, $config->{LOG});
1191            }
1192        }
1193    } else {
1194        if ($synthesis || $hdlist) {
1195            if (ref $discs_files) {
1196                buildGenericHdlist($dir, $cdnum, $fct, $rep, "$reploc/$media_hdlist", $discs_files, $sep_arch);
1197            } else {
1198                log_("WARNING process_hdlist_flags: disc $cdnum rep $rep list $list is empty, no hdlist or synthesis created\n", $config->{verbose}, $config->{LOG});
1199            }
1200        }
1201    }
1202    $size
1203}
1204
1205sub printSize {
1206    my ($img, $file) = @_;
1207    local *A; open A, ">$file";
1208    my $size = imageSize($img);
1209    log_("printSize: creating $file for $img\n", $config->{verbose}, $config->{LOG});
1210    if ($size) {
1211        print A <<EOF
1212#!/usr/bin/perl
1213
1214\$width = $size->[0];
1215\$height = $size->[1];
1216\@data = ()
1217EOF
1218    } else {
1219        print "ERROR advertising: $size/n";
1220        return 0
1221    }
1222}
1223
1224sub advertising {
1225    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode) = @_;
1226    my $graft = $totgraft->{$cdnum};
1227    if (!$fixed) {
1228        my $size;
1229        my $struct_v = $config->{struct_version};
1230        my $extra = $config->{struct}{$struct_v}{extra};
1231        if ($nolive) {
1232            log_("Getting advertising images size\n", $config->{verbose}, $config->{LOG});
1233            my $addir = "$extra/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
1234            my $rep = "$dir/$cdnum/$addir";
1235            -d $rep or mkpath $rep;
1236            local *L; open L, ">$rep/list";
1237            foreach (@{$fct->[1]{img}}) {
1238                s/\.png$//;
1239                my ($name) = m,([^/]*)$,;
1240                $size += du($_, $inode);
1241                print L "$name\n";
1242                if (-f "$_.png") { $graft->{"$addir/$name.png"}{"$_.png"} = 1 } else { next }
1243                if (-f "$_.pl") { $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
1244                } else {
1245                    printSize("$_.png", "$rep/$name.pl");
1246                    $graft->{"$addir/$name.pl"}{"$_.pl"} = 1
1247                }
1248                -f "${_}_icon.png" and $graft->{"$addir/$name-icon.png"}{"${_}_icon.png"} = 1
1249            } 
1250            close L;
1251            $graft->{"$addir/list"}{"$rep/list"} = 1;
1252            $size += du("$rep/list");
1253            return $size
1254        } else {
1255            my $rep = "$dir/$cdnum/$extra/advertising" . ($fct->[1]{lang} ? ".$fct->[1]{lang}" : "");
1256            log_("Creating advertising images directory ($rep)\n", $config->{verbose}, $config->{LOG});
1257            -d $rep or mkpath $rep;
1258            local *L; open L, ">$rep/list";
1259            foreach (@{$fct->[1]{img}}) {
1260                s/\.png$//;
1261                my ($name) = m,([^/]*)$,;
1262                if (-f "$_.png") { cpal("$_.png", "$rep/$name.png") } else { next }
1263                if (-f "$_.pl") { cpal("$_.pl", "$rep/$name.pl") } else { printSize("$_.png", "$rep/$name.pl") }
1264                -f "${_}_icon.png" and cpal("${_}_icon.png", "$rep/${name}_icon.png");
1265                print L "$name.png\n"
1266            }
1267            close L;
1268            return
1269        }
1270    }
1271}
1272
1273sub dir {
1274    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd) = @_;
1275    if (!$fixed) {
1276        if ($nolive) {
1277            return 0
1278        } else {
1279            my $reploc = "$dir/$cdnum/$fct->[1]{reploc}";
1280            log_("dir: creating $reploc\n", $config->{verbose}, $config->{LOG});
1281            -d $reploc or mkpath $reploc;
1282            return 0   
1283        }
1284    }
1285}
1286
1287sub generic {
1288    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFile) = @_;
1289    my $graft = $totgraft->{$cdnum};
1290    my $size;
1291    my $rep = $fct->[1]{repname};
1292    my $dest_dir = $cd->{function}{data}{dir}{$rep}[1];
1293    my $nolive_rep = $dest_dir->{reploc};
1294    if ($fixed) {
1295        my $lists = $fct->[1]{lists};
1296        log_("generic: rep $rep\n", $config->{verbose}, $config->{LOG});
1297        my $reploc = "$dir/$cdnum/$dest_dir->{reploc}/";
1298        my $sep_arch = $dest_dir->{sep_arch};
1299        my %list;
1300        if ($sep_arch) {
1301            if (-f "$reploc/list") {
1302                open my $list_file, "$reploc/list";
1303                while (<$list_file>) {
1304                    chomp;
1305                    $list{$_} = 1
1306                }
1307            }
1308        }
1309        if ($nolive) {
1310            if ($fixed > 0) {
1311                foreach my $list (@$lists) {
1312                    log_("generic: list $list\n", $config->{verbose}, $config->{LOG});
1313                    foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
1314                        log_("generic: src $src\n", $config->{verbose}, $config->{LOG});
1315                        foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
1316                            if ($_->[0] == 1) {
1317                                my $d = $nolive_rep;
1318                                if ($sep_arch) {
1319                                    $_->[1] =~ /([^.]+)\.rpm$/  or log_("WARNING generic: could not find arch of $_\n", $config->{verbose}, $config->{LOG});
1320                                    $d .= "/$1"
1321                                }
1322                                $graft->{"$d/$_->[1]"}{"$src/$_->[1]"} = 1
1323                            } elsif ($_->[0] == 2) {
1324                                my $d = $nolive_rep;
1325                                if ($sep_arch) {
1326                                    $_->[1] =~ /([^.]+)\.rpm$/  or log_("WARNING generic: could not find arch of $_\n", $config->{verbose}, $config->{LOG});
1327                                    $d .= "/$1"
1328                                }
1329                                delete $graft->{"$d/$_->[1]"}{"$src/$_->[1]"} 
1330                            }
1331                        }
1332                    }
1333                    $size += process_hdlist_flags($nolive, $fct->[1]{synthesis}, $fct->[1]{hdlist}, $discsFile->[$cdnum]{$rep}{$list}, $dir, $cdnum, $fct, $rep, $reploc, $sep_arch, $graft, $list, $nolive_rep);
1334                }
1335            }
1336            if ($sep_arch) {
1337                open my $list_file, ">$reploc/list";
1338                foreach (sort keys %list) { print $list_file "$_\n" if $list{$_} }
1339                close $list_file;
1340                $size += du("$dir/$cdnum/$reploc/list");
1341                $graft->{"$nolive_rep/list"}{"$reploc/list"} = 1
1342            }
1343            return $size
1344        } else {
1345            foreach my $list (@$lists) {
1346                log_("generic: list $list\n", $config->{verbose}, $config->{LOG});
1347                foreach my $src (keys %{$cdfile->[$cdnum]{$rep}{$list}}) {
1348                    log_("generic: src $src\n", $config->{verbose}, $config->{LOG});
1349                    foreach (@{$cdfile->[$cdnum]{$rep}{$list}{$src}}) {
1350                        if ($_->[0] == 1) {
1351                            my $d = $reploc;
1352                            if ($sep_arch) {
1353                                $_->[1] =~ /([^.]+)\.rpm$/ or log_("WARNING generic: could not find arch of $_\n", $config->{verbose}, $config->{LOG});
1354                                $d .= "/$1";
1355                                $list{"$1/$_->[1]"} = 1;
1356                                -d $d or mkdir $d;
1357                            }
1358                            cpal("$src/$_->[1]", $d)   
1359                        }  elsif ($_->[0] == 2) {
1360                            log_("generic: deleting $reploc/$_->[1]\n", $config->{verbose}, $config->{LOG});
1361                            my $d = $reploc;
1362                            if ($sep_arch) {
1363                                $_->[1] =~ /([^.]+)\.rpm$/ or log_("WARNING generic: could not find arch of $_\n", $config->{verbose}, $config->{LOG});
1364                                $list{"$1/$_->[1]"} = 0;
1365                                $d = "$reploc/$1";
1366                            }
1367                            unlink "$d/$_->[1]";
1368                        }
1369                    }
1370                }
1371                $size += process_hdlist_flags($nolive, $fct->[1]{synthesis}, $fct->[1]{hdlist}, $discsFile->[$cdnum]{$rep}{$list}, $dir, $cdnum, $fct, $rep, $reploc, $sep_arch, $graft, $list, $nolive_rep);
1372            }
1373            if ($sep_arch) {
1374                open my $list_file, ">$reploc/list";
1375                foreach (sort keys %list) { print $list_file "$_\n" if $list{$_} }
1376                close $list_file;
1377            }
1378            return 0
1379        }
1380       
1381    }
1382}
1383
1384sub printVERSION {
1385    my ($name, $file, $tag) = @_;
1386    open my $VERSION, ">$file";
1387    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
1388    $year += 1900;
1389    printf $VERSION "Mandrakelinux $name $tag %04d%02d%02d $hour:%02d\n", $year, $mon+1, $mday, $min;
1390}
1391
1392sub buildGenericHdlist {
1393    my ($dir, $cdnum, $fct, $rep, $reploc, $discsFilescdrep, $sep_arch) = @_;
1394    my @rpm = map { "$discsFilescdrep->{$_}/$_.rpm" } keys %$discsFilescdrep;
1395   
1396    if ($fct->[1]{synthesis}) {
1397        -d $reploc or mkpath $reploc;
1398    }
1399    # $hdlist = "$reploc/hdlist$cdnum$rep.cz" if $fct->[1]{hdlist};
1400    # my $synthesis = "$reploc/synthesis.hdlist$cdnum$rep.cz" if $fct->[1]{synthesis};
1401    my ($hdlist, $synthesis, @md5files);
1402    my $struct_v = $config->{struct_version};
1403    if ($fct->[1]{hdlist}) {
1404        $hdlist = "$reploc/hdlist.cz";
1405        -d $reploc or mkdir $reploc;
1406        push @md5files, $hdlist
1407    }
1408    if ($fct->[1]{synthesis}) {
1409        $synthesis = "$reploc/synthesis.hdlist.cz";
1410        -d $reploc or mkdir $reploc;
1411        push @md5files, $synthesis
1412    }
1413    my $urpm = mkcd_build_hdlist(1, [ 0, { hdlist => $hdlist, rpms => \@rpm , synthesis => $synthesis } ], "$config->{tmp}/.mkcd_build_hdlist");
1414    compute_files_md5("$reploc/MD5SUM", \@md5files);
1415    $urpm, $reploc
1416}
1417
1418sub buildInstallHdlist {
1419    my ($dir, $cdnum, $inst, $list, $discsFiles, $sort, $nolive) = @_;
1420    my (@hdlist, @hdlist_list);
1421    my $struct_v = $config->{struct_version};
1422    my $media_info = $config->{struct}{$struct_v}{media_info};
1423    -d "$dir/$cdnum/$media_info" or mkpath "$dir/$cdnum/$media_info";
1424    open my $HDLISTS, ">$dir/$cdnum/$media_info/hdlists";
1425    my (%rpmdone, %cd_rep);
1426    my %kerneldone;
1427    my $repnum = 1;
1428    my (@thisInstallRep, @check, @md5files);
1429    my $headers_dir = "$config->{tmp}/.mkcd_build_hdlist";
1430    my $path = "$dir/$cdnum/$media_info";
1431    my $suppl_cd = $inst->[1]{suppl_cd};
1432    my $suppl_postfix = 's' if $suppl_cd;
1433    log_("buildInstallHdlist: suppl_postfix is '$suppl_postfix' ($suppl_cd && $struct_v)\n", $config->{verbose}, $config->{LOG});
1434    foreach my $rd (@{$inst->[1]{tmp_rpmsdir}}) {
1435        my ($ls, $cdrep, $repname, $opts) = @$rd;
1436        log_("buildInstallHdlist: suppl_cd $suppl_cd cd $cdrep repname $repname fixed $opts->{fixed}\n", $config->{verbose}, $config->{LOG});
1437        next if $suppl_cd && $opts->{fixed};
1438        if (!$list->{$cdrep}) { log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n", $config->{verbose}, $config->{LOG}); next }
1439        my $a = $discsFiles->[$cdrep]{$repname};
1440        if (!(ref($a) && %$a)) { log_("WARNING buildInstallHdlist: $cdrep/$repname is empty\n", $config->{verbose}, $config->{LOG}); next }
1441        my $realcd = $config->{disc}[$cdrep]{name};
1442        my $rpmdir = $config->{disc}[$cdrep]{function}{data}{dir}{$repname}[1]{reploc};
1443        $rpmdir .= "/%{ARCH}" if $config->{disc}[$cdrep]{function}{data}{dir}{$repname}[1]{sep_arch};
1444        if (!$rpmdir) { log_("ERROR buildInstallHdlist: disc $cdrep: $repname not defined\n", $config->{verbose}, $config->{LOG}); next }
1445        $hdlist[$repnum]{rpms} = [];
1446        if ($opts->{oem}) {
1447            log_("buildInstallHdlist: oem mode for $cdrep/$repname ($rpmdir)\n", $config->{verbose}, $config->{LOG});
1448            foreach (@{$inst->[1]{oem}{hdlist}}) {
1449                my ($oemdir, $hl, $rep, $name) = @$_;
1450                print $HDLISTS "noauto:" if $opts->{noauto};
1451                print $HDLISTS "$hl $rep $name\n";
1452                my $hdlist = "$path/$hl";
1453                log_("buildInstallHdlist: adding oem hdlist $hdlist from $dir\n", $config->{verbose}, $config->{LOG});
1454                if ($inst->[1]{oem}{norebuild}) {
1455                    cpal("$oemdir/$hl", $hdlist)
1456                }
1457                $hdlist[$repnum]{hdlist} = $hdlist;
1458                $hdlist_list[$repnum] = $hdlist;
1459                $hdlist[$repnum]{synthesis} = "$path/synthesis.$hl";
1460                push @md5files, ($hdlist, "$path/synthesis.$hl");
1461                $repnum++
1462            }
1463        } else {
1464            #
1465            # even for live sources rpm are taken, this may lead to errors in some special case, where
1466            # the sources change after the live is created, but this could help in combined live/nolive
1467            # situation
1468            #
1469            log_("installation: $cdrep - $repname - list $ls\n", $config->{verbose}, $config->{LOG});
1470            foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1471                next if $ls && $ls != $list;
1472                $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
1473                push @{$check[$repnum]}, [$cdrep, $repname, $list];
1474                log_("installation: list $list\n", $config->{verbose}, $config->{LOG});
1475                my $cdsfilesrpms = $discsFiles->[$cdrep]{$repname}{$list};
1476                my %localdone;
1477                my %localkerneldone;
1478                # FIXME taken from tools
1479                my $kernel_like = "((?:(?:NVIDIA_)?kernel.*)|NVIDIA_nforce.*|cm2020.*)";
1480                #
1481                log_("buildInstallHdlist: update ($opts->{update}) nodupkernel ($opts->{nodupkernel}) mode for $cdrep/$repname list $list\n", $config->{verbose}, $config->{LOG}, 3);
1482                push @{$hdlist[$repnum]{rpms}}, map {
1483                    if (/$kernel_like-[^.]+(?:\.[^.]+){3,5}mdk-[^-]+-[^-]+\.[^.]+$/) {
1484                        $kerneldone{$1} = 1;
1485                    }
1486                    if (/(.*)-[^-]+-[^-]+\.[^.]+$/) {
1487                        $rpmdone{$_} = 1;
1488                        $rpmdone{$1} = 1;
1489                        "$cdsfilesrpms->{$_}/$_.rpm" }
1490                    } grep {
1491                        if ($opts->{nodupkernel} && /($kernel_like-[^.]+(?:\.[^.]+){3,5}mdk)-[^-]+-[^-]+\.[^.]+$/) {
1492                            if ($localdone{$1} || $localkerneldone{$2}) { 0 }
1493                            else {
1494                                $localkerneldone{$2} = 1;
1495                                $localdone{$1} = 1;
1496                                ! ($kerneldone{$2} || $rpmdone{$_} || !$opts->{update} && $rpmdone{$1})
1497                            }
1498                        } elsif (/(.*)-[^-]+-[^-]+\.[^.]+$/) {
1499                            if ($localdone{$1}) { $inst->[1]{dup} }
1500                            else {
1501                                $localdone{$1} = 1;
1502                                $inst->[1]{dup} || ! ($rpmdone{$_} || !$opts->{update} && $rpmdone{$1})
1503                            } } } keys %$cdsfilesrpms;
1504                $hdlist[$repnum]{callback} = sub {
1505                       my ($urpm, $id) = @_;
1506                       my $pkg = $urpm->{depslist}[$id];
1507                       my $filename = $pkg->filename;
1508                       $urpm->{id}{$filename} = $id;
1509                       $pkg->pack_header
1510                   }
1511            }
1512            if (@{$hdlist[$repnum]{rpms}}) {
1513                print $HDLISTS "noauto:" if $opts->{noauto};
1514                if ($realcd) {
1515                    print $HDLISTS "hdlist$repnum$suppl_postfix.cz $rpmdir disc $realcd $config->{disc}[$cdrep]{longname}\n";
1516                } else {
1517                    print $HDLISTS "hdlist$repnum$suppl_postfix.cz $rpmdir $config->{disc}[$cdrep]{longname}\n";
1518                }
1519                $cd_rep{$repnum} = [ $cdrep, $rpmdir ];
1520                my %keys;
1521                my $text;
1522                foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1523                    foreach my $keyfile (@{$config->{list}[$list]{keyfiles}}) {
1524                        if (-f $keyfile) {
1525                            log_("buildInstallHdlist: dumping $keyfile in $dir/$cdnum/$media_info/pubkey$repnum$suppl_postfix\n", $config->{verbose}, $config->{LOG}, 3);
1526                            open my $KF, $keyfile;
1527                            my $key;
1528                            while (<$KF>) {
1529                                $key .= $_;
1530                                if (/^-----END PGP PUBLIC KEY BLOCK-----/) {
1531                                    if (! $keys{$key}) {
1532                                        $keys{$key} = 1;
1533                                        $text .= $key
1534                                    }
1535                                    $key = ''
1536                                }
1537                            }
1538                            close $KF
1539                        } else { 
1540                            log_("ERROR buildInstallHdlist: $keyfile file does not exist\n", $config->{verbose}, $config->{LOG}, 0);
1541                        }
1542                    }
1543                }
1544                if ($text) {
1545                    open my $KEY, ">$dir/$cdnum/$media_info/pubkey$repnum$suppl_postfix";
1546                    print $KEY $text;
1547                    close $KEY;
1548                }
1549                $hdlist_list[$repnum] = "$path/hdlist$repnum$suppl_postfix.cz";
1550                $hdlist[$repnum]{hdlist} = $hdlist_list[$repnum];
1551                push @md5files, $hdlist_list[$repnum];
1552                if ($inst->[1]{synthesis}) { 
1553                    $hdlist[$repnum]{synthesis} = "$path/synthesis.hdlist$repnum$suppl_postfix.cz";
1554                    push @md5files, $hdlist[$repnum]{synthesis}
1555                }
1556                $repnum++
1557            } else {
1558                log_("WARNING installation: $cdrep $repname is empty, ignoring\n", $config->{verbose}, $config->{LOG});
1559            }
1560        }
1561    }
1562    # FIXME OEM mode not tested, moreover this norebuild test is wrong, new URPM need to rebuild hdlist.
1563    if (!$inst->[1]{oem}{norebuild}) {
1564        my $urpm = mkcd_build_hdlist($repnum - 1, \@hdlist, $headers_dir, "$path/depslist.ordered", "$path/provides", "$path/compss");
1565        get_sorted_packages($urpm, \@hdlist, $sort, \%cd_rep, "$dir/$cdnum", $nolive, $config->{verbose}, $config->{LOG});
1566    }
1567    log_("installation: compute_files_md5 @md5files\n", $config->{verbose}, $config->{LOG});
1568    compute_files_md5("$dir/$cdnum/$media_info/MD5SUM", \@md5files);
1569
1570    log_("installation: oem ($inst->[1]{oem})\n", $config->{verbose}, $config->{LOG});
1571    if (!$inst->[1]{oem}{oem}) {
1572        log_("installation: checkDiscs\n", $config->{verbose}, $config->{LOG});
1573        checkDiscs(\@hdlist_list, "$path/depslist.ordered", \@thisInstallRep, \@check, $config->{LOG}) or die "depslist.ordered, hdlists and RPMS mismatch\n";
1574    }
1575# Add sources
1576    foreach my $rd (@{$inst->[1]{srpmsdir}}) {
1577        my ($ls, $cdrep, $repname, $opts) = @$rd;
1578        if (!$list->{$cdrep}) { log_("WARNING buildInstallHdlist: disc $cdrep not in list, ignoring\n", $config->{verbose}, $config->{LOG}); next }
1579        foreach my $list (keys %{$discsFiles->[$cdrep]{$repname}}) {
1580            next if $ls && $ls == $list;
1581            $thisInstallRep[$cdrep]{$repname}{$list} = $discsFiles->[$cdrep]{$repname}{$list};
1582        }
1583    }
1584    if ($inst->[1]{suppl}) {
1585        print $HDLISTS "suppl\n"
1586    }
1587    if ($inst->[1]{askmedia}) {
1588        print $HDLISTS "askmedia\n"
1589    }
1590    my $pfile = "$dir/$cdnum/pkg-$config->{name}" . ($inst->[1]{tag} ? "-$inst->[1]{tag}" : "") . ".idx";
1591    printDiscsFile($config, \@thisInstallRep, $pfile);
1592    return $repnum, $path, $pfile, $suppl_postfix
1593}
1594
1595sub boot {
1596    my ($class, $fct, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles, $sort) = @_;
1597    my $graft = $totgraft->{$cdnum};
1598    my $isolinux = $fct->[1]{isolinux};
1599    my $bootimg = $fct->[1]{bootimg};
1600    log_("Boot: $fixed nolive $nolive\n", $config->{verbose}, $config->{LOG});
1601    my $struct_v = $config->{struct_version};
1602    my $isolinux_dir = $fct->[1]{isolinux_dir} || $config->{struct}{$struct_v}{isolinux};
1603    if (!$fixed) {
1604        my $size;
1605        my (@chunk_first, @chunk);
1606        if ($nolive) {
1607            my $mkiso;
1608            my $img;
1609            my $dir;
1610            my $path;
1611            if ($isolinux) {
1612                log_("boot: isolinux mode (bootimg $bootimg)\n", $config->{verbose}, $config->{LOG});
1613                my $img = $bootimg ? $bootimg->[0] : "$isolinux_dir/isolinux.bin"; 
1614                $mkiso = qq( -b $img -c $isolinux_dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table);
1615                push @chunk_first, $img;
1616                $graft->{"$isolinux_dir/boot.cat"} = 0;
1617            } elsif ($bootimg) {
1618                log_("boot: el torito mode (bootimg $bootimg->[0])\n", $config->{verbose}, $config->{LOG});
1619                $img = $bootimg->[0];
1620                $dir = $bootimg->[1]{dir};
1621                $img =~ s,(.*)/([^/]+)$,$2,;
1622                $dir or ($dir) = $1;
1623                $mkiso = qq( -b $dir/$img -c ${dir}/boot.cat);
1624                $graft->{"$dir/boot.cat"} = 0;
1625            }
1626            foreach (@{$fct->[1]{files}}) {
1627                my ($files, $opt) = @$_;
1628                my $dest = $opt->{dest};
1629                $size += du($files);
1630                my ($dirname) = $files =~ m,([^/]*)$,;
1631                log_("boot: files $files dest $dest dirname $dirname\n", $config->{verbose}, $config->{LOG});
1632                if ($img) { 
1633                    my $bimg = $bootimg->[0];
1634                    $bimg =~ s/$dirname//;
1635                    log_("boot: boot image $files/$bimg ($bimg) in $dir/$img (" . (stat "$files/$bimg")[7] . ")\n", $config->{verbose}, $config->{LOG});
1636                    if (-f "$files/$bimg") { 
1637                        if ((stat "$files/$bimg")[7] > 3000000) { 
1638                            $mkiso .= qq( -no-emul-boot)
1639                        }
1640                        # $mkiso .= qq( $dir/$img=$files/$bimg)
1641                        push @chunk_first, "$files/$bimg";
1642                        $graft->{"$dir/$img"}{"$files/$bimg"} = 1
1643                    }
1644                }
1645               
1646                # if (-d "$files") { $mkiso .= " $dest/$dirname/=$files"; next }
1647                # $mkiso .= " $dest/=$files";
1648                log_("boot: graft $dest/$dirname/ from $files\n", $config->{verbose}, $config->{LOG});
1649                if (-d $files) { 
1650                    $graft->{"$dest/$dirname/"}{$files} = 1 
1651                } else { 
1652                    $graft->{"$dest/"}{$files} = 1 
1653                }
1654                $dest =~ s,/+,/,g;
1655                if ($opt->{first}) {
1656                    push @chunk_first, $dest
1657                } else {
1658                    unshift @chunk, $dest 
1659                }
1660                push @chunk_first, "$dir/boot.cat"
1661            }
1662            # it is = and not .= because mkcdisos->[$cdnum] has been added already at the beginning
1663            $mkisos->[$cdnum] = "$mkiso $mkisos->[$cdnum]";
1664        } else {
1665            log_("FILES $fct->[1]{files}\n", $config->{verbose}, $config->{LOG});
1666            foreach (@{$fct->[1]{files}}) {
1667                my ($files, $opt) = @$_;
1668                my $dest = "$config->{topdir}/build/$config->{name}/" . ($opt->{first} ? "first/" : "") . "$cdnum/";
1669                # FIXME first should ne obsolete, however it appears in several place, and the removal must be done with care
1670                -d $dest or mkpath $dest;
1671                my $odest = $opt->{dest};
1672                log_("boot: file $files (first $opt->{first} to $dest odest $odest)\n", $config->{verbose}, $config->{LOG});
1673                if ($odest) {
1674                    $dest .= "/$odest";
1675                    if ($odest =~ m,/$,) { mkpath $dest }
1676                } else {
1677                    my ($dirname) = $files =~ m,([^/]*)$,;
1678                    $dest .= "/$dirname"
1679                }
1680                $dest =~ s,/+,/,g;
1681                log_("boot: file $files (to $dest odest $odest)\n", $config->{verbose}, $config->{LOG});
1682                cpal($files, $dest, "(rr_moved|boot.cat)");
1683                if ($opt->{first}) {
1684                    push @chunk_first, $dest
1685                } else {
1686                    unshift @chunk, $dest 
1687                }
1688                push @chunk_first, "$dir/boot.cat"
1689            }
1690            if ($fct->[1]{oem}) {
1691                log_("boot: setting default boot to oem\n", $config->{verbose}, $config->{LOG});
1692                my $dest = "$config->{topdir}/build/$config->{name}/first/$cdnum/$isolinux_dir";
1693                -d $dest or mkpath $dest;
1694                my $old = "$dest/isolinux.cfg";
1695                my $new = "$dest/isolinux.cfg.new";
1696                copy $old, $new;
1697                unlink $old;
1698                link $new, $old;
1699                unlink $new;
1700                substInFile { s/default linux/default oem/ } $old
1701            }
1702            $graft->{"/"}{"$dir/first/$cdnum/"} = 1;
1703            $size = du("$dir/first/$cdnum/", $inode);
1704        }
1705        push @{$sort->{$cdnum}}, \@chunk_first;
1706        unshift @{$sort->{$cdnum}}, \@chunk;
1707        return $size
1708    } elsif ($fixed == 1) {
1709        if (!$nolive) {
1710            if ($isolinux) {
1711                my $img = $bootimg ? $bootimg->[0] : "$isolinux_dir/isolinux.bin"; 
1712                $mkisos->[$cdnum] .= qq( -b $img -c $isolinux_dir/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table "$config->{topdir}/build/$config->{name}/first/$cdnum");
1713                if (-f "$dir/$cdnum/$img") {
1714                    push @{$sort->{$cdnum}}, [ "$dir/$cdnum/$img" ];
1715                } elsif (-f "$dir/first/$cdnum/$img") {
1716                    push @{$sort->{$cdnum}}, [ "$dir/first/$cdnum/$img" ];
1717                }
1718                $graft->{"$isolinux_dir/boot.cat"} = 0
1719            } elsif ($bootimg) {
1720                my $img = $bootimg->[0];
1721                my $sdir = $bootimg->[1]{dir};
1722                $img =~ s,(.*/)([^/]+)$,$2,;
1723                $sdir or ($sdir) = $1;
1724                $sdir =~ s,//+,/,g;
1725                $sdir =~ s,/$,,g;
1726                log_("boot: boot image $sdir/$img\n", $config->{verbose}, $config->{LOG});
1727                $mkisos->[$cdnum] .= qq(-b $sdir/$img);
1728                my $Bootdir;
1729                my $cdimages;
1730                log_("boot: try to find boot image in $cdimages/$bootimg->[0] and $dir/first/$cdnum/$bootimg->[0]\n", $config->{verbose}, $config->{LOG});
1731                if (-f "$cdimages/$bootimg->[0]") {
1732                    $cdimages = "$dir/$cdnum";
1733                    $Bootdir = "$dir/$cdnum/$sdir/";
1734                } elsif (-f "$dir/first/$cdnum/$bootimg->[0]") {
1735                    $cdimages = "$dir/first/$cdnum";
1736                    $Bootdir = "$dir/first/$cdnum/$sdir/";
1737                } else {
1738                    die "FATAL boot: could not find boot image\n";
1739                }
1740                if ((stat "$cdimages/$bootimg->[0]")[7] > 3000000) { 
1741                    $mkisos->[$cdnum] .= qq( -no-emul-boot)
1742                }
1743                push @{$sort->{$cdnum}}, [ "$cdimages/$bootimg->[0]" ];
1744                $Bootdir =~ s,//+,/,g;
1745                $Bootdir =~ s,/$,,g;
1746                if (! -f "$Bootdir/$img") {
1747                    if (! -d $Bootdir) { mkpath $Bootdir or die "cannot create $Bootdir\n" }
1748                    my $err = link "$cdimages/$bootimg->[0]", "$Bootdir/$img";
1749                    if (!$err) { log_("Linking failed $cdimages/$bootimg->[0]: $!\n", $config->{verbose}, $config->{LOG}) };
1750                }
1751                $mkisos->[$cdnum] .= qq( -c $sdir/boot.cat $dir/first/$cdnum);
1752                $graft->{"$sdir/boot.cat"} = 0;
1753                log_("BOOT $mkisos->[$cdnum]\n", $config->{verbose}, $config->{LOG});
1754            }
1755        }
1756    }
1757}
1758
1759sub installation {
1760    my ($class, $inst, $dir, $fixed, $nolive, $cdnum, $cd, $cdfile, $list, $mkisos, $totgraft, $inode, $discsFiles, $sort) = @_;
1761    my $graft = $totgraft->{$cdnum};
1762    my $install = $inst->[1]{install};
1763    my $struct_v = $config->{struct_version};
1764    my $struct = $config->{struct}{$struct_v};
1765    my ($isolinux_dir, $images_dir, $media_base, $extra_dir, $media_info, $install_dir, $compss_name) = ($struct->{isolinux}, $struct->{images}, $struct->{media_base}, $struct->{extra}, $struct->{media_info}, $struct->{install}, $struct->{compssUsers});
1766
1767    my ($compss, $rpmsrate);
1768    if (defined $cd->{function}{data}{installation}[1]{compssUsers}) {
1769        $compss = $cd->{function}{data}{installation}[1]{compssUsers}
1770    } elsif ($install) {
1771        $compss = "$install/$media_info/$compss_name"
1772    }
1773    if (defined $cd->{function}{data}{installation}[1]{rpmsrate}) {
1774        $rpmsrate = $cd->{function}{data}{installation}[1]{rpmsrate}
1775    } elsif ($install) {
1776        $rpmsrate = "$install/$media_info/base/rpmsrate";
1777    }   
1778    if (!$fixed) {
1779        my $size;
1780        my $media_dir = $struct->{media};
1781
1782        if ($nolive) {
1783            if ($install) {
1784                opendir my $A, $install;
1785                foreach (readdir $A) {
1786                    /~$/ and next;
1787                    /^(\.{1,2}|$install_dir|LICENSE-APPS\.txt|$isolinux_dir|$images_dir|VERSION|boot\.cat|rr_moved|$media_base)$/ and next;
1788                    $size += du("$install/$_");
1789                    if (-d "$install/$_") { $graft->{"/$_/"}{"$install/$_"} = 1; next }
1790                    $graft->{"/"}{"$install/$_"} = 1
1791                }
1792
1793                local *A; opendir A, "$install/$install_dir";
1794                foreach (readdir A) {
1795                    log_("$install_dir -- $_\n", $config->{verbose}, $config->{LOG}, 3);
1796                    /~$/ and next;
1797                    # FIXME both old and new structure detailed
1798                    "$install_dir/$_" =~ m{^($install_dir/(\.{1,2}|$media_base))$|$media_dir|$media_info|$extra_dir|$images_dir|$isolinux_dir} and next;
1799                    $size += du("$install/$install_dir/$_");
1800                    # if (-d "$install/Mandrake/$_") { $mkiso .= " Mandrake/$_/=$install/Mandrake/$_"; next }
1801                    # $graft->{"Mandrake/"}{"$install/Mandrake/$_"} = 1;
1802                    if (-d "$install/$install_dir/$_") { $graft->{"$install_dir/$_/"}{"$install/$install_dir/$_"} = 1; next }
1803                    $graft->{"$install_dir/"}{"$install/$install_dir/$_"} = 1;
1804                }
1805
1806                local *A; opendir A, "$install/$media_info";
1807                foreach (readdir A) {
1808                    /~$/ and next; 
1809                    /(^(\.{1,2}|compss|provides|depslist.ordered|MD5SUM|pubkey.*|synthesis|$compss_name|rpmsrate|rpmslist|filelist|Serial|hashfile)|hdlist|cooker)/ and next;
1810                    $size += du("$install/$media_info/$_");
1811                    # if (-d "$install/Mandrake/base/$_") { $mkiso .= " Mandrake/base/$_/=$install/Mandrake/base/$_"; next}
1812                    # $mkiso .= " Mandrake/base/=$install/Mandrake/base/$_";
1813                    if (-d "$install/$media_info/$_") { $graft->{"$media_info/$_/"}{"$install/$media_info/$_"} = 1; next }
1814                    $graft->{"$media_info/"}{"$install/$media_info/$_"} = 1
1815                }
1816            }
1817            if ($compss) {
1818                if (-f $compss) { 
1819                    log_("installation: $compss_name $compss\n", $config->{verbose}, $config->{LOG}, 2);
1820                    $size += du($compss);
1821                    $graft->{"$media_info/$compss_name"}{$compss} = 1
1822                } else { log_("ERROR installation: $compss file does not exist", $config->{verbose}, $config->{LOG}, 0) } 
1823            }
1824        } else {
1825            if ($install) {
1826                cpal("$install/$install_dir","$dir/$cdnum/$install_dir","$install/*($extra_dir|$images_dir|($install_dir/*)?$isolinux_dir|$media_dir|$media_info)");
1827                cpal("$install/","$dir/$cdnum/","$install/*($install_dir|$images_dir|$isolinux_dir|$media_base|tutorial|misc|doc|LICENSE-APPS.txt|boot.cat|rr_moved)");
1828                cpal("$install/$media_info","$dir/$cdnum/$media_info","$install/*$media_info/*(hdlist|MD5SUM|pubkey|depslist|synthesis|rpmslist|filelist|Serial|hashfile|$compss_name|rpmsrate)");
1829
1830                #cpal("$install/", "$dir/$cdnum", "($install/+(media/+|install/+(extra|images|isolinux)|(Mandrake/+base|media/+media_info)/+(hdlist|MD5SUM|pubkey|depslist|synthesis|rpmslist|filelist|Serial|hashfile|compssUsers|rpmsrate)|Mandrake/+RPMS|Mandrake/+share|isolinux|images|tutorial|misc|doc|LICENSE-APPS.txt|boot.cat|rr_moved))");
1831                if (!$inst->[1]{oem}) {
1832                    cpal("$install/tutorial", "$dir/$cdnum/tutorial") if -d "$install/tutorial";
1833                    cpal("$install/misc", "$dir/$cdnum/misc") if -d "$install/misc";
1834                    cpal("$install/doc", "$dir/$cdnum/doc") if -d "$install/doc";
1835                }
1836
1837            }
1838            if ($compss) {
1839                if (-f $compss) {
1840                    my $path = "$dir/$cdnum/$media_info";
1841                    -d $path or mkpath $path;
1842                    log_("installation: $compss_name $compss\n", $config->{verbose}, $config->{LOG}, 2);
1843                    cpal($compss, "$path/$compss_name");
1844                } else { log_("ERROR installation: $compss file does not exist", $config->{verbose}, $config->{LOG}, 0) }
1845            }
1846        }
1847        return $size
1848    } else {
1849        my $patch_dir = $struct->{patch};
1850        my $stage2 = $struct->{stage2};
1851        if ($nolive) {
1852            my $size;
1853            if ($inst->[1]{boot_medium}) {
1854                -d "$dir/$cdnum/$patch_dir" or mkpath "$dir/$cdnum/$patch_dir";
1855                my $file = "$dir/$cdnum/$patch_dir/patch-oem.pl";
1856                my $A;
1857                if (-f "$install/$patch_dir/patch-oem.pl") {
1858                    copy "$install/$patch_dir/patch-oem.pl", $file;
1859                    open $A, ">>$file" or print "ERROR installation: could not open $file for writing\n";
1860                } else {
1861                    open $A, ">$file" or print "ERROR installation: could not open $file for writing\n";
1862                }
1863                print $A "use install_any;
1864package install_any;
1865
1866\$current_medium = $inst->[1]{boot_medium};
1867\$asked_medium = $inst->[1]{boot_medium};
1868                ";
1869                $graft->{"$patch_dir/"}{$file} = 1;
1870                $size += du($file, $inode)
1871            }
1872            my ($repnum, $path, $pfile, $suppl_postfix) = buildInstallHdlist($dir, $cdnum, $inst, $list, $discsFiles, $sort, $nolive);
1873            if ($install && $fixed == 1) {
1874               
1875                # $mkiso = " Mandrake/base/=$path/compss Mandrake/base/=$path/depslist.ordered Mandrake/base/=$path/provides Mandrake/base/=$path/hdlists /=$pfile";
1876                $graft->{"$media_info/"}{"$path/compss"} = 1;
1877                $graft->{"$media_info/"}{"$path/depslist.ordered"} = 1; 
1878                $graft->{"$media_info/"}{"$path/provides"} = 1;
1879                $graft->{"$media_info/"}{"$path/hdlists"} = 1;
1880                $graft->{"$media_info/"}{"$path/MD5SUM"} = 1;
1881                $graft->{"/"}{$pfile} = 1;
1882                if ($rpmsrate) {
1883                    if (-f $rpmsrate) {
1884                        $size += du($rpmsrate);
1885                        # $mkiso .= " Mandrake/base/rpmsrate=$rpmsrate"
1886                        $graft->{"$media_info/rpmsrate"}{$rpmsrate} = 1
1887                    } else { log_("ERROR installation: $rpmsrate file does not exist", $config->{verbose}, $config->{LOG}, 0); return 0 }
1888                }
1889                $size += du("$path/compss", $inode);
1890                $size += du("$path/depslist.ordered");
1891                $size += du("$path/provides");
1892                $size += du($pfile, $inode);
1893                unshift @{$sort->{$cdnum}}, [ "$path/", "$install/$stage2" ]
1894            }
1895            my $version = "$dir/$cdnum/VERSION";
1896            $size += du("$path/hdlists");
1897            printVERSION($config->{name}, $version, $inst->[1]{tag});
1898            $graft->{VERSION}{$version} = 1;
1899            $size += du($version);     
1900            foreach my $n (1 .. $repnum - 1) {
1901                # $mkiso .= " Mandrake/base/=$path/hdlist$n.cz";
1902                $graft->{"$media_info/"}{"$path/hdlist$n$suppl_postfix.cz"} = 1;
1903                # FIXME This is wrong, previous hdlist size must be deduced in iterative rebuild mode
1904                $size += du("$path/hdlist$n$suppl_postfix.cz");
1905                if (-f "$path/pubkey$n") { 
1906                    $graft->{"$media_info/"}{"$path/pubkey$n$suppl_postfix"} = 1;
1907                    $size += du("$path/pubkey$n$suppl_postfix");
1908                }
1909                if ($inst->[1]{synthesis}) {
1910                    # $mkiso .= " Mandrake/base/=$path/synthesis.hdlist$n.cz";
1911                    $graft->{"$media_info/"}{"$path/synthesis.hdlist$n$suppl_postfix.cz"} = 1;
1912                    $size += du("$path/synthesys.hdlist$n$suppl_postfix.cz")
1913                }
1914            }
1915            return $size;
1916        } else {
1917            if (!$install) { mkpath "$dir/$cdnum/$media_info/" ; mkpath "$dir/$cdnum/$install_dir" }
1918            if ($inst->[1]{boot_medium}) {
1919                log_("installation: boot_medium defined to $inst->[1]{boot_medium}\n", $config->{verbose}, $config->{LOG}, 2);
1920                my $file = "$dir/$cdnum/$patch_dir/patch-oem.pl";
1921                my $A;
1922                if (-f $file) {
1923                    unlink $file;
1924                    copy "$install/$patch_dir/patch-oem.pl", $file;
1925                    open $A, ">>$file" or print "ERROR installation: could not open $file for writing\n";
1926                } else {
1927                    open $A, ">$file" or print "ERROR installation: could not open $file for writing\n";
1928                }
1929                print $A "use install_any;
1930package install_any;
1931
1932\$current_medium = $inst->[1]{boot_medium};
1933\$asked_medium = $inst->[1]{boot_medium};
1934";
1935            } 
1936            unlink "$dir/$cdnum/$media_info/hdlists";
1937            buildInstallHdlist($dir, $cdnum, $inst, $list, $discsFiles, $sort);
1938            if ($fixed == 1) {
1939                if ($rpmsrate) {
1940                    if (-f $rpmsrate) {
1941                        log_("installation: rpmsrate: $rpmsrate\n", $config->{verbose}, $config->{LOG}, 2);
1942                        cpal($rpmsrate, "$dir/$cdnum/$media_info/rpmsrate");
1943                    } else { 
1944                        log_("ERROR installation: $rpmsrate file does not exist", $config->{verbose}, $config->{LOG}, 0); 
1945                        return 0 
1946                    }
1947                }
1948                if ($install) {
1949                    unshift @{$sort->{$cdnum}}, [ "$dir/$cdnum/$media_info/", "$dir/$cdnum/$stage2" ]
1950                }
1951            }
1952            my $version = "$dir/$cdnum/VERSION";
1953            unlink $version;
1954            printVERSION($config->{name}, $version, $inst->[1]{tag});
1955        }
1956    }
1957}
1958
19591
1960
1961#
1962# Changeloh
1963#
1964# 2002 03 15
1965# new sources handling in installation
1966#
1967# 2002 03 19
1968# cdcom are now build as normal ones not to force deps, use standard list
1969#
1970# 2002 03 29
1971# fix a bug in nolive mode that prevent rpmsrate to be put on discs
1972#
1973# 2002 05 13
1974# finish md5 check
1975# fix commented du in sub installation
1976#
1977# 2002 08 01
1978# add noauto options for rpmsdir
1979#
1980# 2002 08 14
1981# fix little bug in buildGenericHdlists
1982#
1983# 2002 10 02
1984# allow glob in rm function for live mode (need to do it for nolive mode)
1985#
1986# 20030401
1987# get_rpmsdir now manages hdlist dir
Note: See TracBrowser for help on using the repository browser.