mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-07-28 19:29:57 +00:00
TUN-528: Move cloudflared into a separate repo
This commit is contained in:
141
vendor/github.com/coreos/go-systemd/machine1/dbus.go
generated
vendored
Normal file
141
vendor/github.com/coreos/go-systemd/machine1/dbus.go
generated
vendored
Normal file
@@ -0,0 +1,141 @@
|
||||
/*
|
||||
Copyright 2015 CoreOS Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
// Integration with the systemd machined API. See http://www.freedesktop.org/wiki/Software/systemd/machined/
|
||||
package machine1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strconv"
|
||||
"syscall"
|
||||
|
||||
"github.com/godbus/dbus"
|
||||
)
|
||||
|
||||
const (
|
||||
dbusInterface = "org.freedesktop.machine1.Manager"
|
||||
dbusPath = "/org/freedesktop/machine1"
|
||||
)
|
||||
|
||||
// Conn is a connection to systemds dbus endpoint.
|
||||
type Conn struct {
|
||||
conn *dbus.Conn
|
||||
object dbus.BusObject
|
||||
}
|
||||
|
||||
// New() establishes a connection to the system bus and authenticates.
|
||||
func New() (*Conn, error) {
|
||||
c := new(Conn)
|
||||
|
||||
if err := c.initConnection(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func (c *Conn) initConnection() error {
|
||||
var err error
|
||||
c.conn, err = dbus.SystemBusPrivate()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Only use EXTERNAL method, and hardcode the uid (not username)
|
||||
// to avoid a username lookup (which requires a dynamically linked
|
||||
// libc)
|
||||
methods := []dbus.Auth{dbus.AuthExternal(strconv.Itoa(os.Getuid()))}
|
||||
|
||||
err = c.conn.Auth(methods)
|
||||
if err != nil {
|
||||
c.conn.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
err = c.conn.Hello()
|
||||
if err != nil {
|
||||
c.conn.Close()
|
||||
return err
|
||||
}
|
||||
|
||||
c.object = c.conn.Object("org.freedesktop.machine1", dbus.ObjectPath(dbusPath))
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Conn) getPath(method string, args ...interface{}) (dbus.ObjectPath, error) {
|
||||
result := c.object.Call(fmt.Sprintf("%s.%s", dbusInterface, method), 0, args...)
|
||||
if result.Err != nil {
|
||||
return "", result.Err
|
||||
}
|
||||
|
||||
path, typeErr := result.Body[0].(dbus.ObjectPath)
|
||||
if !typeErr {
|
||||
return "", fmt.Errorf("unable to convert dbus response '%v' to dbus.ObjectPath", result.Body[0])
|
||||
}
|
||||
|
||||
return path, nil
|
||||
}
|
||||
|
||||
// GetMachine gets a specific container with systemd-machined
|
||||
func (c *Conn) GetMachine(name string) (dbus.ObjectPath, error) {
|
||||
return c.getPath("GetMachine", name)
|
||||
}
|
||||
|
||||
// GetImage gets a specific image with systemd-machined
|
||||
func (c *Conn) GetImage(name string) (dbus.ObjectPath, error) {
|
||||
return c.getPath("GetImage", name)
|
||||
}
|
||||
|
||||
// GetMachineByPID gets a machine specified by a PID from systemd-machined
|
||||
func (c *Conn) GetMachineByPID(pid uint) (dbus.ObjectPath, error) {
|
||||
return c.getPath("GetMachineByPID", pid)
|
||||
}
|
||||
|
||||
// DescribeMachine gets the properties of a machine
|
||||
func (c *Conn) DescribeMachine(name string) (machineProps map[string]interface{}, err error) {
|
||||
var dbusProps map[string]dbus.Variant
|
||||
path, pathErr := c.GetMachine(name)
|
||||
if pathErr != nil {
|
||||
return nil, pathErr
|
||||
}
|
||||
obj := c.conn.Object("org.freedesktop.machine1", path)
|
||||
err = obj.Call("org.freedesktop.DBus.Properties.GetAll", 0, "").Store(&dbusProps)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
machineProps = make(map[string]interface{}, len(dbusProps))
|
||||
for key, val := range dbusProps {
|
||||
machineProps[key] = val.Value()
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// KillMachine sends a signal to a machine
|
||||
func (c *Conn) KillMachine(name, who string, sig syscall.Signal) error {
|
||||
return c.object.Call(dbusInterface+".KillMachine", 0, name, who, sig).Err
|
||||
}
|
||||
|
||||
// TerminateMachine causes systemd-machined to terminate a machine, killing its processes
|
||||
func (c *Conn) TerminateMachine(name string) error {
|
||||
return c.object.Call(dbusInterface+".TerminateMachine", 0, name).Err
|
||||
}
|
||||
|
||||
// RegisterMachine registers the container with the systemd-machined
|
||||
func (c *Conn) RegisterMachine(name string, id []byte, service string, class string, pid int, root_directory string) error {
|
||||
return c.object.Call(dbusInterface+".RegisterMachine", 0, name, id, service, class, uint32(pid), root_directory).Err
|
||||
}
|
104
vendor/github.com/coreos/go-systemd/machine1/dbus_test.go
generated
vendored
Normal file
104
vendor/github.com/coreos/go-systemd/machine1/dbus_test.go
generated
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
/*
|
||||
Copyright 2015 CoreOS Inc.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
package machine1
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os/exec"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/go-systemd/dbus"
|
||||
)
|
||||
|
||||
const (
|
||||
machinePrefix = "machined-test-"
|
||||
)
|
||||
|
||||
func mustCreateTestProcess(machineName string) (pid int) {
|
||||
testServiceName := machineName + ".service"
|
||||
systemdRun, err := exec.LookPath("systemd-run")
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
sleep, err := exec.LookPath("sleep")
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
cmd := exec.Command(systemdRun, "--unit="+testServiceName, sleep, "5000")
|
||||
out, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
panic(fmt.Errorf("systemd-run failed: %q", out))
|
||||
}
|
||||
dbusConn, err := dbus.New()
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
defer dbusConn.Close()
|
||||
mainPIDProperty, err := dbusConn.GetServiceProperty(testServiceName, "MainPID")
|
||||
if err != nil {
|
||||
panic(err.Error())
|
||||
}
|
||||
mainPID := mainPIDProperty.Value.Value().(uint32)
|
||||
return int(mainPID)
|
||||
}
|
||||
|
||||
func TestMachine(t *testing.T) {
|
||||
machineName := machinePrefix + generateRandomLabel(8)
|
||||
leader := mustCreateTestProcess(machineName)
|
||||
|
||||
conn, newErr := New()
|
||||
if newErr != nil {
|
||||
t.Fatal(newErr)
|
||||
}
|
||||
|
||||
regErr := conn.RegisterMachine(machineName, nil, "go-systemd", "container", leader, "")
|
||||
if regErr != nil {
|
||||
t.Fatal(regErr)
|
||||
}
|
||||
|
||||
machine, getErr := conn.GetMachine(machineName)
|
||||
if getErr != nil {
|
||||
t.Fatal(getErr)
|
||||
}
|
||||
if len(machine) == 0 {
|
||||
t.Fatalf("did not find machine named %s", machineName)
|
||||
}
|
||||
|
||||
tErr := conn.TerminateMachine(machineName)
|
||||
if tErr != nil {
|
||||
t.Fatal(tErr)
|
||||
}
|
||||
|
||||
machine, getErr = conn.GetMachine(machineName)
|
||||
if len(machine) != 0 {
|
||||
t.Fatalf("unexpectedly found machine named %s", machineName)
|
||||
} else if getErr == nil {
|
||||
t.Fatal("expected error but got nil")
|
||||
}
|
||||
}
|
||||
|
||||
func generateRandomLabel(n int) string {
|
||||
letters := []rune("abcdefghijklmnopqrstuvwxyz")
|
||||
s := make([]rune, n)
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
for i := range s {
|
||||
s[i] = letters[rand.Intn(len(letters))]
|
||||
}
|
||||
return string(s)
|
||||
}
|
Reference in New Issue
Block a user