From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <o.bektas@proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits))
 (No client certificate requested)
 by lists.proxmox.com (Postfix) with ESMTPS id 220146A084
 for <pve-devel@lists.proxmox.com>; Thu, 29 Jul 2021 14:27:06 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
 by firstgate.proxmox.com (Proxmox) with ESMTP id 1FBD22F1CB
 for <pve-devel@lists.proxmox.com>; Thu, 29 Jul 2021 14:27:06 +0200 (CEST)
Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com
 [94.136.29.106])
 (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
 key-exchange X25519 server-signature RSA-PSS (2048 bits))
 (No client certificate requested)
 by firstgate.proxmox.com (Proxmox) with ESMTPS id 71E842F1C1
 for <pve-devel@lists.proxmox.com>; Thu, 29 Jul 2021 14:27:05 +0200 (CEST)
Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1])
 by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 4AC3C42C44
 for <pve-devel@lists.proxmox.com>; Thu, 29 Jul 2021 14:27:05 +0200 (CEST)
From: Oguz Bektas <o.bektas@proxmox.com>
To: pve-devel@lists.proxmox.com
Date: Thu, 29 Jul 2021 14:26:29 +0200
Message-Id: <20210729122629.833723-1-o.bektas@proxmox.com>
X-Mailer: git-send-email 2.30.2
MIME-Version: 1.0
Content-Transfer-Encoding: 8bit
X-SPAM-LEVEL: Spam detection results:  0
 AWL 1.347 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
Subject: [pve-devel] [PATCH v2 container] vmstatus: include detected IP
 address of running containers
X-BeenThere: pve-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
X-List-Received-Date: Thu, 29 Jul 2021 12:27:06 -0000

add a helper 'find_lxc_ip_address' to fetch IP address of container from
its network namespace using lxc-info.

for the moment it can be queried with the pct tool:
$ pct status 1000 --verbose
cpu: 0
cpus: 1
disk: 6422528
diskread: 368640
diskwrite: 0
ipaddress: 192.168.31.83        <----
maxdisk: 4294967296
maxmem: 536870912
maxswap: 536870912
mem: 864256
name: CT1000
netin: 3281265
netout: 15794
pid: 34897
status: running
swap: 94208
type: lxc
uptime: 11088
vmid: 1000

Signed-off-by: Oguz Bektas <o.bektas@proxmox.com>
---
v1->v2:
* add to vmstatus_return_properties
* add a global variable for caching results
* handle multiple addresses
* pct also needs to handle array when printing verbose status



 src/PVE/CLI/pct.pm |  7 ++++++-
 src/PVE/LXC.pm     | 35 +++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/PVE/CLI/pct.pm b/src/PVE/CLI/pct.pm
index 254b3b3..827a68c 100755
--- a/src/PVE/CLI/pct.pm
+++ b/src/PVE/CLI/pct.pm
@@ -66,7 +66,12 @@ __PACKAGE__->register_method ({
 	    foreach my $k (sort (keys %$stat)) {
 		my $v = $stat->{$k};
 		next if !defined($v);
-		print "$k: $v\n";
+		if (ref($v) eq 'ARRAY') {
+		    my $str = join(",", @$v);
+		    print "$k: $str\n";
+		} else {
+		    print "$k: $v\n";
+		}
 	    }
 	} else {
 	    my $status = $stat->{status} || 'unknown';
diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
index 139f901..3354290 100644
--- a/src/PVE/LXC.pm
+++ b/src/PVE/LXC.pm
@@ -118,6 +118,9 @@ sub get_container_disk_usage {
 
 my $last_proc_vmid_stat;
 
+
+my $container_ip_cache = {};
+
 our $vmstatus_return_properties = {
     vmid => get_standard_option('pve-vmid'),
     status => {
@@ -148,6 +151,11 @@ our $vmstatus_return_properties = {
 	type => 'string',
 	optional => 1,
     },
+    ipaddress => {
+	description => "IP addresses.",
+	type => 'array', items => { type => 'string' },
+	optional => 1,
+    },
     uptime => {
 	description => "Uptime.",
 	type => 'integer',
@@ -245,6 +253,11 @@ sub vmstatus {
 	my $d = $list->{$vmid};
 	my $pid = $d->{pid};
 
+	$container_ip_cache->{$vmid} = {
+	    ipaddress => [],
+	    timestamp => $cdtime,
+	};
+
 	next if !$pid; # skip stopped CTs
 
 	my $proc_pid_stat = PVE::ProcFSTools::read_proc_pid_stat($pid);
@@ -254,6 +267,13 @@ sub vmstatus {
 
 	my $cgroups = PVE::LXC::CGroup->new($vmid);
 
+	my $cache_period = 60; # seconds
+	if ($cdtime - $container_ip_cache->{$vmid}->{timestamp} < $cache_period) {
+	    $container_ip_cache->{$vmid}->{timestamp} = gettimeofday;
+	    $container_ip_cache->{$vmid}->{ipaddress} = find_lxc_ip_address($vmid);
+	    $d->{ipaddress} = $container_ip_cache->{$vmid}->{ipaddress};
+	}
+
 	if (defined(my $mem = $cgroups->get_memory_stat())) {
 	    $d->{mem} = int($mem->{mem});
 	    $d->{swap} = int($mem->{swap});
@@ -397,6 +417,21 @@ sub open_ppid {
     return ($ppid, $fd);
 }
 
+sub find_lxc_ip_address {
+    my ($vmid) = @_;
+
+    my $ip_list = [];
+
+    my $parser = sub {
+	my $line = shift;
+	my $ip = $1 if $line =~ m/^IP:\s+(.*)$/;
+	push @$ip_list, $ip;
+    };
+
+    PVE::Tools::run_command(['lxc-info', '-n', $vmid, '--ips'], outfunc => $parser, errfunc => sub {});
+    return $ip_list;
+}
+
 # Note: we cannot use Net:IP, because that only allows strict
 # CIDR networks
 sub parse_ipv4_cidr {
-- 
2.30.2