# -- # 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). 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. =cut 1;