From 653f333d73f874d2b35ee4bdf64a3e5df7485e19 Mon Sep 17 00:00:00 2001 From: Kevin Date: Thu, 28 Sep 2023 09:58:03 -0700 Subject: [PATCH] Revert "service: support multiple sockets in DSL" --- Library/Homebrew/service.rb | 57 ++++-------- Library/Homebrew/test/service_spec.rb | 121 +++++++------------------- docs/Formula-Cookbook.md | 18 ---- 3 files changed, 48 insertions(+), 148 deletions(-) diff --git a/Library/Homebrew/service.rb b/Library/Homebrew/service.rb index 3d1de39211..130e2f1e7e 100644 --- a/Library/Homebrew/service.rb +++ b/Library/Homebrew/service.rb @@ -187,26 +187,17 @@ module Homebrew end end - SOCKET_STRING_REGEX = %r{([a-z]+)://([a-z0-9.]+):([0-9]+)}i.freeze - - sig { - params(value: T.nilable(T.any(String, T::Hash[Symbol, String]))) - .returns(T.nilable(T::Hash[Symbol, T::Hash[Symbol, String]])) - } + sig { params(value: T.nilable(String)).returns(T.nilable(T::Hash[Symbol, String])) } def sockets(value = nil) - return @sockets if value.nil? - - @sockets = case value + case value + when nil + @sockets when String - { listeners: value } - when Hash - value - end.transform_values do |socket_string| - match = socket_string.match(SOCKET_STRING_REGEX) + match = T.must(value).match(%r{([a-z]+)://([a-z0-9.]+):([0-9]+)}i) raise TypeError, "Service#sockets a formatted socket definition as ://:" if match.blank? type, host, port = match.captures - { host: host, port: port, type: type } + @sockets = { host: host, port: port, type: type } end end @@ -419,14 +410,12 @@ module Homebrew if @sockets.present? base[:Sockets] = {} - @sockets.each do |name, info| - base[:Sockets][name] = { - SockNodeName: info[:host], - SockServiceName: info[:port], - SockProtocol: info[:type].upcase, - SockFamily: "IPv4v6", - } - end + base[:Sockets][:Listeners] = { + SockNodeName: @sockets[:host], + SockServiceName: @sockets[:port], + SockProtocol: @sockets[:type].upcase, + SockFamily: "IPv4v6", + } end if @cron.present? && @run_type == RUN_TYPE_CRON @@ -522,11 +511,7 @@ module Homebrew .join(" ") end - sockets_hash = if @sockets.present? - @sockets.transform_values do |info| - "#{info[:type]}://#{info[:host]}:#{info[:port]}" - end - end + sockets_string = "#{@sockets[:type]}://#{@sockets[:host]}:#{@sockets[:port]}" if @sockets.present? { name: name_params.presence, @@ -546,7 +531,7 @@ module Homebrew restart_delay: @restart_delay, process_type: @process_type, macos_legacy_timers: @macos_legacy_timers, - sockets: sockets_hash, + sockets: sockets_string, }.compact end @@ -580,6 +565,8 @@ module Homebrew raise ArgumentError, "Unexpected run command: #{api_hash["run"]}" end + hash[:keep_alive] = api_hash["keep_alive"].transform_keys(&:to_sym) if api_hash.key?("keep_alive") + if api_hash.key?("environment_variables") hash[:environment_variables] = api_hash["environment_variables"].to_h do |key, value| [key.to_sym, replace_placeholders(value)] @@ -598,22 +585,12 @@ module Homebrew hash[key.to_sym] = replace_placeholders(value) end - %w[interval cron launch_only_once require_root restart_delay macos_legacy_timers].each do |key| + %w[interval cron launch_only_once require_root restart_delay macos_legacy_timers sockets].each do |key| next if (value = api_hash[key]).nil? hash[key.to_sym] = value end - %w[sockets keep_alive].each do |key| - next unless (value = api_hash[key]) - - hash[key.to_sym] = if value.is_a?(Hash) - value.transform_keys(&:to_sym) - else - value - end - end - hash end diff --git a/Library/Homebrew/test/service_spec.rb b/Library/Homebrew/test/service_spec.rb index 7f28005fb0..324a373086 100644 --- a/Library/Homebrew/test/service_spec.rb +++ b/Library/Homebrew/test/service_spec.rb @@ -14,15 +14,6 @@ describe Homebrew::Service do end end - def stub_formula_with_service_sockets(sockets_var) - stub_formula do - service do - run opt_bin/"beanstalkd" - sockets sockets_var - end - end - end - describe "#std_service_path_env" do it "returns valid std_service_path_env" do f = stub_formula do @@ -111,33 +102,43 @@ describe Homebrew::Service do end describe "#sockets" do - let(:sockets_type_error_message) { "Service#sockets a formatted socket definition as ://:" } - it "throws for missing type" do - [ - stub_formula_with_service_sockets("127.0.0.1:80"), - stub_formula_with_service_sockets({ "Socket" => "127.0.0.1:80" }), - ].each do |f| - expect { f.service.manual_command }.to raise_error TypeError, sockets_type_error_message + f = stub_formula do + service do + run opt_bin/"beanstalkd" + sockets "127.0.0.1:80" + end end + + expect do + f.service.manual_command + end.to raise_error TypeError, "Service#sockets a formatted socket definition as ://:" end it "throws for missing host" do - [ - stub_formula_with_service_sockets("tcp://:80"), - stub_formula_with_service_sockets({ "Socket" => "tcp://:80" }), - ].each do |f| - expect { f.service.manual_command }.to raise_error TypeError, sockets_type_error_message + f = stub_formula do + service do + run opt_bin/"beanstalkd" + sockets "tcp://:80" + end end + + expect do + f.service.manual_command + end.to raise_error TypeError, "Service#sockets a formatted socket definition as ://:" end it "throws for missing port" do - [ - stub_formula_with_service_sockets("tcp://127.0.0.1"), - stub_formula_with_service_sockets({ "Socket" => "tcp://127.0.0.1" }), - ].each do |f| - expect { f.service.manual_command }.to raise_error TypeError, sockets_type_error_message + f = stub_formula do + service do + run opt_bin/"beanstalkd" + sockets "tcp://127.0.0.1" + end end + + expect do + f.service.manual_command + end.to raise_error TypeError, "Service#sockets a formatted socket definition as ://:" end end @@ -258,59 +259,10 @@ describe Homebrew::Service do end it "returns valid plist with socket" do - plist_expect = <<~EOS - - - - - \tLabel - \thomebrew.mxcl.formula_name - \tLimitLoadToSessionType - \t - \t\tAqua - \t\tBackground - \t\tLoginWindow - \t\tStandardIO - \t\tSystem - \t - \tProgramArguments - \t - \t\t#{HOMEBREW_PREFIX}/opt/formula_name/bin/beanstalkd - \t - \tRunAtLoad - \t - \tSockets - \t - \t\tlisteners - \t\t - \t\t\tSockFamily - \t\t\tIPv4v6 - \t\t\tSockNodeName - \t\t\t127.0.0.1 - \t\t\tSockProtocol - \t\t\tTCP - \t\t\tSockServiceName - \t\t\t80 - \t\t - \t - - - EOS - - [ - stub_formula_with_service_sockets("tcp://127.0.0.1:80"), - stub_formula_with_service_sockets({ listeners: "tcp://127.0.0.1:80" }), - ].each do |f| - plist = f.service.to_plist - expect(plist).to eq(plist_expect) - end - end - - it "returns valid plist with multiple sockets" do f = stub_formula do service do run [opt_bin/"beanstalkd", "test"] - sockets socket: "tcp://0.0.0.0:80", socket_tls: "tcp://0.0.0.0:443" + sockets "tcp://127.0.0.1:80" end end @@ -339,28 +291,17 @@ describe Homebrew::Service do \t \tSockets \t - \t\tsocket + \t\tListeners \t\t \t\t\tSockFamily \t\t\tIPv4v6 \t\t\tSockNodeName - \t\t\t0.0.0.0 + \t\t\t127.0.0.1 \t\t\tSockProtocol \t\t\tTCP \t\t\tSockServiceName \t\t\t80 \t\t - \t\tsocket_tls - \t\t - \t\t\tSockFamily - \t\t\tIPv4v6 - \t\t\tSockNodeName - \t\t\t0.0.0.0 - \t\t\tSockProtocol - \t\t\tTCP - \t\t\tSockServiceName - \t\t\t443 - \t\t \t @@ -1049,7 +990,7 @@ describe Homebrew::Service do run_type: :immediate, working_dir: "/$HOME", cron: "0 0 * * 0", - sockets: { listeners: "tcp://0.0.0.0:80" }, + sockets: "tcp://0.0.0.0:80", } end diff --git a/docs/Formula-Cookbook.md b/docs/Formula-Cookbook.md index 399ebfb461..7255e0bc80 100644 --- a/docs/Formula-Cookbook.md +++ b/docs/Formula-Cookbook.md @@ -1052,24 +1052,6 @@ The `sockets` method accepts a formatted socket definition as `://:< Please note that sockets will be accessible on IPv4 and IPv6 addresses by default. -If you only need one socket and you don't care about the name (the default is `listeners`): - -```rb -service do - run [opt_bin/"beanstalkd", "test"] - sockets "tcp://127.0.0.1:80" -end -``` - -If you need multiple sockets and/or you want to specify the name: - -```rb -service do - run [opt_bin/"beanstalkd", "test"] - sockets http: "tcp://0.0.0.0:80", https: "tcp://0.0.0.0:443" -end -``` - ### Using environment variables Homebrew has multiple levels of environment variable filtering which affects which variables are available to formulae.