#!/usr/bin/env python # # Copyright 2014 Hewlett-Packard Development Company, L.P. # # Licensed under the Apache License, Version 2.0 (the "License"); you may # not use this file except in compliance with the License. You may obtain # a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations # under the License. """Dump the state of the world for post mortem.""" import argparse import datetime import os import os.path import sys def get_options(): parser = argparse.ArgumentParser( description='Dump world state for debugging') parser.add_argument('-d', '--dir', default='.', help='Output directory for worlddump') return parser.parse_args() def filename(dirname): now = datetime.datetime.utcnow() return os.path.join(dirname, now.strftime("worlddump-%Y-%m-%d-%H%M%S.txt")) def warn(msg): print "WARN: %s" % msg def disk_space(): # the df output print """ File System Summary =================== """ dfraw = os.popen("df -Ph").read() df = [s.split() for s in dfraw.splitlines()] for fs in df: try: if int(fs[4][:-1]) > 95: warn("Device %s (%s) is %s full, might be an issue" % ( fs[0], fs[5], fs[4])) except ValueError: # if it doesn't look like an int, that's fine pass print dfraw def process_list(): print """ Process Listing =============== """ psraw = os.popen("ps axo user,ppid,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,args").read() print psraw def main(): opts = get_options() fname = filename(opts.dir) print "World dumping... see %s for details" % fname sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0) with open(fname, 'w') as f: os.dup2(f.fileno(), sys.stdout.fileno()) disk_space() process_list() if __name__ == '__main__': try: sys.exit(main()) except KeyboardInterrupt: sys.exit(1)