usr/src/cmd/gui-install/src/__init__.py
author Ginnie Wray<virginia.wray@oracle.com>
Tue, 19 Jun 2012 12:18:37 -0600
changeset 1717 10cb4d15a248
parent 1646 ca4e7dcd5f81
child 1744 0e0023aa7b39
permissions -rw-r--r--
7066254 Problem with install/logging 7170155 DC leaves log files in /var/tmp/install

#!/usr/bin/python2.6
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
#

'''
Gtk+ based UI for installing Oracle Solaris
'''

import pygtk
pygtk.require('2.0')

import __builtin__
import gettext
# Set up translation functionality.
__builtin__._ = gettext.gettext
import locale
import logging
from optparse import OptionParser
import os
import sys

import g11nsvc
import gtk

import osol_install.errsvc as errsvc
from solaris_install import ApplicationData, CalledProcessError, Popen, \
    post_install_logs_path, run, check_log_level
from solaris_install.engine import InstallEngine
from solaris_install.gui_install.gui_install_common import exit_gui_install, \
    modal_dialog, other_instance_is_running, start_td_local, write_pid_file, \
    CLEANUP_CPIO_INSTALL, DEBUG_LOG_LEVEL, DEFAULT_LOG_LEVEL, \
    DEFAULT_LOG_LOCATION, GLADE_DIR, LOG_FORMAT, LOG_LEVEL_INPUT, \
    LOG_NAME_INPUT, LOGNAME, RELEASE, TARGET_DISCOVERY, TRANSFER_PREP, \
    VARSHARE_DATASET
from solaris_install.gui_install.install_profile import InstallProfile
from solaris_install.gui_install.screen_manager import ScreenManager
from solaris_install.ict.transfer_files import add_transfer_files_to_doc
from solaris_install.logger import INSTALL_LOGGER_NAME, FileHandler
import solaris_install.sysconfig as sysconfig

# setup target instantiation checkpoint dictionary
TI_CHKPS = dict()
TI_CHKPS[TARGET_DISCOVERY] = (TARGET_DISCOVERY,
                              "solaris_install/target/discovery",
                              "TargetDiscovery")

TI_CHKPS[TRANSFER_PREP] = (TRANSFER_PREP,
                           "solaris_install/transfer/media_transfer",
                           "init_prepare_media_transfer")

TI_CHKPS[VARSHARE_DATASET] = (VARSHARE_DATASET,
                              "solaris_install/target/varshare",
                              "VarShareDataset")

TARGET_INIT = "TargetInitialization"
TI_CHKPS[TARGET_INIT] = (TARGET_INIT,
                         "solaris_install/target/instantiation",
                         "TargetInstantiation")

TRANSFER_ROOT = "transfer-root"
TI_CHKPS[TRANSFER_ROOT] = (TRANSFER_ROOT,
                           "solaris_install/transfer/cpio",
                           "TransferCPIO")

TRANSFER_MISC = "transfer-misc"
TI_CHKPS[TRANSFER_MISC] = (TRANSFER_MISC,
                           "solaris_install/transfer/cpio",
                           "TransferCPIO")

GENERATE_SC_PROFILE_CHKPOINT = 'generate-sc-profile'

TRANSFER_MEDIA = "transfer-media"
TI_CHKPS[TRANSFER_MEDIA] = (TRANSFER_MEDIA,
                            "solaris_install/transfer/cpio",
                            "TransferCPIO")

TI_CHKPS[CLEANUP_CPIO_INSTALL] = (CLEANUP_CPIO_INSTALL,
                      "solaris_install/ict/cleanup_cpio_install",
                      "CleanupCPIOInstall")

INIT_SMF = "initialize-smf"
TI_CHKPS[INIT_SMF] = (INIT_SMF,
                      "solaris_install/ict/initialize_smf",
                      "InitializeSMF")

BOOT_CONFIG = "boot-configuration"
TI_CHKPS[BOOT_CONFIG] = (BOOT_CONFIG,
                         "solaris_install/boot/boot",
                         "SystemBootMenu")

DUMP_ADMIN = "update-dump-admin"
TI_CHKPS[DUMP_ADMIN] = (DUMP_ADMIN,
                        "solaris_install/ict/update_dumpadm",
                        "UpdateDumpAdm")

