Module: Puppet::Util::POSIX

Included in:
Puppet::Util
Defined in:
lib/puppet/util/posix.rb

Overview

Utility methods for interacting with POSIX objects; mostly user and group

API:

  • public

Constant Summary collapse

LOCALE_ENV_VARS =

This is a list of environment variables that we will set when we want to override the POSIX locale

API:

  • public

['LANG', 'LC_ALL', 'LC_MESSAGES', 'LANGUAGE',
'LC_COLLATE', 'LC_CTYPE', 'LC_MONETARY', 'LC_NUMERIC', 'LC_TIME']
USER_ENV_VARS =

This is a list of user-related environment variables that we will unset when we want to provide a pristine environment for “exec” runs

API:

  • public

['HOME', 'USER', 'LOGNAME']

Instance Method Summary collapse

Instance Method Details

#get_posix_field(space, field, id) ⇒ Object

Retrieve a field from a POSIX Etc object. The id can be either an integer or a name. This only works for users and groups. It’s also broken on some platforms, unfortunately, which is why we fall back to the other method search_posix_field in the gid and uid methods if a sanity check fails

Raises:

API:

  • public



19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/puppet/util/posix.rb', line 19

def get_posix_field(space, field, id)
  raise Puppet::DevError, "Did not get id from caller" unless id

  if id.is_a?(Integer)
    if id > Puppet[:maximum_uid].to_i
      Puppet.err "Tried to get #{field} field for silly id #{id}"
      return nil
    end
    method = methodbyid(space)
  else
    method = methodbyname(space)
  end

  begin
    return Etc.send(method, id).send(field)
  rescue NoMethodError, ArgumentError
    # ignore it; we couldn't find the object
    return nil
  end
end

#gid(group) ⇒ Object

Get the GID

API:

  • public



102
103
104
# File 'lib/puppet/util/posix.rb', line 102

def gid(group)
    get_posix_value(:group, :gid, group)
end

#idfield(space) ⇒ Object

Determine what the field name is for users and groups.

API:

  • public



72
73
74
75
76
77
78
79
# File 'lib/puppet/util/posix.rb', line 72

def idfield(space)
  case space.intern
  when :gr, :group; return :gid
  when :pw, :user, :passwd; return :uid
  else
    raise ArgumentError.new("Can only handle users and groups")
  end
end

#methodbyid(space) ⇒ Object

Determine what the method is to get users and groups by id

API:

  • public



82
83
84
85
86
87
88
89
# File 'lib/puppet/util/posix.rb', line 82

def methodbyid(space)
  case space.intern
  when :gr, :group; return :getgrgid
  when :pw, :user, :passwd; return :getpwuid
  else
    raise ArgumentError.new("Can only handle users and groups")
  end
end

#methodbyname(space) ⇒ Object

Determine what the method is to get users and groups by name

API:

  • public



92
93
94
95
96
97
98
99
# File 'lib/puppet/util/posix.rb', line 92

def methodbyname(space)
  case space.intern
  when :gr, :group; return :getgrnam
  when :pw, :user, :passwd; return :getpwnam
  else
    raise ArgumentError.new("Can only handle users and groups")
  end
end

#search_posix_field(type, field, id) ⇒ Object

A degenerate method of retrieving name/id mappings. The job of this method is to retrieve all objects of a certain type, search for a specific entry and then return a given field from that entry.

API:

  • public



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/puppet/util/posix.rb', line 43

def search_posix_field(type, field, id)
  idmethod = idfield(type)
  integer = false
  if id.is_a?(Integer)
    integer = true
    if id > Puppet[:maximum_uid].to_i
      Puppet.err "Tried to get #{field} field for silly id #{id}"
      return nil
    end
  end

  Etc.send(type) do |object|
    if integer and object.send(idmethod) == id
      return object.send(field)
    elsif object.name == id
      return object.send(field)
    end
  end

  # Apparently the group/passwd methods need to get reset; if we skip
  # this call, then new users aren't found.
  case type
  when :passwd; Etc.send(:endpwent)
  when :group; Etc.send(:endgrent)
  end
  nil
end

#uid(user) ⇒ Object

Get the UID

API:

  • public



107
108
109
# File 'lib/puppet/util/posix.rb', line 107

def uid(user)
    get_posix_value(:passwd, :uid, user)
end