package xCAT_plugin::frusetter; use Data::Dumper; sub handled_commands { return { rewritemyfru => 'frusetter', } } sub ok_with_node { my $node = shift; #Here we connect to the node on a privileged port (in the clear) and ask the #node if it just asked us for credential. It's convoluted, but it is #a convenient way to see if root on the ip has approved requests for #credential retrieval. Given the nature of the situation, it is only ok #to assent to such requests before users can log in. During postscripts #stage in stateful nodes and during the rc scripts of stateless boot my $select = new IO::Select; #sleep 0.5; # gawk script race condition might exist, try to lose just in case my $sock = new IO::Socket::INET(PeerAddr => $node, Proto => "tcp", PeerPort => shift); my $rsp; unless ($sock) { return 0 } $select->add($sock); print $sock "CREDOKBYYOU?\n"; unless ($select->can_read(5)) { #wait for data for up to five seconds return 0; } my $response = <$sock>; chomp($response); if ($response eq "CREDOKBYME") { return 1; } return 0; } sub process_request { my $request = shift; my $callback = shift; my $doreq = shift; my $node = $request->{_xcat_clienthost}->[0]; unless (ok_with_node($node, 300)) { $callback->({ error => ["Unable to prove root on your IP approves of this request"], errorcode => [1] }); return; } $doreq->({ command => ['rfrurewrite'], noderange => [$node], }); return; } 1;