From: David Howells Date: Fri, 11 Apr 2014 16:39:28 +0000 (+0100) Subject: Implement "bos status" X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=bf23da0795c317576528b157cf6a118502fe3818;p=users%2Fdhowells%2Fkafs-utils.git Implement "bos status" Signed-off-by: David Howells --- diff --git a/suite/commands/bos/status.py b/suite/commands/bos/status.py new file mode 100644 index 0000000..413e1bd --- /dev/null +++ b/suite/commands/bos/status.py @@ -0,0 +1,169 @@ +# +# AFS Server management toolkit: Show server statuses +# -*- coding: utf-8 -*- +# + +__copyright__ = """ +Copyright (C) 2014 Red Hat, Inc. All Rights Reserved. +Written by David Howells (dhowells@redhat.com) + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public Licence version 2 as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public Licence for more details. + +You should have received a copy of the GNU General Public Licence +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +""" + +from afs.argparse import * +from afs.lib.time import * +import kafs +import sys +import signal + +help = "Display the status of server processes" + +command_arguments = [ + [ "server", get_bosserver, "rs", "" ], + [ "instance", get_file_name, "om", "+" ], + [ "long", get_dummy, "fn" ], + [ "cell", get_cell, "os", "" ], + [ "noauth", get_auth, "fn" ], + [ "localauth", get_auth, "fn" ], + [ "verbose", get_dummy, "fn" ], + [ "encrypt", get_dummy, "fn" ], +] + +cant_combine_arguments = [ + ( "cell", "localauth" ), + ( "noauth", "localauth" ), +] + +description = r""" +Display the status of server processes +""" + +def display_instance_normal(params, bos_conn, name): + info = kafs.BOZO_GetInstanceInfo(bos_conn, name) + status = kafs.BOZO_GetStatus(bos_conn, name) + + if info.status.flags & kafs.BOZO_BADDIRACCESS: + params["_baddiraccess"] = True + + s = "Instance " + name + "," + + if "long" in params: + s += " (type is " + info.type + ")" + + # The instance's permanent state is shown by the goals returned by + # GetInstanceInfo() + if info.status.fileGoal == kafs.BSTAT_SHUTDOWN: + if info.status.goal == kafs.BSTAT_SHUTDOWN: + s += " disabled," + else: + s += " temporarily enabled," + else: + if info.status.goal == kafs.BSTAT_SHUTDOWN: + s += " temporarily disabled," + else: + pass + + # Supplementary data is found in the flags + if info.status.flags & kafs.BOZO_HASCORE: + s += " has core file," + if info.status.flags & kafs.BOZO_ERRORSTOP: + s += " stopped for too many errors," + + # The instance's actual state is returned by GetStatus() + if status.inStat == kafs.BSTAT_SHUTDOWN: + s += " currently shut down." + elif status.inStat == kafs.BSTAT_NORMAL: + s += " currently running normally." + elif status.inStat == kafs.BSTAT_SHUTTINGDOWN: + s += " currently shutting down." + elif status.inStat == kafs.BSTAT_STARTINGUP: + s += " currently starting up." + print(s) + if status.statdescr != "": + print(" Auxiliary status is:", status.statdescr) + return (info, status) + +############################################################################### +# +# +# +############################################################################### +def display_instance_long(params, bos_conn, name): + info, status = display_instance_normal(params, bos_conn, name) + + print(" Process last started at", time2str(info.status.porcStartTime), + "({:d} proc starts)".format(info.status.procStarts)) + + if info.status.lastAnyExit != 0: + print(" Last exit at", time2str(info.status.lastAnyExit)) + + if info.status.lastErrorExit != 0: + print(" Last error exit", info.status.lastErrorExit) + s = " Last error exit at " + time2str(info.status.lastErrorExit) + "," + istr = kafs.BOZO_GetInstanceStrings(bos_conn, name) + if istr.errorname != "": + s += " by " + istr.errorname + "," + if info.status.errorSignal == signal.SIGTERM: + s += " due to shutdown request." + elif info.status.errorSignal != 0: + s += " due to signal {:d}.".format(info.status.errorSignal) + else: + s += " due to exit {:d}.".format(info.status.errorCode) + print(s) + + try: + i = 0 + while True: + ret = kafs.BOZO_GetInstanceParm(bos_conn, name, i) + i += 1 + print(" Command", i, "is '" + ret.parm + "'") + except kafs.AbortBZDOM: + pass + + print() + +############################################################################### +# +# +# +############################################################################### +def main(params): + cell = params["cell"] + bos_conn = cell.open_bos_server(params["server"], params) + + if "instance" not in params: + instances = [] + try: + i = 0 + while True: + ret = kafs.BOZO_EnumerateInstance(bos_conn, i) + i += 1 + instances.append(ret.iname) + except kafs.AbortBZDOM: + pass + else: + instances = params["instance"] + + for i in instances: + try: + if "long" in params: + display_instance_long(params, bos_conn, i) + else: + display_instance_normal(params, bos_conn, i) + except kafs.AbortBZNOENT: + print("bos: failed to get instance info for '" + i + "' (no such entity)", + file=sys.stderr) + + if "_baddiraccess" in params and "long" in params: + print("Bosserver reports inappropriate access on server directories")