diff --git a/apps/backup/commvault/commserve/restapi/custom/api.pm b/apps/backup/commvault/commserve/restapi/custom/api.pm index 8d26c79a6..1b8737336 100644 --- a/apps/backup/commvault/commserve/restapi/custom/api.pm +++ b/apps/backup/commvault/commserve/restapi/custom/api.pm @@ -52,7 +52,9 @@ sub new { 'api-username:s' => { name => 'api_username' }, 'api-password:s' => { name => 'api_password' }, 'user-domain:s' => { name => 'user_domain' }, - 'timeout:s' => { name => 'timeout' } + 'timeout:s' => { name => 'timeout' }, + 'cache-create' => { name => 'cache_create' }, + 'cache-use' => { name => 'cache_use' } }); } $options{options}->add_help(package => __PACKAGE__, sections => 'REST API OPTIONS', once => 1); @@ -83,6 +85,8 @@ sub check_options { $self->{api_password} = (defined($self->{option_results}->{api_password})) ? $self->{option_results}->{api_password} : ''; $self->{timeout} = (defined($self->{option_results}->{timeout})) ? $self->{option_results}->{timeout} : 30; $self->{user_domain} = (defined($self->{option_results}->{user_domain})) ? $self->{option_results}->{user_domain} : ''; + $self->{cache_create} = $self->{option_results}->{cache_create}; + $self->{cache_use} = $self->{option_results}->{cache_use}; if ($self->{hostname} eq '') { $self->{output}->add_option_msg(short_msg => 'Need to specify hostname option.'); @@ -119,6 +123,12 @@ sub get_port { return $self->{port}; } +sub is_use_cache { + my ($self, %options) = @_; + + return defined($self->{cache_use}) ? 1 : 0; +} + sub json_decode { my ($self, %options) = @_; @@ -259,17 +269,88 @@ sub request_internal { return $decoded; } +sub get_cache_file_response { + my ($self, %options) = @_; + + $self->{cache}->read(statefile => 'cache_commvault_commserve_' . $options{type} . '_' . md5_hex($self->{option_results}->{hostname}) . '_' . md5_hex($self->{option_results}->{api_username})); + my $response = $self->{cache}->get(name => 'response'); + my $update_time = $self->{cache}->get(name => 'update_time'); + if (!defined($response)) { + $self->{output}->add_option_msg(short_msg => 'Cache file missing'); + $self->{output}->option_exit(); + } + return $response; +} + +sub get_cache_file_update { + my ($self, %options) = @_; + + $self->{cache}->read(statefile => 'cache_commvault_commserve_' . $options{type} . '_' . md5_hex($self->{option_results}->{hostname}) . '_' . md5_hex($self->{option_results}->{api_username})); + my $update_time = $self->{cache}->get(name => 'update_time'); + return $update_time; +} + +sub create_cache_file { + my ($self, %options) = @_; + + $self->{cache}->read(statefile => 'cache_commvault_commserve_' . $options{type} . '_' . md5_hex($self->{option_results}->{hostname}) . '_' . md5_hex($self->{option_results}->{api_username})); + $self->{cache}->write(data => { response => $options{response}, update_time => time() }); + $self->{output}->output_add( + severity => 'ok', + short_msg => 'Cache file created successfully' + ); + $self->{output}->display(); + $self->{output}->exit(); +} + sub request { my ($self, %options) = @_; - return $self->request_internal( + return $self->get_cache_file_response(type => $options{type}) + if (defined($self->{cache_use})); + + my $response = $self->request_internal( endpoint => $options{endpoint} ); + + $self->create_cache_file(type => $options{type}, response => $response) + if (defined($self->{cache_create})); + + return $response; +} + +sub request_jobs { + my ($self, %options) = @_; + + return $self->get_cache_file_response(type => 'jobs') + if (defined($self->{cache_use})); + + my $lookup_time = $options{completed_job_lookup_time}; + if (defined($self->{cache_create})) { + my $update_time = $self->get_cache_file_update(type => 'jobs'); + $lookup_time = 3600; + if (defined($update_time)) { + $lookup_time = time() - $update_time; + } + } + + my $response = $self->request_internal( + endpoint => $options{endpoint}, + get_param => ['completedJobLookupTime=' . $lookup_time] + ); + + $self->create_cache_file(type => 'jobs', response => $response) + if (defined($self->{cache_create})); + + return $response; } sub request_paging { my ($self, %options) = @_; + return $self->get_cache_file_response(type => $options{type}) + if (defined($self->{cache_use})); + my ($page_num, $page_count) = (1, 200); my $alerts = []; while (1) { @@ -283,6 +364,9 @@ sub request_paging { $page_num++; } + $self->create_cache_file(type => $options{type}, response => $alerts) + if (defined($self->{cache_create})); + return $alerts; } @@ -330,6 +414,14 @@ Set API password Set HTTP timeout +=item B<--cache-create> + +Create a cache file and quit. + +=item B<--cache-use> + +Use the cache file (created with --cache-create). + =back =head1 DESCRIPTION diff --git a/apps/backup/commvault/commserve/restapi/mode/alerts.pm b/apps/backup/commvault/commserve/restapi/mode/alerts.pm index 6998657fb..64c39c6eb 100644 --- a/apps/backup/commvault/commserve/restapi/mode/alerts.pm +++ b/apps/backup/commvault/commserve/restapi/mode/alerts.pm @@ -138,6 +138,7 @@ sub manage_selection { my ($self, %options) = @_; my $alarms = $options{custom}->request_paging( + type => 'alert', endpoint => '/Alert' ); diff --git a/apps/backup/commvault/commserve/restapi/mode/jobs.pm b/apps/backup/commvault/commserve/restapi/mode/jobs.pm index bed40fa53..5a521d3a6 100644 --- a/apps/backup/commvault/commserve/restapi/mode/jobs.pm +++ b/apps/backup/commvault/commserve/restapi/mode/jobs.pm @@ -159,8 +159,9 @@ sub manage_selection { } # Also we get Pending/Waiting/Running jobs with that - my $results = $options{custom}->request( - endpoint => '/Job?completedJobLookupTime=' . $lookup_time + my $results = $options{custom}->request_jobs( + endpoint => '/Job', + completed_job_lookup_time => $lookup_time ); $self->{global} = { total => 0 }; @@ -214,6 +215,9 @@ sub manage_selection { $self->{policy}->{$policy_name} = { job => {}, display => $policy_name } if (!defined($self->{policy}->{$policy_name})); my $elapsed_time = $current_time - $job->{jobStartTime}; + if ($options{custom}->is_use_cache()) { + $elapsed_time = $job->{jobElapsedTime}; + } $self->{policy}->{$policy_name}->{job}->{ $job->{jobId} } = { display => $job->{jobId}, elapsed => $elapsed_time, diff --git a/apps/backup/commvault/commserve/restapi/mode/listmediaagents.pm b/apps/backup/commvault/commserve/restapi/mode/listmediaagents.pm index 5d71d7f8c..652ab33fb 100644 --- a/apps/backup/commvault/commserve/restapi/mode/listmediaagents.pm +++ b/apps/backup/commvault/commserve/restapi/mode/listmediaagents.pm @@ -46,6 +46,7 @@ sub manage_selection { my ($self, %options) = @_; my $agents = $options{custom}->request( + type => 'mediaagent', endpoint => '/v2/MediaAgents' ); diff --git a/apps/backup/commvault/commserve/restapi/mode/liststoragepolicies.pm b/apps/backup/commvault/commserve/restapi/mode/liststoragepolicies.pm index 9e9da28e7..c74f8aa89 100644 --- a/apps/backup/commvault/commserve/restapi/mode/liststoragepolicies.pm +++ b/apps/backup/commvault/commserve/restapi/mode/liststoragepolicies.pm @@ -46,6 +46,7 @@ sub manage_selection { my ($self, %options) = @_; my $policies = $options{custom}->request( + type => 'storagepolicy', endpoint => '/V2/StoragePolicy' ); diff --git a/apps/backup/commvault/commserve/restapi/mode/mediaagents.pm b/apps/backup/commvault/commserve/restapi/mode/mediaagents.pm index 38dae65e1..89bc5c2d0 100644 --- a/apps/backup/commvault/commserve/restapi/mode/mediaagents.pm +++ b/apps/backup/commvault/commserve/restapi/mode/mediaagents.pm @@ -105,6 +105,7 @@ sub manage_selection { my ($self, %options) = @_; my $results = $options{custom}->request( + type => 'mediaagent', endpoint => '/v2/MediaAgents' ); diff --git a/apps/backup/commvault/commserve/restapi/mode/storagepools.pm b/apps/backup/commvault/commserve/restapi/mode/storagepools.pm index f3355ad3f..0f14e0bdf 100644 --- a/apps/backup/commvault/commserve/restapi/mode/storagepools.pm +++ b/apps/backup/commvault/commserve/restapi/mode/storagepools.pm @@ -115,6 +115,7 @@ sub manage_selection { my ($self, %options) = @_; my $results = $options{custom}->request( + type => 'storagepool', endpoint => '/StoragePool' );