github.com/containers/podman/v4@v4.9.4/pkg/machine/applehv/claim.go (about)

     1  //go:build darwin
     2  // +build darwin
     3  
     4  package applehv
     5  
     6  import (
     7  	"fmt"
     8  	"io"
     9  	"io/fs"
    10  	"net"
    11  	"os"
    12  	"os/user"
    13  	"path/filepath"
    14  	"time"
    15  )
    16  
    17  // TODO the following functions were taken from pkg/qemu/claim_darwin.go and
    18  // should be refactored.  I'm thinking even something in pkg/machine/
    19  
    20  func dockerClaimSupported() bool {
    21  	return true
    22  }
    23  
    24  func dockerClaimHelperInstalled() bool {
    25  	u, err := user.Current()
    26  	if err != nil {
    27  		return false
    28  	}
    29  
    30  	labelName := fmt.Sprintf("com.github.containers.podman.helper-%s", u.Username)
    31  	fileName := filepath.Join("/Library", "LaunchDaemons", labelName+".plist")
    32  	info, err := os.Stat(fileName)
    33  	return err == nil && info.Mode().IsRegular()
    34  }
    35  
    36  func claimDockerSock() bool {
    37  	u, err := user.Current()
    38  	if err != nil {
    39  		return false
    40  	}
    41  
    42  	helperSock := fmt.Sprintf("/var/run/podman-helper-%s.socket", u.Username)
    43  	con, err := net.DialTimeout("unix", helperSock, time.Second*5)
    44  	if err != nil {
    45  		return false
    46  	}
    47  	_ = con.SetWriteDeadline(time.Now().Add(time.Second * 5))
    48  	_, err = fmt.Fprintln(con, "GO")
    49  	if err != nil {
    50  		return false
    51  	}
    52  	_ = con.SetReadDeadline(time.Now().Add(time.Second * 5))
    53  	read, err := io.ReadAll(con)
    54  
    55  	return err == nil && string(read) == "OK"
    56  }
    57  
    58  func findClaimHelper() string {
    59  	exe, err := os.Executable()
    60  	if err != nil {
    61  		return ""
    62  	}
    63  
    64  	exe, err = filepath.EvalSymlinks(exe)
    65  	if err != nil {
    66  		return ""
    67  	}
    68  
    69  	return filepath.Join(filepath.Dir(exe), "podman-mac-helper")
    70  }
    71  
    72  func checkSockInUse(sock string) bool {
    73  	if info, err := os.Stat(sock); err == nil && info.Mode()&fs.ModeSocket == fs.ModeSocket {
    74  		_, err = net.DialTimeout("unix", dockerSock, dockerConnectTimeout)
    75  		return err == nil
    76  	}
    77  
    78  	return false
    79  }
    80  
    81  func alreadyLinked(target string, link string) bool {
    82  	read, err := os.Readlink(link)
    83  	return err == nil && read == target
    84  }