github.com/rootless-containers/rootlesskit/v2@v2.3.4/pkg/network/none/none.go (about)

     1  package none
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"os/exec"
     7  	"strconv"
     8  	"syscall"
     9  
    10  	"github.com/rootless-containers/rootlesskit/v2/pkg/api"
    11  	"github.com/rootless-containers/rootlesskit/v2/pkg/common"
    12  	"github.com/rootless-containers/rootlesskit/v2/pkg/messages"
    13  	"github.com/rootless-containers/rootlesskit/v2/pkg/network"
    14  )
    15  
    16  func NewParentDriver() (network.ParentDriver, error) {
    17  	return &parentDriver{}, nil
    18  }
    19  
    20  type parentDriver struct {
    21  }
    22  
    23  const DriverName = "none"
    24  
    25  func (d *parentDriver) MTU() int {
    26  	return 0
    27  }
    28  
    29  func (d *parentDriver) Info(ctx context.Context) (*api.NetworkDriverInfo, error) {
    30  	return &api.NetworkDriverInfo{
    31  		Driver: DriverName,
    32  	}, nil
    33  }
    34  
    35  func (d *parentDriver) ConfigureNetwork(childPID int, stateDir, detachedNetNSPath string) (*messages.ParentInitNetworkDriverCompleted, func() error, error) {
    36  	var cleanups []func() error
    37  
    38  	if detachedNetNSPath != "" {
    39  		cmd := exec.Command("nsenter", "-t", strconv.Itoa(childPID), "-n"+detachedNetNSPath, "-m", "-U", "--no-fork", "--preserve-credentials", "sleep", "infinity")
    40  		cmd.SysProcAttr = &syscall.SysProcAttr{
    41  			Pdeathsig: syscall.SIGKILL,
    42  		}
    43  		err := cmd.Start()
    44  		if err != nil {
    45  			return nil, nil, err
    46  		}
    47  		childPID = cmd.Process.Pid
    48  	}
    49  
    50  	cmds := [][]string{
    51  		[]string{"nsenter", "-t", strconv.Itoa(childPID), "-n", "-m", "-U", "--no-fork", "--preserve-credentials", "ip", "address", "add", "127.0.0.1/8", "dev", "lo"},
    52  		[]string{"nsenter", "-t", strconv.Itoa(childPID), "-n", "-m", "-U", "--no-fork", "--preserve-credentials", "ip", "link", "set", "lo", "up"},
    53  	}
    54  	if err := common.Execs(os.Stderr, os.Environ(), cmds); err != nil {
    55  		return nil, nil, err
    56  	}
    57  
    58  	netmsg := messages.ParentInitNetworkDriverCompleted{}
    59  	return &netmsg, common.Seq(cleanups), nil
    60  }