#!/usr/bin/perl # # Copyright (C) 2005,2006 Mandriva # # Author: Florent Villard # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # upload packages in queue when all the mandatory architectures are done # # TODO # # - take the packages in done/ and upload them with youri in queue/ # - check that the mandatory architectures are present # # PREFIX : sprintf "$year%02d%02d%02d%02d%02d.$user.$host.${$}_", $mon, $mday, $hour, $min, $sec; use strict; use Iurt::Config qw(config_usage get_date config_init dump_cache init_cache get_repsys_conf); use Iurt::Process qw(check_pid); use Iurt::Mail qw(sendmail); use Iurt::File qw(check_upload_tree); use Data::Dumper; my %run; my $program_name = 'emi'; $run{program_name} = $program_name; open(my $LOG, ">&STDERR"); $run{LOG} = $LOG; my $HOME = $ENV{HOME}; my $configfile = "$HOME/.upload.conf"; my %config_usage = ( admin => { desc => 'mail address of the bot administrator', default => 'warly@mandriva.com' }, arch => { desc => "List of arch", default => [ 'i586', 'x86_64', 'ppc' , 'sparc', 'sparc64' ], }, default_mail_domain => { desc => "Default mail domain to append", default => 'mandriva.org' }, http_queue => { desc => 'Address where log can be consulted', default => 'http://svn.mandriva.com/queue/'}, mandatory_arch => { desc => 'List of mandatory architecture to be able to upload', default => [ 'i586', 'x86_64' ], }, tmp => { desc => "Temporary directory", default => "$HOME/tmp/"}, root => { desc => 'Architecture root dir', default => "/mnt/BIG/dis/" }, cache_home => { desc => 'Where to store the cache files', default => "$HOME/.bugs" }, upload_user => { desc => 'User who is uploading packages', default => 'mandrake' }, repsys_conf => { desc => 'Path of the repsys.conf file which includes login mail corresponding', default => '/etc/repsys.conf' }, queue => { desc => 'root directory of the various upload queues', default => '/home/mandrake/uploads/'}, ssh_option => { desc => "SSH options", default => "-o ConectTimeout=20" }, ); my $config; if (-f $configfile) { $config = do $configfile or die "FATAL $program_name: syntax error in $configfile"; } else { $config = {} } config_usage(\%config_usage, $config) if $run{config_usage}; config_init(\%config_usage, $config, \%run); my $mail = get_repsys_conf($config->{repsys_conf}); $run{pidfile_home} = $config->{tmp}; $run{pidfile} = "upload"; my $pidfile = check_pid(\%run); #my $cache = init_cache(\%run, $config, { arch => {} }); my $cache = { arch => {} }; my ($fulldate, $daydate) = get_date(); $run{daydate} = $daydate; print {$run{LOG}} "$program_name\n"; my $done = "$config->{queue}/done/"; my $reject = "$config->{queue}/rejected/"; my %pkg_tree; check_upload_tree(\%run, $done, sub { my ($todo, $f, $m, $s, $r) = @_; if ($r =~ /(\d{14}\.\w+\.\w+\.\d+)_(.*\.([^.]+)\.rpm)$/) { my ($prefix, $rpm, $arch) = ($1, $2, $3); print {$run{LOG}} "$program_name: found rpm $rpm ($prefix)\n"; $pkg_tree{$prefix}{path} = "/$f/$m/$s"; $pkg_tree{$prefix}{arch}{$arch} = 1; $pkg_tree{$prefix}{target} = $f; $pkg_tree{$prefix}{section} = "$m/$s"; push @{$pkg_tree{$prefix}{srpms}}, $rpm if ($arch eq 'src'); push @{$pkg_tree{$prefix}{rpms}} , $rpm; } elsif ($r =~ /(\d{14}\.\w+\.\w+\.\d+)_(.*)\.done$/) { my ($prefix, $arch) = ($1, $2); $cache->{arch}{$prefix}{$arch} = 1 } }, ); foreach my $prefix (keys %pkg_tree) { my $ok = 1; my $target = $pkg_tree{$prefix}{target}; my $path = $pkg_tree{$prefix}{path}; my $section = $pkg_tree{$prefix}{section}; print {$run{LOG}} "$program_name: processing $prefix in $path\n"; my %missing; foreach my $mandatory_arch (@{$config->{mandatory_arch}}, 'src', 'noarch') { print {$run{LOG}} "$program_name: checking if mandatory architecture $mandatory_arch is present: "; if (!$pkg_tree{$prefix}{arch}{$mandatory_arch} ){ if (!$cache->{arch}{$prefix}{$mandatory_arch}) { $missing{$mandatory_arch} = 1; print {$run{LOG}} "no\n"; $ok = 0 } } else { if ($mandatory_arch eq 'noarch') { $ok = 1 } print {$run{LOG}} "yes\n" } } if ($ok) { # upload my @packages; my ($user) = $prefix =~ /\d{14}\.(\w+)\.\w+\.\d+_.*$/; foreach my $rpm (@{$pkg_tree{$prefix}{rpms}}) { push @packages, "$done/$path/${prefix}_$rpm" } my $command = "/usr/bin/sudo -H -u $config->{upload_user} /usr/bin/perl -I/usr/local/lib/perl/ /usr/local/bin/youri-upload --verbose --config /etc/youri/upload-queue.conf --define user=$user --define prefix=$prefix --define section=$section $target @packages &> $done/$path/$prefix.youri"; print {$run{LOG}} "$program_name: running $command\n"; if (!system($command)) { # now check if we need to keep the current srpm in todo my $all_uploaded = 1; foreach my $arch (@{$config->{arch}}) { if (!$cache->{arch}{$prefix}{$arch}) { $all_uploaded = 0 } } if ($all_uploaded) { print {$run{LOG}} "Cleaning upload tree for $prefix\n"; } } else { # should send a mail or something print {$run{LOG}} "$program_name: upload failed ($!), rejecting files in $reject/$path/\n"; foreach my $rpm (@{$pkg_tree{$prefix}{rpms}}) { my $err = link "$done/$path/${prefix}_$rpm", "$reject/$path/${prefix}_$rpm"; print {$run{LOG}} "ERROR $program_name: link of $rpm failed ($!)\n" } link "$done/$path/$prefix.youri", "$reject/$path/$prefix.youri"; my ($user) = $prefix =~ /\d{14}\.(\w+)\.\w+\.\d+/; if ($user) { my $text = qq{The upload of the following packages failed:\n}; my $rpms; foreach my $rpm (@{$pkg_tree{$prefix}{rpms}}) { $rpms .= "$rpm "; $text .= "- $rpm\n" } my $to = $mail->{$user} || "$user\@mandriva.com, $user\@mandriva.org"; $text .= "\nUpload log available in $config->{http_queue}/rejected/$path/$prefix.youri\n"; sendmail($to, $config->{admin} , "Upload failed for $rpms", $text, "Emi the upload bot <$config->{admin}>", 0) } # should delete the files } # delete the files which should have heen either put in queue or rejected unlink $_ foreach @packages; unlink "$done/$path/$prefix.youri" } else { print {$run{LOG}} "WARNING $program_name: mandatory arch (", join(' ', keys %missing),") are missing for $prefix, waiting\n" } } #dump_cache(\%run); unlink $pidfile; exit;