Statistics
| Branch: | Tag: | Revision:

root / lib / runtime.py @ 66e884e1

History | View | Annotate | Download (3.3 kB)

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

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

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

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

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

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

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

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

82 f12e1736 René Nussbaumer
    """
83 f12e1736 René Nussbaumer
    # Daemon pairs
84 f12e1736 René Nussbaumer
    self.masterd_uid = GetUid(constants.MASTERD_USER, _getpwnam)
85 f12e1736 René Nussbaumer
    self.masterd_gid = GetGid(constants.MASTERD_GROUP, _getgrnam)
86 f12e1736 René Nussbaumer
87 f12e1736 René Nussbaumer
    self.confd_uid = GetUid(constants.CONFD_USER, _getpwnam)
88 f12e1736 René Nussbaumer
    self.confd_gid = GetGid(constants.CONFD_GROUP, _getgrnam)
89 f12e1736 René Nussbaumer
90 f12e1736 René Nussbaumer
    self.rapi_uid = GetUid(constants.RAPI_USER, _getpwnam)
91 f12e1736 René Nussbaumer
    self.rapi_gid = GetGid(constants.RAPI_GROUP, _getgrnam)
92 f12e1736 René Nussbaumer
93 f12e1736 René Nussbaumer
    self.noded_uid = GetUid(constants.NODED_USER, _getpwnam)
94 f12e1736 René Nussbaumer
95 f12e1736 René Nussbaumer
    # Misc Ganeti groups
96 f12e1736 René Nussbaumer
    self.daemons_gid = GetGid(constants.DAEMONS_GROUP, _getgrnam)
97 f12e1736 René Nussbaumer
    self.admin_gid = GetGid(constants.ADMIN_GROUP, _getgrnam)
98 f12e1736 René Nussbaumer
99 f12e1736 René Nussbaumer
100 f12e1736 René Nussbaumer
def GetEnts(resolver=GetentResolver):
101 f12e1736 René Nussbaumer
  """Singleton wrapper around resolver instance.
102 f12e1736 René Nussbaumer

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

106 f12e1736 René Nussbaumer
  """
107 f12e1736 René Nussbaumer
  # We need to use the global keyword here
108 f12e1736 René Nussbaumer
  global _priv # pylint: disable-msg=W0603
109 f12e1736 René Nussbaumer
110 f12e1736 René Nussbaumer
  if not _priv:
111 f12e1736 René Nussbaumer
    _priv_lock.acquire()
112 f12e1736 René Nussbaumer
    try:
113 f12e1736 René Nussbaumer
      if not _priv:
114 f12e1736 René Nussbaumer
        # W0621: Redefine '_priv' from outer scope (used for singleton)
115 f12e1736 René Nussbaumer
        _priv = resolver() # pylint: disable-msg=W0621
116 f12e1736 René Nussbaumer
    finally:
117 f12e1736 René Nussbaumer
      _priv_lock.release()
118 f12e1736 René Nussbaumer
119 f12e1736 René Nussbaumer
  return _priv