Module: Akabei::System

Defined in:
lib/akabei/system.rb

Defined Under Namespace

Classes: CommandFailed

Class Method Summary collapse

Class Method Details

.sudo(args, opts) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/akabei/system.rb', line 17

def sudo(args, opts)
  if opts.has_key?(:env)
    opts = opts.dup
    args = args.dup
    env = opts.delete(:env)
    env.each do |k, v|
      args.unshift("#{k}=#{v}")
    end
    args.unshift('env')
  end

  puts "SUDO: #{args.join(' ')}"
  system(%w[sudo] + args, opts)
end

.system(args, opts) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/akabei/system.rb', line 32

def system(args, opts)
  opts = opts.dup
  env = {}
  opts.delete(:env).tap do |e|
    break unless e
    e.each do |k, v|
      env[k.to_s] = v.to_s
    end
  end
  opts.delete(:arch).tap do |a|
    break unless a
    args = args.dup
    args.unshift('setarch', a)
  end

  pid = Kernel.spawn(env, *args.map(&:to_s), opts)
  begin
    _, status = Process.waitpid2(pid)
    unless status.success?
      raise CommandFailed.new(env, args, opts)
    end
  rescue SignalException => e
    # Always raise an error because mkarchroot exits with 0 even if it is
    # interrupted.
    Process.waitpid2(pid)
    raise CommandFailed.new(env, args, opts)
  end
  status
end