|
@@ -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)
|
|
|
+ }
|
|
|
+
|
|
|
}
|