... instead of using sendmail directly

As of now, there is no way to configure a notification channel
for APT notifications. Thus, the implementation simply creates
an temporary channel with a sendmail endpoint sending mail
to root.

Signed-off-by: Lukas Wagner <l.wag...@proxmox.com>
---
 PVE/API2/APT.pm | 73 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 63 insertions(+), 10 deletions(-)

diff --git a/PVE/API2/APT.pm b/PVE/API2/APT.pm
index 6694dbeb..c1b7ece5 100644
--- a/PVE/API2/APT.pm
+++ b/PVE/API2/APT.pm
@@ -19,6 +19,7 @@ use PVE::DataCenterConfig;
 use PVE::SafeSyslog;
 use PVE::INotify;
 use PVE::Exception;
+use PVE::Notify;
 use PVE::RESTHandler;
 use PVE::RPCEnvironment;
 use PVE::API2Tools;
@@ -272,6 +273,12 @@ __PACKAGE__->register_method({
        return $pkglist;
     }});
 
+my $updates_available_subject_template = "New software packages available 
({{hostname}})";
+my $updates_available_body_template = <<EOT;
+The following updates are available:
+{{table updates}}
+EOT
+
 __PACKAGE__->register_method({
     name => 'update_database',
     path => 'update',
@@ -342,27 +349,71 @@ __PACKAGE__->register_method({
                my $mailto = $rootcfg->{email};
 
                if ($mailto) {
-                   my $hostname = `hostname -f` || PVE::INotify::nodename();
-                   chomp $hostname;
+                   # Add ephemeral sendmail endpoint/channel for backwards 
compatibility
+                   # TODO: Make notification channel configurable, then the
+                   # temporary endpoint/channel should not be necessary any 
more.
+                   my $notification_config = PVE::Notify::read_config();
                    my $mailfrom = $dcconf->{email_from} || "root";
-                   my $subject = "New software packages available ($hostname)";
+                   $notification_config->add_sendmail_endpoint(
+                       "anonymous-apt-sendmail",
+                       [$mailto],
+                       $mailfrom,
+                       ""
+                   );
+
+                   $notification_config->add_channel("mail", 
["anonymous-apt-sendmail"]);
+
+                   my $updates_table = {
+                       schema => {
+                           columns => [
+                               {
+                                   label => "Package",
+                                   id    => "package",
+                               },
+                               {
+                                   label => "Old Version",
+                                   id    => "old-version",
+                               },
+                               {
+                                   label => "New Version",
+                                   id    => "new-version",
+                               }
+                           ]
+                       },
+                       data => []
+                   };
 
-                   my $data = "The following updates are available:\n\n";
+                   my $hostname = `hostname -f` || PVE::INotify::nodename();
+                   chomp $hostname;
 
                    my $count = 0;
                    foreach my $p (sort {$a->{Package} cmp $b->{Package} } 
@$pkglist) {
                        next if $p->{NotifyStatus} && $p->{NotifyStatus} eq 
$p->{Version};
                        $count++;
-                       if ($p->{OldVersion}) {
-                           $data .= "$p->{Package}: $p->{OldVersion} ==> 
$p->{Version}\n";
-                       } else {
-                           $data .= "$p->{Package}: $p->{Version} (new)\n";
-                       }
+
+                       push @{$updates_table->{data}}, {
+                           "package"     => $p->{Package},
+                           "old-version" => $p->{OldVersion},
+                           "new-version" => $p->{Version}
+
+                       };
                    }
 
                    return if !$count;
 
-                   PVE::Tools::sendmail($mailto, $subject, $data, undef, 
$mailfrom, '');
+                   my $properties = {
+                       updates  => $updates_table,
+                       hostname => $hostname,
+                   };
+
+                   PVE::Notify::send_notification(
+                       "mail",
+                       "info",
+                       $updates_available_subject_template,
+                       $updates_available_body_template,
+                       $properties,
+                       $notification_config
+                   );
 
                    foreach my $pi (@$pkglist) {
                        $pi->{NotifyStatus} = $pi->{Version};
@@ -378,6 +429,8 @@ __PACKAGE__->register_method({
 
     }});
 
+
+
 __PACKAGE__->register_method({
     name => 'changelog',
     path => 'changelog',
-- 
2.30.2



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to