You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ma...@apache.org on 2015/01/07 20:32:04 UTC

[05/27] incubator-ranger git commit: Ranger-201: Addition changes to process user group JSON array file format in the FileSource

Ranger-201: Addition changes to process user group JSON array file format in the FileSource


Project: http://git-wip-us.apache.org/repos/asf/incubator-ranger/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ranger/commit/1d0c1490
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ranger/tree/1d0c1490
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ranger/diff/1d0c1490

Branch: refs/heads/stack
Commit: 1d0c14908e9a1c4e8ceb5f27dcd7e7392f3f06bc
Parents: 2203ffb
Author: rmani <rm...@hortonworks.com>
Authored: Mon Jan 5 00:02:56 2015 -0800
Committer: rmani <rm...@hortonworks.com>
Committed: Mon Jan 5 00:02:56 2015 -0800

----------------------------------------------------------------------
 .../process/FileSourceUserGroupBuilder.java     | 190 ++++++++++++-------
 1 file changed, 118 insertions(+), 72 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ranger/blob/1d0c1490/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
----------------------------------------------------------------------
diff --git a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
index 8ebe71c..65f8e6c 100644
--- a/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
+++ b/ugsync/src/main/java/org/apache/ranger/unixusersync/process/FileSourceUserGroupBuilder.java
@@ -22,39 +22,43 @@ package org.apache.ranger.unixusersync.process;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.log4j.Logger;
 import org.apache.ranger.unixusersync.config.UserGroupSyncConfig;
