[pve-devel] applied: [PATCH v4 #1752 pve-manager] implement basic wake on LAN functionality

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Jan 17 11:22:09 CET 2019


On 1/17/19 11:01 AM, Christian Ebner wrote:
> Provides the basic functionality to provide a wake on LAN feature implementation
> to start nodes in a cluster from other nodes.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
> Changes to v4:
>     * Changed description to the suggested one
>     * Directly use IPPROTO_UDP instead of calling getprotobyname('udp')
>     * Changed the error handling
>     * Slight code reformatting

applied, thanks!

Now to add some info about this to pve-docs (pvenode chapter could be a good
fit), WebUI integration could be done too and maybe also add it to the pvenode
CLI tool, possible call interface could be: pvenode wakeonlan <node>

just as ideas ;)

> 
>  PVE/API2/Nodes.pm | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  PVE/NodeConfig.pm |  6 ++++++
>  2 files changed, 53 insertions(+)
> 
> diff --git a/PVE/API2/Nodes.pm b/PVE/API2/Nodes.pm
> index dd5471f8..7f829b29 100644
> --- a/PVE/API2/Nodes.pm
> +++ b/PVE/API2/Nodes.pm
> @@ -48,6 +48,7 @@ use Digest::MD5;
>  use Digest::SHA;
>  use PVE::API2::Disks;
>  use JSON;
> +use Socket;
>  
>  use base qw(PVE::RESTHandler);
>  
> @@ -168,6 +169,7 @@ __PACKAGE__->register_method ({
>  	    { name => 'version' },
>  	    { name => 'syslog' },
>  	    { name => 'status' },
> +	    { name => 'wakeonlan' },
>  	    { name => 'subscription' },
>  	    { name => 'report' },
>  	    { name => 'tasks' },
> @@ -466,6 +468,51 @@ __PACKAGE__->register_method({
>  	return undef;
>      }});
>  
> +__PACKAGE__->register_method({
> +    name => 'wakeonlan',
> +    path => 'wakeonlan',
> +    method => 'POST',
> +    permissions => {
> +	check => ['perm', '/nodes/{node}', [ 'Sys.PowerMgmt' ]],
> +    },
> +    protected => 1,
> +    description => "Try to wake a node via 'wake on LAN' network packet.",
> +    parameters => {
> +	additionalProperties => 0,
> +	properties => {
> +	    node => get_standard_option('pve-node', {
> +		description => 'target node for wake on LAN packet',
> +	    }),
> +	},
> +    },
> +    returns => { type => "null" },
> +    code => sub {
> +	my ($param) = @_;
> +
> +	my $config = PVE::NodeConfig::load_config($param->{node});
> +	my $mac_addr = $config->{wakeonlan};
> +	if (!defined($mac_addr)) {
> +	    die "No wake on LAN MAC address defined for '$param->{node}'!\n";
> +	}
> +
> +	$mac_addr =~ s/://g;
> +	my $packet = chr(0xff) x 6 . pack('H*', $mac_addr) x 16;
> +
> +	my $addr = gethostbyname('255.255.255.255');
> +	my $port = getservbyname('discard', 'udp');
> +	my $to = Socket::pack_sockaddr_in($port, $addr);
> +	socket(my $sock, Socket::AF_INET, Socket::SOCK_DGRAM, Socket::IPPROTO_UDP)
> +	    || die "Unable to open socket: $!\n";
> +	setsockopt($sock, Socket::SOL_SOCKET, Socket::SO_BROADCAST, 1)
> +	    || die "Unable to set socket option: $!\n";
> +
> +	send($sock, $packet, 0, $to)
> +	    || die "Unable to send packet: $!\n";
> +
> +	close($sock);
> +
> +	return undef;
> +    }});
>  
>  __PACKAGE__->register_method({
>      name => 'rrd', 
> diff --git a/PVE/NodeConfig.pm b/PVE/NodeConfig.pm
> index 8ab88130..f82f4ace 100644
> --- a/PVE/NodeConfig.pm
> +++ b/PVE/NodeConfig.pm
> @@ -61,6 +61,12 @@ my $confdesc = {
>  	description => 'Node description/comment.',
>  	optional => 1,
>      },
> +    wakeonlan => {
> +	type => 'string',
> +	description => 'MAC address for wake on LAN',
> +	pattern => '^([0-9a-fA-F]{2}:){5}([0-9a-fA-F]{2})$',
> +	optional => 1,
> +    },
>  };
>  
>  my $acmedesc = {
> 





More information about the pve-devel mailing list