mirror of
https://github.com/containers/podman.git
synced 2025-05-17 23:26:08 +08:00
86 lines
1.3 KiB
Go
86 lines
1.3 KiB
Go
//go:build darwin
|
|
// +build darwin
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
const (
|
|
trigger = "GO\n"
|
|
fail = "NO"
|
|
success = "OK"
|
|
)
|
|
|
|
var serviceCmd = &cobra.Command{
|
|
Use: "service",
|
|
Short: "services requests",
|
|
Long: "services requests",
|
|
PreRun: silentUsage,
|
|
Run: serviceRun,
|
|
Hidden: true,
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(serviceCmd)
|
|
}
|
|
|
|
func serviceRun(cmd *cobra.Command, args []string) {
|
|
info, err := os.Stdin.Stat()
|
|
if err != nil || info.Mode()&fs.ModeSocket == 0 {
|
|
fmt.Fprintln(os.Stderr, "This is an internal command that is not intended for standard terminal usage")
|
|
os.Exit(1)
|
|
}
|
|
|
|
os.Exit(service())
|
|
}
|
|
|
|
func service() int {
|
|
defer os.Stdout.Close()
|
|
defer os.Stdin.Close()
|
|
defer os.Stderr.Close()
|
|
if len(os.Args) < 3 {
|
|
fmt.Print(fail)
|
|
return 1
|
|
}
|
|
target := os.Args[2]
|
|
|
|
request := make(chan bool)
|
|
go func() {
|
|
buf := make([]byte, 3)
|
|
_, err := io.ReadFull(os.Stdin, buf)
|
|
request <- err == nil && string(buf) == trigger
|
|
}()
|
|
|
|
valid := false
|
|
select {
|
|
case valid = <-request:
|
|
case <-time.After(5 * time.Second):
|
|
}
|
|
|
|
if !valid {
|
|
fmt.Println(fail)
|
|
return 2
|
|
}
|
|
|
|
err := os.Remove(dockerSock)
|
|
if err == nil || os.IsNotExist(err) {
|
|
err = os.Symlink(target, dockerSock)
|
|
}
|
|
|
|
if err != nil {
|
|
fmt.Print(fail)
|
|
return 3
|
|
}
|
|
|
|
fmt.Print(success)
|
|
return 0
|
|
}
|