-import org.apache.ranger.unixusersync.model.UserGroupList;
 import org.apache.ranger.usergroupsync.UserGroupSink;
 import org.apache.ranger.usergroupsync.UserGroupSource;
 
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import com.google.gson.stream.JsonReader;
 
 public class FileSourceUserGroupBuilder  implements UserGroupSource {
-
 	private static final Logger LOG = Logger.getLogger(FileSourceUserGroupBuilder.class) ;
-	
-	public static  String DEFAULT_USER_GROUP_FILE = null;
-	public static String USER_GROUP_FILE = null;
-	
-	private static boolean isManualRun=false;
-	private Map<String,List<String>>  user2GroupListMap = new HashMap<String,List<String>>();
-	private UserGroupSyncConfig config = UserGroupSyncConfig.getInstance() ;
-	private UserGroupSink ugSink     = null ;
-	private long  usergroupFileModified = 0 ;
-	
+
+	private Map<String,List<String>> user2GroupListMap     = new HashMap<String,List<String>>();
+	private UserGroupSyncConfig      config                = UserGroupSyncConfig.getInstance();
+	private String                   userGroupFilename     = null;
+	private long                     usergroupFileModified = 0 ;
+
+
 	public static void main(String[] args) throws Throwable {
+		FileSourceUserGroupBuilder filesourceUGBuilder = new FileSourceUserGroupBuilder() ;
+
 		if (args.length > 0) {
-			isManualRun=true;
-			USER_GROUP_FILE = args[0];
-		}	
-		FileSourceUserGroupBuilder  filesourceUGBuilder = new FileSourceUserGroupBuilder() ;
+			filesourceUGBuilder.setUserGroupFilename(args[0]);
+		}
+		
 		filesourceUGBuilder.init();
+
+		UserGroupSink ugSink = UserGroupSyncConfig.getInstance().getUserGroupSink();
+		LOG.info("initializing sink: " + ugSink.getClass().getName());
+		ugSink.init();
+
+		filesourceUGBuilder.updateSink(ugSink);
+		
 		if ( LOG.isDebugEnabled()) {
 			filesourceUGBuilder.print(); 
 		}
@@ -62,31 +66,16 @@ public class FileSourceUserGroupBuilder  implements UserGroupSource {
 	
 	@Override
 	public void init() throws Throwable {
-		DEFAULT_USER_GROUP_FILE = config.getUserSyncFileSource();
-		buildUserGroupInfo();
-		if (isManualRun) {
-			ugSink = UserGroupSyncConfig.getInstance().getUserGroupSink();
-			LOG.info("initializing sink: " + ugSink.getClass().getName());
-			ugSink.init();
-			updateSink(ugSink);
+		if(userGroupFilename == null) {
+			userGroupFilename = config.getUserSyncFileSource();
 		}
-	}
 
-	private void print() {
-		for(String user : user2GroupListMap.keySet()) {
-			LOG.debug("USER:" + user) ;
-			List<String> groups = user2GroupListMap.get(user) ;
-			if (groups != null) {
-				for(String group : groups) {
-					LOG.debug("\tGROUP: " + group) ;
-				}
-			}
-		}
+		buildUserGroupInfo();
 	}
 	
 	@Override
 	public boolean isChanged() {
-		long TempUserGroupFileModifedAt = new File(DEFAULT_USER_GROUP_FILE).lastModified() ;
+		long TempUserGroupFileModifedAt = new File(userGroupFilename).lastModified() ;
 		if (usergroupFileModified != TempUserGroupFileModifedAt) {
 			return true ;
 		}
@@ -95,16 +84,33 @@ public class FileSourceUserGroupBuilder  implements UserGroupSource {
 
 	@Override
 	public void updateSink(UserGroupSink sink) throws Throwable {
-		buildUserGroupInfo() ;
+		buildUserGroupInfo();
+
 		for (Map.Entry<String, List<String>> entry : user2GroupListMap.entrySet()) {
 		    String       user   = entry.getKey();
 		    List<String> groups = entry.getValue();
+
 		    sink.addOrUpdateUser(user, groups);
 		}
 	}
 
+	private void setUserGroupFilename(String filename) {
+		userGroupFilename = filename;
+	}
+
+	private void print() {
+		for(String user : user2GroupListMap.keySet()) {
+			LOG.debug("USER:" + user) ;
+			List<String> groups = user2GroupListMap.get(user) ;
+			if (groups != null) {
+				for(String group : groups) {
+					LOG.debug("\tGROUP: " + group) ;
+				}
+			}
+		}
+	}
+
 	public void buildUserGroupInfo() throws Throwable {
-		user2GroupListMap = new HashMap<String,List<String>>();
 		buildUserGroupList();
 		if ( LOG.isDebugEnabled()) {
 			print(); 
@@ -112,50 +118,90 @@ public class FileSourceUserGroupBuilder  implements UserGroupSource {
 	}
 	
 	public void buildUserGroupList() throws Throwable {
-	
-		Gson gson = new GsonBuilder().create() ;
-		
-		UserGroupList usergrouplist = new UserGroupList();
-		
-		String usergroupFile = null;
-		
-		if (isManualRun) {
-			usergroupFile = USER_GROUP_FILE;
-		} else {
-			usergroupFile = DEFAULT_USER_GROUP_FILE;
-		}
-		
-		if (usergroupFile == null){
+		if (userGroupFilename == null){
 			throw new Exception("User Group Source File is not Configured. Please maintain in unixauthservice.properties or pass it as command line argument for org.apache.ranger.unixusersync.process.FileSourceUserGroupBuilder");
 		}
+	
+		File f = new File(userGroupFilename);
 		
-		File f = new File(usergroupFile);
-		
-		if (f.exists()) {
+		if (f.exists() && f.canRead()) {
 			
-			BufferedReader bfr  = new BufferedReader(new FileReader(f));
+			Map<String,List<String>> tmpUser2GroupListMap = new HashMap<String,List<String>>();
 			
-			String line = null ;
+			JsonReader jsonReader = new JsonReader(new BufferedReader(new FileReader(f)));
 			
-			while ((line = bfr.readLine()) != null) {
+			jsonReader.setLenient(true);
 			
-				if (line.trim().isEmpty()) 
-					continue ;
-				
-				usergrouplist = gson.fromJson(line,UserGroupList.class);
-				
-				String user = usergrouplist.getUser();
-				
-				List<String> groups = usergrouplist.getGroups();
+			jsonReader.beginArray();
+			
+			while (jsonReader.hasNext() ) {
+				Map<String, List<String>> usergroupMap = getUserGroupMap(jsonReader);
 				
-				if ( user != null) {
-					user2GroupListMap.put(user, groups);
-				}
+				for(String user : usergroupMap.keySet()) {
+					List<String> groups = usergroupMap.get(user) ;
+					tmpUser2GroupListMap.put(user,groups);
+				}		
 			}
 			
-			bfr.close();
+			jsonReader.endArray();
+			
+			jsonReader.close();
+
+			user2GroupListMap     = tmpUser2GroupListMap;
+			
 			usergroupFileModified = f.lastModified() ;
+			
+		} else {
+			throw new Exception("User Group Source File " + userGroupFilename + "doesn't not exist or readable");
 		}
-
+	}
+	
+	
+	public Map<String, List<String>> getUserGroupMap(JsonReader jsonReader) throws Exception {
+		
+		Map<String, List<String>> ret = new HashMap<String, List<String>>();
+		String user = null ;
+		List<String> groups = new ArrayList<String>();
+		
+		jsonReader.beginObject();
+		
+		while ( jsonReader.hasNext()) {
+			
+			String name = jsonReader.nextName();
+			
+			if ( name.equals("user")) {
+				user = jsonReader.nextString();
+			} else if ( name.equals("groups")) {
+				groups = getGroups(jsonReader);
+			} else {
+				StringBuilder sb = new StringBuilder();
+				sb.append("User Group Source JSON array should have following **user** and **groups** as name tag e.g");
+				sb.append("[ {\"user\":\"userid1\",\"groups\":[\"groupid1\",\"groupid2\"]},");
+				sb.append("[ {\"user\":\"userid2\",\"groups\":[\"groupid1\",\"groupid2\"]}..]");
+				throw new Exception(sb.toString());
+			}
+			
+			if ( user != null ) {
+				ret.put(user, groups);
+			}
+		}
+		
+		jsonReader.endObject();
+		
+		return ret;
+	}
+	
+	public List<String> getGroups(JsonReader reader) throws IOException {
+		List<String> ret = new ArrayList<String>();
+		
+		reader.beginArray();
+		
+		while(reader.hasNext()) {
+			ret.add(reader.nextString());
+		}
+		
+		reader.endArray();
+		
+		return ret;
 	}
 }
\ No newline at end of file