=head1 Name

B<nodestat> - display the running status of each node in a noderange

=head1 B<Synopsis>

B<nodestat> [I<noderange>] [I<-m>|I<--usemon>] [I<-p>|I<--powerstat>] [I<-f>] [I<-u>|I<--updatedb>]

B<nodestat> [I<-h>|I<--help>|I<-v>|I<--version>]

=head1 B<Description>

B<nodestat>  displays and optionally updates the database the running status of a
single or range of nodes or groups.  See L<noderange(3)|noderange.3>.


By default, it works as following:
    1. gets the sshd,pbs_mom,xend port status;
    2. if none of them are open, it gets the fping status;
    3. for pingable nodes that are in the middle of deployment, it gets the deployment status;
    4. for non-pingable nodes, it shows 'noping'.


When -m is specified and there are settings in the monsetting table, it displays the status of the applications specified in the monsetting table. When -p is specified it shows the power status for the nodes that are not pingable. When -u is specified it saves the status info into the xCAT database. Node's pingable status and deployment status is saved in the nodelist.status column. Node's application status is saved in the nodelist.appstatus column.


To specify settings in the B<monsetting> table, use 'xcatmon' as the name, 'apps' as the key and the value will be a list of comma separated list of application names. For each application, you can specify the port number that can be queried on the nodes to get the running status. Or you can specify a command that can be called to get the node status from. The command can be a command that can be run locally at the management node or the service node for hierarchical cluster, or a command that can be run remotely on the nodes. 

The following is an example of the settings in the B<monsetting> table: 

    name key value
    xcatmon apps ssh,ll,gpfs,someapp
    xcatmon gpfs cmd=/tmp/mycmd,group=compute,group=service
    xcarmon ll port=9616,group=compute
    xcatmon someapp dcmd=/tmp/somecmd


Keywords to use:

    apps -- a list of comma separated application names whose status will be queried. For how to get the status of each app, look for app name in the key filed in a different row.
    port -- the application daemon port number, if not specified, use internal list, then /etc/services. 
    group -- the name of a node group that needs to get the application status from. If not specified, assume all the nodes in the nodelist table. To specify more than one groups, use group=a,group=b format.
    cmd -- the command that will be run locally on mn or sn.
    lcmd -- the command that will be run the the mn only. 
    dcmd -- the command that will be run distributed on the nodes using xdsh <nodes> ....

For commands specified by 'cmd' and 'lcmd', the input of is a list of comma separated node names, the output must be in the following format:

  node1:string1
  node2:string2
  ...

For the command specified by 'dcmd', no input is needed, the output can be a string. 


=head1 B<Options>

=over 10

=item B<-f>

Uses fping instead of nmap even if nmap is available.  If you seem to be having a problem with false negatives, fping can be more forgiving, but slower.

=item B<-m>|B<--usemon>

Uses the settings from the B<monsetting> talbe to determine a list of applications that need to get status for. 

=item B<-p>|B<--powerstat>

Gets the power status for the nodes that are 'noping'.

=item B<-u>|B<--updatedb>

Updates the status and appstatus columns of the nodelist table with the returned running status from the given nodes. 

=item B<-v>|B<--version>

Print version.

=item B<-h>|B<--help>

Print help.

=back


=head1 B<Examples>

1.  nodestat compute

 node1   sshd
 node2   sshd
 node3   ping
 node4   pbs
 node5   noping

2.  nodestat compute -p

 node1   sshd
 node2   sshd
 node3   ping
 node4   pbs
 node5   noping(Shutting down)


3. nodestat compute -u
 node1   sshd
 node2   sshd
 node3   ping
 node4   netboot
 node5   noping


4. nodestat compute -m
 node1   ping,sshd,ll,gpfs=ok
 node2   ping,sshd,ll,gpfs=not ok,someapp=something is wrong
 node3   netboot
 node4   noping


=head1 B<See> B<Also>

L<noderange(3)|noderange.3>, L<nodels(1)|nodels.1>, L<nodeset(8)|nodeset.8>
