| 
					
				 | 
			
			
				@@ -66,13 +66,41 @@ func (slice SliceToStringSlicer) Convert() (result []string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type Result struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	Description string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Added   []orm.User 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Updated []orm.User 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	Removed []string 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (result *Result) String() string { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return fmt.Sprintf("[sync] %d added, %d updated, %d removed", result.Added, result.Updated, result.Removed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	output := fmt.Sprintf("\n%s\n", result.Description) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(result.Added) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		output += "\n== ADDED ==\n\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, user := range result.Added { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			output += fmt.Sprintf("* %s\n", user.CompleteName()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(result.Updated) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		output += "\n== UPDATED ==\n\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, user := range result.Updated { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			output += fmt.Sprintf("* %s\n", user.CompleteName()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(result.Removed) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		output += "\n== REMOVED ==\n\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, user := range result.Removed { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			output += fmt.Sprintf("* %s\n", user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(result.Added)*len(result.Updated)*len(result.Removed) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		output += "\n" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	output += fmt.Sprintf("[%d added, %d updated, %d removed]", len(result.Added), len(result.Updated), len(result.Removed)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return output 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type SyncJob struct { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -127,6 +155,8 @@ func (syncJob *SyncJob) SyncUsers(ldapClient *karmen_ldap.Client, karmenClient * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	result := new(Result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	result.Description = "Sync users..." 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, a := range actions { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		switch a.Type { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case slicediff.Remove: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -144,6 +174,9 @@ func (syncJob *SyncJob) SyncUsers(ldapClient *karmen_ldap.Client, karmenClient * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if !user.GetExclude() && user.GetRegenerate() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				result.Updated = append(result.Updated, user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if user.GetExclude() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				result.Removed = append(result.Removed, user.DN()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -240,26 +273,34 @@ func (syncJob *SyncJob) SyncUsers(ldapClient *karmen_ldap.Client, karmenClient * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (syncJob *SyncJob) SyncGroup(ldapClient *karmen_ldap.Client, users []orm.User, groupDN string) (*Result, error) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	var ml bool 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	result := new(Result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	result.Description = fmt.Sprintf("Sync group %s", groupDN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	actions := make(map[string]*slicediff.Action) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	entries, err := ldapClient.GroupMembers(groupDN) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil, err 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	values := entries[0].Attributes[0].Values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	values := make([]string, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if len(entries) > 0 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		values = entries[0].Attributes[0].Values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if strings.Contains(groupDN, "Mailing Lists") { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ml = true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		actions = slicediff.Diff(SliceToStringSlicer(values).Convert, usersToDNConverter(users).Convert) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		actions = slicediff.Diff(SliceToStringSlicer(values).Convert, usersToUsernamesConverter(users).Convert) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	result := new(Result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, a := range actions { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		switch a.Type { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case slicediff.Remove: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			// entry := entries[a.Id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			result.Removed = append(result.Removed, values[a.Id]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		case slicediff.Add: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -267,6 +308,11 @@ func (syncJob *SyncJob) SyncGroup(ldapClient *karmen_ldap.Client, users []orm.Us 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			if !user.GetExclude() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				result.Added = append(result.Added, user) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		case slicediff.Update: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			user := users[a.Id] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			if user.GetExclude() && !ml { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				result.Removed = append(result.Removed, user.Username()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -316,10 +362,10 @@ func (syncJob *SyncJob) Run() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	log.Println("Retrieving Departments...") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// // departments, err := karmenClient.GetDepartments() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// // if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// // 	log.Println(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// // } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	departments, err := karmenClient.GetDepartments() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	users := make([]orm.User, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	for _, teacher := range teachers { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -331,39 +377,36 @@ func (syncJob *SyncJob) Run() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// log.Println("Sync 'Docenti' group...") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// if result, err := syncJob.SyncGroup(ldapClient, users, "cn=Docenti"); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// log.Println("Sync 'Tutti i docenti' ML...") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// if result, err := syncJob.SyncGroup(ldapClient, users, "cn=Tutti i docenti,ou=Mailing Lists"); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// log.Println("Sync Departments and MLs...") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// for _, department := range departments { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	users := make([]orm.User, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	for _, teacher := range department.Teachers { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 		users = append(users, teacher) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	group := fmt.Sprintf("cn=%s,ou=Mailing Lists", department.Name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	if result, err := syncJob.SyncGroup(ldapClient, users, group); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	group = fmt.Sprintf("cn=%s,ou=Dipartimenti", department.Name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	if result, err := syncJob.SyncGroup(ldapClient, users, group); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	// } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if result, err := syncJob.SyncGroup(ldapClient, users, syncJob.conf.Sync.TeachersGroup); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if result, err := syncJob.SyncGroup(ldapClient, users, syncJob.conf.Sync.TeachersML); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	for _, department := range departments { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		users := make([]orm.User, 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		for _, teacher := range department.Teachers { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			users = append(users, teacher) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		group := fmt.Sprintf("cn=%s,ou=Mailing Lists", department.Name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if result, err := syncJob.SyncGroup(ldapClient, users, group); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		group = fmt.Sprintf("cn=%s,ou=Dipartimenti", department.Name) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		if result, err := syncJob.SyncGroup(ldapClient, users, group); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	administratives, err := karmenClient.GetAdministratives() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	if err != nil { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -387,4 +430,10 @@ func (syncJob *SyncJob) Run() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	if result, err := syncJob.SyncGroup(ldapClient, users, syncJob.conf.Sync.AdministrativesGroup); err != nil { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		panic(err) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		log.Println(result) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |