Skip to content

Commit

Permalink
Merge pull request #252 from yast/fix_log_copy
Browse files Browse the repository at this point in the history
Fix log copy
  • Loading branch information
jreidinger committed Jan 7, 2015
2 parents 3b63f35 + 48183d0 commit 971cae6
Show file tree
Hide file tree
Showing 8 changed files with 183 additions and 157 deletions.
6 changes: 6 additions & 0 deletions package/yast2-installation.changes
@@ -1,3 +1,9 @@
-------------------------------------------------------------------
Wed Jan 7 14:27:28 UTC 2015 - jreidinger@suse.com

- do not stuck during copy of logs files (bnc#897091)
- 3.1.126

-------------------------------------------------------------------
Thu Dec 18 20:12:47 UTC 2014 - lslezak@suse.cz

Expand Down
6 changes: 3 additions & 3 deletions package/yast2-installation.spec
Expand Up @@ -17,7 +17,7 @@


Name: yast2-installation
Version: 3.1.125
Version: 3.1.126
Release: 0

BuildRoot: %{_tmppath}/%{name}-%{version}-build
Expand All @@ -37,8 +37,8 @@ BuildRequires: docbook-xsl-stylesheets libxslt update-desktop-files yast2-core-
BuildRequires: yast2-devtools >= 3.1.10
BuildRequires: rubygem(rspec)

# Linuxrc.keys
BuildRequires: yast2 >= 3.1.41
# Base clients for inst clients
BuildRequires: yast2 >= 3.1.112

# Yast::Remote
BuildRequires: yast2-network
Expand Down
1 change: 1 addition & 0 deletions src/Makefile.am
Expand Up @@ -107,6 +107,7 @@ ylibdir = "${yast2dir}/lib/installation"
ylib_DATA = \
lib/installation/cio_ignore.rb \
lib/installation/clone_settings.rb \
lib/installation/copy_logs_finish.rb \
lib/installation/minimal_installation.rb \
lib/installation/prep_shrink.rb \
lib/installation/remote_finish_client.rb
Expand Down
143 changes: 2 additions & 141 deletions src/clients/copy_logs_finish.rb
@@ -1,142 +1,3 @@
# encoding: utf-8
require "installation/copy_logs_finish"

# ------------------------------------------------------------------------------
# Copyright (c) 2006-2012 Novell, Inc. 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 Novell, Inc.
#
# To contact Novell about this file by physical or electronic mail, you may find
# current contact information at www.novell.com.
# ------------------------------------------------------------------------------

# File:
# copy_logs_finish.ycp
#
# Module:
# Step of base installation finish
#
# Authors:
# Jiri Srain <jsrain@suse.cz>
#
# $Id$
#
module Yast
class CopyLogsFinishClient < Client
include Yast::Logger

def main
Yast.import "UI"

textdomain "installation"

Yast.import "Directory"
Yast.include self, "installation/misc.rb"

@ret = nil
@func = ""
@param = {}

# Check arguments
if Ops.greater_than(Builtins.size(WFM.Args), 0) &&
Ops.is_string?(WFM.Args(0))
@func = Convert.to_string(WFM.Args(0))
if Ops.greater_than(Builtins.size(WFM.Args), 1) &&
Ops.is_map?(WFM.Args(1))
@param = Convert.to_map(WFM.Args(1))
end
end

log.info "starting copy_logs_finish"
log.debug "func=#{@func}"
log.debug "param=#{@param}"

if @func == "Info"
return {
"steps" => 1,
# progress step title
"title" => _(
"Copying log files to installed system..."
),
"when" => [:installation, :live_installation, :update, :autoinst]
}
elsif @func == "Write"
@log_files = Convert.convert(
WFM.Read(path(".local.dir"), Directory.logdir),
:from => "any",
:to => "list <string>"
)

Builtins.foreach(@log_files) do |file|
log.debug "Processing file #{file}"

if file == "y2log" || Builtins.regexpmatch(file, "^y2log-[0-9]+$")
# Prepare y2log, y2log-* for log rotation

target_no = 1

if Ops.greater_than(Builtins.size(file), Builtins.size("y2log-"))
target_no = Ops.add(
1,
Builtins.tointeger(
Builtins.substring(file, Builtins.size("y2log-"), 5)
)
)
end

target_basename = Builtins.sformat("y2log-%1", target_no)
InjectRenamedFile(Directory.logdir, file, target_basename)

compress_cmd = Builtins.sformat(
"gzip %1/%2/%3",
Installation.destdir,
Directory.logdir,
target_basename
)
log.debug "Compress command: #{compress_cmd}"
WFM.Execute(path(".local.bash"), compress_cmd)
elsif Builtins.regexpmatch(file, "^y2log-[0-9]+\\.gz$")
target_no = Ops.add(
1,
Builtins.tointeger(
Builtins.regexpsub(file, "y2log-([0-9]+)\\.gz", "\\1")
)
)
InjectRenamedFile(
Directory.logdir,
file,
Builtins.sformat("y2log-%1.gz", target_no)
)
elsif file == "zypp.log"
# Save zypp.log from the inst-sys
InjectRenamedFile(Directory.logdir, file, "zypp.log-1") # not y2log, y2log-*
else
InjectFile(Ops.add(Ops.add(Directory.logdir, "/"), file))
end
end

copy_cmd = "/bin/cp /var/log/pbl.log '#{Installation.destdir}/#{Directory.logdir}/pbl-instsys.log'"
log.debug "Copy command: #{copy_cmd}"
WFM.Execute(path(".local.bash"), copy_cmd)
else
log.error "unknown function: #{@func}"
@ret = nil
end

log.debug "ret=#{@ret}"
log.info "copy_logs_finish finished"
deep_copy(@ret)
end
end
end

Yast::CopyLogsFinishClient.new.main
::Installation::CopyLogsFinish.run
13 changes: 0 additions & 13 deletions src/include/installation/misc.rb
Expand Up @@ -136,19 +136,6 @@ def InjectFile(filename)
#return SCR::Write (.target.byte, filename, copy_buffer);
end


def InjectRenamedFile(dir, src_name, target_name)
src = "#{dir}/#{src_name}"
target = "#{Installation.destdir}/#{dir}/#{target_name}"
command = "/bin/cp #{src} #{target}"

Builtins.y2milestone("InjectRenamedFile: <%1> -> <%2>", src, target)
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)
Expand Down
109 changes: 109 additions & 0 deletions src/lib/installation/copy_logs_finish.rb
@@ -0,0 +1,109 @@
# ------------------------------------------------------------------------------
# Copyright (c) 2006-2015 Novell, Inc. 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 Novell, Inc.
#
# To contact Novell about this file by physical or electronic mail, you may find
# current contact information at www.novell.com.
# ------------------------------------------------------------------------------

require "yast"

require "installation/finish_client"

module Installation
class CopyLogsFinish < ::Installation::FinishClient
include Yast::I18n

LOCAL_BASH = Yast::Path.new(".local.bash")

def initialize
textdomain "installation"

Yast.import "Directory"
Yast.import "Installation"
end

def steps
1
end

def title
_("Copying log files to installed system...")
end

def modes
[:installation, :live_installation, :update, :autoinst]
end

def write
log_files = Yast::WFM.Read(Yast::Path.new(".local.dir"), Yast::Directory.logdir)

log_files.each do |file|
log.debug "Processing file #{file}"

case file
when "y2log", /\Ay2log-\d+\z/
# Prepare y2log, y2log-* for log rotation
target_no = 1

if file != "y2log"
prefix_size = "y2log-".size
target_no = file[prefix_size..-1].to_i + 1
end

target_basename = "y2log-#{target_no}"
copy_log_to_target(file, target_basename)

target_path = ::File.join(
Yast::Installation.destdir,
Yast::Directory.logdir,
target_basename
)
# call gzip with -f to avoid stuck during race condition when log
# rotator also gzip file and gzip then wait for input (bnc#897091)
compress_cmd = "gzip -f #{target_path}"
log.debug "Compress command: #{compress_cmd}"
Yast::WFM.Execute(LOCAL_BASH, compress_cmd)
when /\Ay2log-\d+\.gz\z/
target_no = file[/y2log-(\d+)/, 1].to_i + 1
copy_log_to_target(file, "y2log-#{target_no}.gz")
when "zypp.log"
# Save zypp.log from the inst-sys
copy_log_to_target(file, "zypp.log-1") # not y2log, y2log-*
else
copy_log_to_target(file)
end
end

copy_cmd = "/bin/cp /var/log/pbl.log '#{Yast::Installation.destdir}/#{Yast::Directory.logdir}/pbl-instsys.log'"
log.debug "Copy command: #{copy_cmd}"
Yast::WFM.Execute(LOCAL_BASH, copy_cmd)

nil
end

private

def copy_log_to_target(src_file, dst_file = src_file)
dir = Yast::Directory.logdir
src_path = "#{dir}/#{src_file}"
dst_path = "#{Yast::Installation.destdir}/#{dir}/#{dst_file}"
command = "/bin/cp #{src_path} #{dst_path}"

log.info "copy log with '#{command}'"

Yast::WFM.Execute(LOCAL_BASH, command)
end
end
end
1 change: 1 addition & 0 deletions test/Makefile.am
@@ -1,6 +1,7 @@
TESTS = \
inst_functions_test.rb \
cio_ignore_test.rb \
copy_logs_finish_test.rb \
prep_shrink_test.rb \
remote_finish_test.rb

Expand Down
61 changes: 61 additions & 0 deletions test/copy_logs_finish_test.rb
@@ -0,0 +1,61 @@
#! /usr/bin/env rspec

require_relative "./test_helper"

require "installation/copy_logs_finish"

describe ::Installation::CopyLogsFinish do
describe "#write" do
before do
allow(Yast::WFM).to receive(:Execute)
end

def mock_log_dir(files)
allow(Yast::WFM).to receive(:Read).and_return(files)
end

def expect_to_run(cmd)
expect(Yast::WFM).to receive(:Execute).with(anything(), cmd)
end

it "copies logs from instalation to target system" do
mock_log_dir(["y2start.log"])

expect_to_run(/cp .*y2start.log .*y2start.log/)

subject.write
end

it "rotates y2log" do
mock_log_dir(["y2log-1.gz"])

expect_to_run(/cp .*y2log-1.gz .*y2log-2.gz/)

subject.write
end

it "compresses y2log if not already done" do
mock_log_dir(["y2log-1"])

expect_to_run(/gzip .*y2log-2/) #-2 due to rotation

subject.write
end

it "does not stuck during compress if file already exists (bnc#897091)" do
mock_log_dir(["y2log-1"])

expect_to_run(/gzip -f/)

subject.write
end

it "rotates zypp.log" do
mock_log_dir(["zypp.log"])

expect_to_run(/cp .*zypp.log .*zypp.log-1/)

subject.write
end
end
end

0 comments on commit 971cae6

Please sign in to comment.