Enable relaying events even if build_monitor_db_conf is disabled.
[services/obs-event-plugin.git] / notify_buildmonitor.pm
1 ################################################################
2 #
3 # Module for BuildMonitor DB logging.
4 #
5 package notify_buildmonitor;
6
7 use BSConfig;
8 use plugins::BuildMonitorDB;
9 use Data::Dumper;
10 use BSRPC;
11 use MIME::Base64;
12 use JSON::XS;
13
14 use strict;
15
16 sub new {
17   my $self = {};
18   bless $self, shift;
19   return $self;
20 }
21
22 my %event_handlers = (
23   'SRCSRV_START' => \&BuildMonitorDB::srcsrv_start,
24
25   'SRCSRV_CREATE_PROJECT' => \&BuildMonitorDB::srcsrv_create_project,
26   'SRCSRV_UPDATE_PROJECT' => \&BuildMonitorDB::srcsrv_update_project,
27   'SRCSRV_DELETE_PROJECT' => \&BuildMonitorDB::srcsrv_delete_project,
28
29   'SRCSRV_CREATE_PACKAGE' => \&BuildMonitorDB::srcsrv_create_package,
30   'SRCSRV_UPDATE_PACKAGE' => \&BuildMonitorDB::srcsrv_update_package,
31   'SRCSRV_DELETE_PACKAGE' => \&BuildMonitorDB::srcsrv_delete_package,
32
33   'SRCSRV_REQUEST_ACCEPTED' => \&BuildMonitorDB::srcsrv_request_accepted,
34
35   'SRCSRV_COMMIT' => \&BuildMonitorDB::srcsrv_commit,
36
37   'BUILD_START' => \&BuildMonitorDB::build_start,
38   'BUILD_KILL' => \&BuildMonitorDB::build_kill,
39   'BUILD_UNCHANGED' => \&BuildMonitorDB::build_unchanged,
40   'BUILD_SUCCESS' => \&BuildMonitorDB::build_success,
41   'BUILD_FAIL' => \&BuildMonitorDB::build_fail,
42   'BUILD_BROKEN' => \&BuildMonitorDB::build_broken,
43   'BUILD_UNRESOLVABLE' => \&BuildMonitorDB::build_unresolvable,
44   'BUILD_EXCLUDED' => \&BuildMonitorDB::build_excluded,
45   'BUILD_DISABLED' => \&BuildMonitorDB::build_disabled,
46
47   'REPO_PUBLISH_STATE' => \&BuildMonitorDB::repo_publish_state,
48   'REPO_PUBLISHED' => \&BuildMonitorDB::repo_published,
49 );
50
51 sub extract_name_desc {
52   my ($hash) = @_;
53
54   my $extracted_hash = {};
55
56   for my $key (keys %$hash) {
57     #next if $key ne 'name' && $key ne 'description';
58     next if $key ne 'name';
59     $extracted_hash->{$key} = $hash->{$key};
60   }
61
62   return $extracted_hash;
63 }
64
65 sub extract_proj_in_projpack {
66   my ($p) = @_;
67
68   my @extracted_project;
69   for my $proj (@{$p->{'projpack'}->{'project'}}) {
70     my $proj_name = $proj->{'name'};
71     if( BuildMonitorDB::check_proj_pattern($proj_name) ) {
72       next;
73     }
74     my $exp = extract_name_desc($proj);
75     my @pkgs;
76     for my $pack (@{$proj->{'package'}}) {
77       push @pkgs, extract_name_desc($pack);
78     }
79     $exp->{'package'} = \@pkgs;
80     push @extracted_project, $exp;
81   }
82
83   return @extracted_project;
84 }
85
86 sub relay_src_server {
87   my ($type, $p) = @_;
88
89   return unless $BSConfig::relay_obs_server;
90
91   if( $type ne 'SRCSRV_START' ) {
92     my $proj_name = "";
93     $proj_name=$p->{'project'} if defined $p->{'project'};
94     $proj_name=$p->{'targetproject'} if defined $p->{'targetproject'};
95
96     return if $proj_name eq "";
97
98     if( BuildMonitorDB::check_proj_pattern($proj_name) ) {
99       print "[", __FILE__, ":", __LINE__, "] Skip relaying $proj_name.\n";
100       return;
101     }
102   }
103
104   my $uri= "$BSConfig::relay_obs_server/source";
105   my $param = {
106     'request' => 'POST',
107     'uri' => $uri,
108     'timeout' => 60,
109   };
110   $param->{'proxy'} = $BSConfig::proxy if defined $BSConfig::proxy;
111   my $args = {};
112   for my $key (sort keys %$p) {
113     next if $key eq 'dispatches';
114     next if $key eq 'projpack';
115     next if $key eq 'description';
116     if( $key eq 'reason') {
117       $args->{$key} = BuildMonitorDB::parse_reason($p->{$key});
118     } else {
119       $args->{$key} = $p->{$key} if defined $p->{$key};
120     }
121     print "  key=[$key] value=[$args->{$key}]\n";
122   }
123   if( $type eq 'SRCSRV_START') {
124     my @extracted_project = extract_proj_in_projpack($p);
125     print "extracting...\n";
126     my $projpack = {};
127     $projpack->{'project'} = [];
128     for my $proj (@extracted_project) {
129       select STDOUT;
130       my $proj_name = $proj->{'name'};
131       print "Sending project $proj_name\n";
132       $projpack->{'project'} = [$proj];
133       my @aargs = map {"$_=$args->{$_}"} sort keys %$args;
134       push @aargs, "projpack=".encode_base64(encode_json($projpack),'');
135       my @para = ("cmd=relay_notify",
136           "notify_type=$type",
137           @aargs);
138       print "Relaying events to $uri\n";
139       print "notify_type = $type, param=[@para]\n";
140       $|=1;
141       eval {
142         BSRPC::rpc($param, undef, @para);
143       };
144       if ($@) {
145         warn($@);
146       }
147     }
148   } else {
149     my @aargs = map {"$_=$args->{$_}"} sort keys %$args;
150     my @para = ("cmd=relay_notify",
151         "notify_type=$type",
152         @aargs);
153     select STDOUT;
154     print "Relaying events to $uri\n";
155     print "notify_type = $type, param=[@para]\n";
156     $|=1;
157     eval {
158       BSRPC::rpc($param, undef, @para);
159     };
160     if ($@) {
161       warn($@);
162     }
163   }
164
165 }
166
167 sub notify() {
168   my ($self, $type, $paramRef ) = @_;
169
170   # you should add the statements below to BSConfig.pm
171   #our $notification_plugin = "notify_buildmonitor";
172   #our $build_monitor_db_conf = "/usr/lib/obs/server/build_monitor_db.conf";
173   my $evhandler = $event_handlers{$type};
174   if( defined $BSConfig::build_monitor_db_conf ) {
175
176     my $g_dbh = BuildMonitorDB::connect_db($BSConfig::build_monitor_db_conf);
177     if( ! $g_dbh ) {
178       print "[", __FILE__, ":",__LINE__, "] BuildMonitorDB::connect_db() failed.\n";
179       return ;
180     }
181
182     if( $evhandler ) {
183       $evhandler->($paramRef);
184     } else {
185       print "[BuildMonitor] undefined event type: $type\n";
186     }
187   }
188
189   if( $evhandler ) {
190     print "[", __LINE__, "] relaying $type...\n";
191     relay_src_server($type, $paramRef);
192   }
193 }
194
195 1;