mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
bump(github.com/coreos/go-systemd): 700560af03f8e1df35839041745c9f1fccba7c72
This commit is contained in:
parent
53436af899
commit
04c98d0a75
@ -1,3 +1,8 @@
|
|||||||
# go-systemd
|
# go-systemd
|
||||||
|
|
||||||
Go bindings to systemd socket activation, journal and D-BUS APIs.
|
Go bindings to systemd socket activation, journal and D-BUS APIs.
|
||||||
|
|
||||||
|
## Socket Activation
|
||||||
|
|
||||||
|
See an example in `examples/activation/httpserver.go`. For easy debugging use
|
||||||
|
`/usr/lib/systemd/systemd-activate`
|
||||||
|
@ -29,7 +29,7 @@ func Files(unsetEnv bool) []*os.File {
|
|||||||
if err != nil || nfds == 0 {
|
if err != nil || nfds == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
files := []*os.File(nil)
|
var files []*os.File
|
||||||
for fd := listenFdsStart; fd < listenFdsStart+nfds; fd++ {
|
for fd := listenFdsStart; fd < listenFdsStart+nfds; fd++ {
|
||||||
syscall.CloseOnExec(fd)
|
syscall.CloseOnExec(fd)
|
||||||
files = append(files, os.NewFile(uintptr(fd), "LISTEN_FD_"+strconv.Itoa(fd)))
|
files = append(files, os.NewFile(uintptr(fd), "LISTEN_FD_"+strconv.Itoa(fd)))
|
||||||
|
68
third_party/github.com/coreos/go-systemd/activation/files_test.go
vendored
Normal file
68
third_party/github.com/coreos/go-systemd/activation/files_test.go
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
package activation
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
// correctStringWritten fails the text if the correct string wasn't written
|
||||||
|
// to the other side of the pipe.
|
||||||
|
func correctStringWritten(t *testing.T, r *os.File, expected string) bool {
|
||||||
|
bytes := make([]byte, len(expected))
|
||||||
|
io.ReadAtLeast(r, bytes, len(expected))
|
||||||
|
|
||||||
|
if string(bytes) != expected {
|
||||||
|
t.Fatalf("Unexpected string %s", string(bytes))
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// TestActivation forks out a copy of activation.go example and reads back two
|
||||||
|
// strings from the pipes that are passed in.
|
||||||
|
func TestActivation(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "run", "../examples/activation/activation.go")
|
||||||
|
|
||||||
|
r1, w1, _ := os.Pipe()
|
||||||
|
r2, w2, _ := os.Pipe()
|
||||||
|
cmd.ExtraFiles = []*os.File{
|
||||||
|
w1,
|
||||||
|
w2,
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Env = os.Environ()
|
||||||
|
cmd.Env = append(cmd.Env, "LISTEN_FDS=2", "FIX_LISTEN_PID=1")
|
||||||
|
|
||||||
|
err := cmd.Run()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf(err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
correctStringWritten(t, r1, "Hello world")
|
||||||
|
correctStringWritten(t, r2, "Goodbye world")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestActivationNoFix(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "run", "../examples/activation/activation.go")
|
||||||
|
cmd.Env = os.Environ()
|
||||||
|
cmd.Env = append(cmd.Env, "LISTEN_FDS=2")
|
||||||
|
|
||||||
|
out, _ := cmd.CombinedOutput()
|
||||||
|
if bytes.Contains(out, []byte("No files")) == false {
|
||||||
|
t.Fatalf("Child didn't error out as expected")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestActivationNoFiles(t *testing.T) {
|
||||||
|
cmd := exec.Command("go", "run", "../examples/activation/activation.go")
|
||||||
|
cmd.Env = os.Environ()
|
||||||
|
cmd.Env = append(cmd.Env, "LISTEN_FDS=0", "FIX_LISTEN_PID=1")
|
||||||
|
|
||||||
|
out, _ := cmd.CombinedOutput()
|
||||||
|
if bytes.Contains(out, []byte("No files")) == false {
|
||||||
|
t.Fatalf("Child didn't error out as expected")
|
||||||
|
}
|
||||||
|
}
|
44
third_party/github.com/coreos/go-systemd/examples/activation/activation.go
vendored
Normal file
44
third_party/github.com/coreos/go-systemd/examples/activation/activation.go
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// Activation example used by the activation unit tests.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/coreos/go-systemd/activation"
|
||||||
|
)
|
||||||
|
|
||||||
|
func fixListenPid() {
|
||||||
|
if os.Getenv("FIX_LISTEN_PID") != "" {
|
||||||
|
// HACK: real systemd would set LISTEN_PID before exec'ing but
|
||||||
|
// this is too difficult in golang for the purpose of a test.
|
||||||
|
// Do not do this in real code.
|
||||||
|
os.Setenv("LISTEN_PID", fmt.Sprintf("%d", os.Getpid()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fixListenPid()
|
||||||
|
|
||||||
|
files := activation.Files(false)
|
||||||
|
|
||||||
|
if len(files) == 0 {
|
||||||
|
panic("No files")
|
||||||
|
}
|
||||||
|
|
||||||
|
if os.Getenv("LISTEN_PID") == "" || os.Getenv("LISTEN_FDS") == "" {
|
||||||
|
panic("Should not unset envs")
|
||||||
|
}
|
||||||
|
|
||||||
|
files = activation.Files(true)
|
||||||
|
|
||||||
|
if os.Getenv("LISTEN_PID") != "" || os.Getenv("LISTEN_FDS") != "" {
|
||||||
|
panic("Can not unset envs")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Write out the expected strings to the two pipes
|
||||||
|
files[0].Write([]byte("Hello world"))
|
||||||
|
files[1].Write([]byte("Goodbye world"))
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
1
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/README.md
vendored
Normal file
1
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/README.md
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
Example of using socket activation with systemd to serve a simple HTTP server on http://127.0.0.1:8076
|
11
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/hello.service
vendored
Normal file
11
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/hello.service
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Hello World HTTP
|
||||||
|
Requires=network.target
|
||||||
|
After=multi-user.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/httpserver
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
5
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/hello.socket
vendored
Normal file
5
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/hello.socket
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
[Socket]
|
||||||
|
ListenStream=127.0.0.1:8076
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sockets.target
|
29
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/httpserver.go
vendored
Normal file
29
third_party/github.com/coreos/go-systemd/examples/activation/httpserver/httpserver.go
vendored
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/coreos/go-systemd/activation"
|
||||||
|
)
|
||||||
|
|
||||||
|
func HelloServer(w http.ResponseWriter, req *http.Request) {
|
||||||
|
io.WriteString(w, "hello socket activated world!\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
files := activation.Files()
|
||||||
|
|
||||||
|
if len(files) != 1 {
|
||||||
|
panic("Unexpected number of socket activation fds")
|
||||||
|
}
|
||||||
|
|
||||||
|
l, err := net.FileListener(files[0])
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
http.HandleFunc("/", HelloServer)
|
||||||
|
http.Serve(l, nil)
|
||||||
|
}
|
9
third_party/github.com/coreos/go-systemd/test
vendored
Executable file
9
third_party/github.com/coreos/go-systemd/test
vendored
Executable file
@ -0,0 +1,9 @@
|
|||||||
|
#!/bin/sh -e
|
||||||
|
|
||||||
|
PKG="github.com/coreos/go-systemd"
|
||||||
|
|
||||||
|
rm -R src
|
||||||
|
mkdir -p src/$(dirname $PKG)
|
||||||
|
ln -s ../../../ src/$PKG
|
||||||
|
|
||||||
|
go test -v ${PKG}/activation
|
Loading…
x
Reference in New Issue
Block a user