Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

service: ensure environment variables are prefixed in command #11428

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion Library/Homebrew/caveats.rb
Expand Up @@ -155,7 +155,7 @@ def plist_caveats
return if !f.plist_manual && !f.service?

command = if f.service?
f.service.command.join(" ")
f.service.manual_command
else
f.plist_manual
end
Expand Down
15 changes: 11 additions & 4 deletions Library/Homebrew/service.rb
Expand Up @@ -172,6 +172,16 @@ def command
@run.map(&:to_s)
end

sig { returns(String) }
def manual_command
instance_eval(&@service_block)
vars = @environment_variables.except(:PATH)
.map { |k, v| "#{k}=\"#{v}\"" }

out = vars + command
out.join(" ")
end

# Returns a `String` plist.
# @return [String]
sig { returns(String) }
Expand Down Expand Up @@ -216,10 +226,7 @@ def to_systemd_unit
options << "StandardInput=file:#{@input_path}" if @input_path.present?
options << "StandardOutput=append:#{@log_path}" if @log_path.present?
options << "StandardError=append:#{@error_log_path}" if @error_log_path.present?
if @environment_variables.present?
list = @environment_variables.map { |k, v| "#{k}=#{v}" }.join("&")
options << "Environment=\"#{list}\""
end
options += @environment_variables.map { |k, v| "Environment=\"#{k}=#{v}\"" } if @environment_variables.present?

unit + options.join("\n")
end
Expand Down
39 changes: 37 additions & 2 deletions Library/Homebrew/test/service_spec.rb
Expand Up @@ -32,12 +32,44 @@
end
end

describe "#manual_command" do
it "returns valid manual_command" do
f.class.service do
run "#{HOMEBREW_PREFIX}/bin/beanstalkd"
run_type :immediate
environment_variables PATH: std_service_path_env, ETC_DIR: etc/"beanstalkd"
error_log_path var/"log/beanstalkd.error.log"
log_path var/"log/beanstalkd.log"
working_dir var
keep_alive true
end

path = f.service.manual_command
expect(path).to eq("ETC_DIR=\"#{HOMEBREW_PREFIX}/etc/beanstalkd\" #{HOMEBREW_PREFIX}/bin/beanstalkd")
end

it "returns valid manual_command without variables" do
f.class.service do
run opt_bin/"beanstalkd"
run_type :immediate
environment_variables PATH: std_service_path_env
error_log_path var/"log/beanstalkd.error.log"
log_path var/"log/beanstalkd.log"
working_dir var
keep_alive true
end

path = f.service.manual_command
expect(path).to eq("#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd")
end
end

describe "#to_plist" do
it "returns valid plist" do
f.class.service do
run [opt_bin/"beanstalkd", "test"]
run_type :immediate
environment_variables PATH: std_service_path_env
environment_variables PATH: std_service_path_env, FOO: "BAR"
error_log_path var/"log/beanstalkd.error.log"
log_path var/"log/beanstalkd.log"
input_path var/"in/beanstalkd"
Expand All @@ -56,6 +88,8 @@
<dict>
\t<key>EnvironmentVariables</key>
\t<dict>
\t\t<key>FOO</key>
\t\t<string>BAR</string>
\t\t<key>PATH</key>
\t\t<string>#{HOMEBREW_PREFIX}/bin:#{HOMEBREW_PREFIX}/sbin:/usr/bin:/bin:/usr/sbin:/sbin</string>
\t</dict>
Expand Down Expand Up @@ -122,7 +156,7 @@
f.class.service do
run [opt_bin/"beanstalkd", "test"]
run_type :immediate
environment_variables PATH: std_service_path_env
environment_variables PATH: std_service_path_env, FOO: "BAR"
error_log_path var/"log/beanstalkd.error.log"
log_path var/"log/beanstalkd.log"
input_path var/"in/beanstalkd"
Expand Down Expand Up @@ -150,6 +184,7 @@
StandardOutput=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.log
StandardError=append:#{HOMEBREW_PREFIX}/var/log/beanstalkd.error.log
Environment=\"PATH=#{std_path}\"
Environment=\"FOO=BAR\"
EOS
expect(unit).to eq(unit_expect.strip)
end
Expand Down