From f97a820b4830862f1c170ba66c161df8fc4a20a6 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Wed, 4 Aug 2021 20:41:54 -0400 Subject: [PATCH 01/13] feat(tools): add script to take screenshot of server VM --- tools/anvil-get-server-screenshot | 88 +++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100755 tools/anvil-get-server-screenshot diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot new file mode 100755 index 00000000..d7f5e1e9 --- /dev/null +++ b/tools/anvil-get-server-screenshot @@ -0,0 +1,88 @@ +#!/usr/bin/perl +# +# +# + +use strict; +use warnings; +use Anvil::Tools; + +$| = 1; + +my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0]; +my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0]; +if (($running_directory =~ /^\./) && ($ENV{PWD})) +{ + $running_directory =~ s/^\./$ENV{PWD}/; +} + +my $anvil = Anvil::Tools->new(); + +$anvil->Get->switches; + +$anvil->Database->connect; +$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure => 0, key => "log_0132"}); +if (not $anvil->data->{sys}{database}{connections}) +{ + # No databases, exit. + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0003"}); + $anvil->nice_exit({exit_code => 1}); +} + +sub system_call +{ + my $parameters = shift; + my $shell_call = $parameters->{shell_call}; + + my ($shell_output, $shell_return_code) = $anvil->System->call({ shell_call => $shell_call }); + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { + shell_call => $shell_call, + shell_output => $shell_output, + shell_return_code => $shell_return_code + } }); + + return ($shell_output, $shell_return_code); +} + +sub get_server_screenshot +{ + my $parameters = shift; + my $server_uuid = $parameters->{server_uuid}; + + my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//' | base64"; + my ($shell_output, $shell_return_code) = system_call({ shell_call => $shell_call }); + + return $shell_return_code == 0 ? $shell_output : undef; +} + +sub insert_server_screenshot +{ + my $parameters = shift; + my $server_uuid = $parameters->{server_uuid}; + my $encoded_image = $parameters->{encoded_image}; + + $anvil->Database->insert_or_update_variables({ + variable_name => "server_screenshot::".$server_uuid, + variable_value => $encoded_image + }); +} + +my $server_uuid = $anvil->data->{switches}{'server-uuid'}; +my $is_stdout = $anvil->data->{switches}{'stdout'}; + +if ($server_uuid) +{ + my $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); + + if ($is_stdout) + { + print($encoded_image); + } + else + { + insert_server_screenshot({ + server_uuid => $server_uuid, + encoded_image => $encoded_image + }); + } +} From 1014299d38c9c8b4492d051721ca558a2804d702 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Thu, 5 Aug 2021 18:46:42 -0400 Subject: [PATCH 02/13] fix(tools): enable anvil-get-server-screenshot to be a job --- share/words.xml | 4 ++ tools/anvil-get-server-screenshot | 99 +++++++++++++++++++++++++------ 2 files changed, 84 insertions(+), 19 deletions(-) diff --git a/share/words.xml b/share/words.xml index 5e521616..3e2f71ff 100644 --- a/share/words.xml +++ b/share/words.xml @@ -2256,6 +2256,10 @@ Are you sure that you want to delete the server: [#!variable!server_name!#]? [Ty Finished [#!variable!operation!#] VNC pipe for server UUID [#!variable!server_uuid!#] from host UUID [#!variable!host_uuid!#]. Finished dropping VNC pipes table. Finished managing VNC pipes; no operations happened because requirements not met. + Preparing to get server VM screenshot. + Finished getting server VM screenshot. + Failed to get server VM screenshot; got non-zero return code. + Finished attempting to get server VM screenshot; no operations happened because requirements not met. Saved the mail server information successfully! diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index d7f5e1e9..587edfe2 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -18,17 +18,6 @@ if (($running_directory =~ /^\./) && ($ENV{PWD})) my $anvil = Anvil::Tools->new(); -$anvil->Get->switches; - -$anvil->Database->connect; -$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure => 0, key => "log_0132"}); -if (not $anvil->data->{sys}{database}{connections}) -{ - # No databases, exit. - $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0003"}); - $anvil->nice_exit({exit_code => 1}); -} - sub system_call { my $parameters = shift; @@ -67,22 +56,94 @@ sub insert_server_screenshot }); } -my $server_uuid = $anvil->data->{switches}{'server-uuid'}; -my $is_stdout = $anvil->data->{switches}{'stdout'}; +$anvil->Get->switches; + +$anvil->Database->connect; +$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure => 0, key => "log_0132"}); +if (not $anvil->data->{sys}{database}{connections}) +{ + # No databases, exit. + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0003"}); + $anvil->nice_exit({exit_code => 1}); +} + +# Try to get a job UUID if not given. +if (not $anvil->data->{switches}{'job-uuid'}) +{ + $anvil->data->{switches}{'job-uuid'} = $anvil->Job->get_job_uuid({ program => $THIS_FILE }); + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { + "switches::job-uuid" => $anvil->data->{switches}{'job-uuid'} + } }); +} + +# Handle this script as a job when job UUID is provided. +if ($anvil->data->{switches}{'job-uuid'}) +{ + $anvil->Job->clear(); + $anvil->Job->get_job_details(); + $anvil->Job->update_progress({ + progress => 1, + job_picked_up_by => $$, + job_picked_up_at => time, + message => "message_0263" + }); + + foreach my $line (split/\n/, $anvil->data->{jobs}{job_data}) + { + if ($line =~ /server-uuid=(.*?)$/) + { + $anvil->data->{switches}{'server-uuid'} = $1; + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { + 'switches::server-uuid' => $anvil->data->{switches}{'server-uuid'} + } }); + } + + if ($line =~ /stdout=(.*?)$/) + { + $anvil->data->{switches}{'stdout'} = $1; + $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { + 'switches::stdout' => $anvil->data->{switches}{'stdout'} + } }); + } + } +} + +my $server_uuid = $anvil->data->{switches}{'server-uuid'}; +my $is_stdout = $anvil->data->{switches}{'stdout'}; +my $job_uuid = $anvil->data->{switches}{'job-uuid'}; + +$anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { + server_uuid => $server_uuid, + is_stdout => $is_stdout, + job_uuid => $job_uuid +} }); if ($server_uuid) { my $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); - if ($is_stdout) + if (defined $encoded_image) { - print($encoded_image); + if ($is_stdout) + { + print($encoded_image); + } + else + { + insert_server_screenshot({ + server_uuid => $server_uuid, + encoded_image => $encoded_image + }); + } + + $anvil->Job->update_progress({ progress => 100, message => "message_0264" }); } else { - insert_server_screenshot({ - server_uuid => $server_uuid, - encoded_image => $encoded_image - }); + $anvil->Job->update_progress({ progress => 100, message => "message_0265" }); } } +else +{ + $anvil->Job->update_progress({ progress => 100, message => "message_0266" }); +} From d195a53ba2204afbdcd035c1f5b57abb7546fbd7 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Thu, 5 Aug 2021 21:35:30 -0400 Subject: [PATCH 03/13] feat(cgi-bin): add endpoint for fetching server screenshot --- Anvil/Tools.pm | 1 + cgi-bin/get_server_screenshot | 124 ++++++++++++++++++++++++++++++++++ share/words.xml | 2 + 3 files changed, 127 insertions(+) create mode 100755 cgi-bin/get_server_screenshot diff --git a/Anvil/Tools.pm b/Anvil/Tools.pm index 168fccb6..f358106e 100644 --- a/Anvil/Tools.pm +++ b/Anvil/Tools.pm @@ -1106,6 +1106,7 @@ sub _set_paths 'anvil-delete-server' => "/usr/sbin/anvil-delete-server", 'anvil-download-file' => "/usr/sbin/anvil-download-file", 'anvil-file-details' => "/usr/sbin/anvil-file-details", + 'anvil-get-server-screenshot' => "/usr/sbin/anvil-get-server-screenshot", 'anvil-join-anvil' => "/usr/sbin/anvil-join-anvil", 'anvil-maintenance-mode' => "/usr/sbin/anvil-maintenance-mode", 'anvil-manage-firewall' => "/usr/sbin/anvil-manage-firewall", diff --git a/cgi-bin/get_server_screenshot b/cgi-bin/get_server_screenshot new file mode 100755 index 00000000..8e212267 --- /dev/null +++ b/cgi-bin/get_server_screenshot @@ -0,0 +1,124 @@ +#!/usr/bin/perl +# +# Gets a server VM's screenshot and convert it to a Base64 string. +# + +use strict; +use warnings; +use Anvil::Tools; +use JSON; + +$| = 1; + +my $THIS_FILE = ($0 =~ /^.*\/(.*)$/)[0]; +my $running_directory = ($0 =~ /^(.*?)\/$THIS_FILE$/)[0]; +if (($running_directory =~ /^\./) && ($ENV{PWD})) +{ + $running_directory =~ s/^\./$ENV{PWD}/; +} + +my $anvil = Anvil::Tools->new(); + +sub is_job_incomplete +{ + my $parameters = shift; + my $job_uuid = $parameters->{job_uuid}; + + my $query = " +SELECT + job_progress +FROM + public.jobs +WHERE + job_uuid = ".$anvil->Database->quote($job_uuid)." +;"; + + my $job_progress = $anvil->Database->query({ query => $query, source => $THIS_FILE, line => __LINE__ })->[0]->[0]; + + return $job_progress == 100 ? 0 : 1; +} + +sub get_server_host_uuid +{ + my $parameters = shift; + my $server_uuid = $parameters->{server_uuid}; + + my $query = " +SELECT + server_host_uuid +FROM + public.servers +WHERE + server_uuid = ".$anvil->Database->quote($server_uuid)." +;"; + + return $anvil->Database->query({ query => $query, source => $THIS_FILE, line => __LINE__ })->[0]->[0]; +} + +sub get_screenshot +{ + my $parameters = shift; + my $server_uuid = $parameters->{server_uuid}; + my $server_host_uuid = $parameters->{server_host_uuid}; + + my ($job_uuid) = $anvil->Database->insert_or_update_jobs({ + job_command => $anvil->data->{path}{exe}{'anvil-get-server-screenshot'}, + job_data => "server-uuid=".$server_uuid, + job_host_uuid => $server_host_uuid, + job_description => "job_0357", + job_name => "cgi-bin::get_server_screenshot::".$server_uuid, + job_progress => 0, + job_title => "job_0356" + }); + + # Wait until the job is complete before continuing. + while(is_job_incomplete({ job_uuid => $job_uuid })) + { + sleep(2); + } + + my ($encoded_image) = $anvil->Database->read_variable({ variable_name => "server_screenshot::".$server_uuid }); + + return $encoded_image; +} + +$anvil->Get->switches; + +$anvil->Database->connect; +$anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 2, secure => 0, key => "log_0132"}); +if (not $anvil->data->{sys}{database}{connections}) +{ + # No databases, exit. + $anvil->Log->entry({source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0003"}); + $anvil->nice_exit({exit_code => 1}); +} + +my $cookie_problem = $anvil->Account->read_cookies(); + +# Don't do anything data-related if the user is not logged in. +if ($cookie_problem) +{ + $anvil->Log->entry({ source => $THIS_FILE, line => __LINE__, level => 0, 'print' => 1, priority => "err", key => "error_0307" }); + $anvil->nice_exit({ exit_code => 1 }); +} + +# Read in any CGI variables, if needed. +$anvil->Get->cgi(); + +print $anvil->Template->get({ file => "shared.html", name => "json_headers", show_name => 0 })."\n"; + +my $server_uuid = defined $anvil->data->{cgi}{server_uuid}{value} ? $anvil->data->{cgi}{server_uuid}{value} : $anvil->data->{switches}{'server-uuid'}; + +my $response_body = {}; + +if ($server_uuid) +{ + my $encoded_image = get_screenshot({ server_uuid => $server_uuid, server_host_uuid => get_server_host_uuid({ server_uuid => $server_uuid }) }); + + if (defined $encoded_image) + { + $response_body->{image} = $encoded_image; + } +} + +print JSON->new->utf8->encode($response_body)."\n"; diff --git a/share/words.xml b/share/words.xml index 3e2f71ff..368f2463 100644 --- a/share/words.xml +++ b/share/words.xml @@ -1148,6 +1148,8 @@ It should be provisioned in the next minute or two. * Please enter the name of the server you want to manage -=] Servers available to manage on the Anvil! [#!variable!anvil_name!#] [=- -=] Managing the server: [#!variable!server_name!#] on the Anvil!: [#!variable!anvil_name!#] + Get Server VM Screenshot + Fetch a screenshot of the specified server VM and represent it as a Base64 string. Starting: [#!variable!program!#]. From 4ef231b5671aa48941a518312cde694553e20233 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 6 Aug 2021 14:56:26 -0400 Subject: [PATCH 04/13] fix(tools): prevent too frequent inserts of server VM screenshots --- tools/anvil-get-server-screenshot | 44 ++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 9 deletions(-) diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index 587edfe2..f673a895 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -33,6 +33,18 @@ sub system_call return ($shell_output, $shell_return_code); } +sub is_existing_server_screenshot_outdated +{ + my $parameters = shift; + my $server_uuid = $parameters->{server_uuid}; + + my ($encoded_image, $variable_uuid, $variable_mtime) = $anvil->Database->read_variable({ variable_name => "server_screenshot::".$server_uuid }); + + my $time_difference = time - $variable_mtime; + + return $time_difference > 120 ? 1 : 0; +} + sub get_server_screenshot { my $parameters = shift; @@ -120,27 +132,41 @@ $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, lis if ($server_uuid) { - my $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); + my $encoded_image; - if (defined $encoded_image) + if ($is_stdout) { - if ($is_stdout) + $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); + + if (defined $encoded_image) { print($encoded_image); + + $anvil->Job->update_progress({ progress => 100, message => "message_0264" }); } else { - insert_server_screenshot({ - server_uuid => $server_uuid, - encoded_image => $encoded_image - }); + $anvil->Job->update_progress({ progress => 100, message => "message_0265" }); } + } + elsif (is_existing_server_screenshot_outdated({ server_uuid => $server_uuid })) + { + $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); - $anvil->Job->update_progress({ progress => 100, message => "message_0264" }); + if (defined $encoded_image) + { + insert_server_screenshot({ server_uuid => $server_uuid, encoded_image => $encoded_image }); + + $anvil->Job->update_progress({ progress => 100, message => "message_0264" }); + } + else + { + $anvil->Job->update_progress({ progress => 100, message => "message_0265" }); + } } else { - $anvil->Job->update_progress({ progress => 100, message => "message_0265" }); + $anvil->Job->update_progress({ progress => 100, message => "message_0266" }); } } else From da6b4d39c6a86e090ff8efec2b882ad2101effeb Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 6 Aug 2021 15:17:45 -0400 Subject: [PATCH 05/13] fix(tools): disable line wrap in image Base64 output --- tools/anvil-get-server-screenshot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index f673a895..5ca019f1 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -50,7 +50,7 @@ sub get_server_screenshot my $parameters = shift; my $server_uuid = $parameters->{server_uuid}; - my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//' | base64"; + my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//' | base64 --wrap 0"; my ($shell_output, $shell_return_code) = system_call({ shell_call => $shell_call }); return $shell_return_code == 0 ? $shell_output : undef; From 26d5c60696dd8c240e058c9eacea06852a73cd0b Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 6 Aug 2021 15:36:15 -0400 Subject: [PATCH 06/13] fix(cgi-bin): rename response body screenshot property --- cgi-bin/get_server_screenshot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cgi-bin/get_server_screenshot b/cgi-bin/get_server_screenshot index 8e212267..976c0984 100755 --- a/cgi-bin/get_server_screenshot +++ b/cgi-bin/get_server_screenshot @@ -117,7 +117,7 @@ if ($server_uuid) if (defined $encoded_image) { - $response_body->{image} = $encoded_image; + $response_body->{screenshot} = $encoded_image; } } From 256051a6cab239029d9ae9d60888406c36836f20 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 6 Aug 2021 15:37:18 -0400 Subject: [PATCH 07/13] build(cgi-bin): add get_server_screenshot endpoint to build --- cgi-bin/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/cgi-bin/Makefile.am b/cgi-bin/Makefile.am index 5343314e..92fc1a55 100644 --- a/cgi-bin/Makefile.am +++ b/cgi-bin/Makefile.am @@ -7,6 +7,7 @@ dist_cgibin_SCRIPTS = \ get_memory \ get_networks \ get_replicated_storage \ + get_server_screenshot \ get_servers \ get_shared_storage \ get_status \ From 74670360543dab12bee40cb280464e3e1e3616ad Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 6 Aug 2021 15:38:20 -0400 Subject: [PATCH 08/13] build(tools): add anvil-get-server-screenshot script to build --- tools/Makefile.am | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/Makefile.am b/tools/Makefile.am index f23aa192..d2b6c074 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -14,6 +14,7 @@ dist_sbin_SCRIPTS = \ anvil-delete-server \ anvil-download-file \ anvil-file-details \ + anvil-get-server-screenshot \ anvil-join-anvil \ anvil-maintenance-mode \ anvil-manage-files \ From 65613f501b20049e39dd75b3fb81b6a571fecd7a Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Thu, 12 Aug 2021 14:31:12 -0400 Subject: [PATCH 09/13] fix(tools): add option to resize server screenshot --- cgi-bin/get_server_screenshot | 10 ++++++++-- tools/anvil-get-server-screenshot | 28 +++++++++++++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/cgi-bin/get_server_screenshot b/cgi-bin/get_server_screenshot index 976c0984..7a1e071d 100755 --- a/cgi-bin/get_server_screenshot +++ b/cgi-bin/get_server_screenshot @@ -60,10 +60,11 @@ sub get_screenshot my $parameters = shift; my $server_uuid = $parameters->{server_uuid}; my $server_host_uuid = $parameters->{server_host_uuid}; + my $resize_args = defined $parameters->{resize_args} ? $parameters->{resize_args} : "512x512"; my ($job_uuid) = $anvil->Database->insert_or_update_jobs({ job_command => $anvil->data->{path}{exe}{'anvil-get-server-screenshot'}, - job_data => "server-uuid=".$server_uuid, + job_data => "server-uuid=".$server_uuid."\nresize=".$resize_args, job_host_uuid => $server_host_uuid, job_description => "job_0357", job_name => "cgi-bin::get_server_screenshot::".$server_uuid, @@ -108,12 +109,17 @@ $anvil->Get->cgi(); print $anvil->Template->get({ file => "shared.html", name => "json_headers", show_name => 0 })."\n"; my $server_uuid = defined $anvil->data->{cgi}{server_uuid}{value} ? $anvil->data->{cgi}{server_uuid}{value} : $anvil->data->{switches}{'server-uuid'}; +my $resize_args = defined $anvil->data->{cgi}{resize}{value} ? $anvil->data->{cgi}{resize}{value} : $anvil->data->{switches}{'resize'}; my $response_body = {}; if ($server_uuid) { - my $encoded_image = get_screenshot({ server_uuid => $server_uuid, server_host_uuid => get_server_host_uuid({ server_uuid => $server_uuid }) }); + my $encoded_image = get_screenshot({ + server_uuid => $server_uuid, + server_host_uuid => get_server_host_uuid({ server_uuid => $server_uuid }), + resize_args => $resize_args + }); if (defined $encoded_image) { diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index 5ca019f1..16442d89 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -49,8 +49,17 @@ sub get_server_screenshot { my $parameters = shift; my $server_uuid = $parameters->{server_uuid}; + my $resize_args = $parameters->{resize_args}; + + my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//'"; + + if (defined $resize_args) + { + $shell_call .= " | convert - -resize ".$resize_args." png:-"; + } + + $shell_call .= " | base64 --wrap 0"; - my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//' | base64 --wrap 0"; my ($shell_output, $shell_return_code) = system_call({ shell_call => $shell_call }); return $shell_return_code == 0 ? $shell_output : undef; @@ -105,27 +114,28 @@ if ($anvil->data->{switches}{'job-uuid'}) if ($line =~ /server-uuid=(.*?)$/) { $anvil->data->{switches}{'server-uuid'} = $1; - $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { - 'switches::server-uuid' => $anvil->data->{switches}{'server-uuid'} - } }); + } + + if ($line =~ /resize=(.*?)$/) + { + $anvil->data->{switches}{'resize'} = $1; } if ($line =~ /stdout=(.*?)$/) { $anvil->data->{switches}{'stdout'} = $1; - $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { - 'switches::stdout' => $anvil->data->{switches}{'stdout'} - } }); } } } my $server_uuid = $anvil->data->{switches}{'server-uuid'}; +my $resize_args = $anvil->data->{switches}{'resize'}; my $is_stdout = $anvil->data->{switches}{'stdout'}; my $job_uuid = $anvil->data->{switches}{'job-uuid'}; $anvil->Log->variables({ source => $THIS_FILE, line => __LINE__, level => 2, list => { server_uuid => $server_uuid, + resize_args => $resize_args, is_stdout => $is_stdout, job_uuid => $job_uuid } }); @@ -136,7 +146,7 @@ if ($server_uuid) if ($is_stdout) { - $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); + $encoded_image = get_server_screenshot({ server_uuid => $server_uuid, resize_args => $resize_args }); if (defined $encoded_image) { @@ -151,7 +161,7 @@ if ($server_uuid) } elsif (is_existing_server_screenshot_outdated({ server_uuid => $server_uuid })) { - $encoded_image = get_server_screenshot({ server_uuid => $server_uuid }); + $encoded_image = get_server_screenshot({ server_uuid => $server_uuid, resize_args => $resize_args }); if (defined $encoded_image) { From c1859bc8d8b9828484e6c149d9c3023794fbe2b6 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Thu, 2 Sep 2021 14:07:01 -0400 Subject: [PATCH 10/13] fix(tools): use netpbm tools instead of imagemagick --- tools/anvil-get-server-screenshot | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index 16442d89..e64ef3cb 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -49,13 +49,14 @@ sub get_server_screenshot { my $parameters = shift; my $server_uuid = $parameters->{server_uuid}; - my $resize_args = $parameters->{resize_args}; + my ($resize_x, $resize_y) = split(/x/ , $parameters->{resize_args}); my $shell_call = "virsh screenshot --domain ".$server_uuid." --file /dev/stdout | sed 's/Screenshot.*//'"; - if (defined $resize_args) + if ($resize_x =~ /^\d+$/ && $resize_y =~ /^\d+$/) { - $shell_call .= " | convert - -resize ".$resize_args." png:-"; + $shell_call .= " | pamscale -quiet -xyfit ".$resize_x." ".$resize_y; + $shell_call .= " | pamtopng -quiet"; } $shell_call .= " | base64 --wrap 0"; From f61527edf74653a2980e614bcb1df958b6e91482 Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Thu, 2 Sep 2021 17:08:36 -0400 Subject: [PATCH 11/13] fix(tools): save screenshots to states table --- cgi-bin/get_server_screenshot | 8 +++++++- tools/anvil-get-server-screenshot | 6 +++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/cgi-bin/get_server_screenshot b/cgi-bin/get_server_screenshot index 7a1e071d..184de9ec 100755 --- a/cgi-bin/get_server_screenshot +++ b/cgi-bin/get_server_screenshot @@ -78,7 +78,13 @@ sub get_screenshot sleep(2); } - my ($encoded_image) = $anvil->Database->read_variable({ variable_name => "server_screenshot::".$server_uuid }); + my $query = " +SELECT state_note +FROM public.states +WHERE state_name = ".$anvil->Database->quote("server_screenshot::".$server_uuid)." +;"; + + my $encoded_image = $anvil->Database->query({ query => $query, source => $THIS_FILE, line => __LINE__ })->[0]->[0]; return $encoded_image; } diff --git a/tools/anvil-get-server-screenshot b/tools/anvil-get-server-screenshot index e64ef3cb..57579c4e 100755 --- a/tools/anvil-get-server-screenshot +++ b/tools/anvil-get-server-screenshot @@ -72,9 +72,9 @@ sub insert_server_screenshot my $server_uuid = $parameters->{server_uuid}; my $encoded_image = $parameters->{encoded_image}; - $anvil->Database->insert_or_update_variables({ - variable_name => "server_screenshot::".$server_uuid, - variable_value => $encoded_image + $anvil->Database->insert_or_update_states({ + state_name => "server_screenshot::".$server_uuid, + state_note => $encoded_image }); } From 089675d4d85e1c41d1a2b15ad92557052d7f54bb Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 3 Sep 2021 16:11:08 -0400 Subject: [PATCH 12/13] build: re-order python3-websockify in anvil specfile --- anvil.spec.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/anvil.spec.in b/anvil.spec.in index a7804d62..3cde0a0a 100644 --- a/anvil.spec.in +++ b/anvil.spec.in @@ -159,11 +159,11 @@ Requires: libvirt-daemon-kvm Requires: libvirt-docs Requires: pacemaker Requires: pcs +Requires: python3-websockify Requires: qemu-kvm Requires: qemu-kvm-core Requires: virt-install Requires: virt-top -Requires: python3-websockify # A node is allowed to host servers and be a live migration target. It is not # allowed to host a database or be a DR host. Conflicts: anvil-striker @@ -188,11 +188,11 @@ Requires: libvirt-daemon Requires: libvirt-daemon-driver-qemu Requires: libvirt-daemon-kvm Requires: libvirt-docs +Requires: python3-websockify Requires: qemu-kvm Requires: qemu-kvm-core Requires: virt-install Requires: virt-top -Requires: python3-websockify # A DR host is not allowed to be a live-migration target or host a database. Conflicts: anvil-striker Conflicts: anvil-node From 59ce16f531c9dd16dcf4bb02a769bd88796371ea Mon Sep 17 00:00:00 2001 From: Tsu-ba-me Date: Fri, 3 Sep 2021 16:13:08 -0400 Subject: [PATCH 13/13] build: add netpbm-progs as node and DR dependency --- anvil.spec.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/anvil.spec.in b/anvil.spec.in index 3cde0a0a..d1952b3b 100644 --- a/anvil.spec.in +++ b/anvil.spec.in @@ -157,6 +157,7 @@ Requires: libvirt-daemon Requires: libvirt-daemon-driver-qemu Requires: libvirt-daemon-kvm Requires: libvirt-docs +Requires: netpbm-progs Requires: pacemaker Requires: pcs Requires: python3-websockify @@ -188,6 +189,7 @@ Requires: libvirt-daemon Requires: libvirt-daemon-driver-qemu Requires: libvirt-daemon-kvm Requires: libvirt-docs +Requires: netpbm-progs Requires: python3-websockify Requires: qemu-kvm Requires: qemu-kvm-core