-
Notifications
You must be signed in to change notification settings - Fork 2
/
ldap.go
68 lines (57 loc) · 1.83 KB
/
ldap.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package main
import (
"log"
"time"
"github.com/go-ldap/ldap/v3"
"github.com/spf13/viper"
)
type LdapWorkerConfig struct {
scrapeTime time.Duration
channel chan []*ldap.Entry
logger *log.Logger
}
// NewLdapWorker creates a new LdapWorker instance
func NewLdapWorker(channel chan []*ldap.Entry) *LdapWorkerConfig {
duration := viper.GetDuration("ldap.scrape_time")
return &LdapWorkerConfig{duration, channel, log.New(log.Writer(), "[LDAPWorker] ", log.Ldate|log.Ltime)}
}
func (config *LdapWorkerConfig) Start() {
for {
config.logger.Println("Starting scrape...")
l, err := ldap.DialURL(viper.GetString("ldap.url"))
if err != nil {
config.logger.Printf("Could not connect to LDAP in this cycle: %s \n", err)
time.Sleep(config.scrapeTime)
continue
}
bindDn := viper.GetString("ldap.binddn")
if pw := viper.GetString("ldap.bindpw"); pw != "" {
config.logger.Println("LDAP password set, using authenticated bind.")
err = l.Bind(bindDn, pw)
} else {
config.logger.Println("LDAP password empty, using unauthenticated bind.")
err = l.UnauthenticatedBind(bindDn)
}
if err != nil {
config.logger.Fatalf("Error binding to LDAP: %s \n", err)
}
var ldapAttributes = []string{
viper.GetString("ldap.unique_id_field"),
"givenname",
"sn",
viper.GetString("ldap.phone_field"),
"mail",
viper.GetString("ldap.avatar_field"),
"birthday", "birthmonth", "birthyear",
}
sr := ldap.NewSearchRequest(viper.GetString("ldap.basedn"), ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, 0, 0, false, viper.GetString("ldap.filter"), ldapAttributes, nil)
res, err := l.Search(sr)
if err != nil {
config.logger.Printf("LDAP search failed: %s \n", err)
}
config.logger.Printf("Found %d users.\n", len(res.Entries))
config.channel <- res.Entries
l.Close()
time.Sleep(config.scrapeTime)
}
}