yast/yast-installation

View on GitHub
src/include/installation/misc.rb

Summary

Maintainability
A
25 mins
Test Coverage
# Copyright (c) [2006-2021] SUSE LLC
#
# All Rights Reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of version 2 of the GNU General Public License as published
# by the Free Software Foundation.
#
# 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, contact SUSE LLC.
#
# To contact SUSE LLC about this file by physical or electronic mail, you may
# find current contact information at www.suse.com.

require "shellwords"

module Yast
  module InstallationMiscInclude
    def initialize_installation_misc(_include_target)
      Yast.import "UI"

      textdomain "installation"

      Yast.import "Installation"
      Yast.import "Mode"
      Yast.import "ProductControl"
      Yast.import "ProductFeatures"
      Yast.import "Label"
      Yast.import "FileUtils"
      Yast.import "Linuxrc"
      Yast.import "InstData"
      Yast.import "HTML"

      @modules_to_enable_with_AC_on = nil
    end

    def InjectFile(filename)
      command = "/bin/cp #{filename.shellescape} #{File.join(Installation.destdir,
        filename).shellescape}"
      Builtins.y2milestone("InjectFile: <%1>", filename)
      Builtins.y2debug("Inject command: #{command}")
      WFM.Execute(path(".local.bash"), command)
      nil
    end

    def UpdateWizardSteps
      wizard_mode = Mode.mode
      Builtins.y2milestone("Switching Steps to %1 ", wizard_mode)

      stage_mode = [
        { "stage" => "initial", "mode" => wizard_mode },
        { "stage" => "continue", "mode" => wizard_mode }
      ]
      Builtins.y2milestone("Updating wizard steps: %1", stage_mode)

      ProductControl.UpdateWizardSteps(stage_mode)

      nil
    end

    # Confirm installation or update
    #
    # @note moved from clients/inst_doit.ycp to fix bug #219097
    #
    # @return [Booelan] true if the user confirms; false otherwise
    def confirmInstallation
      display_info = UI.GetDisplayInfo
      size_x = Builtins.tointeger(Ops.get_integer(display_info, "Width", 800))
      size_y = Builtins.tointeger(Ops.get_integer(display_info, "Height", 600))

      # 576x384 support for for ps3
      # bugzilla #273147
      if Ops.greater_or_equal(size_x, 800) && Ops.greater_or_equal(size_y, 600)
        size_x = 70
        size_y = 18
      else
        size_x = 54
        size_y = 15
      end

      UI.OpenDialog(
        VBox(
          VSpacing(0.4),
          HSpacing(size_x), # force width
          HBox(
            HSpacing(0.7),
            VSpacing(size_y), # force height
            RichText(Mode.update ? confirm_update_text : confirm_installation_text),
            HSpacing(0.7)
          ),
          ButtonBox(
            PushButton(
              Id(:cancel),
              Opt(:cancelButton, :key_F10, :default),
              Label.BackButton
            ),
            PushButton(Id(:ok), Opt(:okButton, :key_F9), confirm_button_label)
          )
        )
      )

      button = Convert.to_symbol(UI.UserInput)
      UI.CloseDialog

      button == :ok
    end

    # Text for confirmation popup before the installation really starts
    #
    # @return [String]
    def confirm_installation_text
      result = ""

      result << HTML.Heading(_("Confirm Installation"))
      result << _("<p>Information required for the base installation is now complete.</p>")
      result << _(
        "<p>If you continue now, partitions on your\n" \
        "hard disk will be modified according to the installation settings in the\n" \
        "previous dialogs.</p>"
      )
      result << _(
        "<p>Go back and check the settings if you are unsure.</p>"
      )
    end

    # Text for confirmation popup before the update really starts
    #
    # @return [String]
    def confirm_update_text
      result = ""

      result << HTML.Heading(_("Confirm Update"))
      result << _("<p>Information required to perform an update is now complete.</p>")
      result << _(
        "\n" \
        "<p>If you continue now, data on your hard disk will be overwritten\n" \
        "according to the settings in the previous dialogs.</p>"
      )
      result << _("<p>Go back and check the settings if you are unsure.</p>")
    end

    # Label for the confirmation button before starting the installation or update process
    #
    # @return [String]
    def confirm_button_label
      Mode.update ? _("Start &Update") : Label.InstallButton
    end

    # Some client calls have to be called even if using AC
    def EnableRequiredModules
      # Lazy init
      if @modules_to_enable_with_AC_on.nil?
        feature = ProductFeatures.GetFeature(
          "globals",
          "autoconfiguration_enabled_modules"
        )

        @modules_to_enable_with_AC_on = if feature == "" || feature.nil? || feature == []
          []
        else
          Convert.convert(
            feature,
            from: "any",
            to:   "list <string>"
          )
        end

        Builtins.y2milestone(
          "Steps to enable with AC in use: %1",
          @modules_to_enable_with_AC_on
        )
      end

      if !@modules_to_enable_with_AC_on.nil?
        Builtins.foreach(@modules_to_enable_with_AC_on) do |one_module|
          ProductControl.EnableModule(one_module)
        end
      end

      nil
    end

    def AdjustStepsAccordingToInstallationSettings
      if Installation.add_on_selected == true ||
          !Linuxrc.InstallInf("addon").nil?
        ProductControl.EnableModule("add-on")
      else
        ProductControl.DisableModule("add-on")
      end

      if Installation.productsources_selected == true
        ProductControl.EnableModule("productsources")
      else
        ProductControl.DisableModule("productsources")
      end

      Builtins.y2milestone(
        "Disabled Modules: %1, Proposals: %2",
        ProductControl.GetDisabledModules,
        ProductControl.GetDisabledProposals
      )

      UpdateWizardSteps()

      nil
    end

    def SetXENExceptions
      # not in text-mode
      if !UI.TextMode
        # bnc #376945
        # problems with keyboard in xen
        if SCR.Read(path(".probe.xen")) == true
          Builtins.y2milestone("XEN in X detected: running xset")
          WFM.Execute(path(".local.bash"), "/usr/bin/xset r off; /usr/bin/xset m 1")
          # bnc #433338
          # enabling key-repeating
        else
          Builtins.y2milestone("Enabling key-repeating")
          WFM.Execute(path(".local.bash"), "/usr/bin/xset r on")
        end
      end

      nil
    end

    # Writes to /etc/install.inf whether running the second stage is required
    # This is written to inst-sys and not copied to the installed system
    # (which is already umounted in that time).
    #
    # @see BNC #439572
    def WriteSecondStageRequired(scst_required)
      # writes 'SecondStageRequired' '1' or '0'
      # if such tag exists, it is removed before
      WFM.Execute(
        path(".local.bash"),
        Builtins.sformat(
          "/usr/bin/sed --in-place '/^SecondStageRequired: .*/D' /etc/install.inf; " \
          "/usr/bin/echo 'SecondStageRequired: %1' >> /etc/install.inf",
          (scst_required == false) ? "0" : "1"
        )
      )
      # Is it really needed? It will enforce a read of /etc/install.inf from
      # any step after resetting it.
      Linuxrc.ResetInstallInf

      nil
    end
  end
end