- adjust module config
[opensuse:installation-images.git] / lib / ReadConfig.pm
1 #! /usr/bin/perl -w
2
3 # Read the config file ('etc/config') and set up some useful variables.
4 # Exports some useful functions, too.
5 #
6 # Usage:
7 #
8 #   use ReadConfig;
9 #
10 #   exported functions:
11 #     Print2File(file_name, print_args);
12 #     SUSystem(command);
13 #
14 #   exported arrays:
15 #     %ConfigData
16 #
17 #   exported variables:
18 #     $Script, $BasePath, $LibPath, $BinPath, $CfgPath, $ImagePath,
19 #     $DataPath, $TmpBase, $MToolsCfg, $AutoBuild
20 #
21 #   symbols *not* exported by default:
22 #     $SUBinary, DebugInfo
23
24 =head1 ReadConfig
25
26 C<ReadConfig> is a perl module that reads config data from C<etc/config>
27 initializes a few global variables and exports some useful functions. It
28 should always be included in scripts operating within the C<bootdisk>
29 directory hierarchy.
30
31 It assumes that the script that included this library was either called from
32 the base directory or from the C<bin> subdirectory of the base directory.
33 The base directory itself may be located anywhere.
34
35 This is mainly to avoid an environment variable to hold the base directory
36 (like C<BOOTDISK_ROOT> or something similar).
37
38 For the curious: the regular expression used to find the base directory name
39 from the full script name is:
40
41 C<( $0 =~ /(.*?)((?<![^\/])bin\/)?([^\/]+)$/ )[0]>
42
43 =head2 Usage
44
45 C<BEGIN { unshift @INC, ( $0 =~ /(.*?)((?<![^\/])bin\/)?[^\/]+$/ )[0] . "lib" }>
46
47 C<use ReadConfig;>
48
49 =head2 Description
50
51 =over
52
53 =item *
54
55 C<Print2File(file_name, print_args)>
56
57 C<Print2File(file_name, print_args)> opens the file C<file_name> and prints
58 to it. C<print_args> are the arguments that would be given to a normal
59 C<print> command. It's mainly for convenience.
60
61 =for html <p>
62
63 =item *
64
65 C<SUSystem(command)>
66
67 C<SUSystem(command)> executes C<command> with root permissions. This
68 requires a special 'C<sudo>' command to be installed that can give you root
69 privileges without asking for a password. The name of this command is
70 C</usr/local/sw> and can only be changed by editing the C<ReadConfig.pm>
71 file.
72
73 This allows you to run the bootdisk scripts as a normal user.
74
75 If you don't have such a program or are running the scripts as root, C<SUSystem> is
76 I<identical> to the usual C<system> command.
77
78 You can check if this feature is actually available by looking at the
79 C<$ReadConfig::SUBinary> variable that holds the name of the 'C<sudo>'
80 command (or C<undef>).
81
82 =for html <p>
83
84 =item *
85
86 C<%ConfigData>
87
88 C<%ConfigData> is an hash table that holds the config info read from C<etc/config>.
89 C<etc/config> is a shell script that may contain I<only> variable assignments.
90
91 =for html <p>
92
93 =item *
94
95 exported variables
96
97 =over
98
99 =item *
100
101 C<$Script> is the name of the script that included this library (without the path).
102
103 =item *
104
105 C<$BasePath> holds the name of the base directory.
106
107 =item *
108
109 C<$LibPath = "$BasePath/lib">.
110
111 =item *
112
113 C<$BinPath = "$BasePath/bin">. The C<PATH> environment variable is
114 appropriately extended.
115
116 =item *
117
118 C<$CfgPath = "$BasePath/etc">.
119
120 =item *
121
122 C<$ImagePath = "$BasePath/images">.
123
124 =item *
125
126 C<$DataPath = "$BasePath/data">.
127
128 =item *
129
130 C<$TmpBase> is the name used for temporary file/directory names.
131
132 =item *
133
134 C<$MToolsCfg> is the name of a temporary C<mtools> config file. The
135 C<MTOOLSRC> environment variable is set to point to it.
136
137 =back
138
139 =for html <p>
140
141 =item *
142
143 symbols that are not exported
144
145 =over
146
147 =item *
148
149 C<DebugInfo()> prints the current values of some variables.
150
151 =item *
152
153 C<$SUBinary> (see C<SUSystem> above).
154
155 =back
156
157 =back
158
159 =cut
160
161
162 package ReadConfig;
163
164 require Exporter;
165 @ISA = qw ( Exporter );
166 @EXPORT = qw (
167   $Script $BasePath $LibPath $BinPath $CfgPath $ImagePath $DataPath
168   $TmpBase %ConfigData ReadFile RealRPM ReadRPM $SUBinary SUSystem Print2File $MToolsCfg $AutoBuild
169 );
170
171 use strict 'vars';
172 use vars qw (
173   $Script $BasePath $LibPath $BinPath $CfgPath $ImagePath $DataPath
174   $TmpBase %ConfigData $SUBinary &RPMFileName &SUSystem &Print2File $MToolsCfg $AutoBuild
175   $rpmData
176 );
177
178 use Cwd;
179 use File::Path 'make_path';
180 use File::Spec 'abs2rel';
181
182 sub get_repo_list;
183 sub read_meta;
184 sub read_packages;
185
186
187 sub DebugInfo
188 {
189   local $_;
190
191   print "Script = \"$Script\"\n";
192   print "BasePath = \"$BasePath\"\n";
193   print "LibPath = \"$LibPath\"\n";
194   print "BinPath = \"$BinPath\"\n";
195   print "CfgPath = \"$CfgPath\"\n";
196   print "ImagePath = \"$ImagePath\"\n";
197   print "DataPath = \"$DataPath\"\n";
198   print "TmpBase = \"$TmpBase\"\n";
199   print "MToolsCfg = \"$MToolsCfg\"\n";
200
201   print "ConfigData:\n";
202   for (sort keys %ConfigData) {
203     print "  $_ = \"$ConfigData{$_}\"\n"
204   }
205 }
206
207
208 sub ReadFile
209 {
210   my ($f, $buf);
211
212   open $f, $_[0];
213   sysread($f, $buf, -s $_[0]);
214   close $f;
215
216   return $buf;
217 }
218
219
220 #
221 # Returns hash with 'name' and 'file' keys or undef if package does not
222 # exist.
223 #
224 sub RealRPM
225
226   local $_;
227   my $rpm = shift;
228   my ($f, @f, @ff, $p, $back, $n, %n, $r);
229
230   return $rpmData->{$rpm} if exists $rpmData->{$rpm};
231
232   $back = 1 if $rpm =~ s/~$//;
233
234   if($ConfigData{obs}) {
235     $p = $rpm;
236     $p = "\Q$p";
237     $p =~ s/\\\*/([0-9_]+)/g;
238     @f = grep { /^$p / } @{$ConfigData{packages}};
239
240     return $rpmData->{$rpm} = undef if @f == 0;
241
242     @f = sort @f;
243     # for (@f) { print ">$_<\n"; }
244     $f = pop @f;
245     $f = pop @f if $back;
246
247     if($f =~ m/^(\S+) (.+)$/) {
248       return $rpmData->{$1} = $rpmData->{$rpm} = { name => $1, file => "$ConfigData{tmp_cache_dir}/.obs/$2/$1.rpm", rfile => "../.obs/$2/$1.rpm", obs => "$2" };
249     }
250     else {
251       return $rpmData->{$rpm} = undef;
252     }
253   }
254   else {
255     my $dir = $ConfigData{suse_base};
256
257     @f = grep { -f } <$ConfigData{cache_dir}/$rpm.rpm $dir/$rpm.rpm>;
258     for (@f) {
259       $n = $_;
260       s#^.*/|\.rpm$##g;
261       $n{$_} = $n unless exists $n{$_};
262     }
263
264     return $rpmData->{$rpm} = undef if @f == 0;
265
266     $p = $rpm;
267     $p = "\Q$p";
268     $p =~ s/\\\*/([0-9_]+)/g;
269     @f = grep { /^$p$/ } @f;
270     @f = sort @f;
271     # for (@f) { print ">$_<\n"; }
272     $f = pop @f;
273     $f = pop @f if $back;
274
275     return $rpmData->{$f} = $rpmData->{$rpm} = { name => $f, file => $n{$f} } ;
276   }
277 }
278
279
280 #
281 # 'rpm' is hash as returned from RealRPM().
282 #
283 sub UnpackRPM
284 {
285   my $rpm = shift;
286   my $dir = shift;
287
288   return 1 unless $rpm;
289
290   if($rpm->{obs} && ! -f $rpm->{file}) {
291
292     system "curl -s -o '$rpm->{file}' '$ConfigData{obs_server}/build/$rpm->{obs}/$ConfigData{obs_arch}/_repository/$rpm->{name}.rpm'";
293     # system "curl -s -o '$rpm->{file}' '$ConfigData{obs_url}/$rpm->{obs}'";
294     if(! -f $rpm->{file}) {
295       warn "$Script: failed to download $rpm->{name}";
296       return 1
297     }
298   }
299
300   if(SUSystem "sh -c 'cd $dir ; rpm2cpio $rpm->{file} | cpio --quiet --sparse -dimu --no-absolute-filenames'") {
301     warn "$Script: failed to extract $rpm->{name}";
302     return 1;
303   }
304
305   symlink($rpm->{rfile} ? $rpm->{rfile} : $rpm->{file}, "$ConfigData{tmp_cache_dir}/.rpms/$rpm->{name}.rpm");
306
307   return 0;
308 }
309
310
311 #
312 # Unpack rpm to cache dir and return path to dir or undef if failed.
313 #
314 sub ReadRPM
315 {
316   local $_;
317   my ($s, $f, @s);
318
319   my $rpm = RealRPM $_[0];
320
321   if(!$rpm || !$rpm->{name}) {
322     warn "$Script: no such package: $_[0]";
323     return undef;
324   }
325
326   my $rpm_cmd = "rpm --nosignature";
327   my $dir = "$ConfigData{tmp_cache_dir}/$rpm->{name}";
328   my $tdir = "$dir/rpm";
329
330   return $dir if -d $dir;
331
332   die "$Script: failed to create $dir ($!)" unless mkdir $dir, 0777;
333   die "$Script: failed to create $tdir ($!)" unless mkdir $tdir, 0777;
334
335   my $err = UnpackRPM $rpm, $tdir;
336
337   if(!$err) {
338     $_ = `$rpm_cmd -qp --qf '%{VERSION}-%{RELEASE}.%{ARCH}' $rpm->{file} 2>/dev/null`;
339     open $f, ">$dir/version";
340     print $f $_;
341     close $f;
342
343     $_ = `$rpm_cmd -qp --requires $rpm->{file} 2>/dev/null`;
344     open $f, ">$dir/requires";
345     print $f $_;
346     close $f;
347
348     @s = `$rpm_cmd -qp --qf '%|PREIN?{PREIN\n}:{}|%|POSTIN?{POSTIN\n}:{}|%|PREUN?{PREUN\n}:{}|%|POSTUN?{POSTUN\n}:{}|' $rpm->{file} 2>/dev/null`;
349     for (@s) {
350       chomp;
351       $_ = "\L$_";
352       $s = `$rpm_cmd -qp --qf '%{\U$_\E}' $rpm->{file} 2>/dev/null`;
353       open $f, ">$dir/$_";
354       print $f $s;
355       close $f;
356     }
357     if(@s) {
358       $s = join ",", @s;
359       open $f, ">$dir/scripts";
360       print $f "\L$s";
361       close $f;
362     }
363   }
364
365   if(!$err && $rpm->{name} eq $ConfigData{kernel_rpm}) {
366     SUSystem "find $tdir -type d -exec chmod a+rx '{}' \\;";
367
368     my $kv;
369
370     $kv = <$tdir/lib/modules/*>;
371
372     if(-d $kv) {
373       $kv =~ s#.*/##;
374       open $f, ">$dir/kernel";
375       print $f $kv;
376       close $f;
377     }
378     else {
379       $err = 1;
380       undef $kv;
381     }
382
383     UnpackRPM RealRPM("$rpm->{name}-base"), $tdir;
384     UnpackRPM RealRPM("$rpm->{name}-extra"), $tdir;
385
386     my $kmp;
387     for (split(',', $ConfigData{kmp_list})) {
388       ($kmp = $rpm->{name}) =~ s/^kernel/$_-kmp/;
389       print "adding kmp $kmp\n";
390       UnpackRPM RealRPM($kmp), $tdir;
391     }
392
393     for (split(',', $ConfigData{fw_list})) {
394       print "adding firmware $_\n";
395       UnpackRPM RealRPM($_), $tdir;
396     }
397
398     # keep it readable
399     SUSystem "find $tdir -type d -exec chmod a+rx '{}' \\;";
400
401     # if kmp version differs, copy files to real kernel tree
402     for (<$tdir/lib/modules/*>) {
403       s#.*/##;
404       next if $_ eq $kv;
405       print "warning: kmp/firmware version mismatch: $_\n";
406       SUSystem "sh -c 'tar -C $tdir/lib/modules/$_ -cf - . | tar -C $tdir/lib/modules/$kv -xf -'";
407     }
408   }
409
410   return $err ? undef : $dir;
411 }
412
413
414 #
415 # execute string as root
416 #
417 sub SUSystem
418 {
419   if($SUBinary) {
420     return system "$SUBinary -q 0 $_[0]";
421   }
422   else {
423     return system @_;
424   }
425 }
426
427 #
428 # print to a file
429 #
430 sub Print2File
431 {
432   local $_ = shift;
433
434   open Print2File_F, ">$_" or return undef;
435   print Print2File_F @_;
436   close Print2File_F;
437
438   return 1;
439 }
440
441
442 #
443 # return list of kernel images
444 #
445 sub KernelImg
446 {
447   local $_;
448   my ($k_files, @k_images);
449
450   $k_files = shift;
451
452   chomp @$k_files;
453
454   for (@$k_files) {
455     s#.*/boot/##;
456     next if /autoconf|config|shipped|version/;          # skip obvious garbage
457     push @k_images, $_ if m#$ConfigData{kernel_img}#;
458   }
459
460   return @k_images;
461 }
462
463
464 sub version_sort
465 {
466   my ($i, $j);
467
468   $i = $ConfigData{ini}{Version}{$a};
469   $j = $ConfigData{ini}{Version}{$b};
470
471   $i =~ s/,([^,]+)//;
472   $j =~ s/,([^,]+)//;
473
474   return $i <=> $j;
475 }
476
477
478 sub get_repo_list
479 {
480   local $_;
481
482   my $prj = shift;
483   my $repo = shift;
484   my $inrepo;
485   my $r = [ ];
486
487   # print "($prj, $repo)\n";
488
489   for (`curl -s '$ConfigData{obs_server}/source/$prj/_meta'`) {
490     if($inrepo) {
491       if(/<path/) {
492         my $x;
493         $x->[0] = $1 if /\sproject="([^"]+)"/;
494         $x->[1] = $1 if /\srepository="([^"]+)"/;
495         push @$r, $x if @$x == 2;
496         next;
497       }
498       elsif(/<\/repository>/) {
499         last;
500       }
501     }
502     elsif(/<repository.*\sname="\Q$repo\E"/) {
503       $inrepo = 1;
504       next;
505     }
506   }
507
508   # for (@$r) { print "> $_->[0] - $_->[1]\n"; }
509
510   return $r;
511 }
512
513
514 sub read_meta
515 {
516   local $_;
517
518   my $prj = shift;
519   my $repo = shift;
520   my $list = [[ $prj, $repo ]];
521   my %seen;
522   my $cnt;
523
524   do {
525     $cnt = 0;
526     for (@{get_repo_list(@{$list->[-1]})}) {
527       if(!$seen{"$_->[0]/$_->[1]"}) {
528         push @$list, $_;
529         $cnt++;
530       }
531       $seen{"$_->[0]/$_->[1]"} = 1;
532     }
533   } while($cnt);
534
535   # for (@$list) { print ">> $_->[0] - $_->[1]\n"; }
536
537   return $list;
538 }
539
540
541 sub read_packages
542 {
543   local $_;
544
545   my $prj = shift;
546   my $repo = shift;
547   my ($list, %seen, $l, @packages, $f, $p, $r);
548
549   if(-f "$ConfigData{tmp_cache_dir}/.obs/packages") {
550     open $f, "$ConfigData{tmp_cache_dir}/.obs/packages";
551     while(<$f>) {
552       chomp;
553       push @packages, $_;
554     }
555     close $f;
556     if(@packages) {
557       $ConfigData{packages} = [ @packages ];
558     }
559     else {
560       die "no packages in $ConfigData{suse_base}\n";
561     }
562
563     return;
564   }
565
566   print STDERR "Reading OBS meta data...";
567
568   $list = read_meta($prj, $repo);
569
570   open $f, ">", "$ConfigData{tmp_cache_dir}/.obs/repositories";
571
572   for $l (@$list) {
573     $p = $l->[0];
574     $r = $l->[1];
575
576     print $f "$p $r\n";
577     die "$Script: failed to create $ConfigData{tmp_cache_dir}/.obs/$p/$r ($!)" unless make_path "$ConfigData{tmp_cache_dir}/.obs/$p/$r";
578
579     for (`curl -s '$ConfigData{obs_server}/build/$p/$r/$ConfigData{obs_arch}/_repository?view=binaryversions&nometa=1'`) {
580       if(/<binary\s+name="([^"]+)\.rpm"/) {
581         push @packages, "$1 $p/$r" unless $seen{$1};
582         $seen{$1} = 1;
583       }
584     }
585   }
586
587   close $f;
588
589   # for (@packages) { print "$_\n"; }
590
591   if(@packages) {
592     open $f, ">", "$ConfigData{tmp_cache_dir}/.obs/packages";
593     for (@packages) { print $f "$_\n" }
594     close $f;
595     $ConfigData{packages} = [ @packages ];
596   }
597   else {
598     die "no packages in $ConfigData{suse_base}\n";
599   }
600
601   print STDERR "\n";
602 }
603
604
605 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
606 #
607 # initialization part
608 #
609
610 delete $ENV{'LANG'};
611 delete $ENV{'LANGUAGE'};
612
613 if($0 =~ /(.*?)((?<![^\/])bin\/)?([^\/]+)$/) {
614   $Script = $3;
615   $BasePath = $1;
616   $LibPath = $1 . "lib/";
617   $BinPath = $1 . "bin/";
618   $CfgPath = $1 . "etc/";
619   $ImagePath = $1 . "images/";
620   $DataPath = $1 . "data/";
621 }
622 else {
623   die "OOPS: don't invoke the script that way!\n"
624 }
625
626 if(!(
627   ($BasePath eq "" || -d $BasePath) &&
628   -d $LibPath &&
629   -d $BinPath &&
630   -d $CfgPath &&
631   -d $ImagePath &&
632   -d $DataPath
633 )) {
634   die "$Script: you got it all wrong!\n";
635 }
636
637 $| = 1;
638
639 $_ = $BinPath;
640 s:^(.+)/$:$1:;
641 $ENV{PATH} = "/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:$_";
642
643 $TmpBase = "/tmp/${Script}_${$}";
644 $MToolsCfg = "$TmpBase.mtoolsrc";
645
646 $ENV{MTOOLSRC} = $MToolsCfg;
647
648 # The purpose of this is to allow to run the scripts without having root
649 # permissions.
650 #
651 # The $SUBinary must be a program that gives you superuser rights *without*
652 # a password.
653 #
654 # If you don't have such a program or *are* already root this feature is
655 # turned off.
656
657 if($<) {        # only if we are *not* already root
658   $SUBinary = "/usr/local/bin/sw";
659   $SUBinary = "/usr/bin/sw" if -x "/usr/bin/sw";
660   $SUBinary = undef unless -x $SUBinary && -u $SUBinary;
661 }
662
663
664 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
665 #
666 # set arch
667 #
668
669 my ($arch, $realarch, $susearch);
670
671 $arch = `uname -m`;
672 chomp $arch;
673 $arch = "i386" if $arch =~ /^i.86$/;
674
675 $arch = $ENV{TEST_ARCH} if exists $ENV{TEST_ARCH};
676
677 $realarch = $arch;
678 $arch = "sparc" if $arch eq 'sparc64';
679
680 $susearch = $arch;
681 $susearch = 'axp' if $arch eq 'alpha';
682
683 $ConfigData{arch} = $arch;
684 $ConfigData{obs_arch} = $arch eq 'i386' ? 'i586' : $arch;
685
686
687 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
688 #
689 # read config file & .buildenv
690 #
691
692 {
693   my ($f, @f, $sect, $i, $j);
694
695   $f = $CfgPath . "config";
696   die "$Script: no config file \"$f\"\n" unless open(F, "$f.$arch") || open(F, $f);
697
698   while(<F>) {
699     chomp;
700     s/^\s*([#;].*)?//;
701     next if $_ eq "";
702     if(/^\[(.+)\]/) {
703       $sect = $1;
704       next;
705     }
706     if(/^\s*([^=]*?)\s*=\s*(.*?)\s*$/) {
707       $ConfigData{ini}{$sect}{$1} = $2 if defined $sect;
708       next;
709     }
710   }
711
712   close F;
713
714   $ConfigData{buildroot} = $ENV{buildroot} ? $ENV{buildroot} : "";
715
716   if(open F, "$ConfigData{buildroot}/.buildenv") {
717     while(<F>) {
718       chomp;
719       s/^\s*([#;].*)?//;
720       next if $_ eq "";
721       if(/^\s*([^=]*?)\s*=\s*(.*?)\s*$/) {
722         $i = $1;
723         $j = $2;
724         $j = $1 if $j =~ /^\"(.*)\"$/;
725         $ConfigData{buildenv}{$i} = $j;
726       }
727     }
728     close F;
729   }
730 }
731
732
733 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
734 # kernel image name
735 #
736
737 $ConfigData{kernel_img} = $ConfigData{ini}{KernelImage}{default}
738   if $ConfigData{ini}{KernelImage}{default};
739
740 $ConfigData{kernel_img} = $ConfigData{ini}{KernelImage}{$arch}
741   if $ConfigData{ini}{KernelImage}{$arch};
742
743 $ConfigData{kernel_img} = $ENV{kernel_img} if $ENV{kernel_img};
744
745
746 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
747 # lib directory
748 #
749
750 $ConfigData{lib} = "lib";
751 $ConfigData{lib} = $ConfigData{ini}{lib}{default} if $ConfigData{ini}{lib}{default};
752 $ConfigData{lib} = $ConfigData{ini}{lib}{$arch} if $ConfigData{ini}{lib}{$arch};
753
754
755 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
756 # kernel rpm name
757 #
758
759 $ConfigData{kernel_rpm} = $ConfigData{ini}{KernelRPM}{default}
760   if $ConfigData{ini}{KernelRPM}{default};
761
762 $ConfigData{kernel_rpm} = $ConfigData{ini}{KernelRPM}{$arch}
763   if $ConfigData{ini}{KernelRPM}{$arch};
764
765 $ConfigData{kernel_rpm} = $ENV{kernel} if $ENV{kernel};
766
767
768 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
769 # kmp list
770 #
771
772 $ConfigData{kmp_list} = "";
773
774 $ConfigData{kmp_list} = $ConfigData{ini}{KMP}{default}
775   if $ConfigData{ini}{KMP}{default};
776
777 $ConfigData{kmp_list} = $ConfigData{ini}{KMP}{$arch}
778   if $ConfigData{ini}{KMP}{$arch};
779
780
781 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
782 # firmware list
783 #
784
785 $ConfigData{fw_list} = "";
786 $ConfigData{fw_list} = $ConfigData{ini}{Firmware}{default} if $ConfigData{ini}{Firmware}{default};
787 $ConfigData{fw_list} = $ConfigData{ini}{Firmware}{$arch} if $ConfigData{ini}{Firmware}{$arch};
788
789
790 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
791
792
793 # print STDERR "kernel_rpm = $ConfigData{kernel_rpm}, kernel_img = $ConfigData{kernel_img}\n";
794
795 # print STDERR "BUILD_DISTRIBUTION_NAME = $ConfigData{buildenv}{BUILD_DISTRIBUTION_NAME}\n";
796 # print STDERR "BUILD_BASENAME = $ConfigData{buildenv}{BUILD_BASENAME}\n";
797
798
799 {
800   # set suse_base
801   # kernel_ver
802   # (used to be in etc/config)
803
804   my ( $r, $r0, $rx, $in_abuild, $a, $v, $kv, $rf, $ki, @f );
805   my ( $theme, $load_image, $yast_theme, $splash_theme, $product_name, $update_dir);
806
807   my ( $dist, $i, $j, $rel );
808
809   $in_abuild = $ConfigData{buildenv}{BUILD_BASENAME} ? 1 : 0;
810   $in_abuild = 1 if -d "$ConfigData{buildroot}/.build.binaries";
811
812   # print STDERR "abuild = $in_abuild\n";
813
814   if($in_abuild) {
815     my $rpmdir;
816
817     $dist = $ConfigData{buildenv}{BUILD_BASENAME};
818
819     $rpmdir = "$ConfigData{buildroot}/.build.binaries";
820     $rpmdir = "$ConfigData{buildroot}/.rpm-cache/$dist" unless -d $rpmdir;
821
822     die "No rpm files found (looking for \"$dist\")!\n" unless -d $rpmdir;
823
824     $ConfigData{suse_base} = $AutoBuild = $rpmdir;
825   }
826   elsif($ENV{work}) {
827     my ($work, $base, $xdist);
828
829     $dist = $susearch;
830
831     $work = $ENV{work};
832
833     $xdist = $ENV{dist} ? $ENV{dist} : $ENV{suserelease};
834
835     if($xdist) {
836       $base = "$work/full-$xdist/suse";
837       $dist = $xdist if -d $base;
838       if(! -d $base) {
839         $base = "$work/full-$xdist-$dist/suse";
840         $dist = "$xdist-$dist" if -d $base;
841       }
842     }
843     else {
844       $base = "$work/full-$dist/suse";
845     }
846
847     die "Sorry, could not locate packages for \"$dist\" ($base).\n" unless -d $base;
848
849     $ConfigData{suse_base} = "$base/*";
850   }
851   else {
852     # OBS
853
854     $ConfigData{obs} = 1;
855
856     my ($obs_proj, $obs_repo);
857
858     $ConfigData{obs_proj} = $ConfigData{ini}{OBS}{project};
859     $ConfigData{obs_repo} = $ConfigData{ini}{OBS}{repository};
860     $ConfigData{obs_server} = $ConfigData{ini}{OBS}{server};
861
862     if($ENV{obs} =~ m#^([^/]+)/([^/]+)-([^/-]+)$#) {
863       $ConfigData{obs_proj} = $1;
864       $ConfigData{obs_repo} = $2;
865       $ConfigData{obs_arch} = $3;
866     }
867
868     $ConfigData{obs_url} = "$ConfigData{obs_server}/build/$ConfigData{obs_proj}/$ConfigData{obs_repo}/$ConfigData{obs_arch}/_repository";
869
870     $ConfigData{suse_base} = "$ConfigData{obs_proj}/$ConfigData{obs_repo}-$ConfigData{obs_arch}";
871
872     ($dist = $ConfigData{suse_base}) =~ tr#/#-#;
873
874     # print "$ConfigData{suse_base}\n";
875   }
876
877   $ConfigData{dist} = $dist;
878
879   # print STDERR "base = $ConfigData{suse_base}\n";
880
881   $i = $dist;
882
883   if($ConfigData{obs}) {
884     ($rel = $ConfigData{obs_proj}) =~ s/^.*://;
885   }
886   else {
887     while(!($rel = $ConfigData{ini}{Version}{$i}) && $i =~ s/-[^\-]+$//) {}
888     $rel = $ConfigData{ini}{Version}{default} if !$rel && $dist !~ /-/;
889
890     die "Sorry, \"$ConfigData{dist}\" is not supported.\n" unless $rel;
891   }
892
893   $ConfigData{cache_dir} = getcwd() . "/${BasePath}cache/$ConfigData{dist}";
894   $ConfigData{tmp_cache_dir} = getcwd() . "/${BasePath}tmp/cache/$ConfigData{dist}";
895   system "mkdir -p $ConfigData{tmp_cache_dir}/.rpms" unless -d "$ConfigData{tmp_cache_dir}/.rpms";
896
897   if($ConfigData{obs}) {
898     my ($f, @rpms);
899     system "mkdir -p $ConfigData{tmp_cache_dir}/.obs" unless -d "$ConfigData{tmp_cache_dir}/.obs";
900
901     read_packages($ConfigData{obs_proj}, $ConfigData{obs_repo});
902   }
903
904   my $k_dir = ReadRPM $ConfigData{kernel_rpm};
905   if($k_dir) {
906     my @k_images = KernelImg [ `find $k_dir/rpm/boot -type f` ];
907
908     if(!@k_images) {
909       die "Error: No kernel image identified! (Looking for \"$ConfigData{kernel_img}\".)\n\n";
910     }
911
912     if(@k_images != 1) {
913       warn "Warning: Can't identify the real kernel image, choosing the first:\n", join(", ", @k_images), "\n\n";
914     }
915
916     $ConfigData{kernel_img} = $k_images[0];
917     $ConfigData{kernel_ver} = ReadFile "$k_dir/kernel";
918     $ConfigData{module_type} = 'ko';
919   }
920
921   # print STDERR "kernel_img = $ConfigData{kernel_img}\n";
922   # print STDERR "kernel_rpm = $ConfigData{kernel_rpm}\n";
923   # print STDERR "kernel_ver = $ConfigData{kernel_ver}\n";
924
925   $theme = $ENV{theme} ? $ENV{theme} : "openSUSE";
926
927   die "Don't know theme \"$theme\"\n" unless exists $ConfigData{ini}{"Theme $theme"};
928
929   if($ENV{themes}) {
930     my %t;
931     @t{split ' ', $ENV{themes}} = ();
932     die "Theme \"$theme\" not supported\n" unless exists $t{$theme};
933   }
934
935   $yast_theme = $ConfigData{ini}{"Theme $theme"}{yast};
936   $splash_theme = $ConfigData{ini}{"Theme $theme"}{ksplash};
937   $product_name = $ConfigData{ini}{"Theme $theme"}{product};
938   my $full_product_name = $product_name;
939   $full_product_name .= (" " . $ConfigData{ini}{"Theme $theme"}{version}) if $ConfigData{ini}{"Theme $theme"}{version};
940
941   my $suse_release = $ConfigData{ini}{"Theme $theme"}{version};
942   my $sle_release = "sle" . $ConfigData{ini}{"Theme $theme"}{sle};
943   my $sles_release = "sles" . $ConfigData{ini}{"Theme $theme"}{sle};
944   my $sled_release = "sled" . $ConfigData{ini}{"Theme $theme"}{sle};
945
946   $update_dir = $ConfigData{ini}{"Theme $theme"}{update};
947   $update_dir =~ s/<sles>/$sles_release/g;
948   $update_dir =~ s/<sled>/$sled_release/g;
949   $update_dir =~ s/<rel>/$suse_release/g;
950   $update_dir =~ s/<arch>/$realarch/g;
951   $load_image = $ConfigData{ini}{"Theme $theme"}{image};
952   $load_image = $load_image * 1024 if $load_image;
953
954   $ConfigData{theme} = $theme;
955   $ConfigData{yast_theme} = $yast_theme;
956   $ConfigData{splash_theme} = $splash_theme;
957   $ConfigData{product_name} = $product_name;
958   $ConfigData{full_product_name} = $full_product_name;
959   $ConfigData{update_dir} = $update_dir;
960   $ConfigData{load_image} = $load_image;
961
962   $ConfigData{min_memory} = $ConfigData{ini}{"Theme $theme"}{memory};
963
964   # print STDERR "yast_theme = $ConfigData{yast_theme}\n";
965   # print STDERR "splash_theme = $ConfigData{splash_theme}\n";
966   # print STDERR "product_name = $ConfigData{product_name}\n";
967   # print STDERR "update_dir = $ConfigData{update_dir}\n";
968   # print STDERR "load_image = $ConfigData{load_image}\n";
969
970   $ConfigData{kernel_mods} = $ConfigData{kernel_ver};
971   $ConfigData{kernel_mods} =~ s/-(.+?)-/-override-/;
972
973   $ConfigData{instsys_complain} = $ENV{instsys_complain};
974   $ConfigData{instsys_complain_root} = $ENV{instsys_complain_root};
975   $ConfigData{instsys_build_id} = $ENV{instsys_build_id};
976
977   if(!$ENV{silent}) {
978     my ($r, $kmp);
979
980     if($ConfigData{kmp_list}) {
981       $kmp = ' (' . join(', ', map { $_ .= "-kmp" } (split(',', $ConfigData{kmp_list}))) . ')';
982     }
983     else {
984       $kmp = "";
985     }
986
987     print "--- Building for $product_name $suse_release $ConfigData{arch} ($sle_release) [$ConfigData{lib}], theme $ConfigData{theme}\n";
988     print "--- Kernel: $ConfigData{kernel_rpm}$kmp, $ConfigData{kernel_img}, $ConfigData{kernel_ver}\n";
989
990     $r = $ConfigData{suse_base};
991     $r =~ s/\/\*$//;
992     print "--- Source: $r\n";
993   }
994 }
995
996 1;