summaryrefslogtreecommitdiff
path: root/lib/sbin/ConfigScriptParser.pl
blob: 80cb1a18247f407a65ae98770adc76c3cb876877 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#! /usr/bin/perl -s
#/*@@
#  @file      ConfigScriptParser
#  @date      Thu Mar 25 14:25:13 2004
#  @author    Yaakoub El-Khamra
#  @desc
#             Parses the Config Script Output
#  @enddesc
#  @version   $Header$
#@@*/

#/*@@
#  @routine   ParseConfigScript
#  @date      Thu Mar 25 14:25:13 2004
#  @author    Yaakoub El-Khamra
#  @desc
#  Parses the Config Script Ouput
#  @enddesc
#@@*/
sub ParseConfigScript
{
    my ($config_dir, $provides, $lang, $script, $thorn, $cfg) = @_;
    
    return if $lang eq '' || $script eq '';
    
    print "\n";
    print "********************************************************************************\n";
    print "Running configuration script for thorn $thorn:\n";
    
    # Run the configuration script in the config_dir folder
    chdir $config_dir;
    open (my $lines, '-|', "$lang $script");
    
    my $line_number = 0;
    while (my $line = <$lines>) {
        chomp $line; ++$line_number;
        next if ! $line;
        
        # Parse the line
        if ($line =~ m/^\s*BEGIN\s+DEFINE\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+DEFINE\s*/i) {
                $cfg->{"\U$thorn $provides\E DEFINE"} .= "$line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*BEGIN\s+INCLUDE\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+INCLUDE\s*/i) {
                $cfg->{"\U$thorn $provides\E INCLUDE"} .= "$line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*BEGIN\s+ERROR\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+ERROR\s*/i) {
                $cfg->{"\U$thorn $provides\E ERROR"} .= "$line\n";
                print "ERROR: $line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*BEGIN\s+MESSAGE\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+MESSAGE\s*/i) {
                $cfg->{"\U$thorn $provides\E MESSAGE"} .= "$line\n";
                print "$line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*BEGIN\s+MAKE_DEFINITION\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+MAKE_DEFINITION\s*/i) {
                $cfg->{"\U$thorn $provides\E MAKE_DEFINITION"} .= "$line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*BEGIN\s+MAKE_DEPENDENCY\s*/i) {
            $line = <$lines>; chomp $line; ++$line_number;
            while ($line !~ m/^\s*END\s+MAKE_DEPENDENCY\s*/i) {
                $cfg->{"\U$thorn $provides\E MAKE_DEPENDENCY"} .= "$line\n";
                $line = <$lines>; chomp $line; ++$line_number;
            }
        } elsif ($line =~ m/^\s*INCLUDE_DIRECTORY\s+(.*)$/i) {
            $cfg->{"\U$thorn $provides\E INCLUDE_DIRECTORY"} .= " $1";
        } elsif ($line =~ m/^\s*LIBRARY_DIRECTORY\s+(.*)$/i) {
            $cfg->{"\U$thorn $provides\E LIBRARY_DIRECTORY"} .= " $1";
        } elsif ($line =~ m/^\s*LIBRARY\s+(.*)$/i) {
            $cfg->{"\U$thorn $provides\E LIBRARY"} .= " $1";
        } else {
            &CST_error(0, "Unrecognised line $line_number '$line' produced by configuration script '$script'");
        }
    }
    
    close $lines;
    my $exit_value  = $? >> 8;
    my $signal_num  = $? & 127;
    my $dumped_core = $? & 128;
    
    my $error_msg = $cfg->{"\U$thorn $provides\E ERROR"};
    chomp $error_msg;
    if ($error_msg) {
        $error_msg = "     Error message: '$error_msg'";
    } else {
        $error_msg = '     (no error message)';
    }
    
    my $msg = "Configuration script for thorn $thorn";
    &CST_error(0, "$msg returned exit code $exit_value\n$error_msg")
        if $exit_value;
    &CST_error(0, "$msg received signal $signal_num\n$error_msg")
      if $signal_num;
    &CST_error(0, "$msg dumped core\n$error_msg")
        if $dumped_core;
    
    print "Finished running configuration script for thorn $thorn.\n";
    
    # TODO: Should we abort if there was an error message, but the
    # return code indicates that there was no error?
}

1;