source: soft/build_system/build_system/mkcd/trunk/mkcd.cgi @ 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: 15.5 KB
Line 
1#!/usr/bin/perl
2#
3# Copyright (C) 2005 Mandriva
4#
5# Author: Florent Villard <warly@mandriva.com>
6#
7# This program is free software; you can redistribute it and/or modify
8# it under the terms of the GNU General Public License as published by
9# the Free Software Foundation; either version 2, or (at your option)
10# any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20#
21# to prepare, create and burn iso images
22
23my $VERSION = "0.0.2";
24
25use strict;
26use Mkcd::Config qw(%config);
27use File::Path;
28use Mkcd::Group;
29use Mkcd::Package qw(%ARCH);
30use Mkcd::Tools qw(convert_size);
31use CGI qw/:standard/;
32use CGI::Carp qw(fatalsToBrowser);
33
34my $cgi = new CGI; 
35my ($sec, $min, $hour, $mday, $mon, $year) = gmtime(time);
36$year += 1900;
37my $date = sprintf "%04d-%02d-%02d %02d:%02d:%02d GMT", $year, ($mon+1), $mday, $hour, $min, $sec;
38my $timestamp = sprintf "%04d%02d%02d%02d%02d%02d.$$", $year, ($mon+1), $mday, $hour, $min, $sec;
39
40our $topdir = `pwd`;
41chop $topdir;
42my %config = (
43    lists => [],
44    fast => 0,
45    nodeps => 0,
46    verbose => 0,
47    print => 0,
48    printscript => 0,
49    nolive => 0,
50    noiso => 0,
51    deps => 0,
52    nosrcfit => 0,
53    nosrc => 0,
54    product => 0,
55    bugzilla => 0,
56    Builddir => 0,
57    topdir => $topdir,
58    discsize => 681000000,
59    isodir => 0,
60    filetag => 0,
61    Publisher => 'Mandriva',
62    sysid => 'Mandriva Linux',
63    log => 0,
64    mkisoopt => "-r -J -hide-rr-moved -nobak -cache-inodes",
65    tmp => $ENV{TMPDIR} || "$topdir/tmp",
66    disc_building_tries => 3,
67    rejected_options => { 
68        config => "Could not comply with packages filter directives",
69        no_disc => "Could not add more disc for this package",
70        no_space => "Not enough space",
71        deps => "Missing dependencies",
72        old_version => "More recent version found",
73        deps_rejected => "Some needed dependencies rejected",
74        excluded => "Explicitely excluded",
75        order_pb => "Needed dependency could not be put before",
76        sequential => "Could not add interlist dependencies in sequential mode",
77        autodeps => "not selected in rpm lists"
78    },
79    optimize_space => 1,
80    ARCH => \%ARCH,
81    struct => { 
82        '10.0' => { 
83            install => 'Mandrake',
84            media_hdlist => '',
85            media_info => 'Mandrake/base',
86            media => 'Mandrake/RPMS',
87            media_base => 'Mandrake',
88            srpm_media => 'Mandrake/SRPMS',
89            isolinux => 'isolinux',
90            images => 'images',
91            extra => 'Mandrake/share',
92            patch => 'Mandrake/base',
93            stage2 => 'Mandrake/mdkinst',
94            compssUsers => 'compssUsers',
95        },
96        '10.1' => {
97            install => 'install',
98            media_hdlist => 'media_info',
99            media_info => 'media/media_info',
100            media => 'media/main',
101            media_base => 'media',
102            srpm_media => 'SRPMS/main',
103            isolinux => 'isolinux',
104            images => 'install/images',
105            extra => 'install/extra',
106            patch => 'install',
107            stage2 => 'install/stage2',
108            compssUsers => 'compssUsers.pl',
109        }
110    },
111    struct_version => 10.1,
112    boot_cat_fatal_location => [ 929, 740 ],
113);
114
115
116my $header = qq{
117<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
118<html>
119<head>
120<META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
121<title>Mkcd</title>
122<link href="index.css" type="text/css" rel="stylesheet">
123<style type="text/css">
124        A:link { color:#000000 }
125      A:active { color:#aaaaaa }
126      A:visited { color:#000000 }
127      <!--
128      #d1 {
129      position: absolute;
130      left: 10px;
131      top: 10px;
132      width: 600px;
133      z-index: 1;
134      }
135      #d2 {
136      position: absolute;
137      font-size: 12px;
138      font-family: helvetica;
139      left: 100px;
140      top: 150px;
141      width: 1000px;
142      z-index: 1;
143      }
144      #d3 {
145      position: absolute;
146      font-size: 12px;
147      font-family: helvetica;
148      left: 300px;
149      top: 150px;
150      width: 600px;
151      z-index: 1;
152      }
153      #p1 {
154      font-size: 25px;
155      font-family: helvetica;
156      font-style: normal;
157      font-weight: bold;
158      text-align: center;
159      position: relative;
160      left: 180px;
161      top: 0px;
162      width: 400px;
163      z-index: 1;
164       }
165      #p2 {
166      font-size: 12px;
167      font-family: helvetica;
168      font-style: normal;
169      font-weight: normal;
170      text-align: left;
171      position: absolute;
172      left: 50px;
173      top: 150px;
174      width: 250px;
175      z-index: 1;
176      }
177      #p3 {
178      font-size: 10px;
179      font-family: helvetica;
180      font-style: normal;
181      font-weight: normal;
182      text-align: left;
183      font-weight: normal;
184      text-align: left;
185      position: absolute;
186      left: 200px;
187      top: 230px;
188      width: 100px;
189      z-index: 1;
190        }
191      #p5 {
192      color: #000;
193      font-size: 10px;
194      font-family: helvetica;
195      font-style: normal;
196      font-weight: bold;
197      position: relative;
198      left: 20px;
199      top: 400px;
200      width: 500px;
201      z-index: 2;
202      }
203      #p6 {
204      color: #000;
205      font-size: 10px;
206      font-family: helvetica;
207      font-style: normal;
208      font-weight: bold;
209      position: absolute;
210      left: 100px;
211      top: 200px;
212      width: 500px;
213      z-index: 2;
214      }
215      #p7 {
216      color: #000;
217      font-size: 14px;
218      font-family: helvetica;
219      font-style: normal;
220      font-weight: bold;
221      text-align: center;
222      position: absolute;
223      left: 100px;
224      top: 450px;
225      width: 400px;
226      z-index: 2;
227      }
228      #p8 {
229      color: #000;
230      font-size: 12px;
231      font-family: helvetica;
232      font-style: normal;
233      font-weight: bold;
234      text-align: left;
235      position: absolute;
236      left: 0px;
237      top: 0px;
238      width: 100px;
239      z-index: 2;                                                                                                                                       
240      width: 100px;
241      z-index: 2;
242      }
243      -->
244  </style>
245</head>
246};
247
248if ($cgi->param) { 
249    if ($cgi->param('done')) {
250       
251        my $name = $cgi->param('done');
252        opendir my $dir, "/home/qa/build/iso/$name";
253        print qq{Content-Type: text/html
254
255$header
256<p id ="p8">
257<img src="/logo.jpg"></img>
258</p>
259<div id=d1>
260<p id="p1"><i>Distribution Builder</i>
261<p align=right><font size=-2><i>version: $VERSION</i></font></p>
262</p>
263<div id=d2>
264<br>
265<br><font size=+2>Result</font>
266<br>};
267        my @S = (qw(B KB MB GB TB));
268        foreach (sort readdir $dir) {
269            /$name/ or next;
270            if (/\.iso$/) {
271                my $size = (stat "/home/qa/build/iso/$name/$_")[7];
272                my $a;
273                while ($size > 1024) {
274                    $a++;
275                    $size /= 1024
276                }       
277                $size = sprintf "%0.2d$S[$a]", $size;
278                print qq{<br><a href="/iso/qa/$name/$_">$_</a> ($size) }
279            } elsif (/\.cd$/) {
280                print qq{<br><a href="/iso/qa/$name/$_">Packages list</a> }
281            }
282        }
283        print "<div id=p6>"
284    } elsif ($cgi->param('next')) { 
285print qq{Content-Type: text/html
286$header
287<body bgcolor="#ffffff">
288<div id=d1>
289<p id="p1"><i>Distribution Builder</i>
290<p align=right><font size=-2><i>version: $VERSION</i></font></p>
291</p> 
292
293<p id ="p8">
294<img src="/logo.jpg"></img>
295</p> 
296
297<form method=get action="mkcd.cgi">
298<div id="d2">
299<p><b>Packages:</b>
300<br>
301<table><tr valign=top><td>};
302my $class = $cgi->param('distro_type');
303$::o->{meta_class} = 'desktop' if $class =~ /discovery/i;
304$::o->{meta_class} = 'powerpack' if $class =~ /powerpack|download/i;
305$::o->{meta_class} = 'server' if $class =~ /corporate/i;
306open my $c, "/var/www/html/compssUsers.pl";
307my ($compssUsers) = eval (join '', <$c>);
308my $section;
309foreach my $cat (@$compssUsers) {
310        my ($new_section) = $cat->{uid} =~ /(.*)\|/;
311        print "</td><td><br><b>$new_section</b>\n" if $section ne $new_section;
312        $section = $new_section;
313        my $flags = "@{$cat->{flags}}";
314        print qq|<br><input type=checkbox name="FLAGS $flags" value=1>$cat->{label}\n|
315}
316print qq{</td></tr></table>
317<br><input type=checkbox name="FLAGS ALL" value=1><b>Include everything</b>
318<br>
319<br>
320<br>
321<br><input type="submit" value="Go">
322};
323foreach my $field ('arch', 'disc_size', 'disc_nb', 'distro_type', 'version') { 
324        print qq{<input type="hidden" name="$field" value="}, $cgi->param($field) , qq{">\n};
325}
326print qq{
327</p>
328
329</p>
330</div>
331</form>
332</div>
333</body>
334</html>}   
335    } else {
336        my ($name, $tag);
337        my $class = $cgi->param('distro_type');
338        my $vers = $cgi->param('version');
339        my $arch = $cgi->param('arch');
340        $name = "Mandriva-custom-$vers-$class.$arch.$timestamp";
341        $config{name} = $name;
342        print "Refresh: 0; URL=\"mkcd.cgi?done=$name\n";
343        print "Content-Type: text/html\n\n";
344        print qq{$header
345            <body bgcolor="#ffffff">
346<div id=d1>
347<p id="p1"><i>Distribution Builder</i>
348<p align=right><font size=-2><i>version: $VERSION</i></font></p>
349</p> 
350
351<p id="p8">
352<img src="/logo.jpg"></img>
353</p>
354<p id="d2">Building discs, please wait...
355<div id="p6">
356</p> 
357        };
358        $config{tmp} = '/home/qa/build/tmp/';
359        $config{group} = new Mkcd::Group(\%config);
360        $config{nolive} = 1;
361        $config{nosrcfit} = 1;
362        $config{deps} = 1;
363        $config{disc_building_tries} = 1;
364        $config{optimize_space} = 0;
365        my $struct_v = $config{struct_version};
366        if ($vers eq '10.0') {
367            $struct_v = '10.0'
368        }
369        my $install_dir = $config{struct}{$struct_v}{install};
370        my $media_dir = $config{struct}{$struct_v}{media_base};
371        if ($vers eq 'Cooker') {
372            $vers = 'current'
373        }
374        $config{topdir} = "/home/qa/build/";
375        open my $log, ">$config{topdir}/log/$config{name}.log";
376        $config{LOG} = $log;
377        $config{log} = $log;
378        print "log to $config{topdir}/log/$config{name}.log\n";
379        $config{verbose} = 10;
380        $config{print} = "$config{topdir}/iso/$config{name}/$config{name}.cd";
381       
382        my $repository = "$config{topdir}/pieces/$vers/$arch/";
383        -d "$repository/$media_dir" or die "ERROR: $repository/$media_dir does not exist\n";
384        my $dir = "$repository/$media_dir/";
385        my @rpms;
386        foreach ('main') {
387            -d "$dir/$_" or next;
388            print "<br>Including $dir/$_\n";
389            unshift @rpms, "$dir/$_"
390        }
391        my $media_info_dir = "$repository/$config{struct}{$struct_v}{media_info}";
392        if (-d $media_info_dir) {
393            opendir my $basedir, $media_info_dir;
394            foreach my $file (readdir $basedir) {
395                $file =~ /^pubkey/ or next;
396                push @{$config{list}[1]{keyfiles}}, "$media_info_dir/$file"
397            }
398            closedir $basedir
399        }
400        foreach (@rpms) {
401            push @{$config{list}[1]{packages}}, { rpm => [ $_ ], srpm => \@rpms }
402        }
403        $config{list}[1]{prelist} = [
404                [ "INSTALL", { section => 1, force => 1 } ],
405                [ "SYSTEM", { section => 1, force => 1 } ],
406                [ "kernel-(smp-|)[0-9].*", { regexp => 1, force => 1 } ],
407        ];
408        my @params = $cgi->param;
409        foreach my $p (@params) {
410            $p =~ s/^FLAGS // or next;
411            foreach my $f (split ' ',$p) {
412                if ($f eq 'ALL') {
413                    push @{$config{list}[1]{prelist}}, [ '.*',  { section => 1 } ]
414                } else {
415                    push @{$config{list}[1]{prelist}}, [ "CAT_$f",  { section => 1 } ]
416                }
417            }
418        }
419        my $cd = $cgi->param('disc_nb');
420        my @cd = 1 .. $cd;
421        my %cd = (map { $_ => 2 } 1 .. $cd);
422
423        $config{discsize} = convert_size($cgi->param('disc_size'));
424        $config{disc}[1]{size} = $config{discsize};
425        $config{disc}[1]{serial} = "${name}-disc1";
426        $config{disc}[1]{name} = 1;
427        $config{disc}[1]{longname} = "Mandriva Linux $name";
428        $config{disc}[1]{appname} = "Mandriva Linux $name disc 1";
429        $config{disc}[1]{label} = substr "$name-Disc1", 0, 32;
430        my $idx = 1;
431        my %idx;
432        my $functions = $config{group}{disc}{functions}{functions};
433        &{$functions->{dir}[0][5]}(1,$idx, "rpms", $config{struct}{$struct_v}{media});
434        $idx++;
435        &{$functions->{generic}[0][5]}(1,$idx, "rpms",1);
436        &{$functions->{generic}[2][5]}(1,$idx);
437        $idx++;
438        $idx{installation} = $idx;
439        &{$functions->{installation}[0][5]}(1,$idx);
440        &{$functions->{installation}[5][5]}(1,$idx, $repository);
441        &{$functions->{installation}[10][5]}(1,$idx, $tag);
442        &{$functions->{installation}[14][5]}(1,$idx);
443        &{$functions->{installation}[18][5]}(1,$idx, "1/rpms");
444        my $d_idx = $idx;
445        $idx++;
446        &{$functions->{boot}[0][5]}(1,$idx);
447        my $isolinux_dir = $config{struct}{$struct_v}{isolinux};
448        my $images_dir = $config{struct}{$struct_v}{images};
449        if (-w "$repository/$isolinux_dir/isolinux.bin") {
450            &{$functions->{boot}[1][5]}(1,$idx, { isolinux => 1 });
451            &{$functions->{boot}[2][5]}(1,$idx, { bootimg => 1 }, "$isolinux_dir/isolinux.bin");
452            &{$functions->{boot}[3][5]}(1,$idx, { first => 1 }, "$repository/$isolinux_dir");
453            &{$functions->{boot}[3][5]}(1,$idx, { first => 1, dest => "$install_dir"}, "$repository/$images_dir");
454        } else {
455            die "ERROR: $repository/$isolinux_dir/isolinux.bin is not writable\n";
456        }
457        &{$functions->{installation}[6][5]}(1,$idx);
458        foreach my $ncd (2 .. $cd) {
459            $config{disc}[$ncd]{size} = $config{discsize};
460            $config{disc}[$ncd]{name} = $ncd;
461            my ($curdir, $srpmcurdir);
462            my $tmp = "$config{tmp}/build/$config{name}";
463            my $f = "$tmp/$ncd.list";
464            -f $f and unlink $f;
465            if ($config{nolive}) {
466                rmtree "$tmp/$ncd";
467                mkpath "$tmp/$ncd";
468            } else {
469                my $dir = "$config{topdir}/build/$config{name}";
470                rmtree "$dir/$ncd";
471                rmtree "$dir/first/$ncd";
472                mkpath "$dir/$ncd"
473            }
474            my $media_dir = $config{struct}{$struct_v}{media};
475            $config{disc}[$ncd]{serial} = "$config{name}-$ncd";
476            $config{disc}[$ncd]{longname} = "Mandriva Linux $config{name}";
477            $config{disc}[$ncd]{appname} = "Mandriva Linux $config{name} disc $ncd";
478            $config{disc}[$ncd]{label} = substr "$config{name}-Disc$ncd", 0, 32;
479            &{$functions->{dir}[0][5]}($ncd, 1, "rpms","$media_dir$ncd");
480            &{$functions->{generic}[0][5]}($ncd, 2, "rpms", 1);
481            &{$functions->{installation}[18][5]}(1,$d_idx, "2/rpms");
482        }
483        $config{group}->makeWithGroups(\%cd, \@cd);
484        print qq{</div></body></html>}
485    }
486} else {
487    print qq{Content-Type: text/html
488$header
489<body bgcolor="#ffffff">
490<div id=d1>
491<p id="p1"><i>Distribution Builder</i>
492<p align=right><font size=-2><i>version: $VERSION</i></font></p>
493</p> 
494
495<p id ="p8">
496<img src="/logo.jpg"></img>
497</p> 
498
499<form method=get action="mkcd.cgi">
500<div id="p2">
501<p>  
502<b>Media type: </b>
503<select name="disc_size" size="1">
504<option value='300m'>300 MB Mini CD</option>
505<option value='650m' "SELECTED">Standard 650 MB CD</option>
506<option value='700m'>700 MB CD</option>
507<option value='800m'>800 MB CD</option>
508<option value='4.3g'>4.3 GB DVD</option>
509</select>
510<br> 
511<br> 
512<b>Number of discs: </b>
513<select name="disc_nb" size="1">
514<option value='1'>1</option>
515<option value='2'>2</option>
516<option value='3' "SELECTED">3</option>
517<option value='4'>4</option>
518<option value='5'>5</option>
519<option value='6'>5</option>
520<option value='7'>7</option>
521<option value='8'>8</option>
522</select>
523<br> 
524<br><b>Product Type: </b>
525<select name="distro_type" size="1">
526<option value='Dowload'>Download</option>
527<option value='Discovery'>Discovery</option>
528<option value='Powerpack' "SELECTED">Powerpack</option>
529<option value='Corporate'>Corporate</option>
530</select>
531</div>
532
533<p id="p3">
534<br>
535<br>
536<br>
537<br><input type="submit" value="Next">
538<input type="hidden" name="next" value="1">
539</p>
540
541<div id="d3">
542<p><b>Architecture:</b>
543<select name="arch" size="1">
544<option value='i586' "SELECTED">i586</option>
545<option value='x86_64'>x86_64</option>
546</select>
547<p><b>Version:</b>
548<br>
549<select name="version" size="5">
550<option value='Cooker' "SELECTED">Mandriva Linux Cooker</option>
551<option value='2005'>Mandriva Linux 2005</option>
552</select>
553</div>
554</form>
555<p id=p5>
556For any comments or feedback, feel free to mail warly\@mandriva.com.
557<br> 
558<!-- Created: Tue Jan 11 18:00:00 EST 2004 -->                                                                                                   
559<!-- hhmts start -->
560Generated: $date
561<!-- hhmts end -->
562</p>
563</div>
564</body>
565</html>};
566}
Note: See TracBrowser for help on using the repository browser.