Statistics
| Branch: | Tag: | Revision:

root / lib / runtime.py @ 98dfcaff

History | View | Annotate | Download (5.3 kB)

1 f12e1736 René Nussbaumer
#
2 f299ca21 Michael Hanselmann
#
3 f12e1736 René Nussbaumer
4 f12e1736 René Nussbaumer
# Copyright (C) 2010 Google Inc.
5 f12e1736 René Nussbaumer
#
6 f12e1736 René Nussbaumer
# This program is free software; you can redistribute it and/or modify
7 f12e1736 René Nussbaumer
# it under the terms of the GNU General Public License as published by
8 f12e1736 René Nussbaumer
# the Free Software Foundation; either version 2 of the License, or
9 f12e1736 René Nussbaumer
# (at your option) any later version.
10 f12e1736 René Nussbaumer
#
11 f12e1736 René Nussbaumer
# This program is distributed in the hope that it will be useful, but
12 f12e1736 René Nussbaumer
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 f12e1736 René Nussbaumer
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 f12e1736 René Nussbaumer
# General Public License for more details.
15 f12e1736 René Nussbaumer
#
16 f12e1736 René Nussbaumer
# You should have received a copy of the GNU General Public License
17 f12e1736 René Nussbaumer
# along with this program; if not, write to the Free Software
18 f12e1736 René Nussbaumer
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 f12e1736 René Nussbaumer
# 02110-1301, USA.
20 f12e1736 René Nussbaumer
21 f12e1736 René Nussbaumer
"""Module implementing configuration details at runtime.
22 f12e1736 René Nussbaumer

23 f12e1736 René Nussbaumer
"""
24 f12e1736 René Nussbaumer
25 f12e1736 René Nussbaumer
26 f12e1736 René Nussbaumer
import grp
27 f12e1736 René Nussbaumer
import pwd
28 f12e1736 René Nussbaumer
import threading
29 f12e1736 René Nussbaumer
30 f12e1736 René Nussbaumer
from ganeti import constants
31 f12e1736 René Nussbaumer
from ganeti import errors
32 44fbd23b René Nussbaumer
from ganeti import utils
33 f12e1736 René Nussbaumer
34 f12e1736 René Nussbaumer
35 f12e1736 René Nussbaumer
_priv = None
36 f12e1736 René Nussbaumer
_priv_lock = threading.Lock()
37 f12e1736 René Nussbaumer
38 f12e1736 René Nussbaumer
39 f12e1736 René Nussbaumer
def GetUid(user, _getpwnam):
40 f12e1736 René Nussbaumer
  """Retrieve the uid from the database.
41 f12e1736 René Nussbaumer

42 f12e1736 René Nussbaumer
  @type user: string
43 f12e1736 René Nussbaumer
  @param user: The username to retrieve
44 f12e1736 René Nussbaumer
  @return: The resolved uid
45 f12e1736 René Nussbaumer

46 f12e1736 René Nussbaumer
  """
47 f12e1736 René Nussbaumer
  try:
48 f12e1736 René Nussbaumer
    return _getpwnam(user).pw_uid
49 f12e1736 René Nussbaumer
  except KeyError, err:
50 f12e1736 René Nussbaumer
    raise errors.ConfigurationError("User '%s' not found (%s)" % (user, err))
51 f12e1736 René Nussbaumer
52 f12e1736 René Nussbaumer
53 f12e1736 René Nussbaumer
def GetGid(group, _getgrnam):
54 f12e1736 René Nussbaumer
  """Retrieve the gid from the database.
55 f12e1736 René Nussbaumer

56 f12e1736 René Nussbaumer
  @type group: string
57 f12e1736 René Nussbaumer
  @param group: The group name to retrieve
58 f12e1736 René Nussbaumer
  @return: The resolved gid
59 f12e1736 René Nussbaumer

60 f12e1736 René Nussbaumer
  """
61 f12e1736 René Nussbaumer
  try:
62 f12e1736 René Nussbaumer
    return _getgrnam(group).gr_gid
63 f12e1736 René Nussbaumer
  except KeyError, err:
64 f12e1736 René Nussbaumer
    raise errors.ConfigurationError("Group '%s' not found (%s)" % (group, err))
