This commit is contained in:
2024-10-14 00:08:40 +02:00
parent dbfba56f66
commit 1462d52e13
4572 changed files with 2658864 additions and 0 deletions

View File

@@ -0,0 +1,179 @@
# --
# Copyright (C) 2001-2019 OTRS AG, https://otrs.com/
# --
# This software comes with ABSOLUTELY NO WARRANTY. For details, see
# the enclosed file COPYING for license information (GPL). If you
# did not receive this file, see https://www.gnu.org/licenses/gpl-3.0.txt.
# --
package Kernel::System::Console::Command::Maint::Config::Rebuild;
use strict;
use warnings;
use parent qw(Kernel::System::Console::BaseCommand);
use Time::HiRes qw(sleep);
our @ObjectDependencies = (
'Kernel::System::Cache',
'Kernel::System::PID',
'Kernel::System::SysConfig',
);
sub Configure {
my ( $Self, %Param ) = @_;
$Self->Description('Rebuild the system configuration of OTRS.');
$Self->AddOption(
Name => 'cleanup',
Description => "Cleanup the database configuration, removing entries not defined in the XML files.",
Required => 0,
HasValue => 0,
);
$Self->AddOption(
Name => 'time',
Description => "Specify how many seconds should this instance wait to unlock PID if there is another " .
"instance of this command running at the same time (in cluster environment). Default: 120.",
Required => 0,
HasValue => 1,
ValueRegex => qr/^\d+$/smx,
);
return;
}
sub PreRun {
my ( $Self, %Param ) = @_;
my $PIDObject = $Kernel::OM->Get('Kernel::System::PID');
my $Time = $Self->GetOption('time') || 120;
my $Locked;
my $WaitedSeconds = 0;
my $Interval = 0.1;
my $ShowMessage = 1;
# Make sure that only one rebuild config command is running at the same time. Wait up to 2 minutes
# until other instances are done (see https://bugs.otrs.org/show_bug.cgi?id=14259).
PID:
while ( $WaitedSeconds <= $Time ) {
my %PID = $PIDObject->PIDGet(
Name => 'RebuildConfig',
);
if ( !%PID ) {
my $Success = $PIDObject->PIDCreate(
Name => 'RebuildConfig',
);
my %PID = $PIDObject->PIDGet(
Name => 'RebuildConfig',
);
$PID{PID} || 0;
# PID created successfully.
if ( $Success && $PID{PID} eq $$ ) {
$Locked = 1;
last PID;
}
}
Time::HiRes::sleep($Interval);
$WaitedSeconds += $Interval;
# Increase waiting interval up to 3 seconds.
if ( $Interval < 3 ) {
$Interval += 0.1;
}
if ($ShowMessage) {
$Self->Print("\nThere is another system configuration rebuild in progress, waiting...\n\n");
$ShowMessage = 0;
}
}
if ( !$Locked ) {
die "System was unable to create PID for RebuildConfig!\n";
}
return;
}
sub Run {
my ( $Self, %Param ) = @_;
$Self->Print("<yellow>Rebuilding the system configuration...</yellow>\n");
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
# Enable in-memory cache to improve SysConfig performance, which is normally disabled for commands.
$CacheObject->Configure(
CacheInMemory => 1,
);
# Get SysConfig object.
my $SysConfigObject = $Kernel::OM->Get('Kernel::System::SysConfig');
if (
!$SysConfigObject->ConfigurationXML2DB(
UserID => 1,
Force => 1,
CleanUp => $Self->GetOption('cleanup'),
)
)
{
# Disable in memory cache.
$CacheObject->Configure(
CacheInMemory => 0,
);
$Self->PrintError("There was a problem writing XML to DB.");
return $Self->ExitCodeError();
}
my %DeploymentResult = $SysConfigObject->ConfigurationDeploy(
Comments => "Configuration Rebuild",
AllSettings => 1,
UserID => 1,
Force => 1,
);
if ( !$DeploymentResult{Success} ) {
# Disable in memory cache.
$CacheObject->Configure(
CacheInMemory => 0,
);
$Self->PrintError("There was a problem writing ZZZAAuto.pm.");
return $Self->ExitCodeError();
}
# Disable in memory cache.
$CacheObject->Configure(
CacheInMemory => 0,
);
$Self->Print("<green>Done.</green>\n");
return $Self->ExitCodeOk();
}
sub PostRun {
my ($Self) = @_;
my $PIDObject = $Kernel::OM->Get('Kernel::System::PID');
my %PID = $PIDObject->PIDGet(
Name => 'RebuildConfig',
);
if (%PID) {
return $PIDObject->PIDDelete( Name => 'RebuildConfig' );
}
return 1;
}
1;