21
1
Fork 0
mirror of https://github.com/Evolix/chexpire.git synced 2024-05-02 17:00:49 +02:00
chexpire/app/services/system_command.rb

56 lines
1 KiB
Ruby
Raw Normal View History

# 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-29 22:33:12 +02:00
class SystemCommand
Result = Struct.new(:command, :exit_status, :stdout, :stderr)
class NotAllowedError < StandardError; end
2018-05-29 22:33:12 +02:00
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
Result.new(
2018-05-30 13:23:15 +02:00
syscmd,
status.exitstatus || 255,
2018-05-30 13:23:15 +02:00
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