DEVICE_CONFIG = "device-config"
TI_CHKPS[DEVICE_CONFIG] = (DEVICE_CONFIG,
                           "solaris_install/ict/device_config",
                           "DeviceConfig")

APPLY_SYSCONFIG = "apply-sysconfig"
TI_CHKPS[APPLY_SYSCONFIG] = (APPLY_SYSCONFIG,
                             "solaris_install/ict/apply_sysconfig",
                             "ApplySysConfig")

BOOT_ARCHIVE = "boot-archive"
TI_CHKPS[BOOT_ARCHIVE] = (BOOT_ARCHIVE,
                          "solaris_install/ict/boot_archive",
                          "BootArchive")

TRANSFER_FILES = "transfer-gui-files"
TI_CHKPS[TRANSFER_FILES] = (TRANSFER_FILES,
                            "solaris_install/ict/transfer_files",
                            "TransferFiles")

CREATE_SNAPSHOT = "create-snapshot"
TI_CHKPS[CREATE_SNAPSHOT] = (CREATE_SNAPSHOT,
                             "solaris_install/ict/create_snapshot",
                             "CreateSnapshot")


def setup_checkpoints():
    '''Sets up the checkpoints for the installation within the install engine
    '''
    logger = logging.getLogger(INSTALL_LOGGER_NAME)
    engine = InstallEngine.get_instance()
    logger.debug("**** Establishing checkpoints ****")
    logger.debug("Establishing the " + TARGET_DISCOVERY + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TARGET_DISCOVERY]))
    logger.debug("Establishing the " + TRANSFER_PREP + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TRANSFER_PREP]))
    logger.debug("Establishing the " + VARSHARE_DATASET + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[VARSHARE_DATASET]))
    logger.debug("Establishing the " + TARGET_INIT + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TARGET_INIT]))
    logger.debug("Establishing the " + TRANSFER_ROOT + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TRANSFER_ROOT]))
    logger.debug("Establishing the " + TRANSFER_MISC + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TRANSFER_MISC]))
    logger.debug("Establishing the " + TRANSFER_MEDIA + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[TRANSFER_MEDIA]))
    logger.debug("Establishing the " + GENERATE_SC_PROFILE_CHKPOINT + \
                " checkpoint")
    sysconfig.register_checkpoint()
    logger.debug("Establishing the " + CLEANUP_CPIO_INSTALL + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[CLEANUP_CPIO_INSTALL]))
    logger.debug("Establishing the " + INIT_SMF + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[INIT_SMF]))
    logger.debug("Establishing the " + BOOT_CONFIG + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[BOOT_CONFIG]))
    logger.debug("Establishing the " + DUMP_ADMIN + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[DUMP_ADMIN]))
    logger.debug("Establishing the " + DEVICE_CONFIG + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[DEVICE_CONFIG]))
    logger.debug("Establishing the " + APPLY_SYSCONFIG + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[APPLY_SYSCONFIG]))
    logger.debug("Establishing the " + BOOT_ARCHIVE + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[BOOT_ARCHIVE]))
    logger.debug("Establishing the " + TRANSFER_FILES + " checkpoint")
    # Build up list of files to be added to DataObjectCache for transfer
    # to new boot environment.
    tf_dict = dict()
    tf_dict['/var/adm/messages'] = post_install_logs_path('messages')
    add_transfer_files_to_doc(TRANSFER_FILES, tf_dict)
    engine.register_checkpoint(*(TI_CHKPS[TRANSFER_FILES]))
    logger.debug("Establishing the " + CREATE_SNAPSHOT + " checkpoint")
    engine.register_checkpoint(*(TI_CHKPS[CREATE_SNAPSHOT]))
    logger.debug("**** Checkpoints Established ****")


def init_install_profile():
    '''
        Initialize the profile for storing user-entered details.
        Assumes that InstallEngine has been instantiated first.
    '''
    data_object_name = "GUI Install"

    engine = InstallEngine.get_instance()
    doc = engine.data_object_cache

    # Clear out any other "GUI Install" InstallProfiles in the
    # DOC - there should only be one.
    doc.volatile.delete_children(
        name=data_object_name,
        class_type=InstallProfile)

    profile = InstallProfile(data_object_name)
    doc.volatile.insert_children(profile)


