Module: Homebrew::Services::System Private

Extended by:
Utils::Output::Mixin
Defined in:
services/system.rb,
services/system/systemctl.rb

This module is part of a private API. This module may only be used in the Homebrew/brew repository. Third parties should avoid using this module if possible, as it may be removed or changed without warning.

Defined Under Namespace

Modules: Systemctl

Constant Summary collapse

LAUNCHCTL_DOMAIN_ACTION_NOT_SUPPORTED =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

T.let(125, Integer)
MISSING_DAEMON_MANAGER_EXCEPTION_MESSAGE =

This constant is part of a private API. This constant may only be used in the Homebrew/brew repository. Third parties should avoid using this constant if possible, as it may be removed or changed without warning.

T.let(
  "`brew services` is supported only on macOS or Linux (with systemd)!",
  String,
)

Class Method Summary collapse

Methods included from Utils::Output::Mixin

odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, pretty_duration, pretty_installed, pretty_outdated, pretty_uninstalled

Class Method Details

.boot_pathPathname

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Run at boot.

Returns:



59
60
61
62
63
64
65
66
67
# File 'services/system.rb', line 59

def self.boot_path
  if launchctl?
    Pathname.new("/Library/LaunchDaemons")
  elsif systemctl?
    Pathname.new("/usr/lib/systemd/system")
  else
    raise UsageError, MISSING_DAEMON_MANAGER_EXCEPTION_MESSAGE
  end
end

.candidate_domain_targetsArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



116
117
118
119
120
# File 'services/system.rb', line 116

def self.candidate_domain_targets
  candidates = [domain_target]
  candidates += ["user/#{Process.euid}", "gui/#{Process.uid}"] unless root?
  candidates.uniq
end

.domain_targetString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'services/system.rb', line 88

def self.domain_target
  if root?
    "system"
  elsif (ssh_tty = ENV.fetch("HOMEBREW_SSH_TTY", nil).present? &&
         File.stat("/dev/console").uid != Process.uid) ||
        (sudo_user = ENV.fetch("HOMEBREW_SUDO_USER", nil).present?) ||
        (Process.uid != Process.euid)
    if @output_warning.blank? && ENV.fetch("HOMEBREW_SERVICES_NO_DOMAIN_WARNING", nil).blank?
      if ssh_tty
        opoo "running over SSH without /dev/console ownership, using user/* instead of gui/* domain!"
      elsif sudo_user
        opoo "running through sudo, using user/* instead of gui/* domain!"
      else
        opoo "uid and euid do not match, using user/* instead of gui/* domain!"
      end
      unless Homebrew::EnvConfig.no_env_hints?
        puts "Hide this warning by setting `HOMEBREW_SERVICES_NO_DOMAIN_WARNING=1`."
        puts "Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`)."
      end
      @output_warning = T.let(true, T.nilable(TrueClass))
    end
    "user/#{Process.euid}"
  else
    "gui/#{Process.uid}"
  end
end

.launchctlPathname?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Path to launchctl binary.

Returns:



20
21
22
# File 'services/system.rb', line 20

def self.launchctl
  @launchctl ||= T.let(which("launchctl"), T.nilable(Pathname))
end

.launchctl?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Is this a launchctl system

Returns:

  • (Boolean)


26
27
28
# File 'services/system.rb', line 26

def self.launchctl?
  launchctl.present?
end

.pathPathname

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

If root, return boot_path, else return user_path.

Returns:



83
84
85
# File 'services/system.rb', line 83

def self.path
  root? ? boot_path : user_path
end

.root?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Woohoo, we are root dude!

Returns:

  • (Boolean)


38
39
40
# File 'services/system.rb', line 38

def self.root?
  Process.euid.zero?
end

.systemctl?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Is this a systemd system

Returns:

  • (Boolean)


32
33
34
# File 'services/system.rb', line 32

def self.systemctl?
  Systemctl.executable.present?
end

.userString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Current user running [sudo] brew services.

Returns:



44
45
46
# File 'services/system.rb', line 44

def self.user
  @user ||= T.let(ENV["USER"].presence || Utils.safe_popen_read("/usr/bin/whoami").chomp, T.nilable(String))
end

.user_of_process(pid) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • pid (Integer, nil)

Returns:



49
50
51
52
53
54
55
# File 'services/system.rb', line 49

def self.user_of_process(pid)
  if pid.nil? || pid.zero?
    user
  else
    Utils.safe_popen_read("ps", "-o", "user", "-p", pid.to_s).lines.second&.chomp
  end
end

.user_pathPathname

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Run at login.

Returns:



71
72
73
74
75
76
77
78
79
# File 'services/system.rb', line 71

def self.user_path
  if launchctl?
    Pathname.new("#{Dir.home}/Library/LaunchAgents")
  elsif systemctl?
    Pathname.new("#{Dir.home}/.config/systemd/user")
  else
    raise UsageError, MISSING_DAEMON_MANAGER_EXCEPTION_MESSAGE
  end
end