586 lines
16 KiB
Perl
586 lines
16 KiB
Perl
# --
|
|
# 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::SystemMaintenance;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Kernel::System::VariableCheck qw(:all);
|
|
|
|
our @ObjectDependencies = (
|
|
'Kernel::Config',
|
|
'Kernel::System::Cache',
|
|
'Kernel::System::DB',
|
|
'Kernel::System::Log',
|
|
'Kernel::System::Main',
|
|
'Kernel::System::DateTime',
|
|
'Kernel::System::Valid',
|
|
);
|
|
|
|
=head1 NAME
|
|
|
|
Kernel::System::SystemMaintenance
|
|
|
|
=head1 DESCRIPTION
|
|
|
|
SystemMaintenance backend
|
|
|
|
=head1 PUBLIC INTERFACE
|
|
|
|
=head2 new()
|
|
|
|
create a SystemMaintenance object. Do not use it directly, instead use:
|
|
|
|
my $SystemMaintenanceObject = $Kernel::OM->Get('Kernel::System::SystemMaintenance');
|
|
|
|
=cut
|
|
|
|
sub new {
|
|
my ( $Type, %Param ) = @_;
|
|
|
|
# allocate new hash for object
|
|
my $Self = {};
|
|
bless( $Self, $Type );
|
|
|
|
return $Self;
|
|
}
|
|
|
|
=head2 SystemMaintenanceAdd()
|
|
|
|
add new SystemMaintenance
|
|
|
|
returns the id of the created SystemMaintenance if success or undef otherwise
|
|
|
|
my $ID = $SystemMaintenance->SystemMaintenanceAdd(
|
|
StartDate => 1485346000 # mandatory
|
|
StopDate => 1485349600 # mandatory
|
|
Comment => 'Comment', # mandatory
|
|
LoginMessage => 'A login message.', # optional
|
|
ShowLoginMessage => 1, # optional
|
|
NotifyMessage => 'Notification message.', # optional
|
|
ValidID => 1, # mandatory
|
|
UserID => 123, # mandatory
|
|
);
|
|
|
|
Returns:
|
|
|
|
$ID = 567;
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceAdd {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed stuff
|
|
for my $Key (qw(StartDate StopDate Comment ValidID UserID)) {
|
|
if ( !$Param{$Key} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "Need $Key!",
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
# date start shouldn't be higher than stop date
|
|
return if ( $Param{StartDate} > $Param{StopDate} );
|
|
|
|
# Database columns for LoginMessage and NotifyMessage in system_maintenance are limited to 250 characters.
|
|
return if $Param{LoginMessage} && length $Param{LoginMessage} > 250;
|
|
return if $Param{NotifyMessage} && length $Param{NotifyMessage} > 250;
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
# SQL
|
|
return if !$DBObject->Do(
|
|
SQL => '
|
|
INSERT INTO system_maintenance ( start_date, stop_date, comments, login_message,
|
|
show_login_message, notify_message, valid_id, create_time, create_by, change_time, change_by )
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, current_timestamp, ?, current_timestamp, ?)',
|
|
Bind => [
|
|
\$Param{StartDate}, \$Param{StopDate}, \$Param{Comment}, \$Param{LoginMessage},
|
|
\$Param{ShowLoginMessage}, \$Param{NotifyMessage}, \$Param{ValidID},
|
|
\$Param{UserID}, \$Param{UserID},
|
|
],
|
|
);
|
|
|
|
return if !$DBObject->Prepare(
|
|
SQL => '
|
|
SELECT id FROM system_maintenance
|
|
WHERE start_date = ? and stop_date = ? and comments = ?
|
|
',
|
|
Bind => [
|
|
\$Param{StartDate}, \$Param{StopDate}, \$Param{Comment},
|
|
],
|
|
);
|
|
|
|
my $ID;
|
|
while ( my @Row = $DBObject->FetchrowArray() ) {
|
|
$ID = $Row[0];
|
|
}
|
|
|
|
# return undef if not correct result
|
|
return if !$ID;
|
|
|
|
return $ID;
|
|
}
|
|
|
|
=head2 SystemMaintenanceDelete()
|
|
|
|
delete a SystemMaintenance
|
|
|
|
returns 1 if success or undef otherwise
|
|
|
|
my $Success = $SystemMaintenanceObject->SystemMaintenanceDelete(
|
|
ID => 123,
|
|
UserID => 123,
|
|
);
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceDelete {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed stuff
|
|
for my $Key (qw(ID UserID)) {
|
|
if ( !$Param{$Key} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "Need $Key!",
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
# check if exists
|
|
my $SystemMaintenance = $Self->SystemMaintenanceGet(
|
|
ID => $Param{ID},
|
|
UserID => 1,
|
|
);
|
|
|
|
return if !IsHashRefWithData($SystemMaintenance);
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
# delete SystemMaintenance
|
|
return if !$DBObject->Do(
|
|
SQL => 'DELETE FROM system_maintenance WHERE id = ?',
|
|
Bind => [ \$Param{ID} ],
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
=head2 SystemMaintenanceGet()
|
|
|
|
get SystemMaintenance attributes
|
|
|
|
my $SystemMaintenance = $SystemMaintenanceObject->SystemMaintenanceGet(
|
|
ID => 123, # mandatory
|
|
UserID => 123, # mandatory
|
|
);
|
|
|
|
Returns:
|
|
|
|
$SystemMaintenance = {
|
|
ID => 123,
|
|
StartDate => 1485346000,
|
|
StopDate => 1485349600,
|
|
Comment => 'Comment',
|
|
LoginMessage => 'A login message.',
|
|
ShowLoginMessage => 1,
|
|
NotifyMessage => 'Notification message.',
|
|
ValidID => 1,
|
|
CreateTime => 1485346000,
|
|
ChangeTime => 1485347300,
|
|
CreateBy => 'user_login',
|
|
ChangeBy => 'user_login',
|
|
};
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceGet {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed stuff
|
|
for my $Needed (qw(ID UserID)) {
|
|
if ( !$Param{$Needed} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "Need $Needed!"
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
# SQL
|
|
return if !$DBObject->Prepare(
|
|
SQL => '
|
|
SELECT id, start_date, stop_date, comments, login_message,
|
|
show_login_message, notify_message, valid_id, create_time,
|
|
change_time, create_by, change_by
|
|
FROM system_maintenance
|
|
WHERE id = ?',
|
|
Bind => [ \$Param{ID} ],
|
|
Limit => 1,
|
|
);
|
|
|
|
my %Data;
|
|
while ( my @Row = $DBObject->FetchrowArray() ) {
|
|
|
|
%Data = (
|
|
ID => $Row[0],
|
|
StartDate => $Row[1],
|
|
StopDate => $Row[2],
|
|
Comment => $Row[3],
|
|
LoginMessage => $Row[4],
|
|
ShowLoginMessage => $Row[5],
|
|
NotifyMessage => $Row[6],
|
|
ValidID => $Row[7],
|
|
CreateTime => $Row[8],
|
|
ChangeTime => $Row[9],
|
|
CreateBy => $Row[10],
|
|
ChangeBy => $Row[11],
|
|
);
|
|
}
|
|
|
|
return if !$Data{ID};
|
|
|
|
return \%Data;
|
|
}
|
|
|
|
=head2 SystemMaintenanceUpdate()
|
|
|
|
update SystemMaintenance attributes
|
|
|
|
returns 1 if success or undef otherwise
|
|
|
|
my $Success = $SystemMaintenanceObject->SystemMaintenanceUpdate(
|
|
ID => 123, # mandatory
|
|
StartDate => 1485346000, # mandatory
|
|
StopDate => 1485349600, # mandatory
|
|
Comment => 'Comment', # mandatory
|
|
LoginMessage => 'Description', # optional
|
|
ShowLoginMessage => 1, # optional
|
|
NotifyMessage => 'Notification for showing', # optional
|
|
ValidID => 'ValidID', # mandatory
|
|
UserID => 123, # mandatory
|
|
);
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceUpdate {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed stuff
|
|
for my $Key (qw(ID StartDate StopDate Comment ValidID UserID)) {
|
|
if ( !$Param{$Key} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "Need $Key!",
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
|
|
# date start shouldn't be higher than stop date
|
|
return if ( $Param{StartDate} > $Param{StopDate} );
|
|
|
|
# Database columns for LoginMessage and NotifyMessage in system_maintenance table are limited to 250 characters.
|
|
return if $Param{LoginMessage} && length $Param{LoginMessage} > 250;
|
|
return if $Param{NotifyMessage} && length $Param{NotifyMessage} > 250;
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
# SQL
|
|
return if !$DBObject->Do(
|
|
SQL => '
|
|
UPDATE system_maintenance
|
|
SET start_date = ?, stop_date = ?, comments = ?, login_message = ?, show_login_message = ?,
|
|
notify_message = ?, valid_id = ?, change_time = current_timestamp, change_by = ?
|
|
WHERE id = ?',
|
|
Bind => [
|
|
\$Param{StartDate}, \$Param{StopDate}, \$Param{Comment}, \$Param{LoginMessage},
|
|
\$Param{ShowLoginMessage}, \$Param{NotifyMessage},
|
|
\$Param{ValidID}, \$Param{UserID}, \$Param{ID},
|
|
],
|
|
);
|
|
|
|
return 1;
|
|
}
|
|
|
|
=head2 SystemMaintenanceList()
|
|
|
|
get an SystemMaintenance list
|
|
|
|
my $List = $SystemMaintenanceObject->SystemMaintenanceList(
|
|
ValidIDs => ['1','2'], # optional, to filter SystemMaintenances that match listed valid IDs
|
|
UserID => 1,
|
|
);
|
|
|
|
Returns a hash with the SystemMaintenance IDs as keys:
|
|
|
|
$List = {
|
|
42 => 1,
|
|
24 => 1,
|
|
}
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceList {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed
|
|
if ( !$Param{UserID} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => "Need UserID!"
|
|
);
|
|
return;
|
|
}
|
|
|
|
my $ValidIDsStrg;
|
|
if ( !IsArrayRefWithData( $Param{ValidIDs} ) ) {
|
|
$ValidIDsStrg = 'ALL';
|
|
}
|
|
else {
|
|
$ValidIDsStrg = join ',', @{ $Param{ValidIDs} };
|
|
}
|
|
|
|
# get cache object
|
|
my $CacheObject = $Kernel::OM->Get('Kernel::System::Cache');
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
my $SQL = '
|
|
SELECT id
|
|
FROM system_maintenance ';
|
|
|
|
if ( $ValidIDsStrg ne 'ALL' ) {
|
|
|
|
my $ValidIDsStrgDB = join ',', map { $DBObject->Quote( $_, 'Integer' ) }
|
|
@{ $Param{ValidIDs} };
|
|
|
|
$SQL .= "WHERE valid_id IN ($ValidIDsStrgDB)";
|
|
}
|
|
|
|
return if !$DBObject->Prepare( SQL => $SQL );
|
|
my %Data;
|
|
while ( my @Row = $DBObject->FetchrowArray() ) {
|
|
$Data{ $Row[0] } = '1';
|
|
}
|
|
|
|
return \%Data;
|
|
}
|
|
|
|
=head2 SystemMaintenanceListGet()
|
|
|
|
get an SystemMaintenance list with all SystemMaintenance details
|
|
|
|
my $List = $SystemMaintenanceObject->SystemMaintenanceListGet(
|
|
UserID => 1,
|
|
ValidIDs => ['1','2'], # optional, to filter SystemMaintenances that match listed valid IDs
|
|
);
|
|
|
|
Returns:
|
|
|
|
$List = [
|
|
{
|
|
ID => 123,
|
|
StartDate => 1485346000,
|
|
StopDate => 1485349600,
|
|
Comment => 'Comment',
|
|
LoginMessage => 'The message',
|
|
ShowLoginMessage => 1,
|
|
NotifyMessage => 'The notification',
|
|
ValidID => 1,
|
|
CreateTime => 1485342400,
|
|
ChangeTime => 1485343700,
|
|
},
|
|
{
|
|
ID => 123,
|
|
StartDate => 1485346000,
|
|
StopDate => 1485349600,
|
|
Comment => 'Other Comment',
|
|
LoginMessage => 'To be shown on the login screen.',
|
|
ShowLoginMessage => 0,
|
|
NotifyMessage => 'A different notification',
|
|
ValidID => 1,
|
|
CreateTime => 1485342400,
|
|
ChangeTime => 1485343700,
|
|
},
|
|
];
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceListGet {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
# check needed stuff
|
|
if ( !$Param{UserID} ) {
|
|
$Kernel::OM->Get('Kernel::System::Log')->Log(
|
|
Priority => 'error',
|
|
Message => 'Need UserID!',
|
|
);
|
|
return;
|
|
}
|
|
|
|
my $SystemMaintenanceData = $Self->SystemMaintenanceList(
|
|
%Param,
|
|
);
|
|
|
|
my @SystemMaintenanceIDs = sort keys %{$SystemMaintenanceData};
|
|
|
|
my @Data;
|
|
for my $ItemID (@SystemMaintenanceIDs) {
|
|
|
|
my $SystemMaintenanceData = $Self->SystemMaintenanceGet(
|
|
ID => $ItemID,
|
|
UserID => 1,
|
|
);
|
|
push @Data, $SystemMaintenanceData;
|
|
}
|
|
|
|
# sort list by start date
|
|
@Data = sort { $a->{StartDate} <=> $b->{StartDate} } @Data;
|
|
|
|
return \@Data;
|
|
}
|
|
|
|
=head2 SystemMaintenanceIsActive()
|
|
|
|
get a SystemMaintenance active flag
|
|
|
|
my $ActiveMaintenance = $SystemMaintenanceObject->SystemMaintenanceIsActive();
|
|
|
|
Returns:
|
|
|
|
$ActiveMaintenance = 7 # a System Maintenance ID
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceIsActive {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my $DateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime');
|
|
my $SystemTime = $DateTimeObject->ToEpoch();
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
my $SQL = "
|
|
SELECT id
|
|
FROM system_maintenance
|
|
WHERE start_date <= $SystemTime and stop_date >= $SystemTime
|
|
";
|
|
|
|
my @ValidList = $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet();
|
|
if ( scalar @ValidList ) {
|
|
|
|
my $ValidIDsStrgDB = join ',', map { $DBObject->Quote( $_, 'Integer' ) } @ValidList;
|
|
|
|
$SQL .= " AND valid_id IN ($ValidIDsStrgDB)";
|
|
}
|
|
$SQL .= ' ORDER BY id';
|
|
|
|
return if !$DBObject->Prepare( SQL => $SQL );
|
|
|
|
my $Result;
|
|
RESULT:
|
|
while ( my @Row = $DBObject->FetchrowArray() ) {
|
|
$Result = $Row[0];
|
|
last RESULT;
|
|
}
|
|
|
|
return if !$Result;
|
|
|
|
return $Result;
|
|
}
|
|
|
|
=head2 SystemMaintenanceIsComing()
|
|
|
|
Get a upcoming SystemMaintenance start and stop date.
|
|
|
|
my %SystemMaintenanceIsComing = $SystemMaintenanceObject->SystemMaintenanceIsComing();
|
|
|
|
Returns:
|
|
|
|
%SystemMaintenanceIsComing = {
|
|
StartDate => 1515614400,
|
|
StopDate => 1515607200
|
|
};
|
|
|
|
=cut
|
|
|
|
sub SystemMaintenanceIsComing {
|
|
my ( $Self, %Param ) = @_;
|
|
|
|
my $DateTimeObject = $Kernel::OM->Create('Kernel::System::DateTime');
|
|
my $SystemTime = $DateTimeObject->ToEpoch();
|
|
|
|
my $NotifiBeforeTime =
|
|
$Kernel::OM->Get('Kernel::Config')->Get('SystemMaintenance::TimeNotifyUpcomingMaintenance')
|
|
|| 30;
|
|
$DateTimeObject->Add( Minutes => $NotifiBeforeTime );
|
|
my $TargetTime = $DateTimeObject->ToEpoch();
|
|
|
|
# get database object
|
|
my $DBObject = $Kernel::OM->Get('Kernel::System::DB');
|
|
|
|
my $SQL = "
|
|
SELECT start_date, stop_date
|
|
FROM system_maintenance
|
|
WHERE start_date > $SystemTime and start_date <= $TargetTime
|
|
";
|
|
|
|
my @ValidList = $Kernel::OM->Get('Kernel::System::Valid')->ValidIDsGet();
|
|
if ( scalar @ValidList ) {
|
|
|
|
my $ValidIDsStrgDB = join ',', map { $DBObject->Quote( $_, 'Integer' ) } @ValidList;
|
|
|
|
$SQL .= " AND valid_id IN ($ValidIDsStrgDB)";
|
|
}
|
|
$SQL .= ' ORDER BY id';
|
|
|
|
return if !$DBObject->Prepare( SQL => $SQL );
|
|
|
|
my %Result;
|
|
RESULT:
|
|
while ( my @Row = $DBObject->FetchrowArray() ) {
|
|
$Result{StartDate} = $Row[0];
|
|
$Result{StopDate} = $Row[1];
|
|
last RESULT;
|
|
}
|
|
|
|
return if !%Result;
|
|
|
|
return %Result;
|
|
}
|
|
|
|
1;
|
|
|
|
=head1 TERMS AND CONDITIONS
|
|
|
|
This software is part of the OTRS project (L<https://otrs.org/>).
|
|
|
|
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 L<https://www.gnu.org/licenses/gpl-3.0.txt>.
|
|
|
|
=cut
|
|
|
|
1;
|