podman

Форк
0
84 строки · 1.3 Кб
1
//go:build darwin
2

3
package main
4

5
import (
6
	"fmt"
7
	"io"
8
	"io/fs"
9
	"os"
10
	"time"
11

12
	"github.com/spf13/cobra"
13
)
14

15
const (
16
	trigger = "GO\n"
17
	fail    = "NO"
18
	success = "OK"
19
)
20

21
var serviceCmd = &cobra.Command{
22
	Use:    "service",
23
	Short:  "Service requests",
24
	Long:   "Service requests",
25
	PreRun: silentUsage,
26
	Run:    serviceRun,
27
	Hidden: true,
28
}
29

30
func init() {
31
	rootCmd.AddCommand(serviceCmd)
32
}
33

34
func serviceRun(cmd *cobra.Command, args []string) {
35
	info, err := os.Stdin.Stat()
36
	if err != nil || info.Mode()&fs.ModeSocket == 0 {
37
		fmt.Fprintln(os.Stderr, "This is an internal command that is not intended for standard terminal usage")
38
		os.Exit(1)
39
	}
40

41
	os.Exit(service())
42
}
43

44
func service() int {
45
	defer os.Stdout.Close()
46
	defer os.Stdin.Close()
47
	defer os.Stderr.Close()
48
	if len(os.Args) < 3 {
49
		fmt.Print(fail)
50
		return 1
51
	}
52
	target := os.Args[2]
53

54
	request := make(chan bool)
55
	go func() {
56
		buf := make([]byte, 3)
57
		_, err := io.ReadFull(os.Stdin, buf)
58
		request <- err == nil && string(buf) == trigger
59
	}()
60

61
	valid := false
62
	select {
63
	case valid = <-request:
64
	case <-time.After(5 * time.Second):
65
	}
66

67
	if !valid {
68
		fmt.Println(fail)
69
		return 2
70
	}
71

72
	err := os.Remove(dockerSock)
73
	if err == nil || os.IsNotExist(err) {
74
		err = os.Symlink(target, dockerSock)
75
	}
76

77
	if err != nil {
78
		fmt.Print(fail)
79
		return 3
80
	}
81

82
	fmt.Print(success)
83
	return 0
84
}
85

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.