diff options
Diffstat (limited to 'nslcd_server/func_handlerequest.go')
-rw-r--r-- | nslcd_server/func_handlerequest.go | 1751 |
1 files changed, 1751 insertions, 0 deletions
diff --git a/nslcd_server/func_handlerequest.go b/nslcd_server/func_handlerequest.go new file mode 100644 index 0000000..ce3061a --- /dev/null +++ b/nslcd_server/func_handlerequest.go @@ -0,0 +1,1751 @@ +// ./func_handlerequest.go.gen requests.txt +// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT + +package nslcd_server + +import ( + "context" + "fmt" + "io" + "time" + + p "git.lukeshu.com/go/libnslcd/nslcd_proto" +) + +const sensitive = "<omitted-from-log>" + +func maybePanic(err error) { + if err != nil { + panic(err) + } +} + +type Limits struct { + // What is the maximum total amount of time that we spend + // handling a single request. This includes both the time + // reading the request and the time creating and writing the + // response. + Timeout time.Duration + + // How long can we spend reading a request? + ReadTimeout time.Duration + + // How long can we spend writing a response? + WriteTimeout time.Duration + + // What is the maximum request length in bytes that we are + // willing to handle? + RequestMaxSize int64 +} + +type Conn interface { + // This is a subset of net.Conn; semantics are the same. + + Read(b []byte) (n int, err error) + Write(b []byte) (n int, err error) + SetDeadline(t time.Time) error + SetReadDeadline(t time.Time) error + SetWriteDeadline(t time.Time) error +} + +// Handle a request to nslcd. The caller is responsible for +// initializing the context with PeerCredKey. +func HandleRequest(backend Backend, limits Limits, conn Conn, ctx context.Context) (err error) { + defer func() { + if r := recover(); r != nil { + switch r := r.(type) { + case p.NslcdError: + err = r + default: + panic(r) + } + } + }() + + now := time.Now() + deadlineAll := time.Time{} + deadlineRead := time.Time{} + if limits.Timeout != 0 { + deadlineAll = now.Add(limits.Timeout) + } + if deadline, ok := ctx.Deadline(); ok { + if deadlineAll.IsZero() || deadline.Before(deadlineAll) { + deadlineAll = deadline + } + } + if limits.ReadTimeout != 0 { + deadlineRead = now.Add(limits.ReadTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineRead) { + deadlineRead = deadlineAll + } + } + deadlineWrite := deadlineAll + if !deadlineRead.IsZero() { + err = conn.SetReadDeadline(deadlineRead) + if err != nil { + return err + } + } + + log := LoggerFromContext(ctx) + + var in io.Reader = conn + if limits.RequestMaxSize > 0 { + in = &io.LimitedReader{R: in, N: limits.RequestMaxSize} + } + out := conn + + var version int32 + maybePanic(p.Read(in, &version)) + if version != p.NSLCD_VERSION { + return p.NslcdError(fmt.Sprintf("Version mismatch: server=%#08x client=%#08x", p.NSLCD_VERSION, version)) + } + var action int32 + maybePanic(p.Read(in, &action)) + + switch action { + case p.NSLCD_ACTION_CONFIG_GET: + var req p.Request_Config_Get + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Config_Get(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_ALIAS_BYNAME: + var req p.Request_Alias_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Alias_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_ALIAS_ALL: + var req p.Request_Alias_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Alias_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_ETHER_BYNAME: + var req p.Request_Ether_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Ether_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_ETHER_BYETHER: + var req p.Request_Ether_ByEther + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Ether_ByEther(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_ETHER_ALL: + var req p.Request_Ether_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Ether_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_GROUP_BYNAME: + var req p.Request_Group_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Group_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_GROUP_BYGID: + var req p.Request_Group_ByGid + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Group_ByGid(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_GROUP_BYMEMBER: + var req p.Request_Group_ByMember + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Group_ByMember(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_GROUP_ALL: + var req p.Request_Group_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Group_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_HOST_BYNAME: + var req p.Request_Host_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Host_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_HOST_BYADDR: + var req p.Request_Host_ByAddr + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Host_ByAddr(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_HOST_ALL: + var req p.Request_Host_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Host_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_NETGROUP_BYNAME: + var req p.Request_Netgroup_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Netgroup_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_NETGROUP_ALL: + var req p.Request_Netgroup_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Netgroup_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_NETWORK_BYNAME: + var req p.Request_Network_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Network_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_NETWORK_BYADDR: + var req p.Request_Network_ByAddr + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Network_ByAddr(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_NETWORK_ALL: + var req p.Request_Network_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Network_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PASSWD_BYNAME: + var req p.Request_Passwd_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Passwd_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PASSWD_BYUID: + var req p.Request_Passwd_ByUID + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Passwd_ByUID(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PASSWD_ALL: + var req p.Request_Passwd_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Passwd_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PROTOCOL_BYNAME: + var req p.Request_Protocol_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Protocol_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PROTOCOL_BYNUMBER: + var req p.Request_Protocol_ByNumber + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Protocol_ByNumber(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PROTOCOL_ALL: + var req p.Request_Protocol_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Protocol_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_RPC_BYNAME: + var req p.Request_RPC_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.RPC_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_RPC_BYNUMBER: + var req p.Request_RPC_ByNumber + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.RPC_ByNumber(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_RPC_ALL: + var req p.Request_RPC_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.RPC_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_SERVICE_BYNAME: + var req p.Request_Service_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Service_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_SERVICE_BYNUMBER: + var req p.Request_Service_ByNumber + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Service_ByNumber(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_SERVICE_ALL: + var req p.Request_Service_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Service_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_SHADOW_BYNAME: + var req p.Request_Shadow_ByName + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Shadow_ByName(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_SHADOW_ALL: + var req p.Request_Shadow_All + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.Shadow_All(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PAM_AUTHENTICATION: + var req p.Request_PAM_Authentication + maybePanic(p.Read(in, &req)) + _req := req + _req.Password = sensitive + log.Info(fmt.Sprintf("Request: %#v\n", _req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.PAM_Authentication(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PAM_AUTHORIZATION: + var req p.Request_PAM_Authorization + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.PAM_Authorization(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PAM_SESSIONOPEN: + var req p.Request_PAM_SessionOpen + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.PAM_SessionOpen(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PAM_SESSIONCLOSE: + var req p.Request_PAM_SessionClose + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.PAM_SessionClose(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_PAM_PWMOD: + var req p.Request_PAM_PwMod + maybePanic(p.Read(in, &req)) + _req := req + if len(_req.OldPassword) > 0 { + _req.OldPassword = sensitive + } + _req.NewPassword = sensitive + log.Info(fmt.Sprintf("Request: %#v", _req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.PAM_PwMod(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + case p.NSLCD_ACTION_USERMOD: + var req p.Request_UserMod + maybePanic(p.Read(in, &req)) + log.Info(fmt.Sprintf("Request: %#v", req)) + + if limits.WriteTimeout != 0 { + deadlineWrite = time.Now().Add(limits.WriteTimeout) + if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { + deadlineWrite = deadlineAll + } + } + if !deadlineWrite.IsZero() { + err = out.SetWriteDeadline(deadlineWrite) + if err != nil { + return err + } + } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + + maybePanic(p.Write(out, p.NSLCD_VERSION)) + maybePanic(p.Write(out, action)) + ch := backend.UserMod(ctx, req) + n := 0 + for result := range ch { + if err == nil { + err = p.Write(out, p.NSLCD_RESULT_BEGIN) + } + if err == nil { + err = p.Write(out, result) + } + n++ + log.Info(fmt.Sprintf("Wrote %d results / err = %v", n, err)) + } + maybePanic(err) + maybePanic(p.Write(out, p.NSLCD_RESULT_END)) + return ctx.Err() // probably nil + default: + return p.NslcdError(fmt.Sprintf("Unknown request action: %#08x", action)) + } +} |