def save_locale_in_doc():
    '''Saves the current locale set by the user from the locale screen upon
       initial boot into the DOC.'''
    # get the current locale
    locale_ops = g11nsvc.G11NSvcLocaleOperations()

    locale_ops.setlocale(localename=os.environ['LANG'])
    the_locale = locale_ops.getlocale()
    locale_description = locale_ops.get_territory_desc(the_locale, the_locale)

    # Save the locale details to the DOC
    engine = InstallEngine.get_instance()
    doc = engine.data_object_cache
    profile = doc.volatile.get_first_child(
        name="GUI Install",
        class_type=InstallProfile)
    if profile is None:
        SystemExit("Internal Error, GUI Install DOC not found")

    profile.set_locale_data([locale_description], [the_locale], the_locale)


def _init_locale():
    '''Initialize the locale for gui-install'''
    locale.setlocale(locale.LC_ALL, "")
    gettext.install("solaris_install_guiinstall",
                    "/usr/share/locale",
                    unicode=True)


def main():
    '''Main routine for the gui-install-er'''
    _init_locale()

    # This is needed or InstallEngine threading won't work
    gtk.gdk.threads_init()

    # check we are running as root
    if os.getuid() != 0:
        sys.exit(_("The %s installer must be run as "
                   "root. Quitting.") % RELEASE)

    if other_instance_is_running():
        modal_dialog(
            _("Installer Startup Terminated"),
            _("Only one instance of this Installer is allowed. "
            "Another instance is already running."))
        sys.exit(_("Only one instance of this Installer is allowed. "
            "Another instance is already running."))

    write_pid_file()

    usage = "usage: %prog [-l FILE] [-v LEVEL] [-d]"
    parser = OptionParser(usage=usage, version="%prog 1.1")
    parser.add_option("-l", "--log-location", dest="logname",
                      help=_("Set log location to FILE (default: %default)"),
                      metavar="FILE", default=DEFAULT_LOG_LOCATION)
    parser.add_option("-v", "--log-level", dest="log_level",
                      default=None,
                      help=_("Set log verbosity to LEVEL. In order of "
                             "increasing verbosity, valid values are 'error' "
                             "'warn' 'info' 'debug' or 'input'\n[default:"
                             " %default]"),
                      choices=["error", "warn", "info", "debug", "input"],
                      metavar="LEVEL")
    parser.add_option("-d", "--debug", action="store_true", dest="debug",
                      default=False, help=_("Enable debug mode. Sets "
                      "logging level to 'input' and enables CTRL-C for "
                      "killing the program\n"))
    options, args = parser.parse_args()

    # Initialize the Engine and set up logging
    work_dir = os.path.dirname(options.logname)
    logname = os.path.basename(options.logname)
    app_data = ApplicationData("gui-install", work_dir=work_dir,
                               logname=logname)

    if options.log_level is None:
        if options.debug:
            options.log_level = DEBUG_LOG_LEVEL
        else:
            options.log_level = DEFAULT_LOG_LEVEL
        InstallEngine(app_data.logname, loglevel=options.log_level, debug=True)
    elif check_log_level(options.log_level):
        InstallEngine(app_data.logname, loglevel=options.log_level,
                      debug=options.debug)
    else:
        raise IOError(2, "Invalid --log-level parameter", options.log_level)

    doc = InstallEngine.get_instance().doc
    doc.persistent.insert_children(app_data)

    logger = logging.getLogger(INSTALL_LOGGER_NAME)
    logger.info("**** START ****")

    logger.debug("CLI options: log location = %s, verbosity = %s, debug "
        "mode = %s", app_data.logname,
        logging.getLevelName(options.log_level).lower(), options.debug)

    setup_checkpoints()
    manager = ScreenManager(app_data.logname)

    start_td_local()

    init_install_profile()
    save_locale_in_doc()
    manager.main()

    exit_gui_install(logname=app_data.logname, errcode=0)

if __name__ == '__main__':
    main()