summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--go.mod9
-rw-r--r--go.sum6
-rwxr-xr-xmake-release60
-rw-r--r--nslcd_server/.gitignore4
-rw-r--r--nslcd_server/func_handlerequest.go1751
-rw-r--r--nslcd_server/interface_backend.go55
-rw-r--r--nslcd_server/requests.txt38
-rw-r--r--nslcd_server/type_nilbackend.go209
8 files changed, 2128 insertions, 4 deletions
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..d528c32
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,9 @@
+module git.lukeshu.com/go/libnslcd
+
+go 1.17
+
+require (
+ git.lukeshu.com/go/libgnulinux v0.0.0-20170114074148-b2bae3c73817
+ git.lukeshu.com/go/libsystemd v0.5.3
+ golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf
+)
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..9bc7553
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,6 @@
+git.lukeshu.com/go/libgnulinux v0.0.0-20170114074148-b2bae3c73817 h1:QmB//pm4GcjYcuy/8PQUSaT08UwP0xsZ5X9RrFYfIcg=
+git.lukeshu.com/go/libgnulinux v0.0.0-20170114074148-b2bae3c73817/go.mod h1:CVvoUmCtgX1FQn/gha4laT330Wv+rrP2iwb6zxy0RL4=
+git.lukeshu.com/go/libsystemd v0.5.3 h1:491FbFw6FUXF449cVOYtrv7p7sJRSKNldLbOU7Ajvgc=
+git.lukeshu.com/go/libsystemd v0.5.3/go.mod h1:FfDoP0i92r4p5Vn4NCLxvjkd7rCOe6otPa4L6hZg9WM=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf h1:2ucpDCmfkl8Bd/FsLtiD653Wf96cW37s+iGx93zsu4k=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
diff --git a/make-release b/make-release
new file mode 100755
index 0000000..fabfd02
--- /dev/null
+++ b/make-release
@@ -0,0 +1,60 @@
+#!/usr/bin/env bash
+# Copyright 2016-2018 Luke Shumaker
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+set -e
+
+branch=$(git name-rev --name-only HEAD)
+if [[ $branch == master ]]; then
+ gitdir="$(git rev-parse --git-dir)"
+ workdir="${gitdir}/release"
+ exec 8>"${workdir}.lock"
+ flock 8
+
+ rm -rf -- "$workdir"
+ git worktree prune
+ git branch -D release.tmp &>/dev/null || true
+
+ unset GIT_INDEX_FILE
+ git worktree add -b release.tmp "${gitdir}/release" master
+ (
+ unset GIT_DIR GIT_WORK_TREE
+ cd "$workdir"
+
+ go generate ./...
+ git ls-files -z '*/.gitignore' | xargs -0r rm -f --
+
+ git add .
+ git commit -m "Generate artifacts"
+
+ git checkout release # Ensure it exists locally
+ git pull --no-edit -s ours # Avoid conflicts
+
+ # What we want is
+ #
+ # git merge --no-edit -s theirs release.tmp
+ #
+ # Unfortunately, there is no 'theirs' strategy; so we
+ # have to switch branches and do it backward with the
+ # 'ours' strategry, switch back, then merge the merge
+ # commit.
+ git checkout release.tmp
+ git merge --no-edit -s ours release
+ git checkout release
+ git merge release.tmp
+
+ git branch -d release.tmp
+ )
+ rm -rf -- "$workdir"
+ git worktree prune
+fi
diff --git a/nslcd_server/.gitignore b/nslcd_server/.gitignore
deleted file mode 100644
index 8a2b4eb..0000000
--- a/nslcd_server/.gitignore
+++ /dev/null
@@ -1,4 +0,0 @@
-/func_handlerequest.go
-/interface_backend.go
-/type_nilbackend.go
-/requests.txt
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))
+ }
+}
diff --git a/nslcd_server/interface_backend.go b/nslcd_server/interface_backend.go
new file mode 100644
index 0000000..de9b99a
--- /dev/null
+++ b/nslcd_server/interface_backend.go
@@ -0,0 +1,55 @@
+// ./interface_backend.go.gen requests.txt
+// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+
+package nslcd_server
+
+import (
+ "context"
+
+ p "git.lukeshu.com/go/libnslcd/nslcd_proto"
+)
+
+// The Backend interface allows the backend store to be implemented
+// separately from the protocol implementation. Each request type
+// that the nslcd server may reply to is implemented simply as a
+// method that returns a channel of the resulting values.
+type Backend interface {
+ Config_Get(context.Context, p.Request_Config_Get) <-chan p.Config
+ Alias_ByName(context.Context, p.Request_Alias_ByName) <-chan p.Alias
+ Alias_All(context.Context, p.Request_Alias_All) <-chan p.Alias
+ Ether_ByName(context.Context, p.Request_Ether_ByName) <-chan p.Ether
+ Ether_ByEther(context.Context, p.Request_Ether_ByEther) <-chan p.Ether
+ Ether_All(context.Context, p.Request_Ether_All) <-chan p.Ether
+ Group_ByName(context.Context, p.Request_Group_ByName) <-chan p.Group
+ Group_ByGid(context.Context, p.Request_Group_ByGid) <-chan p.Group
+ Group_ByMember(context.Context, p.Request_Group_ByMember) <-chan p.Group
+ Group_All(context.Context, p.Request_Group_All) <-chan p.Group
+ Host_ByName(context.Context, p.Request_Host_ByName) <-chan p.Host
+ Host_ByAddr(context.Context, p.Request_Host_ByAddr) <-chan p.Host
+ Host_All(context.Context, p.Request_Host_All) <-chan p.Host
+ Netgroup_ByName(context.Context, p.Request_Netgroup_ByName) <-chan p.Netgroup
+ Netgroup_All(context.Context, p.Request_Netgroup_All) <-chan p.Netgroup
+ Network_ByName(context.Context, p.Request_Network_ByName) <-chan p.Network
+ Network_ByAddr(context.Context, p.Request_Network_ByAddr) <-chan p.Network
+ Network_All(context.Context, p.Request_Network_All) <-chan p.Network
+ Passwd_ByName(context.Context, p.Request_Passwd_ByName) <-chan p.Passwd
+ Passwd_ByUID(context.Context, p.Request_Passwd_ByUID) <-chan p.Passwd
+ Passwd_All(context.Context, p.Request_Passwd_All) <-chan p.Passwd
+ Protocol_ByName(context.Context, p.Request_Protocol_ByName) <-chan p.Protocol
+ Protocol_ByNumber(context.Context, p.Request_Protocol_ByNumber) <-chan p.Protocol
+ Protocol_All(context.Context, p.Request_Protocol_All) <-chan p.Protocol
+ RPC_ByName(context.Context, p.Request_RPC_ByName) <-chan p.RPC
+ RPC_ByNumber(context.Context, p.Request_RPC_ByNumber) <-chan p.RPC
+ RPC_All(context.Context, p.Request_RPC_All) <-chan p.RPC
+ Service_ByName(context.Context, p.Request_Service_ByName) <-chan p.Service
+ Service_ByNumber(context.Context, p.Request_Service_ByNumber) <-chan p.Service
+ Service_All(context.Context, p.Request_Service_All) <-chan p.Service
+ Shadow_ByName(context.Context, p.Request_Shadow_ByName) <-chan p.Shadow
+ Shadow_All(context.Context, p.Request_Shadow_All) <-chan p.Shadow
+ UserMod(context.Context, p.Request_UserMod) <-chan p.UserMod
+ PAM_Authentication(context.Context, p.Request_PAM_Authentication) <-chan p.PAM_Authentication
+ PAM_Authorization(context.Context, p.Request_PAM_Authorization) <-chan p.PAM_Authorization
+ PAM_SessionOpen(context.Context, p.Request_PAM_SessionOpen) <-chan p.PAM_SessionOpen
+ PAM_SessionClose(context.Context, p.Request_PAM_SessionClose) <-chan p.PAM_SessionClose
+ PAM_PwMod(context.Context, p.Request_PAM_PwMod) <-chan p.PAM_PwMod
+}
diff --git a/nslcd_server/requests.txt b/nslcd_server/requests.txt
new file mode 100644
index 0000000..e5c3ada
--- /dev/null
+++ b/nslcd_server/requests.txt
@@ -0,0 +1,38 @@
+Config_Get
+Alias_ByName
+Alias_All
+Ether_ByName
+Ether_ByEther
+Ether_All
+Group_ByName
+Group_ByGid
+Group_ByMember
+Group_All
+Host_ByName
+Host_ByAddr
+Host_All
+Netgroup_ByName
+Netgroup_All
+Network_ByName
+Network_ByAddr
+Network_All
+Passwd_ByName
+Passwd_ByUID
+Passwd_All
+Protocol_ByName
+Protocol_ByNumber
+Protocol_All
+RPC_ByName
+RPC_ByNumber
+RPC_All
+Service_ByName
+Service_ByNumber
+Service_All
+Shadow_ByName
+Shadow_All
+PAM_Authentication
+PAM_Authorization
+PAM_SessionOpen
+PAM_SessionClose
+PAM_PwMod
+UserMod
diff --git a/nslcd_server/type_nilbackend.go b/nslcd_server/type_nilbackend.go
new file mode 100644
index 0000000..208b62f
--- /dev/null
+++ b/nslcd_server/type_nilbackend.go
@@ -0,0 +1,209 @@
+// ./type_nilbackend.go.gen interface_backend.go
+// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
+
+package nslcd_server
+
+import (
+ "context"
+
+ p "git.lukeshu.com/go/libnslcd/nslcd_proto"
+)
+
+// NilBackend implements the Backend interface, but only returns empty
+// responses. It is useful to add as an anonymous member of a backend
+// implementation that does not return results for all of the
+// databases.
+type NilBackend struct{}
+
+func (o NilBackend) Config_Get(context.Context, p.Request_Config_Get) <-chan p.Config {
+ r := make(chan p.Config)
+ close(r)
+ return r
+}
+func (o NilBackend) Alias_ByName(context.Context, p.Request_Alias_ByName) <-chan p.Alias {
+ r := make(chan p.Alias)
+ close(r)
+ return r
+}
+func (o NilBackend) Alias_All(context.Context, p.Request_Alias_All) <-chan p.Alias {
+ r := make(chan p.Alias)
+ close(r)
+ return r
+}
+func (o NilBackend) Ether_ByName(context.Context, p.Request_Ether_ByName) <-chan p.Ether {
+ r := make(chan p.Ether)
+ close(r)
+ return r
+}
+func (o NilBackend) Ether_ByEther(context.Context, p.Request_Ether_ByEther) <-chan p.Ether {
+ r := make(chan p.Ether)
+ close(r)
+ return r
+}
+func (o NilBackend) Ether_All(context.Context, p.Request_Ether_All) <-chan p.Ether {
+ r := make(chan p.Ether)
+ close(r)
+ return r
+}
+func (o NilBackend) Group_ByName(context.Context, p.Request_Group_ByName) <-chan p.Group {
+ r := make(chan p.Group)
+ close(r)
+ return r
+}
+func (o NilBackend) Group_ByGid(context.Context, p.Request_Group_ByGid) <-chan p.Group {
+ r := make(chan p.Group)
+ close(r)
+ return r
+}
+func (o NilBackend) Group_ByMember(context.Context, p.Request_Group_ByMember) <-chan p.Group {
+ r := make(chan p.Group)
+ close(r)
+ return r
+}
+func (o NilBackend) Group_All(context.Context, p.Request_Group_All) <-chan p.Group {
+ r := make(chan p.Group)
+ close(r)
+ return r
+}
+func (o NilBackend) Host_ByName(context.Context, p.Request_Host_ByName) <-chan p.Host {
+ r := make(chan p.Host)
+ close(r)
+ return r
+}
+func (o NilBackend) Host_ByAddr(context.Context, p.Request_Host_ByAddr) <-chan p.Host {
+ r := make(chan p.Host)
+ close(r)
+ return r
+}
+func (o NilBackend) Host_All(context.Context, p.Request_Host_All) <-chan p.Host {
+ r := make(chan p.Host)
+ close(r)
+ return r
+}
+func (o NilBackend) Netgroup_ByName(context.Context, p.Request_Netgroup_ByName) <-chan p.Netgroup {
+ r := make(chan p.Netgroup)
+ close(r)
+ return r
+}
+func (o NilBackend) Netgroup_All(context.Context, p.Request_Netgroup_All) <-chan p.Netgroup {
+ r := make(chan p.Netgroup)
+ close(r)
+ return r
+}
+func (o NilBackend) Network_ByName(context.Context, p.Request_Network_ByName) <-chan p.Network {
+ r := make(chan p.Network)
+ close(r)
+ return r
+}
+func (o NilBackend) Network_ByAddr(context.Context, p.Request_Network_ByAddr) <-chan p.Network {
+ r := make(chan p.Network)
+ close(r)
+ return r
+}
+func (o NilBackend) Network_All(context.Context, p.Request_Network_All) <-chan p.Network {
+ r := make(chan p.Network)
+ close(r)
+ return r
+}
+func (o NilBackend) Passwd_ByName(context.Context, p.Request_Passwd_ByName) <-chan p.Passwd {
+ r := make(chan p.Passwd)
+ close(r)
+ return r
+}
+func (o NilBackend) Passwd_ByUID(context.Context, p.Request_Passwd_ByUID) <-chan p.Passwd {
+ r := make(chan p.Passwd)
+ close(r)
+ return r
+}
+func (o NilBackend) Passwd_All(context.Context, p.Request_Passwd_All) <-chan p.Passwd {
+ r := make(chan p.Passwd)
+ close(r)
+ return r
+}
+func (o NilBackend) Protocol_ByName(context.Context, p.Request_Protocol_ByName) <-chan p.Protocol {
+ r := make(chan p.Protocol)
+ close(r)
+ return r
+}
+func (o NilBackend) Protocol_ByNumber(context.Context, p.Request_Protocol_ByNumber) <-chan p.Protocol {
+ r := make(chan p.Protocol)
+ close(r)
+ return r
+}
+func (o NilBackend) Protocol_All(context.Context, p.Request_Protocol_All) <-chan p.Protocol {
+ r := make(chan p.Protocol)
+ close(r)
+ return r
+}
+func (o NilBackend) RPC_ByName(context.Context, p.Request_RPC_ByName) <-chan p.RPC {
+ r := make(chan p.RPC)
+ close(r)
+ return r
+}
+func (o NilBackend) RPC_ByNumber(context.Context, p.Request_RPC_ByNumber) <-chan p.RPC {
+ r := make(chan p.RPC)
+ close(r)
+ return r
+}
+func (o NilBackend) RPC_All(context.Context, p.Request_RPC_All) <-chan p.RPC {
+ r := make(chan p.RPC)
+ close(r)
+ return r
+}
+func (o NilBackend) Service_ByName(context.Context, p.Request_Service_ByName) <-chan p.Service {
+ r := make(chan p.Service)
+ close(r)
+ return r
+}
+func (o NilBackend) Service_ByNumber(context.Context, p.Request_Service_ByNumber) <-chan p.Service {
+ r := make(chan p.Service)
+ close(r)
+ return r
+}
+func (o NilBackend) Service_All(context.Context, p.Request_Service_All) <-chan p.Service {
+ r := make(chan p.Service)
+ close(r)
+ return r
+}
+func (o NilBackend) Shadow_ByName(context.Context, p.Request_Shadow_ByName) <-chan p.Shadow {
+ r := make(chan p.Shadow)
+ close(r)
+ return r
+}
+func (o NilBackend) Shadow_All(context.Context, p.Request_Shadow_All) <-chan p.Shadow {
+ r := make(chan p.Shadow)
+ close(r)
+ return r
+}
+func (o NilBackend) UserMod(context.Context, p.Request_UserMod) <-chan p.UserMod {
+ r := make(chan p.UserMod)
+ close(r)
+ return r
+}
+func (o NilBackend) PAM_Authentication(context.Context, p.Request_PAM_Authentication) <-chan p.PAM_Authentication {
+ r := make(chan p.PAM_Authentication)
+ close(r)
+ return r
+}
+func (o NilBackend) PAM_Authorization(context.Context, p.Request_PAM_Authorization) <-chan p.PAM_Authorization {
+ r := make(chan p.PAM_Authorization)
+ close(r)
+ return r
+}
+func (o NilBackend) PAM_SessionOpen(context.Context, p.Request_PAM_SessionOpen) <-chan p.PAM_SessionOpen {
+ r := make(chan p.PAM_SessionOpen)
+ close(r)
+ return r
+}
+func (o NilBackend) PAM_SessionClose(context.Context, p.Request_PAM_SessionClose) <-chan p.PAM_SessionClose {
+ r := make(chan p.PAM_SessionClose)
+ close(r)
+ return r
+}
+func (o NilBackend) PAM_PwMod(context.Context, p.Request_PAM_PwMod) <-chan p.PAM_PwMod {
+ r := make(chan p.PAM_PwMod)
+ close(r)
+ return r
+}
+
+var _ Backend = NilBackend{}