#!/usr/bin/python
# Authors:
#     Endi S. Dewata <edewata@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# 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 License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright (C) 2013 Red Hat, Inc.
# All rights reserved.
#

import getopt
import signal
import sys

import pki
import pki.server.upgrade


def interrupt_handler(signal, frame):
    print
    print
    print 'Upgrade canceled.'
    sys.exit(1)


def usage():
    print 'Usage: pki-server-upgrade [OPTIONS]'
    print
    print '  -i, --instance <instance>      Upgrade a specific instance only.'
    print '  -s, --subsystem <subsystem>    Upgrade a specific subsystem in an instance only.'
    print '  -t, --instance-type <type>     Specify 9 for upgraded Dogtag 9 instances only,'
    print '                                 10 for Dogtag 10 instances only.'
    print
    print '  --scriptlet-version <version>  Run scriptlets for a specific version only.'
    print '  --scriptlet-index <index>      Run a specific scriptlet only.'
    print
    print '  --silent                       Upgrade in silent mode. Ignore any failures.'
    print '  --status                       Show upgrade status only. Do not perform upgrade.'
    print
    print '  -X                             Show advanced usage.'
    print '  -v, --verbose                  Run in verbose mode.'
    print '  -h, --help                     Show this help message.'


def advancedUsage():
    print 'WARNING: These options may render the system unusable.'
    print 'Usage: pki-upgrade [OPTIONS]'
    print '  --remove-tracker             Remove tracker'
    print '  --reset-tracker              Reset tracker to match package version'


def main(argv):

    signal.signal(signal.SIGINT, interrupt_handler)

    try:
        opts, args = getopt.getopt(argv[1:], 'hi:s:t:vX', [
            'instance=', 'subsystem=', 'instance-type=',
            'scriptlet-version=', 'scriptlet-index=',
            'silent', 'status',
            'remove-tracker', 'reset-tracker',
            'verbose', 'help'])

    except getopt.GetoptError as e:
        print 'ERROR: ' + str(e)
        usage()
        sys.exit(1)

    instanceName = None
    subsystemName = None
    instanceType = None

    version = None
    index = None

    silent = False
    status = False
    remove_tracker = False
    reset_tracker = False

    for o, a in opts:
        if o in ('-i', '--instance'):
            instanceName = a

        elif o in ('-s', '--subsystem'):
            subsystemName = a

        elif o in ('-t', '--instance-type'):
            instanceType = int(a)

        elif o == '--scriptlet-version':
            version = a

        elif o == '--scriptlet-index':
            index = int(a)

        elif o == '--silent':
            silent = True

        elif o == '--status':
            status = True

        elif o == '--remove-tracker':
            remove_tracker = True

        elif o == '--reset-tracker':
            reset_tracker = True

        elif o in ('-v', '--verbose'):
            pki.upgrade.verbose = True

        elif o in ('-h', '--help'):
            usage()
            sys.exit()

        elif o == '-X':
            advancedUsage()
            sys.exit()

        else:
            print 'ERROR: unknown option ' + o
            usage()
            sys.exit(1)

    if subsystemName and not instanceName:
        print 'ERROR: --subsystem requires --instance'
        usage()
        sys.exit(1)

    if index and not version:
        print 'ERROR: --scriptlet-index requires --scriptlet-version'
        usage()
        sys.exit(1)

    try:
        upgrader = pki.server.upgrade.PKIServerUpgrader(
            instanceName = instanceName,
            subsystemName = subsystemName,
            instanceType = instanceType,
            version = version,
            index = index,
            silent = silent)

        if status:
            upgrader.status()

        elif remove_tracker:
            upgrader.remove_tracker()

        elif reset_tracker:
            upgrader.reset_tracker()

        else:
            upgrader.upgrade()

    except pki.PKIException as e:
        print e.message


if __name__ == '__main__':
    main(sys.argv)
