diff --git a/Anvil/Tools.pm b/Anvil/Tools.pm index 08544dca..2afd49c1 100644 --- a/Anvil/Tools.pm +++ b/Anvil/Tools.pm @@ -1278,6 +1278,7 @@ sub _set_paths ps => "/usr/bin/ps", psql => "/usr/bin/psql", pamtopng => "/usr/bin/pamtopng", + pngtopam => "/usr/bin/pngtopam", pnmtojpeg => "/usr/bin/pnmtojpeg", 'postgresql-setup' => "/usr/bin/postgresql-setup", postmap => "/usr/sbin/postmap", diff --git a/ocf/alteeve/server b/ocf/alteeve/server index a1a89ad3..d8abcd1b 100755 --- a/ocf/alteeve/server +++ b/ocf/alteeve/server @@ -1239,50 +1239,14 @@ sub server_status $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, priority => "alert", key => "log_0331", variables => { timeout => $anvil->data->{environment}{OCF_RESKEY_CRM_meta_timeout} }}); } - # Is 'libvirtd' running? We'll wait up to half the timeout for it to start (in case it _just_ started) - # before timing out. - my $wait_until = time + ($anvil->data->{environment}{OCF_RESKEY_CRM_meta_timeout} / 2000); # Devide by 2000 to convert to seconds and total second halved. - my $look_for_pid = 0; - my $libvirtd_wait = 1; - my $warning_shown = 0; - while($libvirtd_wait) + # libvirtd lists as disabled / stopped, but "starts" when called. So checking the daemon doesn't make + # sense. Given virsh might fail, if we don't find the server, we'll also look for it in 'ps'. + my $loop = 1; + while($loop) { - my $running = $anvil->System->check_daemon({daemon => "libvirtd.service"}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { running => $running }}); - if ($running) - { - $libvirtd_wait = 0; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { libvirtd_wait => $libvirtd_wait }}); - } - else - { - # On EL8 and above, libvirtd starts on demand, so this error isn't - if (not $warning_shown) - { - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, key => "log_0522", variables => { wait_time => ($wait_until - time) }}); - $warning_shown = 1; - } - sleep 1; - if (time > $wait_until) - { - # Libvirtd isn't running, try to find the PID of the server (in case it's - # running and libvirtd isn't) - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, priority => "alert", key => "warning_0057"}); - $look_for_pid = 1; - $libvirtd_wait = 0; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - look_for_pid => $look_for_pid, - libvirtd_wait => $libvirtd_wait, - }}); - } - } - } - - # If libvirtd wasn't running, we'll manually look for a PID. - if ($look_for_pid) - { - my $server_up = 0; - my $shell_call = $anvil->data->{path}{exe}{ps}." aux"; + $loop = 0; + my $found = 0; + my $shell_call = $anvil->data->{path}{exe}{setsid}." --wait ".$anvil->data->{path}{exe}{virsh}." list --all"; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); @@ -1290,59 +1254,8 @@ sub server_status output => $output, return_code => $return_code, }}); - foreach my $line (split/\n/, $output) - { - next if $line !~ /qemu-kvm/; - - $line = $anvil->Words->clean_spaces({ string => $line }); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); - - if ($line =~ /guest=(.*?),/) - { - my $this_server = $1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { this_server => $this_server }}); - - if ($this_server eq $server) - { - # Found it. - $server_up = 1; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_up => $server_up }}); - last; - } - } - } - - if ($server_up) - { - # The server is running. Exit with OCF_SUCCESS (rc 0); - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0523"}); - $anvil->nice_exit({exit_code => 0}); - } - else - { - # The server is not running. Exit with OCF_NOT_RUNNING (rc: 7) - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0524"}); - $anvil->nice_exit({exit_code => 7}); - } - } - else - { - # Parse the virsh state. If it's listed as 'crashed', return OCF_ERR_GENERIC (rc: 1). If it's - # 'in shutdown', 'loop' gets set to 1 and this will loop indefinitely. We don't put a timer - # on it, we let pacemaker handle that. - my $loop = 1; - while($loop) + if (not $return_code) { - $loop = 0; - my $found = 0; - my $shell_call = $anvil->data->{path}{exe}{setsid}." --wait ".$anvil->data->{path}{exe}{virsh}." list --all"; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); - - my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - output => $output, - return_code => $return_code, - }}); foreach my $line (split/\n/, $output) { $line = $anvil->Words->clean_spaces({ string => $line }); @@ -1351,7 +1264,7 @@ sub server_status if ($line =~ /\s\Q$server\E\s+(.*)/) { my $state = $1; - $found = 1; + $found = 1; $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { found => $found, 'state' => $state, @@ -1382,7 +1295,6 @@ pmsuspended - The domain has been suspended by guest power management, e.g. ente $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { loop => $loop }}); sleep 1; - last; } elsif ($state eq "shut off") { @@ -1401,11 +1313,53 @@ pmsuspended - The domain has been suspended by guest power management, e.g. ente } } } + } + + # If it wasn't found at all, exit. + if ((not $found) or ($return_code)) + { + # If we've timed out, we'll look for it using it's PID. + my $server_up = 0; + my $shell_call = $anvil->data->{path}{exe}{ps}." aux"; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); + + my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + output => $output, + return_code => $return_code, + }}); + foreach my $line (split/\n/, $output) + { + next if $line !~ /qemu-kvm/; + + $line = $anvil->Words->clean_spaces({ string => $line }); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { line => $line }}); + + if ($line =~ /guest=(.*?),/) + { + my $this_server = $1; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { this_server => $this_server }}); + + if ($this_server eq $server) + { + # Found it. + $server_up = 1; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { server_up => $server_up }}); + last; + } + } + } - # If it wasn't found at all, exit. - if (not $found) + # Did we find it by PID? + if ($server_up) + { + # The server is running. Exit with OCF_SUCCESS (rc 0); + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0523"}); + $anvil->nice_exit({exit_code => 0}); + } + else { - # Exit with OCF_NOT_RUNNING (rc: 7); + # The server is not running. Exit with OCF_NOT_RUNNING (rc: 7) $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 1, key => "log_0526", variables => { server_name => $server }}); $anvil->nice_exit({exit_code => 7}); } diff --git a/share/words.xml b/share/words.xml index 1f333fb5..1381b744 100644 --- a/share/words.xml +++ b/share/words.xml @@ -2377,10 +2377,10 @@ The file: [#!variable!file!#] needs to be updated. The difference is: The server: [#!variable!server!#] is indeed running. It will be shut down now. Checking the status of the server: [#!variable!server!#]. The 'libvirtd' daemon is not running. It may be starting up, will wait: [#!variable!wait_time!#] seconds... - Found the server to be running using it's PID. The state of the server can't be determined, however. Please start the 'libvirtd' daemon! + Found the server to be running using it's PID. The state of the server can't be determined, however. There appears to be a problem with 'virsh'! No PID for the server was found. It is not running on this host. The server: [#!variable!server_name!#] is shutting down. Will wait for it to finish... - The server: [#!variable!server_name!#] is off. + The server: [#!variable!server_name!#] is off (not found in virsh or by PID). The server: [#!variable!server_name!#] is running (state is: [#!variable!state!#]). We've been asked to migrating the server: [#!variable!server!#] to: [#!variable!target_host!#]. Checking server state after: [#!variable!server!#] was migrated to this host. @@ -2681,7 +2681,7 @@ The file: [#!variable!file!#] needs to be updated. The difference is: Connecting: [#!variable!host_name!#] via: [#!variable!target_ip!#] Getting a screenshot from: [#!variable!server_name!#] (uuid: [#!variable!server_uuid!#]) from the host: [#!variable!host_name!#]. - Saving the screenshot: [#!variable!ppm_file!#]. - - Converting: [#!variable!ppm_file!#] to: + - Converting: [#!variable!source_file!#] to: [#!variable!new_file!#] Deleting screenshots older than: [#!variable!maximum_age!#]. - Deleting the server: [#!variable!server_name!#]'s screenshot: [#!variable!file!#]. @@ -4187,6 +4187,7 @@ We will try to proceed anyway. [ Warning ] - The attempt to boot: [#!variable!host_name!#] appears to have failed. The return code received was: [#!variable!return_code!#] (expected '0'). The output, if any, was: [#!variable!output!#]. [ Warning ] - The daemon: [#!variable!daemon!#] appears to have failed! Attempting to restart it now. [ Warning ] - The line: [#!variable!line!#] that was going to be added to the hosts file is invalid, removing it. + [ Warning ] - Failed to convert: [#!variable!source_file!#] to: [#!variable!new_file!#] (format: [#!variable!format!#]! Return code was: [#!variable!return_code!#], expected '0'. diff --git a/tools/striker-get-screenshots b/tools/striker-get-screenshots index a8135f70..04d773b4 100755 --- a/tools/striker-get-screenshots +++ b/tools/striker-get-screenshots @@ -381,6 +381,8 @@ sub get_screenshots my $unix_time = time; my $file_name = "server-uuid_".$server_uuid."_timestamp-".$unix_time; my $ppm_file = $anvil->data->{path}{directories}{screenshots}."/".$file_name.".ppm"; + my $jpg_file = $anvil->data->{path}{directories}{screenshots}."/".$file_name.".jpg"; + my $png_file = $anvil->data->{path}{directories}{screenshots}."/".$file_name.".png"; my $mimetype = $domain->screenshot($stream, 0); my $screenshot = ""; my $screenshot_size = 0; @@ -393,26 +395,112 @@ sub get_screenshots unix_time => $unix_time, file_name => $file_name, ppm_file => $ppm_file, + jpg_file => $jpg_file, + png_file => $png_file, mimetype => $mimetype, screenshot_size => $screenshot_size." (".$anvil->Convert->bytes_to_human_readable({'bytes' => $screenshot_size}).")", }}); $stream->recv_all($handle_ss_chunk); - # Write out the screenshot. - $anvil->Storage->write_file({ - debug => 2, - file => $ppm_file, - body => $screenshot, - mode => "0666", - binary => 1, - }); - $anvil->Job->update_progress({ - progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, - message => "log_0806", - log_level => 2, - variables => { ppm_file => $ppm_file }, - }); + ### TODO: Delete this when EL8 support is dropped. + ### TODO: When generating PNG, convert directly to JPEG + # On EL8, the mimetype is 'image/x-portable-pixmap'. On EL9, this is 'image/png'. + if ($mimetype eq "image/png") + { + # Write this out to png, and convert it to pmm. + $anvil->Storage->write_file({ + debug => 2, + file => $png_file, + body => $screenshot, + mode => "0666", + binary => 1, + }); + + # Change the ownership + $anvil->Storage->change_owner({ + debug => 2, + path => $png_file, + user => "striker-ui-api", + group => "striker-ui-api", + }); + + # Convert to PPM + my $shell_call = $anvil->data->{path}{exe}{pngtopam}." ".$png_file." > ".$ppm_file; + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); + + my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { + output => $output, + return_code => $return_code, + }}); + + if ($return_code) + { + # Failed + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "warning_0173", + log_level => 1, + variables => { + source_file => $png_file, + new_file => $ppm_file, + 'format' => "ppm", + return_code => $return_code, + }, + }); + unlink $ppm_file; + } + else + { + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "log_0807", + log_level => 2, + variables => { + source_file => $png_file, + new_file => $ppm_file, + 'format' => "ppm", + }, + }); + + # Change the ownership + $anvil->Storage->change_owner({ + debug => 2, + path => $png_file, + user => "striker-ui-api", + group => "striker-ui-api", + }); + } + + } + else + { + # Write out ppm the screenshot. + $anvil->Storage->write_file({ + debug => 2, + file => $ppm_file, + body => $screenshot, + mode => "0666", + binary => 1, + }); + print "Wrote ppm: [".$ppm_file."]\n"; + + # Change the ownership + $anvil->Storage->change_owner({ + debug => 2, + path => $ppm_file, + user => "striker-ui-api", + group => "striker-ui-api", + }); + + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "log_0806", + log_level => 2, + variables => { ppm_file => $ppm_file }, + }); + } ### TODO: Make these user-configurable later. my $make_jpeg = 1; @@ -425,73 +513,110 @@ sub get_screenshots }}); # Convert to jpg - if ($make_jpeg) + if ((-e $ppm_file) && ($make_jpeg)) { - my $jpg_file = $anvil->data->{path}{directories}{screenshots}."/".$file_name.".jpg"; my $shell_call = $anvil->data->{path}{exe}{pnmtojpeg}." ".$ppm_file." > ".$jpg_file; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - shell_call => $shell_call, - jpg_file => $jpg_file, - }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code, }}); - $anvil->Job->update_progress({ - progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, - message => "log_0807", - log_level => 2, - variables => { - ppm_file => $ppm_file, - new_file => $jpg_file, - 'format' => "jpeg", - }, - }); - # Change the ownership - $anvil->Storage->change_owner({ - debug => 2, - path => $jpg_file, - user => "striker-ui-api", - group => "striker-ui-api", - }); + if ($return_code) + { + # Failed + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "warning_0173", + log_level => 1, + variables => { + source_file => $ppm_file, + new_file => $jpg_file, + 'format' => "jpeg", + return_code => $return_code, + }, + }); + unlink $jpg_file; + } + else + { + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "log_0807", + log_level => 2, + variables => { + source_file => $ppm_file, + new_file => $jpg_file, + 'format' => "jpeg", + }, + }); + + # Change the ownership + $anvil->Storage->change_owner({ + debug => 2, + path => $jpg_file, + user => "striker-ui-api", + group => "striker-ui-api", + }); + } } # Convert to png - if ($make_png) + if ((-e $ppm_file) && ($make_png) && (not -e $png_file)) { - my $png_file = $anvil->data->{path}{directories}{screenshots}."/".$file_name.".png"; my $shell_call = $anvil->data->{path}{exe}{pamtopng}." ".$ppm_file." > ".$png_file; - $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { - shell_call => $shell_call, - png_file => $png_file, - }}); + $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { shell_call => $shell_call }}); my ($output, $return_code) = $anvil->System->call({shell_call => $shell_call}); $anvil->Log->variables({source => $THIS_FILE, line => __LINE__, level => 2, list => { output => $output, return_code => $return_code, }}); - $anvil->Job->update_progress({ - progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, - message => "log_0807", - log_level => 2, - variables => { - ppm_file => $ppm_file, - new_file => $png_file, - 'format' => "png", - }, - }); - # Change the ownership - $anvil->Storage->change_owner({ - debug => 2, - path => $png_file, - user => "striker-ui-api", - group => "striker-ui-api", - }); + if ($return_code) + { + # Failed + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "warning_0173", + log_level => 1, + variables => { + source_file => $ppm_file, + new_file => $png_file, + 'format' => "png", + return_code => $return_code, + }, + }); + unlink $png_file; + } + else + { + $anvil->Job->update_progress({ + progress => $anvil->data->{job}{progress} < 99 ? ++$anvil->data->{job}{progress} : $anvil->data->{job}{progress}, + message => "log_0807", + log_level => 2, + variables => { + source_file => $ppm_file, + new_file => $png_file, + 'format' => "png", + }, + }); + + # Change the ownership + $anvil->Storage->change_owner({ + debug => 2, + path => $png_file, + user => "striker-ui-api", + group => "striker-ui-api", + }); + } + } + elsif ((not $make_png) && (-e $png_file)) + { + # Remove the source png file + unlink $png_file; } # Delete the original PPM file?