2018-08-02 00:09:29 +02:00
|
|
|
# Copyright (C) 2018 Colin Darie <colin@darie.eu>, 2018 Evolix <info@evolix.fr>
|
|
|
|
# License: GNU AGPL-3+ (see full text in LICENSE file)
|
|
|
|
|
2018-05-30 13:23:15 +02:00
|
|
|
require "open4"
|
2018-05-29 22:33:12 +02:00
|
|
|
require "null_logger"
|
|
|
|
|
2018-05-30 13:23:15 +02:00
|
|
|
SystemCommandResult = Struct.new(:command, :exit_status, :stdout, :stderr)
|
|
|
|
|
2018-05-29 22:33:12 +02:00
|
|
|
class SystemCommand
|
|
|
|
attr_reader :program
|
|
|
|
attr_reader :args
|
|
|
|
attr_reader :logger
|
|
|
|
|
|
|
|
def initialize(program, args, logger: NullLogger.new)
|
|
|
|
@program = program
|
|
|
|
@args = Array.wrap(args)
|
|
|
|
@logger = logger
|
|
|
|
end
|
|
|
|
|
|
|
|
def execute
|
|
|
|
logger.log :before_command, syscmd
|
|
|
|
|
2018-05-30 13:23:15 +02:00
|
|
|
result = call(syscmd)
|
2018-05-29 22:33:12 +02:00
|
|
|
|
2018-05-30 13:23:15 +02:00
|
|
|
logger.log :after_command, result
|
2018-05-29 22:33:12 +02:00
|
|
|
|
2018-05-30 13:23:15 +02:00
|
|
|
result
|
2018-05-29 22:33:12 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def syscmd
|
|
|
|
escaped_args = args.map { |arg|
|
|
|
|
'"' + escape_arg(arg) + '"'
|
|
|
|
}
|
|
|
|
|
|
|
|
[program, escaped_args].join(" ")
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2018-06-02 15:44:34 +02:00
|
|
|
# :nocov:
|
2018-05-30 13:23:15 +02:00
|
|
|
def call(cmd)
|
|
|
|
pid, _, stdout, stderr = Open4.popen4 cmd
|
|
|
|
_, status = Process.waitpid2 pid
|
|
|
|
|
|
|
|
SystemCommandResult.new(
|
|
|
|
syscmd,
|
|
|
|
status.exitstatus,
|
|
|
|
stdout.read.strip,
|
|
|
|
stderr.read.strip,
|
|
|
|
)
|
|
|
|
end
|
2018-06-02 15:44:34 +02:00
|
|
|
# :nocov:
|
2018-05-30 13:23:15 +02:00
|
|
|
|
2018-05-29 22:33:12 +02:00
|
|
|
def escape_arg(arg)
|
|
|
|
arg.to_s.gsub('"') { '\"' }
|
|
|
|
end
|
|
|
|
end
|