[pve-devel] [PATCH manager] Allow to set the IP broadcast address used to send the WoL packet
Thomas Lamprecht
t.lamprecht at proxmox.com
Tue Apr 9 13:42:36 CEST 2019
On 4/8/19 3:28 PM, Christian Ebner wrote:
> 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,
> + },
I'd rather have this in above existing wakeonlan property, as format string,
with current mac (as default_key) and new broadcast_addr (or however you'd like
to name it there) as optional key.
> };
>
> 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)
> });
> }
> });
>
More information about the pve-devel
mailing list