#!/usr/bin/python
#
#
import sys
import argparse
import inspect

def backup(args):
    import Benno.backup
    retval=0
    try:
        if args.repo:
            retval=Benno.backup.fromRepo(args)
        elif args.config:
            configfile=args.config
        else:
            configfile='/etc/benno/benno.xml'
            retval=Benno.backup.fromConfig(configfile,args)
    except (IOError, OSError), e:
        print >> sys.stderr, "%s: %s" % (e.strerror,e.filename)
        retval=e.errno
    sys.exit(retval)


def export(args):
    import Benno.export
    retval=0
    if not hasattr(args,'inbox'):
        args.inbox = './'
    if args.repo:
        retval=Benno.export.repoDir(args.repo,args)
        sys.exit(retval)
    else:
        if args.config:
            configfile=args.config
        else:
            configfile='/etc/benno/benno.xml'
        retval=Benno.export.configFile(configfile,args)
        sys.exit(retval)


def info(args):
    import Benno.info
    retval=0
    if args.config:
        configfile=args.config
    else:
        configfile='/etc/benno/benno.xml'
    print "Version"
    component='Benno Tools'
    version='2.6.0'
    print "  %-16s %s" % (component+':',version)
    component='Benno Archive'
    version=Benno.info.printVersion(component,args)
    if version:
        print "  %-16s %s" % (component+':',version)
    component='Benno REST'
    version=Benno.info.printVersion(component,args)
    if version:
        print "  %-16s %s" % (component+':',version)
    component='Benno Web'
    version=Benno.info.printWebVersion(component,args)
    if version:
        print "  %-16s %s" % (component+':',version)
    component='Benno SMTP'
    version=Benno.info.printVersion(component,args)
    if version:
        print "  %-16s %s" % (component+':',version)
    print ""
    print "Configuration"
    Benno.info.printConfig(configfile,args)
    component='Web UI'
    Benno.info.printWebInfo(component,args)
    print ""
    print "System"
    Benno.info.printHostInfo(args)
    print ""
    sys.exit(retval)


def reindex(args):
    import Benno.export
    retval=0
    if not hasattr(args,'inbox'):
        args.inbox = '/srv/benno/inbox'
    if args.repo:
        retval=Benno.export.repoDir(args.repo,args)
        sys.exit(retval)
    else:
        if args.config:
            configfile=args.config
        else:
            configfile='/etc/benno/benno.xml'
        retval=Benno.export.configFile(configfile,args)
        sys.exit(retval)
 

def verify(args):
    import Benno.verify
    retval=0
    if args.repo:
        retval=Benno.verify.repoDir(args)
        sys.exit(retval)
    else:
        if args.config:
            configfile=args.config
        else:
            configfile='/etc/benno/benno.xml'
        retval=Benno.verify.configFile(configfile,args)
        sys.exit(retval)
        

################################################################################
if __name__ == '__main__':
    prg_info='Benno MailArchive Toolbox 2.4.0'
    sys.path.append('/usr/lib/benno-tools')
    parser=argparse.ArgumentParser(description=prg_info)
    parser.add_argument('-V','--version',
                        action='version', version=prg_info)
    subparsers=parser.add_subparsers(dest='subcommand', help='sub-command help')

    parser_backup=subparsers.add_parser('backup', help='Prints files in repo to backup in reverse order (newest file first)')
    parser_backup.add_argument('-c','--config', help='Path to the config file (/etc/benno/benno.xml)')
    parser_backup.add_argument('-i','--increment', help='Write status file for incremental backups', action='store_true')
    parser_backup.add_argument('-r','--repo', help='Repository path (instead derived from config file)')
    parser_backup.add_argument('-l','--list', help='Print list of files to backup (default)', action='store_true')
    parser_backup.add_argument('-t','--tarfile', help='Write backup data to tar archive file')
    parser_backup.add_argument('-s','--statusfile', help='Store stautus data for incremental backups in this file (default:<repodir>/backup.status')
    parser_backup.add_argument('--purge_status', help='Purge status before backup', action='store_true')
    parser_backup.add_argument('-v','--verbose', help='verbose output (-vv verboser output)', action='count', default=False)


    parser_export=subparsers.add_parser('export', help='Export documents from archive')
    group_export = parser_export.add_mutually_exclusive_group(required=True)
    group_export.add_argument('-b','--box', help='Export the given box (ALL: whole archive)')
    group_export.add_argument('-m','--mailid', help='Mail id to reindex')
    parser_export.add_argument('-c','--config', help='Path to the config file (/etc/benno/benno.xml)')
    parser_export.add_argument('-e','--exportdir', help='Write files into this directory (default: ./)')
    parser_export.add_argument('-r','--repo', help='Path to repository')
    parser_export.add_argument('-v','--verbose', help='Verbose output (-vv verboser output)', action='count', default=False)


    parser_info=subparsers.add_parser('info', help='Show information about the current installation')
    parser_info.add_argument('-c','--config', help='Path to the config file (/etc/benno/benno.xml)')
    parser_info.add_argument('-i','--installdir', help='Path to the Benno installation directory (/opt/benno)')
    parser_info.add_argument('-v','--verbose', help='verbose output (-vv verboser output)', action='count', default=False)


    parser_reindex=subparsers.add_parser('reindex', help='Reindex documents from archive')
    group_reindex = parser_reindex.add_mutually_exclusive_group(required=True)
    group_reindex.add_argument('-b','--box', help='Reindex the given box (ALL: whole archive)')
    group_reindex.add_argument('-m','--mailid', help='Mail id to reindex')
    parser_reindex.add_argument('-c','--config', help='Path to the config file (/etc/benno/benno.xml)')
    parser_reindex.add_argument('-i','--inbox', help='Path to the inbox directory (/srv/benno/inbox)')
    parser_reindex.add_argument('-r','--repo', help='Path to repository')
    parser_reindex.add_argument('-v','--verbose', help='Verbose output (-vv verboser output)', action='count', default=False)


    parser_verify=subparsers.add_parser('verify', help='Verify consistence of the archive')
    parser_verify.add_argument('-c','--config', help='Path to the config file (/etc/benno/benno.xml)')
    parser_verify.add_argument('-r','--repo', help='Path to repository')
    parser_verify.add_argument('-j','--journal', default='store_true', help='Verify consistence of the journalchain (default)')
    parser_verify.add_argument('-a','--archive', action='store_true', help='Verify consistence of the archived files against journal (includes --journal)')
    parser_verify.add_argument('-v','--verbose', help='Verbose output (-vv verboser output)', action='count', default=False)


    args=parser.parse_args()
    if args.subcommand=='backup':
        backup(args)
    if args.subcommand=='export':
        export(args)
    if args.subcommand=='info':
        info(args)
    if args.subcommand=='reindex':
        reindex(args)
    if args.subcommand=='verify':
        verify(args)