65 f12e1736 René Nussbaumer
66 f12e1736 René Nussbaumer
67 f12e1736 René Nussbaumer
class GetentResolver:
68 f12e1736 René Nussbaumer
  """Resolves Ganeti uids and gids by name.
69 f12e1736 René Nussbaumer

70 f12e1736 René Nussbaumer
  @ivar masterd_uid: The resolved uid of the masterd user
71 f12e1736 René Nussbaumer
  @ivar masterd_gid: The resolved gid of the masterd group
72 f12e1736 René Nussbaumer
  @ivar confd_uid: The resolved uid of the confd user
73 f12e1736 René Nussbaumer
  @ivar confd_gid: The resolved gid of the confd group
74 f12e1736 René Nussbaumer
  @ivar rapi_uid: The resolved uid of the rapi user
75 f12e1736 René Nussbaumer
  @ivar rapi_gid: The resolved gid of the rapi group
76 f12e1736 René Nussbaumer
  @ivar noded_uid: The resolved uid of the noded user
77 f12e1736 René Nussbaumer

78 f12e1736 René Nussbaumer
  @ivar daemons_gid: The resolved gid of the daemons group
79 f12e1736 René Nussbaumer
  @ivar admin_gid: The resolved gid of the admin group
80 f12e1736 René Nussbaumer
  """
81 f12e1736 René Nussbaumer
  def __init__(self, _getpwnam=pwd.getpwnam, _getgrnam=grp.getgrnam):
82 f12e1736 René Nussbaumer
    """Initialize the resolver.
83 f12e1736 René Nussbaumer

84 f12e1736 René Nussbaumer
    """
85 f12e1736 René Nussbaumer
    # Daemon pairs
86 f12e1736 René Nussbaumer
    self.masterd_uid = GetUid(constants.MASTERD_USER, _getpwnam)
87 f12e1736 René Nussbaumer
    self.masterd_gid = GetGid(constants.MASTERD_GROUP, _getgrnam)
88 f12e1736 René Nussbaumer
89 f12e1736 René Nussbaumer
    self.confd_uid = GetUid(constants.CONFD_USER, _getpwnam)
90 f12e1736 René Nussbaumer
    self.confd_gid = GetGid(constants.CONFD_GROUP, _getgrnam)
91 f12e1736 René Nussbaumer
92 f12e1736 René Nussbaumer
    self.rapi_uid = GetUid(constants.RAPI_USER, _getpwnam)
93 f12e1736 René Nussbaumer
    self.rapi_gid = GetGid(constants.RAPI_GROUP, _getgrnam)
94 f12e1736 René Nussbaumer
95 f12e1736 René Nussbaumer
    self.noded_uid = GetUid(constants.NODED_USER, _getpwnam)
96 44fbd23b René Nussbaumer
    self.noded_gid = GetGid(constants.NODED_GROUP, _getgrnam)
97 f12e1736 René Nussbaumer
98 f12e1736 René Nussbaumer
    # Misc Ganeti groups
99 f12e1736 René Nussbaumer
    self.daemons_gid = GetGid(constants.DAEMONS_GROUP, _getgrnam)
100 f12e1736 René Nussbaumer
    self.admin_gid = GetGid(constants.ADMIN_GROUP, _getgrnam)
101 f12e1736 René Nussbaumer
102 44fbd23b René Nussbaumer
    self._uid2user = {
103 44fbd23b René Nussbaumer
      self.masterd_uid: constants.MASTERD_USER,
104 44fbd23b René Nussbaumer
      self.confd_uid: constants.CONFD_USER,
105 44fbd23b René Nussbaumer
      self.rapi_uid: constants.RAPI_USER,
106 44fbd23b René Nussbaumer
      self.noded_uid: constants.NODED_USER,
107 44fbd23b René Nussbaumer
      }
108 44fbd23b René Nussbaumer
109 44fbd23b René Nussbaumer
    self._gid2group = {
110 44fbd23b René Nussbaumer
      self.masterd_gid: constants.MASTERD_GROUP,
111 44fbd23b René Nussbaumer
      self.confd_gid: constants.CONFD_GROUP,
112 44fbd23b René Nussbaumer
      self.rapi_gid: constants.RAPI_GROUP,
113 44fbd23b René Nussbaumer
      self.noded_gid: constants.NODED_GROUP,
114 44fbd23b René Nussbaumer
      self.daemons_gid: constants.DAEMONS_GROUP,
115 44fbd23b René Nussbaumer
      self.admin_gid: constants.ADMIN_GROUP,
116 44fbd23b René Nussbaumer
      }
117 44fbd23b René Nussbaumer
118 44fbd23b René Nussbaumer
    self._user2uid = utils.InvertDict(self._uid2user)
119 44fbd23b René Nussbaumer
    self._group2gid = utils.InvertDict(self._gid2group)
120 44fbd23b René Nussbaumer
121 44fbd23b René Nussbaumer
  def LookupUid(self, uid):
