summaryrefslogtreecommitdiff
path: root/nslcd_server/func_handlerequest.go
diff options
context:
space:
mode:
Diffstat (limited to 'nslcd_server/func_handlerequest.go')
-rw-r--r--nslcd_server/func_handlerequest.go1751
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))
+ }
+}