RPC/Backend: Make UploadFile uid and gid agnostic
authorRené Nussbaumer <rn@google.com>
Thu, 19 May 2011 08:37:58 +0000 (10:37 +0200)
committerRené Nussbaumer <rn@google.com>
Tue, 24 May 2011 09:37:20 +0000 (11:37 +0200)
Signed-off-by: René Nussbaumer <rn@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>

lib/backend.py
lib/rpc.py

index 339440b..a3c3fa1 100644 (file)
@@ -1801,10 +1801,10 @@ def UploadFile(file_name, data, mode, uid, gid, atime, mtime):
   @param data: the new contents of the file
   @type mode: int
   @param mode: the mode to give the file (can be None)
-  @type uid: int
-  @param uid: the owner of the file (can be -1 for default)
-  @type gid: int
-  @param gid: the group of the file (can be -1 for default)
+  @type uid: string
+  @param uid: the owner of the file
+  @type gid: string
+  @param gid: the group of the file
   @type atime: float
   @param atime: the atime to set on the file (can be None)
   @type mtime: float
@@ -1821,6 +1821,13 @@ def UploadFile(file_name, data, mode, uid, gid, atime, mtime):
 
   raw_data = _Decompress(data)
 
+  if not (isinstance(uid, basestring) and isinstance(gid, basestring)):
+    _Fail("Invalid username/groupname type")
+
+  getents = runtime.GetEnts()
+  uid = getents.LookupUser(uid)
+  gid = getents.LookupGroup(gid)
+
   utils.SafeWriteFile(file_name, None,
                       data=raw_data, mode=mode, uid=uid, gid=gid,
                       atime=atime, mtime=mtime)
index 4e2693e..1414170 100644 (file)
@@ -45,6 +45,7 @@ from ganeti import constants
 from ganeti import errors
 from ganeti import netutils
 from ganeti import ssconf
+from ganeti import runtime
 
 # pylint has a bug here, doesn't see this import
 import ganeti.http.client  # pylint: disable-msg=W0611
@@ -1168,8 +1169,9 @@ class RpcRunner(object):
     file_contents = utils.ReadFile(file_name)
     data = cls._Compress(file_contents)
     st = os.stat(file_name)
-    params = [file_name, data, st.st_mode, st.st_uid, st.st_gid,
-              st.st_atime, st.st_mtime]
+    getents = runtime.GetEnts()
+    params = [file_name, data, st.st_mode, getents.LookupUid(st.st_uid),
+              getents.LookupGid(st.st_gid), st.st_atime, st.st_mtime]
     return cls._StaticMultiNodeCall(node_list, "upload_file", params,
                                     address_list=address_list)