This is node-cmds.pl in view mode; [Download] [Up]
# Defined commands:
#
%cmds = ("quit", "quit",
"kill", "kill",
"kill_pcn", "kill_pcn",
"set", "set",
"child-rusage", "child_rusage",
"uptime", "uptime",
"eval", "eval",
"start", "start",
"start_fork", "start_fork",
"start_fork_withdir", "start_fork_withdir",
"startnode", "startnode",
"arch", "arch",
"status","status",
"ps", "ps",
"kj", kj);
$arch = &getarch;
%vars = ("pcn-dir", "/Net/auriga/auriga5/olson/PCN/v1.1/Em/$arch.bsd",
"pcn", "pcn.$arch.bsd",
"enabled", "yes",
"see_node_output", "yes",
"kill_signal", "15");
%magic_vars = ("see_node_output", "set_see_node_output");
#print "Cmds are ", join(':', %cmds), "\n";
%pcn_pids = ();
%pcn_handles = ();
$next_pcn_handle = "PCN001";
sub startnode
{
local($old) = select($conn_handle);
if (&start_node_on_host(@_))
{
print $conn_handle "Success\n";
}
select($old);
0;
}
sub child_rusage
{
local($user, $system, $cuser, $csystem) = times;
print $conn_handle "$cuser $csystem\n";
0;
}
sub set
{
local($var, @value) = @_;
if (!defined($var))
{
while (($var, $value) = each %vars)
{
print $conn_handle "$var = $value\n";
}
}
elsif (!defined(@value))
{
print $conn_handle "$var = $vars{$var}\n";
}
else
{
local($vstr) = join(' ', @value);
local($old) = $vars{$var};
print $conn_handle "Assigned $var = $vstr\n";
$vars{$var} = $vstr;
if ($magic_vars{$var})
{
print "Evaling magic variable $var sub $magic_vars{$var}\n";
eval "&$magic_vars{$var}(\$old, \$value)";
undef $@;
}
}
0;
}
# Start a process. This called by start-node from PCN
#
sub start_fork
{
&start_fork_withdir($vars{"pcn-dir"}, $vars{pcn}, @_);
}
sub start_fork_withdir
{
local($pcndir, $pcn, @args) = @_;
local($cmd, $mesg, $rc, $rh, $wh);
$rh = "${next_pcn_handle}_READ";
$wh = "${next_pcn_handle}_WRITE";
pipe($rh, $wh);
select($rh); $| = 1;
select($wh); $| = 1;
select(STDOUT);
$cmd = "sh -c 'cd $pcndir; $pcn @args'";
print $conn_handle "Starting process <$cmd>\n";
if (!$vars{enabled} || $vars{enabled} ne "yes")
{
print $conn_handle "Failure: node not enabled\n";
return 0;
}
if (($pid = fork) < 0)
{
print $conn_handle "Failure: fork failed: $!\n";
}
elsif ($pid == 0)
{
# The child
close(STDIN);
close(STDOUT);
close(STDERR);
close($rh);
open(STDIN, "</dev/null");
open(STDOUT, ">&$wh");
open(STDERR, ">&$wh");
close($wh);
chdir($pcndir);
exec($pcn, @args);
die "Exec failed: $!\n";
}
close($wh);
$pcn_pids{$rh} = $pid;
$pcn_handles{$pid} = $rh;
$next_pcn_handle++;
print $conn_handle "Success: child $pid started\n";
print STDOUT "Success: child $pid started\n" if $verbose;
0;
}
sub set_see_node_output
{
local($old_value, $new_value) = @_;
if ($old_value eq "yes" && $new_value ne "yes")
{
undef $pcn_save_output;
}
elsif ($old_value ne "yes" && $new_value eq "yes")
{
&broadcast("start-output:\n",$pcn_save_output);
}
}
sub process_pcn_output
{
local($handle) = @_;
local($rin, $n, $inp);
&broadcast("start-output:\n");
while (1)
{
$rin = '';
vec($rin, fileno($handle), 1) = 1;
$n = select($rin, undef, undef, 0);
last if $n == 0;
print "Waiting for pcn input...\n";
$inp = <$handle>;
print "Got it\n";
if (!$inp)
{
local($pid)= $pcn_pids{$handle};
local($wpid);
print "got EOF\n";
$wpid = waitpid($pid, 0);
print "Wait returned $wpid\n";
&broadcast("Wait returned $wpid\n") if $verbose;
&broadcast("got EOF for PCN pid $pid on $hostname\n")
if $verbose;
&broadcast("PCN node exited on $hostname\n");
&broadcast(".\n");
close($handle);
delete $pcn_pids{$handle};
delete $pcn_handles{$pid};
return;
}
print "got input $inp";
if ($vars{see_node_output} eq "yes")
{
&broadcast("WORKER: $inp");
}
else
{
$pcn_save_output .= $inp;
}
}
&broadcast(".\n") if ($vars{see_node_output} eq "yes");
}
sub start
{
local(@args) = @_;
local($cmd, $mesg, $rc);
$cmd = "sh -c 'cd ", $vars{"pcn-dir"}, "; ", $vars{"pcn"}, " @args &'";
$mesg = "Starting process $cmd\n";
print $mesg;
print $conn_handle $mesg;
$rc = system($cmd);
print "system returns $rc\n";
if ($rc && 0) # Hmm. $rc is -1 when it works...
{
print $conn_handle "Failure starting process: $!\n";
}
else
{
print $conn_handle "Success\n";
}
0;
}
sub status
{
local($pid);
print $conn_handle "PCN node status:\n";
for $pid (keys %pcn_handles)
{
print $conn_handle "PID $pid running with handle $pcn_handles{$pid}\n";
}
}
sub arch
{
local($arch) = &getarch;
print "Got arch $arch\n";
print $conn_handle "$arch\n";
0;
}
sub uptime
{
print $conn_handle `uptime`;
0;
}
sub eval
{
local($old) = select($conn_handle);
print "Eval '@_'\n";
local(@rc) = eval @_;
if ($@)
{
chop($@);
print $conn_handle "Eval fails: '$@'\n";
undef $@;
}
else
{
print "Eval returns '", join(':', @rc), "'\n";
}
select($old);
0;
}
sub ps
{
print $conn_handle `ps @_`;
0;
}
sub quit
{
return 1;
}
sub kj
{
local($regexp);
print "Got kj, args: ", join(':', @_), "\n";
$regexp = "(" . join(')|(', @_) . ")";
print "regexp is '$regexp'\n";
open(PS_OUT, "/bin/ps ugxaww|");
while (<PS_OUT>)
{
if (/(\S+)\s+(\d+)\s+.*$regexp/i)
{
$user = $1;
$pid = $2;
if ($user ne $ENV{USER})
{
print $conn_handle "You don't own $pid\n";
next;
}
print $conn_handle "Killing process user $user pid $pid\n";
if (kill(2, $pid) != 1)
{
kill(9, $pid);
}
}
}
close(PS_OUT);
return 0;
}
sub kill
{
$done = 1;
return 1;
}
sub kill_pcn
{
local(@pids) = @_;
local($sig, $pid);
$sig = $vars{kill_signal};
if (@pids == 0)
{
@pids = keys %pcn_handles;
}
for $pid (@pids)
{
print $conn_handle "Killing PCN pid $pid with signal $sig\n";
$n = kill $sig, $pid;
if ($n == 0)
{
print $conn_handle "Pid $pid didn't die\n";
}
else
{
print $conn_handle "Kill returns $n\n";
}
}
0;
}
1;
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.