change the date
[tools/build.git] / runservices
1 #!/usr/bin/perl -w
2
3 BEGIN {
4   unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
5 }
6
7 use POSIX;
8 use File::Temp ();
9 use File::Copy ();
10
11 use strict;
12
13 use Build::SimpleXML;
14
15 my $servicedir = '/usr/lib/obs/service';
16 my $buildroot = '';
17
18 sub ls {
19   local *D;
20   opendir(D, $_[0]) || return ();
21   my @r = grep {$_ ne '.' && $_ ne '..'} readdir(D);
22   closedir D;
23   return @r;
24 }
25
26 sub run_services {
27   my ($xml) = @_;
28
29   my $servicexml = Build::SimpleXML::parse($xml);
30   die("not a valid _service file\n") unless $servicexml && $servicexml->{'services'};
31   $servicexml = $servicexml->{'services'}->[0];
32
33   my $tempdir;
34   if ($buildroot ne '') {
35     $tempdir = File::Temp::tempdir('CLEANUP' => 1, 'DIR' => "$buildroot/tmp");
36     die("bad tempdir\n") unless $tempdir =~ s/^\Q$buildroot\E//;
37   } else {
38     $tempdir = File::Temp::tempdir('CLEANUP' => 1);
39   }
40
41   # take default version setting
42   for my $s (@{$servicexml->{'service'} || []}) {
43     # buildtime only is default
44     next unless $s->{'mode'} && $s->{'mode'} eq 'buildtime';
45     die("missing name in service\n") unless $s->{'name'};
46
47     if (! -x "$buildroot$servicedir/$s->{'name'}") {
48       die("service '$s->{'name'}' configured to run, but is not available\n");
49     }
50
51     my @run;
52     push @run, "$servicedir/$s->{'name'}";
53     for my $param (@{$s->{'param'}}) {
54       next if $param->{'name'} eq 'outdir';
55       next unless $param->{'_content'};
56       push @run, "--$param->{'name'}";
57       push @run, $param->{'_content'};
58     }
59     push @run, "--outdir";
60     push @run, $tempdir;
61     my $pid = fork();
62     die("fork: $!\n") unless defined $pid;
63     if ($pid == 0) {
64       if ($buildroot ne '') {
65         chroot($buildroot) || die("chroot $buildroot: $!\n");
66       }
67       exec(@run);
68       die("$run[0]: $!\n");
69     }
70     1 while waitpid($pid, 0) != $pid;
71     die("service run failed for service '$s->{'name'}'\n") if $?;
72     # copy back
73     for my $file (grep {!/^[:\.]/} ls("$buildroot$tempdir")) {
74       File::Copy::move("$buildroot$tempdir/$file", $file) if -f "$buildroot$tempdir/$file";
75     }
76   }
77 }
78
79 if (@ARGV > 1 && $ARGV[0] eq '--buildroot') {
80   shift @ARGV;
81   $buildroot = shift @ARGV;
82   $buildroot = '' if $buildroot && $buildroot eq '/';
83   die("bad buildroot\n") unless $buildroot eq '' || $buildroot =~ /^\//;
84 }
85
86 local *F;
87 open(F, '<', '_service') || die("_service: $!\n");
88 my $xml = '';
89 1 while sysread(F, $xml, 4096, length($xml)) > 0;
90 close F;
91
92 run_services($xml);