[pve-devel] [PATCH v2 cluster] add qdevice status api call

Oguz Bektas o.bektas at proxmox.com
Mon Jul 1 16:31:56 CEST 2019


Signed-off-by: Oguz Bektas <o.bektas at proxmox.com>
---

v1 -> v2:

* return empty hash if socket does not exist or is not a socket file
* remove unnecessary corosync config lines since we don't use the config file

 data/PVE/API2/ClusterConfig.pm | 54 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 54 insertions(+)

diff --git a/data/PVE/API2/ClusterConfig.pm b/data/PVE/API2/ClusterConfig.pm
index e7142b5..fa2c879 100644
--- a/data/PVE/API2/ClusterConfig.pm
+++ b/data/PVE/API2/ClusterConfig.pm
@@ -12,6 +12,8 @@ use PVE::Cluster;
 use PVE::APIClient::LWP;
 use PVE::Corosync;
 
+use IO::Socket::UNIX;
+
 use base qw(PVE::RESTHandler);
 
 my $clusterconf = "/etc/pve/corosync.conf";
@@ -69,6 +71,7 @@ __PACKAGE__->register_method({
 	    { name => 'nodes' },
 	    { name => 'totem' },
 	    { name => 'join' },
+	    { name => 'qdevice' },
 	];
 
 	return $result;
@@ -552,4 +555,55 @@ __PACKAGE__->register_method({
 	return $totem_cfg;
     }});
 
+__PACKAGE__->register_method ({
+    name => 'status',
+    path => 'qdevice',
+    method => 'GET',
+    description => 'Get QDevice and configuration.',
+    permissions => {
+	check => ['perm', '/', [ 'Sys.Audit' ]],
+    },
+    parameters => {
+	additionalProperties => 0,
+	properties => {},
+    },
+    returns => {
+	type => "object",
+    },
+    code => sub {
+	my ($param) = @_;
+
+	my $result = {};
+	my $socket_path="/var/run/corosync-qdevice/corosync-qdevice.sock";
+	return $result unless -e -S $socket_path;
+
+	my $qdevice_socket = IO::Socket::UNIX->new(
+	    Type => SOCK_STREAM,
+	    Peer => $socket_path,
+	);
+
+	print $qdevice_socket "status verbose\n";
+	my @qdevice_matches = (
+	    "Algorithm",
+	    "Echo reply",
+	    "Last poll call",
+	    "Model",
+	    "QNetd host",
+	    "State",
+	    "Tie-breaker",
+	);
+	my $keys = { map { $_ => 1 } @qdevice_matches };
+	while (my $line = <$qdevice_socket>) {
+	    chomp $line;
+	    next if $line =~ /^\s/;
+	    if ($line =~ /^(.*?)\s*:\s*(.*)$/) {
+		$result->{$1} = $2 if $keys->{$1};
+	    }
+	}
+
+	return $result;
+    }});
+#TODO: possibly add setup and remove methods
+
+
 1;
-- 
2.11.0





More information about the pve-devel mailing list