RunCommand: use helper functions to ensure filenames and paths are the same

Otherwise, it's possible someone updates the format in one place but not
the others, leading to broken or incorrect functionality.
This commit is contained in:
Cole Helbling 2022-01-24 11:25:13 -08:00
parent 4a441b54ce
commit 5d3912962b
4 changed files with 29 additions and 10 deletions

View file

@ -140,7 +140,7 @@ sub view_log : Chained('buildChain') PathPart('log') {
sub view_runcommand_log : Chained('buildChain') PathPart('runcommand-log') { sub view_runcommand_log : Chained('buildChain') PathPart('runcommand-log') {
my ($self, $c, $sha) = @_; my ($self, $c, $sha) = @_;
$c->stash->{log_uri} = $c->uri_for($c->controller('Root')->action_for("runcommandlog"), $sha . "-" . $c->stash->{build}->id); $c->stash->{log_uri} = $c->uri_for($c->controller('Root')->action_for("runcommandlog"), constructRunCommandLogFilename($sha, $c->stash->{build}->id));
$c->stash->{template} = 'runcommand-log.tt'; $c->stash->{template} = 'runcommand-log.tt';
} }

View file

@ -7,7 +7,6 @@ use base 'Hydra::Base::Controller::ListBuilds';
use Hydra::Helper::Nix; use Hydra::Helper::Nix;
use Hydra::Helper::CatalystUtils; use Hydra::Helper::CatalystUtils;
use Hydra::View::TT; use Hydra::View::TT;
use Hydra::Model::DB;
use Nix::Store; use Nix::Store;
use Nix::Config; use Nix::Config;
use Encode; use Encode;
@ -538,7 +537,7 @@ sub runcommandlog :Local :Args(1) {
die if defined $tail && $tail !~ /^[0-9]+$/; die if defined $tail && $tail !~ /^[0-9]+$/;
my $logFile = Hydra::Model::DB::getHydraPath . "/runcommand-logs/" . substr($filename, 0, 2) . "/$filename"; my $logFile = constructRunCommandLogPath($filename);
if (-f $logFile) { if (-f $logFile) {
serveLogFile($c, $logFile, $tail); serveLogFile($c, $logFile, $tail);
return; return;

View file

@ -19,6 +19,8 @@ our @EXPORT = qw(
cancelBuilds cancelBuilds
captureStdoutStderr captureStdoutStderr
captureStdoutStderrWithStdin captureStdoutStderrWithStdin
constructRunCommandLogFilename
constructRunCommandLogPath
findLog findLog
gcRootFor gcRootFor
getBaseUrl getBaseUrl
@ -589,4 +591,20 @@ sub isLocalStore {
} }
sub constructRunCommandLogFilename {
my ($sha, $build_id) = @_;
my $filename = "$sha-$build_id";
return $filename;
}
sub constructRunCommandLogPath {
my ($filename) = @_;
my $hydra_path = Hydra::Model::DB::getHydraPath;
my $bucket = substr($filename, 0, 2);
return "$hydra_path/runcommand-logs/$bucket/$filename";
}
1; 1;

View file

@ -7,6 +7,8 @@ use experimental 'smartmatch';
use JSON::MaybeXS; use JSON::MaybeXS;
use Digest::SHA1 qw(sha1_hex); use Digest::SHA1 qw(sha1_hex);
use Hydra::Model::DB; use Hydra::Model::DB;
use Hydra::Helper::Nix;
use File::Basename qw(dirname);
sub isEnabled { sub isEnabled {
my ($self) = @_; my ($self) = @_;
@ -162,15 +164,15 @@ sub buildFinished {
$runlog->started(); $runlog->started();
# Prepare log collection my $filename = constructRunCommandLogFilename(sha1_hex($command), $build->get_column('id'));
my $filename = sha1_hex($command) . "-" . $build->get_column('id'); my $logPath = constructRunCommandLogPath($filename);
my $dir = Hydra::Model::DB::getHydraPath . "/runcommand-logs/" . substr($filename, 0, 2); my $dir = dirname($logPath);
my $logpath = "$dir/$filename";
mkdir($dir, oct(755)); mkdir($dir, oct(755));
# This creates the file with the correct permissions
open(my $f, '>', $logpath); open(my $f, '>', $logPath);
close($f); close($f);
chmod(oct(644), $logpath); chmod(oct(644), $logPath);
# Run the command # Run the command
system("$command 1>$logpath 2>&1") == 0 system("$command 1>$logpath 2>&1") == 0