Package ganeti :: Module runtime
[hide private]
[frames] | no frames]

Source Code for Module ganeti.runtime

  1  # 
  2   
  3  # Copyright (C) 2010 Google Inc. 
  4  # 
  5  # This program is free software; you can redistribute it and/or modify 
  6  # it under the terms of the GNU General Public License as published by 
  7  # the Free Software Foundation; either version 2 of the License, or 
  8  # (at your option) any later version. 
  9  # 
 10  # This program is distributed in the hope that it will be useful, but 
 11  # WITHOUT ANY WARRANTY; without even the implied warranty of 
 12  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 13  # General Public License for more details. 
 14  # 
 15  # You should have received a copy of the GNU General Public License 
 16  # along with this program; if not, write to the Free Software 
 17  # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
 18  # 02110-1301, USA. 
 19   
 20  """Module implementing configuration details at runtime. 
 21   
 22  """ 
 23   
 24   
 25  import grp 
 26  import pwd 
 27  import threading 
 28   
 29  from ganeti import constants 
 30  from ganeti import errors 
 31   
 32   
 33  _priv = None 
 34  _priv_lock = threading.Lock() 
 35   
 36   
37 -def GetUid(user, _getpwnam):
38 """Retrieve the uid from the database. 39 40 @type user: string 41 @param user: The username to retrieve 42 @return: The resolved uid 43 44 """ 45 try: 46 return _getpwnam(user).pw_uid 47 except KeyError, err: 48 raise errors.ConfigurationError("User '%s' not found (%s)" % (user, err))
49 50
51 -def GetGid(group, _getgrnam):
52 """Retrieve the gid from the database. 53 54 @type group: string 55 @param group: The group name to retrieve 56 @return: The resolved gid 57 58 """ 59 try: 60 return _getgrnam(group).gr_gid 61 except KeyError, err: 62 raise errors.ConfigurationError("Group '%s' not found (%s)" % (group, err))
63 64
65 -class GetentResolver:
66 """Resolves Ganeti uids and gids by name. 67 68 @ivar masterd_uid: The resolved uid of the masterd user 69 @ivar masterd_gid: The resolved gid of the masterd group 70 @ivar confd_uid: The resolved uid of the confd user 71 @ivar confd_gid: The resolved gid of the confd group 72 @ivar rapi_uid: The resolved uid of the rapi user 73 @ivar rapi_gid: The resolved gid of the rapi group 74 @ivar noded_uid: The resolved uid of the noded user 75 76 @ivar daemons_gid: The resolved gid of the daemons group 77 @ivar admin_gid: The resolved gid of the admin group 78 """
79 - def __init__(self, _getpwnam=pwd.getpwnam, _getgrnam=grp.getgrnam):
80 """Initialize the resolver. 81 82 """ 83 # Daemon pairs 84 self.masterd_uid = GetUid(constants.MASTERD_USER, _getpwnam) 85 self.masterd_gid = GetGid(constants.MASTERD_GROUP, _getgrnam) 86 87 self.confd_uid = GetUid(constants.CONFD_USER, _getpwnam) 88 self.confd_gid = GetGid(constants.CONFD_GROUP, _getgrnam) 89 90 self.rapi_uid = GetUid(constants.RAPI_USER, _getpwnam) 91 self.rapi_gid = GetGid(constants.RAPI_GROUP, _getgrnam) 92 93 self.noded_uid = GetUid(constants.NODED_USER, _getpwnam) 94 95 # Misc Ganeti groups 96 self.daemons_gid = GetGid(constants.DAEMONS_GROUP, _getgrnam) 97 self.admin_gid = GetGid(constants.ADMIN_GROUP, _getgrnam)
98 99
100 -def GetEnts(resolver=GetentResolver):
101 """Singleton wrapper around resolver instance. 102 103 As this method is accessed by multiple threads at the same time 104 we need to take thread-safty carefully 105 106 """ 107 # We need to use the global keyword here 108 global _priv # pylint: disable-msg=W0603 109 110 if not _priv: 111 _priv_lock.acquire() 112 try: 113 if not _priv: 114 # W0621: Redefine '_priv' from outer scope (used for singleton) 115 _priv = resolver() # pylint: disable-msg=W0621 116 finally: 117 _priv_lock.release() 118 119 return _priv
120