122 44fbd23b René Nussbaumer
    """Looks which Ganeti user belongs to this uid.
123 44fbd23b René Nussbaumer

124 44fbd23b René Nussbaumer
    @param uid: The uid to lookup
125 44fbd23b René Nussbaumer
    @returns The user name associated with that uid
126 44fbd23b René Nussbaumer

127 44fbd23b René Nussbaumer
    """
128 44fbd23b René Nussbaumer
    try:
129 44fbd23b René Nussbaumer
      return self._uid2user[uid]
130 44fbd23b René Nussbaumer
    except KeyError:
131 44fbd23b René Nussbaumer
      raise errors.ConfigurationError("Unknown Ganeti uid '%d'" % uid)
132 44fbd23b René Nussbaumer
133 44fbd23b René Nussbaumer
  def LookupGid(self, gid):
134 44fbd23b René Nussbaumer
    """Looks which Ganeti group belongs to this gid.
135 44fbd23b René Nussbaumer

136 44fbd23b René Nussbaumer
    @param gid: The gid to lookup
137 44fbd23b René Nussbaumer
    @returns The group name associated with that gid
138 44fbd23b René Nussbaumer

139 44fbd23b René Nussbaumer
    """
140 44fbd23b René Nussbaumer
    try:
141 44fbd23b René Nussbaumer
      return self._gid2group[gid]
142 44fbd23b René Nussbaumer
    except KeyError:
143 44fbd23b René Nussbaumer
      raise errors.ConfigurationError("Unknown Ganeti gid '%d'" % gid)
144 44fbd23b René Nussbaumer
145 44fbd23b René Nussbaumer
  def LookupUser(self, name):
146 44fbd23b René Nussbaumer
    """Looks which uid belongs to this name.
147 44fbd23b René Nussbaumer

148 44fbd23b René Nussbaumer
    @param name: The name to lookup
149 44fbd23b René Nussbaumer
    @returns The uid associated with that user name
150 44fbd23b René Nussbaumer

151 44fbd23b René Nussbaumer
    """
152 44fbd23b René Nussbaumer
    try:
153 44fbd23b René Nussbaumer
      return self._user2uid[name]
154 44fbd23b René Nussbaumer
    except KeyError:
155 44fbd23b René Nussbaumer
      raise errors.ConfigurationError("Unknown Ganeti user '%s'" % name)
156 44fbd23b René Nussbaumer
157 44fbd23b René Nussbaumer
  def LookupGroup(self, name):
158 44fbd23b René Nussbaumer
    """Looks which gid belongs to this name.
159 44fbd23b René Nussbaumer

160 44fbd23b René Nussbaumer
    @param name: The name to lookup
161 44fbd23b René Nussbaumer
    @returns The gid associated with that group name
162 44fbd23b René Nussbaumer

163 44fbd23b René Nussbaumer
    """
164 44fbd23b René Nussbaumer
    try:
165 44fbd23b René Nussbaumer
      return self._group2gid[name]
166 44fbd23b René Nussbaumer
    except KeyError:
167 44fbd23b René Nussbaumer
      raise errors.ConfigurationError("Unknown Ganeti group '%s'" % name)
168 44fbd23b René Nussbaumer
169 f12e1736 René Nussbaumer
170 f12e1736 René Nussbaumer
def GetEnts(resolver=GetentResolver):
171 f12e1736 René Nussbaumer
  """Singleton wrapper around resolver instance.
172 f12e1736 René Nussbaumer

173 f12e1736 René Nussbaumer
  As this method is accessed by multiple threads at the same time
174 f12e1736 René Nussbaumer
  we need to take thread-safty carefully
175 f12e1736 René Nussbaumer

176 f12e1736 René Nussbaumer
  """
177 f12e1736 René Nussbaumer
  # We need to use the global keyword here
178 b459a848 Andrea Spadaccini
  global _priv # pylint: disable=W0603
179 f12e1736 René Nussbaumer
180 f12e1736 René Nussbaumer
  if not _priv:
181 f12e1736 René Nussbaumer
    _priv_lock.acquire()
182 f12e1736 René Nussbaumer
    try:
183 f12e1736 René Nussbaumer
      if not _priv:
184 f12e1736 René Nussbaumer
        # W0621: Redefine '_priv' from outer scope (used for singleton)
185 b459a848 Andrea Spadaccini
        _priv = resolver() # pylint: disable=W0621
186 f12e1736 René Nussbaumer
    finally:
187 f12e1736 René Nussbaumer
      _priv_lock.release()
188 f12e1736 René Nussbaumer
189 f12e1736 René Nussbaumer
  return _priv