#!/usr/local/bin/python

import getopt
import glob
import logging
import os
import subprocess as sp
import sys

def usage():
    sys.exit('''
    usage: %s -d dir -h --list --save --clear
     -d dir         directory to save the core to
    --list          list_cores all dump partitions having cores
    --save          save core to d core_directory
    --clear         clear core on dump partition
     -h:            help
    ''' % (os.path.basename(sys.argv[0])))

def main():
    try:
        optlist, __ = getopt.getopt(sys.argv[1:], 'hd:', ['list', 'save', 'clear'])
    except:
        usage()
    list_cores = False
    save = False
    clear = False
    core_dir = None
    for opt, val in optlist:
        if opt == "--list":
            list_cores = True
        elif opt == "--save":
            save = True
        elif opt == "--clear":
            clear = True
        elif opt == "-d":
            core_dir = val
        else:
            usage()
    if ((core_dir == None and save) or not optlist or
        (core_dir != None and len(optlist) < 2)):
        usage()

    pipe = sp.Popen('isi_bootdisk_type', stdout=sp.PIPE)
    op = pipe.communicate()[0]
    if op.find('imdd') != -1:
        # For imdd the partition has no label, so might as well use savecore on
        # all *d partitions to find the dumpdev
        dev = None
        for dev in glob.glob('/dev/ad*') + glob.glob('/dev/da*'):
            pipe = sp.Popen(['/sbin/savecore', '-C', dev], stdout=sp.PIPE)
            op = pipe.communicate()[0]
            if op == None or op.find("dump exists") == -1:
                continue
            if list_cores:
                print dev
                continue
            if save and sp.call(['/sbin/savecore', '-v', '-k', core_dir, dev]):
                continue
            if clear:
                sp.call(['/sbin/savecore', '-c', '/tmp', dev])
    elif op.find('gmirror') != -1:
        import isi.sys.bootdisk as bootdisk
        try:
            prov = bootdisk.get_provider_dev(bootdisk.PROVIDER_ID_KERNELDUMP)
        except:
            logging.exception('Could not determine kernel dump provider: %s',
                              bootdisk.PROVIDER_ID_KERNELDUMP)
            return

        pipe = sp.Popen(['/sbin/savecore', '-C', prov], stdout=sp.PIPE)
        op = pipe.communicate()[0]
        if op == None or op.find("dump exists") == -1:
            return
        if list_cores:
            print prov
            return
        if save and sp.call(['/sbin/savecore', '-v', '-k', core_dir, prov]) != 0:
            return
        if clear:
            sp.call(['/sbin/savecore', '-c', '/tmp', prov])

if __name__ == '__main__':
    main()
