[pve-devel] [PATCH manager] Allow to set the IP broadcast address used to send the WoL packet

Christian Ebner c.ebner at proxmox.com
Mon Apr 8 15:28:18 CEST 2019


In order to send the WoL packet to a specific broadcast domain, the user can
define the broadcast address in the config, as fallback 255.255.255.255 is used.
By this, the route and therefore the NIC is decided by the kernel.

Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
---
 PVE/API2/Nodes.pm            | 25 ++++++++++++++++++++-----
 PVE/CLI/pvenode.pm           |  2 +-
 PVE/NodeConfig.pm            |  6 ++++++
 www/manager6/node/CmdMenu.js |  3 ++-
 4 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
index 8a2c2384..81596f25 100644
--- a/PVE/API2/Nodes.pm
+++ b/PVE/API2/Nodes.pm
@@ -490,9 +490,19 @@ __PACKAGE__->register_method({
 	},
     },
     returns => {
-	type => 'string',
-	format => 'mac-addr',
-	description => 'MAC address used to assemble the WoL magic packet.',
+	type => 'object',
+	properties => {
+	    wakeonlan => {
+		type => 'string',
+		format => 'mac-addr',
+		description => 'MAC address used to assemble the WoL magic packet.',
+	    },
+	    wakeonlanaddr => {
+		type => 'string',
+		format => 'ip',
+		description => 'IP-Broadcast address used to send the WoL magic packet.',
+	    },
+	},
     },
     code => sub {
 	my ($param) = @_;
@@ -506,6 +516,9 @@ __PACKAGE__->register_method({
 
 	my $config = PVE::NodeConfig::load_config($node);
 	my $mac_addr = $config->{wakeonlan};
+	my $broadcast_addr = $config->{wakeonlanaddr};
+	$broadcast_addr = '255.255.255.255' if !defined $broadcast_addr;
+
 	if (!defined($mac_addr)) {
 	    die "No wake on LAN MAC address defined for '$node'!\n";
 	}
@@ -513,7 +526,7 @@ __PACKAGE__->register_method({
 	$mac_addr =~ s/://g;
 	my $packet = chr(0xff) x 6 . pack('H*', $mac_addr) x 16;
 
-	my $addr = gethostbyname('255.255.255.255');
+	my $addr = gethostbyname($broadcast_addr);
 	my $port = getservbyname('discard', 'udp');
 	my $to = Socket::pack_sockaddr_in($port, $addr);
 
@@ -527,7 +540,9 @@ __PACKAGE__->register_method({
 
 	close($sock);
 
-	return $config->{wakeonlan};
+	my $ret->{wakeonlan} = $config->{wakeonlan};
+	$ret->{wakeonlanaddr} = $broadcast_addr;
+	return $ret;
     }});
 
 __PACKAGE__->register_method({
diff --git a/PVE/CLI/pvenode.pm b/PVE/CLI/pvenode.pm
index 1989e8b3..41120050 100644
--- a/PVE/CLI/pvenode.pm
+++ b/PVE/CLI/pvenode.pm
@@ -212,7 +212,7 @@ our $cmddef = {
     wakeonlan => [ 'PVE::API2::Nodes::Nodeinfo', 'wakeonlan', [ 'node' ], {}, sub {
 	    my ($mac_addr) = @_;
 
-	    print "Wake on LAN packet send for '$mac_addr'\n";
+	    print "Wake on LAN packet send for '$mac_addr->{wakeonlan}' via '$mac_addr->{wakeonlanaddr}'\n";
 	} ],
 
 };
diff --git a/PVE/NodeConfig.pm b/PVE/NodeConfig.pm
index b52868e2..4f9df886 100644
--- a/PVE/NodeConfig.pm
+++ b/PVE/NodeConfig.pm
@@ -67,6 +67,12 @@ my $confdesc = {
 	format => 'mac-addr',
 	optional => 1,
     },
+    wakeonlanaddr => {
+	type => 'string',
+	description => 'IP Broadcast address for wake on LAN',
+	format => 'ip',
+	optional => 1,
+    },
 };
 
 my $acmedesc = {
diff --git a/www/manager6/node/CmdMenu.js b/www/manager6/node/CmdMenu.js
index f718f69a..9d266363 100644
--- a/www/manager6/node/CmdMenu.js
+++ b/www/manager6/node/CmdMenu.js
@@ -103,7 +103,8 @@ Ext.define('PVE.node.CmdMenu', {
 			Ext.Msg.show({
 			    title: 'Success',
 			    icon: Ext.Msg.INFO,
-			    msg: Ext.String.format(gettext("Wake on LAN packet send for '{0}': '{1}'"), me.nodename, response.result.data)
+			    msg: Ext.String.format(gettext("Wake on LAN packet send for '{0}': '{1}' via '{2}'"),
+				me.nodename, response.result.data.wakeonlan, response.result.data.wakeonlanaddr)
 			});
 		    }
 		});
-- 
2.11.0




More information about the pve-devel mailing list