diff --git a/scripts/Util.pm b/scripts/Util.pm new file mode 100644 index 0000000..217fe66 --- /dev/null +++ b/scripts/Util.pm @@ -0,0 +1,88 @@ +package Util; + +use strict; +use warnings; +use diagnostics; + +use feature 'say'; + +my $ntfy_url = 'https://ntfy.vps.chriphost.de'; +my $ntfy_token = 'tk_rx8fd6hojuz4ekcb72j7juugkbmga'; # May be public +my $ntfy_topic = 'fail-alerts'; + +sub notify { + my ($msg) = @_; + + system( 'curl', '-H', "Authorization: Bearer $ntfy_token", + '-d', $msg, "$ntfy_url/$ntfy_topic" ); +} + +sub notify_file { + my ($file) = @_; + + system( + 'curl', '-H', "Authorization: Bearer $ntfy_token", + '-T', $file, '-H', "Filename: $file", + "$ntfy_url/$ntfy_topic" + ); +} + +sub find_files { + my ($dir) = @_; + + opendir( my $dhandle, $dir ) or die "opendir($dir): $!"; + my @files = grep { -f "$dir/$_" } readdir($dhandle); + closedir($dhandle); + + return @files; +} + +sub find_subdirs { + my ($dir) = @_; + + opendir( my $dhandle, $dir ) or die "opendir($dir): $!"; + my @subdirs = + grep { $_ ne '.' && $_ ne '..' && -d "$dir/$_" } readdir($dhandle); + closedir($dhandle); + + return @subdirs; +} + +sub execute_query { + my ( $experiment, $queryname, $db_conf, $builds_dir ) = @_; + + say "Running query $queryname"; + + my $module = "Queries::$queryname"; + my $file = "$module.pm"; + $file =~ s/::/\//g; + + require $file; + + my $query = $module->can('query') or die "$module can't query()"; + my $args = $module->can('args') or die "$module can't args()"; + my $filename = $module->can('filename') or die "$module can't filanem()"; + my $postprocess = $module->can('postprocess') + or die "$module can't postprocess()"; + + my $querystring = $query->($experiment); + my $argsstring = $args->(); + my $filenamestring = $filename->(); + + my $result = + qx{mariadb --defaults-file=$db_conf $argsstring -e "$querystring"}; + die "Query failed: $?" if $? != 0; + + $postprocess->($result); + + open( my $results_handle, '>', "$builds_dir/$experiment/$filenamestring" ) + or die "failed to open file: $!"; + print $results_handle $result; + close($results_handle) or die "failed to close file: $!"; + + notify_file("$builds_dir/$experiment/$filenamestring"); + + return $result; +} + +1;