View Javadoc

1   /*
2    * CoreLogic.java
3    *
4    * Created on May 24, 2004, 3:17 PM
5    */
6   
7   package gov.bnl.gums;
8   
9   import gov.bnl.gums.account.*;
10  import gov.bnl.gums.configuration.Configuration;
11  import gov.bnl.gums.configuration.ConfigurationToolkit;
12  import gov.bnl.gums.groupToAccount.GroupToAccountMapping;
13  import gov.bnl.gums.hostToGroup.HostToGroupMapping;
14  import gov.bnl.gums.userGroup.UserGroup;
15  import gov.bnl.gums.userGroup.VOMSUserGroup;
16  import gov.bnl.gums.util.StringUtil;
17  
18  import java.io.FileInputStream;
19  import java.io.OutputStream;
20  import java.io.PrintStream;
21  import java.util.*;
22  
23  import org.apache.log4j.Logger;
24  
25  /** 
26   * The main interface of the core logic for GUMS, allows to update the
27   * groups, generate the gridMapfiles and to map a single user.
28   *
29   * @author Gabriele Carcassi, Jay Packard
30   */
31  public class CoreLogic {
32      //private Logger log = Logger.getLogger(CoreLogic.class); // only use this log for particularly tricky aspects of this class - otherwise log within lower level classes
33      private Logger gumsAdminLog = Logger.getLogger(GUMS.gumsAdminLogName);
34      Configuration conf = null;
35  
36      /**
37       * Creates a Core Logic object to use the singleton GUMS object to get the configuration
38       * 
39       * @param configuration
40       */
41      public CoreLogic() {
42      }
43      
44      /**
45       * Creates a Core Logic object for a certain configuration (usually for testing)
46       * 
47       * @param configuration
48       */
49      public CoreLogic(Configuration conf) {
50      	this.conf = conf;
51      }
52      
53      public void addAccountRange(String accountPoolMapperName, String range) throws Exception {
54  		AccountMapper accountMapper = getConfiguration().getAccountMapper(accountPoolMapperName);
55  		if (accountMapper==null)
56  			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' does not exist");
57  		if (!(accountMapper instanceof AccountPoolMapper))
58  			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' is not an account pool mapper");
59  		AccountPoolMapper accountPoolMapper = (AccountPoolMapper)accountMapper;
60  
61  		String firstAccount = range.substring(0, range.indexOf('-'));
62  		String lastAccountN = range.substring(range.indexOf('-') + 1);
63  		String firstAccountN = firstAccount.substring(firstAccount.length() - lastAccountN.length());
64  		//String accountBase = firstAccount.substring(0, firstAccount.length() - lastAccountN.length());
65  		int nFirstAccount = Integer.parseInt(firstAccountN);
66  		int nLastAccount = Integer.parseInt(lastAccountN);
67  
68  		StringBuffer last = new StringBuffer(firstAccount);
69  		String nLastAccountString = Integer.toString(nLastAccount);
70  		last.replace(firstAccount.length() - nLastAccountString.length(), firstAccount.length(), nLastAccountString);
71  
72  		StringBuffer buf = new StringBuffer(firstAccount);
73  		int len = firstAccount.length();
74  		List<Mapping> mappings = ((AccountPoolMapper)accountPoolMapper).getMappings();
75  		for (int account = nFirstAccount; account <= nLastAccount; account++) {
76  			String nAccount = Integer.toString(account);
77  			buf.replace(len - nAccount.length(), len, nAccount);
78  			if (mappings.contains(new SiteUser(buf.toString()))) {
79  				String message = "One or more accounts already exist for '"+accountPoolMapperName+" "+range+"'. None were added.";
80  				gumsAdminLog.warn(message);
81  				throw new RuntimeException(message);
82  			}
83  		}
84  		buf = new StringBuffer(firstAccount);
85  		for (int account = nFirstAccount; account <= nLastAccount; account++) {
86  			String nAccount = Integer.toString(account);
87  			buf.replace(len - nAccount.length(), len, nAccount);
88  			accountPoolMapper.createMapping(null, new SiteUser(buf.toString()));
89  		}
90      }
91      
92      public boolean isUserBanned(GridUser user) throws Exception {
93      	return getConfiguration().isUserBanned(user);
94      }
95      
96       /**
97       * @param hostname
98       * @return
99       */
100     public String generateOsgUserVoMap(String hostname) throws Exception {
101         Configuration conf = getConfiguration();
102         StringBuffer osgMapBuffer = new StringBuffer("");
103         HostToGroupMapping host2GroupMapper = hostToGroupMapping(conf, hostname);
104         if (host2GroupMapper == null) {
105         	String message = "Cannot generate osg user VO map for host '" + hostname + "' - it is not defined in any host to group mapping.";
106             gumsAdminLog.warn(message);
107         	throw new RuntimeException(message);
108         }
109         
110         // Create header
111         osgMapBuffer.append("#User-VO map\n");
112         osgMapBuffer.append("# #comment line, format of each regular line line: account VO\n");
113         osgMapBuffer.append("# Next 2 lines with VO names, same order, all lowercase, with case (lines starting with #voi, #VOc)\n");
114         String voi = "#voi";
115         String voc = "#VOc";
116         Iterator<String> iter = getGroupToAccountMappings(host2GroupMapper).iterator();
117         while (iter.hasNext()) {
118             GroupToAccountMapping gMap = conf.getGroupToAccountMapping( iter.next() );
119             Collection<String> userGroups = getUserGroups(gMap);
120             Iterator<String> userGroupIt = userGroups.iterator();
121             while (userGroupIt.hasNext()) {
122             	UserGroup userGroup = conf.getUserGroup( userGroupIt.next() );
123 	            if (userGroup.getMembers().size()!=0 && !gMap.getAccountingVoSubgroup().equals("") && !gMap.getAccountingVo().equals("")) {
124 	                voi = voi + " " + gMap.getAccountingVoSubgroup();
125 	                voc = voc + " " + gMap.getAccountingVo();
126 	            }
127             }
128         }
129         osgMapBuffer.append(voi);
130         osgMapBuffer.append("\n");
131         osgMapBuffer.append(voc);
132         osgMapBuffer.append("\n");
133         
134         // Loop through group to account mappings
135         List<String> accountsInMap = new ArrayList<String>();
136         iter = getGroupToAccountMappings(host2GroupMapper).iterator();
137         while (iter.hasNext()) {
138             GroupToAccountMapping gMap = (GroupToAccountMapping) conf.getGroupToAccountMapping( (String)iter.next() );
139             if (!gMap.getAccountingVoSubgroup().equals("") && !gMap.getAccountingVo().equals("")) {
140 	            Collection<String> userGroups = getUserGroups(gMap);
141             	Collection<String> accountMappers = getAccountMappers(gMap);
142 	            Iterator<String> userGroupIt = userGroups.iterator();
143 	            while (userGroupIt.hasNext()) {
144 	            	UserGroup userGroup = conf.getUserGroup( userGroupIt.next() );
145 		            Set<GridUser> users = new TreeSet<GridUser>(retrieveUserComparatorByDN());
146 		            users.addAll(userGroup.getMembers());
147 		            osgMapBuffer.append("#---- accounts for vo: " + userGroup.getName() + " ----#\n");          
148 		            Iterator<GridUser> memberIter = users.iterator();
149 		            while (memberIter.hasNext()) {
150 		                GridUser user = memberIter.next();
151 		                if (isUserBanned(user))
152 		                	continue;
153 	                    Iterator<String> accountMapperIt = accountMappers.iterator();
154 	                    while (accountMapperIt.hasNext()) {
155 	                    	AccountMapper accountMapper = conf.getAccountMapper( accountMapperIt.next() );
156 			                SiteUser siteUser = accountMapper.mapDn(user.getDn(), false);
157 			                if (siteUser!=null && siteUser.getAccount()!=null && !accountsInMap.contains(siteUser.getAccount())) {
158 			                	osgMapBuffer.append(siteUser.getAccount());
159 			                	osgMapBuffer.append(' ');
160 			                	osgMapBuffer.append(gMap.getAccountingVoSubgroup());
161 			                	osgMapBuffer.append("\n");
162 			                    accountsInMap.add(siteUser.getAccount());
163 			                }
164 	                    }
165 		            }
166 	            }
167             }
168         }
169         
170         String finalOsgMap = osgMapBuffer.toString();
171         return finalOsgMap;
172     }
173     
174 
175     /**
176      * Generates a fqan to account mapping for a given host and prints it to out.
177      * 
178      * @param hostname
179      * @return
180      */
181     public String generateFqanMapfile(String hostname, boolean getAssignments) throws Exception {
182         String mapfile;
183         mapfile = generateFqanMapfileImpl(hostname, getAssignments);
184         return mapfile;
185     }    
186     
187     /**
188      * Generates a grid mapfile for a given host and prints it to out.
189      * 
190      * @param hostname
191      * @param includeFQAN
192      * @return
193      */
194     public String generateGridMapfile(String hostname, boolean createNewMappings, boolean includeFQAN, boolean includeEmail) throws Exception {
195         String mapfile;
196         mapfile = generateGridMapfileImpl(hostname, createNewMappings, includeFQAN, includeEmail);
197         return mapfile;
198     }
199     
200     /**
201      * Get a list of out of date FQANS (because of inability to contact VOMS server for example)
202      * 
203      * @return
204      */
205     public String getOutOfDateFqans(int hoursSinceLastUpdate) throws Exception {
206     	StringBuffer sb = new StringBuffer();
207     	for (UserGroup userGroup: getConfiguration().getUserGroups().values()) {
208     		if (userGroup instanceof VOMSUserGroup) {
209     			VOMSUserGroup vomsUserGroup = (VOMSUserGroup)userGroup;
210     			Calendar cal = Calendar.getInstance();
211 				cal.add(Calendar.HOUR, -hoursSinceLastUpdate);
212     			if (vomsUserGroup.getLastUpdate().before(cal.getTime()))
213     				sb.append(userGroup.getName() + " " + userGroup.getLastUpdate());
214     		}
215     	}
216     	return sb.toString();
217     }
218     
219     /**
220      * Maps a user to a local account for a given host to a grid identity.
221      * 
222      * @param hostname
223      * @param user
224      * @return
225      */
226     public SiteUser map(String hostname, GridUser user, boolean checkBannedList) throws Exception {
227         if (checkBannedList && isUserBanned(user))
228         	return null;
229         return mapImpl(hostname, user);
230     }
231     
232     /**
233      * Map a local account to a list of grid identity
234      * 
235      * @param accountName
236      * @return
237      */
238     public String mapAccount(String accountName) throws Exception {
239     	TreeSet<String> dns = new TreeSet<String>();
240         Configuration conf = getConfiguration();
241         Iterator<GroupToAccountMapping> g2AMappingsIt = conf.getGroupToAccountMappings().values().iterator();
242         while (g2AMappingsIt.hasNext()) {
243             GroupToAccountMapping g2AMapping = g2AMappingsIt.next();
244             Collection<String> userGroups = getUserGroups(g2AMapping);
245             Iterator<String> userGroupsIt = userGroups.iterator();
246             while (userGroupsIt.hasNext()) {
247             	UserGroup userGroup = conf.getUserGroup( userGroupsIt.next() );
248             	Set<GridUser> users = userGroup.getMembers();
249             	Iterator<GridUser> usersIt = users.iterator();
250             	while (usersIt.hasNext()) {
251             		GridUser user = usersIt.next();
252             		if (isUserBanned(user))
253                     	continue;
254                 	Collection<String> accountMappers = getAccountMappers(g2AMapping);
255                     Iterator<String> accountMappersIt = accountMappers.iterator();
256                     while (accountMappersIt.hasNext()) {
257                     	AccountMapper accountMapper = conf.getAccountMapper( accountMappersIt.next() );
258                 		if (accountName.equals(accountMapper.mapDn(user.getDn(), false)) && !dns.contains(user.getDn()))
259                         	dns.add(user.getDn());
260                     }            		
261             	}
262             }
263         }
264         
265         if (dns.size()==0) {
266             gumsAdminLog.warn("Cannot map account '" + accountName + "' to any DN.");
267         }
268         
269         StringBuffer output = new StringBuffer();
270         Iterator<String> it = dns.iterator();
271         while(it.hasNext()) {
272         	output.append( it.next() );
273         	output.append("\n");
274         }
275 
276 		gumsAdminLog.info("Mapped the account '" + accountName + "' to '" + output.toString() + "'");
277         return output.toString();
278     }
279     
280     /**
281      * @param hostname
282      * @return
283      */
284     private String generateFqanMapfileForH2GMapping(HostToGroupMapping hToGMapping, boolean getAssignments) throws Exception {   
285         StringBuffer fqanMapfileBuffer = new StringBuffer("");
286       	
287         if (hToGMapping != null) {
288            	Configuration conf = hToGMapping.getConfiguration();
289 	       	Iterator<String> iter = getGroupToAccountMappings(hToGMapping).iterator();
290 	        while (iter.hasNext()) {
291 	            GroupToAccountMapping gMap = (GroupToAccountMapping)conf.getGroupToAccountMapping( iter.next() );
292 	            fqanMapfileBuffer.append(generateFqanMapfileForG2AMapping(conf, gMap, getAssignments));
293 	        }
294         }
295         else {
296         	Configuration conf = getConfiguration();
297 	       	Iterator<GroupToAccountMapping> iter = conf.getGroupToAccountMappings().values().iterator();
298 	        while (iter.hasNext()) {
299 	            GroupToAccountMapping gMap = iter.next();
300 	            fqanMapfileBuffer.append(generateFqanMapfileForG2AMapping(conf, gMap, getAssignments));
301 	        }
302         }
303         
304         return fqanMapfileBuffer.toString();
305     }    
306     
307     private String generateFqanMapfileForG2AMapping(Configuration conf, GroupToAccountMapping gMap, boolean getAssignments) {
308         StringBuffer fqanMapfileBuffer = new StringBuffer("");
309         Collection<String> userGroups = getUserGroups(gMap);
310         Iterator<String> userGroupIt = userGroups.iterator();
311         while (userGroupIt.hasNext()) {
312         	UserGroup userGroup = conf.getUserGroup( userGroupIt.next() );
313         	if (userGroup instanceof VOMSUserGroup) {
314         		VOMSUserGroup vomsUserGroup = (VOMSUserGroup)userGroup;
315         		Collection<String> accountMappers = getAccountMappers(gMap);
316                 Iterator<String> accountMapperIt = accountMappers.iterator();
317                 while (accountMapperIt.hasNext()) {
318                 	AccountMapper accountMapper = conf.getAccountMapper( accountMapperIt.next() );
319                 	if (accountMapper instanceof GroupAccountMapper || accountMapper instanceof AccountPoolMapper) {
320                 		String fqan = vomsUserGroup.getVoGroup() + (vomsUserGroup.getRole().equals("") ? "" : "/Role=" + vomsUserGroup.getRole());
321                     	String account = null;
322                        	if (accountMapper instanceof GroupAccountMapper) {
323                     		GroupAccountMapper groupPoolMapper = (GroupAccountMapper)accountMapper;
324                     		account = groupPoolMapper.getAccountName();
325                     	}
326                     	else if (accountMapper instanceof AccountPoolMapper){
327                     		if (getAssignments)
328                     			account = ((AccountPoolMapper)accountMapper).getAssignments();
329                     		else {
330 	                    		String accountPool = ((AccountPoolMapper)accountMapper).getAccountPool();
331 	                    		account = accountPool + "0-"+accountPool+"0(0/0)";
332                     		}
333                     	}
334                        	if (account != null) {
335                        		fqanMapfileBuffer.append('"');
336                        		fqanMapfileBuffer.append( fqan );
337                        		fqanMapfileBuffer.append('"');
338                        		fqanMapfileBuffer.append(' ');
339                        		fqanMapfileBuffer.append( account );
340                        		fqanMapfileBuffer.append("\n");
341                        		break;
342                        	}
343                 	}
344                 }
345         	}
346         }
347         return fqanMapfileBuffer.toString();
348     }
349     
350     private String generateGridMapfile(HostToGroupMapping hToGMapping, boolean createNewMappings, boolean includeFQAN, boolean includeEmail) throws Exception {
351     	Configuration conf = hToGMapping.getConfiguration();
352         Iterator<String> iter = getGroupToAccountMappings(hToGMapping).iterator();
353         TreeSet<String> usersInMap = new TreeSet<String>();
354         
355         StringBuffer gridMapfileBuffer = new StringBuffer("");
356         while (iter.hasNext()) {
357             GroupToAccountMapping gMap = (GroupToAccountMapping) conf.getGroupToAccountMapping( (String)iter.next() );
358             Collection<String> userGroups = getUserGroups(gMap);
359             Iterator<String> userGroupIt = userGroups.iterator();
360             while (userGroupIt.hasNext()) {
361             	UserGroup userGroup = conf.getUserGroup( userGroupIt.next() );
362 	            Set<GridUser> members = new TreeSet<GridUser>(retrieveUserComparatorByDN());
363 	            members.addAll(userGroup.getMembers());
364 	            gridMapfileBuffer.append("#---- members of vo: " + userGroup.getName() + " ----#\n");
365 	            Iterator<GridUser> memberIter = members.iterator();
366 	            if (includeFQAN) {
367 		            while (memberIter.hasNext()) {
368 		                GridUser user = memberIter.next();
369 		                if (isUserBanned(user))
370 	                    	continue;
371 	                    String fqan = user.getFqan()!=null ? user.getFqan() : "";
372 	                    String email = user.getEmail()!=null?user.getEmail().toString():"";
373 		                if ( !usersInMap.contains(user.getDn() + fqan) ) {
374 		                	Collection<String> accountMappers = getAccountMappers(gMap);
375 		                    Iterator<String> accountMappersIt = accountMappers.iterator();
376 		                    while (accountMappersIt.hasNext()) {
377 		                    	AccountMapper accountMapper = conf.getAccountMapper( accountMappersIt.next() );
378 			                	SiteUser siteUser = accountMapper.mapDn(user.getDn(), true);
379 			                	if (siteUser!=null && siteUser.getAccount()!=null) {
380 			                        gridMapfileBuffer.append('"');
381 			                        gridMapfileBuffer.append( user.getDn() );
382 			                        gridMapfileBuffer.append('"' );
383 			                        gridMapfileBuffer.append(" \"");
384 			                        gridMapfileBuffer.append( fqan );
385 			                        gridMapfileBuffer.append('"');         	
386 			                        gridMapfileBuffer.append(' ');
387 			                        gridMapfileBuffer.append( siteUser.getAccount() );
388 			                        if (includeEmail) {
389 				                        gridMapfileBuffer.append(' ');
390 				                        gridMapfileBuffer.append( email );
391 			                        }
392 			                        gridMapfileBuffer.append("\n");
393 		                        	usersInMap.add( user.getDn() + fqan );
394 		                        	break;
395 			                    } else {
396 			                    	gumsAdminLog.debug("User " + user + " from group " + gMap.getUserGroups() + " can't be mapped.");
397 			                    }
398 		                    }
399 		            	}
400 		            }
401 	            }
402 	            else {
403 		            while (memberIter.hasNext()) {
404 		                GridUser user = (GridUser) memberIter.next();
405 		                if (isUserBanned(user))
406 	                    	continue;
407 		                String email = user.getEmail()!=null?user.getEmail().toString():"";
408 		                if (!usersInMap.contains(user.getDn()) && userGroup.isMember(new GridUser(user.getDn()))) {
409 		                	Collection<String> accountMappers = getAccountMappers(gMap);
410 		                    Iterator<String> accountMappersIt = accountMappers.iterator();
411 		                    while (accountMappersIt.hasNext()) {
412 		                    	AccountMapper accountMapper = conf.getAccountMapper( accountMappersIt.next() );
413 			                	SiteUser siteUser = accountMapper.mapDn(user.getDn(), true);
414 			                    if (siteUser!=null && siteUser.getAccount()!=null) {
415 			                        gridMapfileBuffer.append('"');
416 			                        gridMapfileBuffer.append( user.getDn() );
417 			                        gridMapfileBuffer.append('"' );
418 			                        gridMapfileBuffer.append(' ');
419 			                        gridMapfileBuffer.append( siteUser.getAccount() );
420 			                        if (includeEmail && email!=null) {
421 				                        gridMapfileBuffer.append(' ');
422 				                        gridMapfileBuffer.append( email );
423 			                        }
424 			                        gridMapfileBuffer.append("\n");
425 		                        	usersInMap.add(user.getDn());
426 		                        	break;
427 			                    } else {
428 			                    	gumsAdminLog.debug("User " + user + " from group " + gMap.getUserGroups() + " can't be mapped.");
429 			                    }
430 		                    }
431 		            	}
432 		            }	            	
433 	            }
434             }
435         }
436 
437         String finalGridmapfile = gridMapfileBuffer.toString();
438         return finalGridmapfile;
439     }
440  
441     private String generateFqanMapfileImpl(String hostname, boolean getAssignments) throws Exception {
442         String mapfile = null;
443         if (hostname != null) {
444 	    	Configuration conf = getConfiguration();
445 	        HostToGroupMapping host2GroupMapper = hostToGroupMapping(conf, hostname);
446 	        if (host2GroupMapper == null) {
447 	        	String message = "Cannot generate FQAN mapfile for host '" + hostname + "' - it is not defined in any host to group mapping.";
448 	            gumsAdminLog.warn(message);
449 	        	throw new RuntimeException(message);
450 	        }
451 	        mapfile = generateFqanMapfileForH2GMapping(host2GroupMapper, getAssignments);
452         }
453         else
454         	mapfile = generateFqanMapfileForH2GMapping(null, getAssignments);
455         return mapfile;
456     }
457     
458     private String generateGridMapfileImpl(String hostname, boolean createNewMappings, boolean includeFqan, boolean includeEmail) throws Exception {
459     	Configuration conf = getConfiguration();
460         HostToGroupMapping host2GroupMapper = hostToGroupMapping(conf, hostname);
461         if (host2GroupMapper == null) {
462         	String message = "Cannot generate grid mapfile for host '" + hostname + "' - it is not defined in any host to group mapping.";
463             gumsAdminLog.warn(message);
464         	throw new RuntimeException(message);
465         }
466         String mapfile = generateGridMapfile(host2GroupMapper, createNewMappings, includeFqan, includeEmail);
467         return mapfile;
468     }
469     
470     private Configuration getConfiguration() throws Exception {
471     	if (conf != null)
472     		return conf;
473     	else
474     		return GUMS.getSingletonGums().getConfiguration();
475     }
476     
477     private HostToGroupMapping hostToGroupMapping(Configuration conf, String hostname) {
478     	Collection<HostToGroupMapping> hostToGroupMappers = conf.getHostToGroupMappings();
479     	Iterator<HostToGroupMapping> it = hostToGroupMappers.iterator();
480         while (it.hasNext()) {
481             HostToGroupMapping hostToGroupMapper = it.next();
482             if (hostToGroupMapper.isInGroup(hostname)) {
483                 return hostToGroupMapper;
484             }
485         }
486         return null;
487     }
488 
489     private SiteUser mapImpl(String hostname, GridUser user) throws Exception {
490     	Configuration conf = getConfiguration();
491         HostToGroupMapping host2GroupMapper = hostToGroupMapping(conf, hostname);
492         if (host2GroupMapper == null) {
493         	String message = "Cannot map user for host '" + hostname + "' - it is not defined in any host to group mapping.";
494             gumsAdminLog.warn(message);
495         	throw new RuntimeException(message);
496         }
497         Iterator<String> g2AMappingsIt = getGroupToAccountMappings(host2GroupMapper).iterator();
498         while (g2AMappingsIt.hasNext()) {
499             GroupToAccountMapping g2AMapping = conf.getGroupToAccountMapping( g2AMappingsIt.next() );
500             Collection<String> userGroups = getUserGroups(g2AMapping);
501             Iterator<String> userGroupsIt = userGroups.iterator();
502             while (userGroupsIt.hasNext()) {
503             	UserGroup userGroup = conf.getUserGroup( userGroupsIt.next() );
504                 if (userGroup.isMember(user)) {
505                 	Collection<String> accountMappers = getAccountMappers(g2AMapping);
506                     Iterator<String> accountMappersIt = accountMappers.iterator();
507                     while (accountMappersIt.hasNext()) {
508                     	AccountMapper accountMapper = conf.getAccountMapper( accountMappersIt.next() );
509                         SiteUser siteUser = accountMapper.mapDn(user.getDn(), true);
510                         if (siteUser!=null && siteUser.getAccount()!=null)
511                             return siteUser;
512                     }
513                 }
514             }
515         }
516         return null;
517     }
518 
519 	public void removeAccountRange(String accountPoolMapperName, String range) throws Exception {
520 		AccountMapper accountMapper = getConfiguration().getAccountMapper(accountPoolMapperName);
521 		if (accountMapper==null)
522 			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' does not exist");
523 		if (!(accountMapper instanceof AccountPoolMapper))
524 			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' is not an account pool mapper");
525 		AccountPoolMapper accountPoolMapper = (AccountPoolMapper)accountMapper;
526 
527 		String firstAccount = range.substring(0, range.indexOf('-'));
528 		String lastAccountN = range.substring(range.indexOf('-') + 1);
529 		String firstAccountN = firstAccount.substring(firstAccount.length() - lastAccountN.length());
530 		//String accountBase = firstAccount.substring(0, firstAccount.length() - lastAccountN.length());
531 		int nFirstAccount = Integer.parseInt(firstAccountN);
532 		int nLastAccount = Integer.parseInt(lastAccountN);
533 
534 		StringBuffer last = new StringBuffer(firstAccount);
535 		String nLastAccountString = Integer.toString(nLastAccount);
536 		last.replace(firstAccount.length() - nLastAccountString.length(), firstAccount.length(), nLastAccountString);
537 
538 		StringBuffer buf = new StringBuffer(firstAccount);
539 		int len = firstAccount.length();
540 		for (int account = nFirstAccount; account <= nLastAccount; account++) {
541 			String nAccount = Integer.toString(account);
542 			buf.replace(len - nAccount.length(), len, nAccount);
543 			accountPoolMapper.removeMapping(new SiteUser(buf.toString()));
544 		}
545 	}
546     
547     private Comparator<GridUser> retrieveUserComparatorByDN() {
548         return new Comparator<GridUser>() {
549             public int compare(GridUser u1, GridUser u2) {
550                 GridUser user1 = u1;
551                 GridUser user2 = u2;
552                 return user1.compareDn(user2);
553             }
554         };
555     }
556     
557 	public void unassignAccountRange(String accountPoolMapperName, String range) throws Exception {
558 		AccountMapper accountMapper = getConfiguration().getAccountMapper(accountPoolMapperName);
559 		if (accountMapper==null)
560 			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' does not exist");
561 		if (!(accountMapper instanceof AccountPoolMapper))
562 			throw new RuntimeException("Account Mapper '" + accountPoolMapperName + "' is not an account pool mapper");
563 		AccountPoolMapper accountPoolMapper = (AccountPoolMapper)accountMapper;
564 		
565 		String firstAccount = range.substring(0, range.indexOf('-'));
566 		String lastAccountN = range.substring(range.indexOf('-') + 1);
567 		String firstAccountN = firstAccount.substring(firstAccount.length() - lastAccountN.length());
568 		//String accountBase = firstAccount.substring(0, firstAccount.length() - lastAccountN.length());
569 		int nFirstAccount = Integer.parseInt(firstAccountN);
570 		int nLastAccount = Integer.parseInt(lastAccountN);
571 
572 		StringBuffer last = new StringBuffer(firstAccount);
573 		String nLastAccountString = Integer.toString(nLastAccount);
574 		last.replace(firstAccount.length() - nLastAccountString.length(), firstAccount.length(), nLastAccountString);
575 
576 		StringBuffer buf = new StringBuffer(firstAccount);
577 		int len = firstAccount.length();
578 		for (int account = nFirstAccount; account <= nLastAccount; account++) {
579 			String nAccount = Integer.toString(account);
580 			buf.replace(len - nAccount.length(), len, nAccount);
581 			accountPoolMapper.createMapping(null, new SiteUser(buf.toString()));
582 		}
583 	}
584 
585     
586 	public static void main(String args[]) {
587 		if (args.length < 2) {
588 			System.out.println("Must specify arguments: {configuration path} {command} {argument1} ...");
589 			return;
590 		}
591 		
592         // Disable system error output since getBuilderFactory is outputting a bunch of information messages to it
593     	PrintStream errStreamOriginal = System.err;
594     	System.setErr(new PrintStream(new OutputStream() {
595     		public void write(int b) {
596     		}
597     	}));
598     	PrintStream outStreamOriginal = System.out;
599     	System.setOut(new PrintStream(new OutputStream() {
600     		public void write(int b) {
601     		}
602     	}));
603 		
604 		String configurationPath = args[0];
605 		String command = args[1];
606 		String map = "";
607 		try {
608 			FileInputStream fileInputStream = new FileInputStream(configurationPath);
609 			try {
610 				StringBuffer configBuffer = new StringBuffer();
611 				int ch;
612 				while ((ch = fileInputStream.read()) != -1)
613 					configBuffer.append((char)ch);
614 				Configuration conf = ConfigurationToolkit.parseConfiguration(configBuffer.toString(), false);
615 				CoreLogic coreLogic = new CoreLogic(conf);
616 				if (command.equals("generateFqanMapfile")) {
617 					if (args.length == 3)
618 						map = coreLogic.generateFqanMapfile(args[2], false);
619 					else
620 						map = coreLogic.generateFqanMapfileImpl(null, false);
621 				}
622 				else
623 					System.out.println("Command '" + command + "' not supported");
624 			} finally {
625 				fileInputStream.close();
626 			}
627 		} catch (Exception e) {
628 			System.setErr(errStreamOriginal);
629 			System.setOut(outStreamOriginal);
630 		 	System.out.println(e.getMessage());
631 		 	System.exit(1);
632 		} 
633 		
634 		System.setErr(errStreamOriginal);
635 		System.setOut(outStreamOriginal);
636 		
637 		System.out.println(map);
638 	}
639 	
640 	protected List<String> getUserGroups(GroupToAccountMapping g2aMapping) {
641 		return StringUtil.toList(g2aMapping.getUserGroups());
642 	}
643 	
644 	protected List<String> getAccountMappers(GroupToAccountMapping g2aMapping) {
645 		return StringUtil.toList(g2aMapping.getAccountMappers());
646 	}
647 	
648 	protected List<String> getGroupToAccountMappings(HostToGroupMapping h2gMapping) {
649 		return StringUtil.toList(h2gMapping.getGroupToAccountMappings());
650 	}
651 }