aboutsummaryrefslogtreecommitdiffstats
path: root/iurt2
diff options
context:
space:
mode:
Diffstat (limited to 'iurt2')
-rwxr-xr-xiurt2206
1 files changed, 153 insertions, 53 deletions
diff --git a/iurt2 b/iurt2
index b92500e..9dcf2cc 100755
--- a/iurt2
+++ b/iurt2
@@ -27,9 +27,10 @@
# - add icecream compilation support
# - add a --group option to compile a set of packages (in progress)
# - add a function to update a packages when it obviously need to be recompile
-# - Maybe call the function from the initial todo list (thus making the argument ordering important)
+# - Maybe call the function from the initial todo list (thus making the
+# argument ordering important)
# - Change the packager tag in the chroot to have the one who submit the package
-#
+
use strict;
use RPM4::Header;
use Iurt::Config qw(config_usage get_date get_prefix config_init dump_cache_par get_maint get_date check_arch %arch_comp get_package_prefix);
@@ -274,34 +275,130 @@ if (!$run{chrooted_urpmi} && $run{group}) {
}
my %config_usage = (
- admin => { desc => 'Mail of the administrator of packages builds', default => '' },
- all_media => { desc => 'List of known media', default => { 'main' => [ '' ], 'contrib' => [ '' ] } },
- basesystem_media_root => { desc => 'Name of the media holding basesystem packages', default => sub { my ($config, $run) = @_; "$config->{repository}/$run{distro}/$run{my_arch}/" } },
- basesystem_media => { desc => 'Where to find basesystem packages', default => 'main/release' },
- basesystem_packages => { desc => 'List of packages needed for the chroot creation', default => ['basesystem', 'rpm-build', 'rpm-mandriva-setup-build', 'sudo', 'urpmi' ] },
- cache_home => { desc => 'Where to store the cache files', default => "$HOME/.bugs" },
- cache_min_size => { desc => 'Minimal size to consider a cache file valid', default => 1000000 },
- check_binary_file => { desc => 'Packages rebuild should be checked, however sometime rpm is segfaulting and the test is not correct', default => 0 },
- iurt_root_command => { desc => 'Program to run sudo command', default => '/usr/local/bin/iurt_root_command' },
- distribution => { desc => 'Name of the packages distribution', default => 'Mandriva Linux' },
- home => { desc => 'Home dir', default => $HOME },
- install_chroot_binary => { desc => 'Tool used to create initial chroot', default => 'install-chroot-tar.sh' },
- local_home => { desc => 'Where to build packages', default => $HOME },
- local_upload => { desc => 'Where to store build packages and log', default => '' },
- local_spool => { desc => 'To override the directory where all the results are stored', default => '' },
- log_size_limit => { desc => 'Maximum authorized size for a log file', default => '100M' },
- log_size_date => { desc => 'Number of days log should be kept', default => '30' },
- log_url => { desc => 'Where the log can be seen', default => '' },
- minimum_package_number => { "Minimum number of packages in a synthesis file to consider it valid", default => 1000 },
- max_command_retry => { "Maximum number of retry Iurt will perform for a given command", fault => 20 },
- no_mail => { desc => 'Hash table with people mail address where we should not send any mails', default => {} },
- packager => { desc => 'Name of the build bot', default => 'Iurt' },
- repository => { desc => 'Prefix of the repositories', default => '/mnt/BIG/dis/' },
- rsync_to => { desc => 'Server where the result of the builds should be rsynced (name@server:path format)', default => ''},
- sendmail => { desc => 'If the bot will send mail reports regarding build', default => 0 },
- supported_arch => { desc => 'Table of supported architecture', default => ['i586', 'x86_64'] },
- upload => { desc => 'Where to copy build packages', default => "$HOME/uploads/" },
- vendor => { desc => 'Name of the packages vendor', default => 'Mandriva' },
+ admin => {
+ desc => 'Mail of the administrator of packages builds',
+ default => ''
+ },
+ all_media => {
+ desc => 'List of known media',
+ default => {
+ 'main' => [ '' ],
+ 'contrib' => [ '' ]
+ }
+ },
+ basesystem_media_root => {
+ desc => 'Name of the media holding basesystem packages',
+ default => sub {
+ my ($config, $run) = @_;
+ "$config->{repository}/$run{distro}/$run{my_arch}/"
+ }
+ },
+ basesystem_media => {
+ desc => 'Where to find basesystem packages',
+ default => 'main/release'
+ },
+ basesystem_packages => {
+ desc => 'List of packages needed for the chroot creation',
+ default => [
+ 'basesystem',
+ 'rpm-build',
+ 'rpm-mandriva-setup-build',
+ 'sudo',
+ 'urpmi'
+ ]
+ },
+ cache_home => {
+ desc => 'Where to store the cache files',
+ default => "$HOME/.bugs"
+ },
+ cache_min_size => {
+ desc => 'Minimal size to consider a cache file valid',
+ default => 1000000
+ },
+ check_binary_file => {
+ desc => 'Packages rebuild should be checked, however sometime rpm is segfaulting and the test is not correct',
+ default => 0
+ },
+ iurt_root_command => {
+ desc => 'Program to run sudo command',
+ default => '/usr/local/bin/iurt_root_command'
+ },
+ distribution => {
+ desc => 'Name of the packages distribution',
+ default => 'Mandriva Linux'
+ },
+ home => {
+ desc => 'Home dir',
+ default => $HOME
+ },
+ install_chroot_binary => {
+ desc => 'Tool used to create initial chroot',
+ default => 'install-chroot-tar.sh'
+ },
+ local_home => {
+ desc => 'Where to build packages',
+ default => $HOME
+ },
+ local_upload => {
+ desc => 'Where to store build packages and log',
+ default => ''
+ },
+ local_spool => {
+ desc => 'To override the directory where all the results are stored',
+ default => ''
+ },
+ log_size_limit => {
+ desc => 'Maximum authorized size for a log file',
+ default => '100M'
+ },
+ log_size_date => {
+ desc => 'Number of days log should be kept',
+ default => '30'
+ },
+ log_url => {
+ desc => 'Where the log can be seen',
+ default => ''
+ },
+ minimum_package_number => {
+ "Minimum number of packages in a synthesis file to consider it valid",
+ default => 1000
+ },
+ max_command_retry => {
+ "Maximum number of retry Iurt will perform for a given command",
+ fault => 20
+ },
+ no_mail => {
+ desc => 'Hash table with people mail address where we should not send any mails',
+ default => {}
+ },
+ packager => {
+ desc => 'Name of the build bot',
+ default => 'Iurt'
+ },
+ repository => {
+ desc => 'Prefix of the repositories',
+ default => '/mnt/BIG/dis/'
+ },
+ rsync_to => {
+ desc => 'Server where the result of the builds should be rsynced (name@server:path format)',
+ default => ''
+ },
+ sendmail => {
+ desc => 'If the bot will send mail reports regarding build',
+ default => 0
+ },
+ supported_arch => {
+ desc => 'Table of supported architecture',
+ default => ['i586', 'x86_64']
+ },
+ upload => {
+ desc => 'Where to copy build packages',
+ default => "$HOME/uploads/"
+ },
+ vendor => {
+ desc => 'Name of the packages vendor',
+ default => 'Mandriva'
+ },
);
config_usage() if $run{config_usage};
@@ -632,11 +729,11 @@ do {
}
plog(5, "calling callback for $opt->{hash}");
if ($run{unionfs_tmp} && $output =~ /no space left on device/i) {
- print {$run{LOG}} "ERROR $program_name: running out of space to compile $srpm in unionfs mode, will recompile it in normal mode\n";
+ plog("ERROR: running out of space to compile $srpm in unionfs mode, will recompile it in normal mode");
$cache->{no_unionfs}{$srpm} = 1;
return 1
} elsif ($run{unionfs_tmp} && $output =~ m,$home,) {
- print {$run{LOG}} "ERROR $program_name: seems like building $srpm needs to access /proc/self/exe, which is broken with unionfs, will try to recompile it in non unionfs mode\n";
+ plog("ERROR: seems like building $srpm needs to access /proc/self/exe, which is broken with unionfs, will try to recompile it in non unionfs mode");
$cache->{no_unionfs}{$srpm} = 1;
return 1
} elsif ($output =~ /bin\/ld: cannot find -l(\S*)|configure.*error.* (?:-l([^\s]+)|([^\s]+) includes)/) {
@@ -721,11 +818,14 @@ do {
$urpmi->add_to_local_media($chroot_tmp, $srpm, $luser);
} else {
plog("build successful, copying packages to $local_spool.");
- system("cp $chroot_tmp/home/$luser/rpm/RPMS/*/*.rpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy rpm files from $chroot_tmp/home/$luser/rpm/RPMS/ to $local_spool ($!)\n";
+
+ system("cp $chroot_tmp/home/$luser/rpm/RPMS/*/*.rpm $local_spool &>/dev/null") and plog("ERROR: could not copy rpm files from $chroot_tmp/home/$luser/rpm/RPMS/ to $local_spool ($!)");
+
if ($run{copy_srpm}) {
# replace the old srpm
unlink "$local_spool/$old_srpm";
- system("cp $chroot_tmp/home/$luser/rpm/SRPMS/$srpm $local_spool &>/dev/null") and print {$run{LOG}} "ERROR: could not copy $srpm from $chroot_tmp/home/$luser/rpm/SRPMS/ to $local_spool ($!)\n";
+
+ system("cp $chroot_tmp/home/$luser/rpm/SRPMS/$srpm $local_spool &>/dev/null") and plog("ERROR: could not copy $srpm from $chroot_tmp/home/$luser/rpm/SRPMS/ to $local_spool ($!)");
}
process_queue($config, \%run, \@wrong_rpm, 1)
}
@@ -827,9 +927,9 @@ sub check_needed {
}
my $v ||= $version;
if ($package) {
- print {$run{LOG}} "ERROR $program_name: $srpm needs package $package which requires missing $name $v to be compiled.\n";
+ plog("ERROR: $srpm needs package $package which requires missing $name $v to be compiled.");
} else {
- print {$run{LOG}} "ERROR $program_name: $srpm needs $name $v to be compiled.\n";
+ plog("ERROR: $srpm needs $name $v to be compiled.");
}
# try to recompile it once in a while
last if $cache->{warning}{"install_deps_$srpm"}{$maint}++ % 72;
@@ -856,7 +956,7 @@ sub process_queue {
my $err = system('/usr/bin/scp',"$dir/$rpm", $config->{upload} . "/$config->{extra_subdir}/RPMS/");
# try to keep the opportunity to prevent disk full
if ($err){
- print {$run{LOG}} "ERROR process_queue: cannot copy $dir/$rpm to ", $config->{upload}, "/$config->{extra_subdir}/RPMS/ ($!)\n";
+ plog("ERROR: process_queue: cannot copy $dir/$rpm to ", $config->{upload}, "/$config->{extra_subdir}/RPMS/ ($!)");
next
}
}
@@ -885,7 +985,7 @@ sub check_pid {
chomp $hostname;
my $pidfile = $run->{pidfile};
my $lockfile = "$run->{pidfile_home}/$pidfile.$hostname.pid.lock";
- print {$run->{LOG}} "$program_name: trying to lock $lockfile\n";
+ plog("trying to lock $lockfile");
open my $lock, ">$lockfile";
my $lock_ok;
# lockf seems not to work, try to workarround, but this start to create lock on the lock for the lock of the file.
@@ -893,9 +993,9 @@ sub check_pid {
if (!$status) {
$lock_ok = 1;
} else {
- print {$run->{LOG}} "ERROR $program_name: could not lock pid file (status $status $!)\n";
+ plog("ERROR: could not lock pid file (status $status $!)");
if (! -f "$lockfile.2") {
- print {$run->{LOG}} "$program_name: using $lockfile.2 as lock file\n";
+ plog("using $lockfile.2 as lock file");
open my $lock2, ">$lockfile.2" or die "FATAL $program_name: could not open lock file $lockfile.2";
print $lock2 $$;
close $lock2;
@@ -914,10 +1014,10 @@ sub check_pid {
my $diff = time - $time;
my $msg = "$program_name: an other iurt is running for $run->{my_arch} on $pid_host, pid $pid, since $diff seconds";
if ($diff < 36000) {
- print {$run->{LOG}} "$msg\n";
+ plog("$msg\n");
exit
} else {
- print {$run->{LOG}} "$msg, ignoring it\n"
+ plog("$msg, ignoring it");
}
}
}
@@ -930,7 +1030,7 @@ sub check_pid {
my $pid = <$test_PID>;
close $test_PID;
if (!$pid) {
- print {$run->{LOG}} "ERROR $program_name: invalid pidfile ($pid), should be <pid>";
+ plog("ERROR: invalid pidfile ($pid), should be <pid>");
unlink $pidfile
}
if ($pid && getpgrp $pid != -1) {
@@ -938,7 +1038,7 @@ sub check_pid {
my $state = `ps h -o state $pid`;
chomp $state;
if ($time < time - 36000 || $state eq 'Z') {
- print {$run->{LOG}} "$program_name: an other iurt pid $pid is running for a very long time or is zombie, killing it\n";
+ plog("an other iurt pid $pid is running for a very long time or is zombie, killing it");
my $i;
while ($i < 5 && getpgrp $pid != -1) {
kill_for_good($pid);
@@ -946,15 +1046,15 @@ sub check_pid {
sleep 1
}
} else {
- print {$run->{LOG}} "$program_name: an other iurt is running for $run->{my_arch}, pid $pid, since ",time - $time," seconds\n";
+ plog("an other iurt is running for $run->{my_arch}, pid $pid, since ",time - $time," seconds");
exit
}
} else {
- print {$run->{LOG}} "$program_name: a previous iurt for $run->{my_arch} seems dead, cleaning.\n";
+ plog("a previous iurt for $run->{my_arch} seems dead, cleaning.");
unlink $pidfile
}
}
- print {$run->{LOG}} "$program_name: setting $pidfile pid lock\n";
+ plog("setting $pidfile pid lock");
open my $PID, ">$pidfile" or die "FATAL $program_name: could not open pidfile $pidfile for writing";
print $PID $$;
close $PID;
@@ -972,7 +1072,7 @@ sub check_media {
# We could rely on only parsing the synthesis, hoping that they are correct, however this scan is very fast, so...
foreach my $subdir (@{$config->{all_media}{$run->{media}}}) {
my $rpms_dir = "$config->{repository}/$run->{distro}/$run->{my_arch}/media/$run->{media}/$subdir/";
- print {$run->{LOG}} "$program_name: checking current packages in $rpms_dir\n";
+ plog("checking current packages in $rpms_dir");
opendir my $rpmdir, $rpms_dir or die "Could not open $rpms_dir: $!";
my $urpmi = $run->{urpmi};
foreach my $rpm (readdir $rpmdir) {
@@ -989,7 +1089,7 @@ sub check_media {
foreach my $subdir (@{$config->{all_media}{$m}}) {
my $synthesis_file = "$config->{repository}/$run->{distro}/$run->{my_arch}/media/$m/$subdir/media_info/synthesis.hdlist.cz";
if (-f $synthesis_file) {
- print {$run->{LOG}} "Parsing $synthesis_file\n";
+ plog("Parsing $synthesis_file");
if (open my $syn, "zcat $synthesis_file |") {
my @prov;
my $nb;
@@ -1029,9 +1129,9 @@ sub check_media {
sub search_packages {
my ($clean, $cache, $provides, $run, $maint, $srpm_version, @dir) = @_;
my ($to_compile, %rep, %done_rpm);
- print {$run->{LOG}} "iurt search_package: @dir\n";
+ plog("iurt search_package: @dir");
foreach my $dir (@dir) {
- print {$run->{LOG}} "$program_name: checking SRPMS dir $dir\n";
+ plog("checking SRPMS dir $dir");
opendir my $rpmdir, $dir or next;
foreach my $srpm (readdir $rpmdir) {
# this is for the output of the new svn system
@@ -1086,7 +1186,7 @@ sub add_sudoers {
my $file = "$chroot/etc/sudoers";
my $f;
if (!open $f, qq{| $sudo sh -c "cat > $file"}) {
- print {$run->{LOG}} "ERROR $program_name: could not open $file ($!)\n";
+ plog("ERROR: could not open $file ($!)");
return 0
}
print $f qq{Cmnd_Alias RPM=/bin/rpm,/usr/sbin/urpmi,/usr/sbin/urpme,/usr/sbin/urpmi.addmedia,/usr/sbin/urpmi.update,/usr/sbin/urpmi.removemedia
@@ -1094,7 +1194,7 @@ root ALL=(ALL) ALL
$user ALL=(ALL) NOPASSWD:RPM
};
close $f;
- print {$run->{LOG}} "$program_name: adding sudo for /bin/rpm, /usr/sbin/urpmi and /usr/sbin/urpme\n";
+ plog("adding sudo for /bin/rpm, /usr/sbin/urpmi and /usr/sbin/urpme");
-f $file or return 0;
1
}