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,174 @@
# --
# 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::Stats::Dashboard::Generate;
use strict;
use warnings;
use parent qw(Kernel::System::Console::BaseCommand);
our @ObjectDependencies = (
'Kernel::Config',
'Kernel::System::PID',
'Kernel::System::User',
'Kernel::System::JSON',
'Kernel::System::Main',
'Kernel::System::Stats',
);
sub Configure {
my ( $Self, %Param ) = @_;
$Self->Description('Generate statistics widgets for the dashboard.');
$Self->AddOption(
Name => 'number',
Description => "Statistic number as shown in the overview of AgentStats.",
Required => 0,
HasValue => 1,
ValueRegex => qr/\d+/smx,
);
$Self->AddOption(
Name => 'force-pid',
Description => "Start even if another process is still registered in the database.",
Required => 0,
HasValue => 0,
);
$Self->AddOption(
Name => 'debug',
Description => "Output debug information while running.",
Required => 0,
HasValue => 0,
ValueRegex => qr/.*/smx,
);
return;
}
sub PreRun {
my ($Self) = @_;
my $PIDCreated = $Kernel::OM->Get('Kernel::System::PID')->PIDCreate(
Name => $Self->Name(),
Force => $Self->GetOption('force-pid'),
TTL => 60 * 60 * 6,
);
if ( !$PIDCreated ) {
my $Error = "Unable to register the process in the database. Is another instance still running?\n";
$Error .= "You can use --force-pid to override this check.\n";
die $Error;
}
return;
}
sub Run {
my ( $Self, %Param ) = @_;
$Self->Print("<yellow>Generating dashboard widgets statistics...</yellow>\n");
my $StatNumber = $Self->GetOption('number');
# get the list of stats that can be used in agent dashboards
my $Stats = $Kernel::OM->Get('Kernel::System::Stats')->StatsListGet(
UserID => 1,
);
my $DefaultLanguage = $Kernel::OM->Get('Kernel::Config')->Get('DefaultLanguage') || 'en';
STATID:
for my $StatID ( sort keys %{ $Stats || {} } ) {
my %Stat = %{ $Stats->{$StatID} || {} };
next STATID if $StatNumber && $StatNumber ne $Stat{StatNumber};
next STATID if !$Stat{ShowAsDashboardWidget};
$Self->Print("<yellow>Stat $Stat{StatNumber}: $Stat{Title}</yellow>\n");
# now find out all users which have this statistic enabled in their dashboard
my $DashboardActiveSetting = 'UserDashboard' . ( 1000 + $StatID ) . "-Stats";
my %UsersWithActivatedWidget = $Kernel::OM->Get('Kernel::System::User')->SearchPreferences(
Key => $DashboardActiveSetting,
Value => 1,
);
my $UserWidgetConfigSetting = 'UserDashboardStatsStatsConfiguration' . ( 1000 + $StatID ) . "-Stats";
# Calculate the cache for each user, if needed. If several users have the same settings
# for a stat, the cache will not be recalculated.
USERID:
for my $UserID ( sort keys %UsersWithActivatedWidget ) {
my $StartTime = time(); ## no critic
# ignore invalid users
my %UserData = $Kernel::OM->Get('Kernel::System::User')->GetUserData(
UserID => $UserID,
Valid => 1,
NoOutOfOffice => 1,
);
next USERID if !%UserData;
$Self->Print("<yellow> User: $UserData{UserLogin} ($UserID)</yellow>\n");
my $UserGetParam = {};
if ( $UserData{$UserWidgetConfigSetting} ) {
$UserGetParam = $Kernel::OM->Get('Kernel::System::JSON')->Decode(
Data => $UserData{$UserWidgetConfigSetting},
);
}
if ( $Self->GetOption('debug') ) {
print STDERR "DEBUG: user statistic configuration data:\n";
print STDERR $Kernel::OM->Get('Kernel::System::Main')->Dump($UserGetParam);
}
$Kernel::OM->ObjectsDiscard(
Objects => ['Kernel::Language'],
);
$Kernel::OM->ObjectParamAdd(
'Kernel::Language' => {
UserLanguage => $UserData{UserLanguage} || $DefaultLanguage,
},
);
# Now run the stat to fill the cache with the current parameters (passing the
# user language for the correct caching).
my $Result = $Kernel::OM->Get('Kernel::System::Stats')->StatsResultCacheCompute(
StatID => $StatID,
UserGetParam => {
%{$UserGetParam},
UserLanguage => $UserData{UserLanguage} || $DefaultLanguage,
},
UserID => $UserID
);
if ( $Self->GetOption('debug') ) {
print STDERR sprintf( "DEBUG: time taken: %ss\n", time() - $StartTime ); ## no critic
}
if ( !$Result ) {
$Self->PrintError(" Stat calculation was not successful.");
}
}
}
$Self->Print("<green>Done.</green>\n");
return $Self->ExitCodeOk();
}
sub PostRun {
my ($Self) = @_;
return $Kernel::OM->Get('Kernel::System::PID')->PIDDelete( Name => $Self->Name() );
}
1;