diff --git a/tbsetup/node_reboot.in b/tbsetup/node_reboot.in index e1fa1dbe81eb7e3ff1f39ae4f4480fb3db7a7d1e..1f615148e687f52e08a1b93ad83751fac013fdc1 100644 --- a/tbsetup/node_reboot.in +++ b/tbsetup/node_reboot.in @@ -25,12 +25,13 @@ sub usage() "Use the -n option to not wait for nodes to go down\n" . "Use the -w option to to wait for nodes is come back up\n" . "Use the -k option to power cycle nodes in PXEWAIT mode\n" . + "Use the -a option to reboot all free nodes\n". "Use the -f option to power cycle (and not wait for nodes to die)\n"; exit(-1); } # The hidden -r option runs this in "realmode", ie don't send an event, but # really do the work instead. -my $optlist = "dfe:nwrk"; +my $optlist = "dfe:nwrka"; # # Configure variables @@ -66,6 +67,7 @@ my $nowait = 0; my $failed = 0; my $eidmode = 0; my $killmode = 0; +my $freemode = 0; my $pid; my $eid; @@ -106,6 +108,9 @@ if (defined($options{"w"})) { if (defined($options{"r"})) { $realmode = 1; } +if (defined($options{"a"})) { + $freemode = 1; +} if (defined($options{"n"}) && !defined($options{"w"})) { $nowait = 1; } @@ -131,11 +136,35 @@ $realmode=1; # die("*** You cannot use real mode!\n"); #} -# -# If eidmode, then get the node list out of the DB instead of the command -# line. A proper check is made later, so need to be fancy about the query. -# -if ($eidmode) { +if ($freemode) { + # + # Reboot all free nodes + # + if ($UID && !TBAdmin($UID)) { + die("*** You not have permission to reboot all free nodes!\n"); + } + + my $query_result = + DBQueryFatal("select n.node_id from nodes as n ". + "left join reserved as r on r.node_id=n.node_id ". + "left join node_types as nt on nt.type=n.type ". + "where nt.class='pc' and n.role='testnode' and ". + " r.pid is NULL"); + + if ($query_result->numrows == 0) { + print STDOUT "There are no free nodes to reboot\n"; + usage(); + } + + while (@row = $query_result->fetchrow_array()) { + push(@nodes, $row[0]); + } +} +elsif ($eidmode) { + # + # If eidmode, then get the node list out of the DB instead of the command + # line. A proper check is made later, so need to be fancy about the query. + # my @row; #