Path: blob/main/components/workspacekit/cmd/nsenter.go
2498 views
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package cmd56import (7"log"8"os"910"github.com/spf13/cobra"11"golang.org/x/sys/unix"1213"github.com/gitpod-io/gitpod/common-go/nsenter"14)1516var nsenterOpts struct {17Target int18MountNS bool19NetNS bool20}2122var nsenterCmd = &cobra.Command{23Use: "nsenter <cmd> <args ...>",24Short: "enters namespaces and executes the arg",25Args: cobra.MinimumNArgs(1),26Aliases: []string{"handler"},27Run: func(_ *cobra.Command, args []string) {28if os.Getenv("_LIBNSENTER_INIT") != "" {29err := unix.Exec(args[0], args, os.Environ())30if err != nil {31log.Fatalf("cannot exec: %v", err)32}33return34}3536var ns []nsenter.Namespace37if nsenterOpts.MountNS {38ns = append(ns, nsenter.NamespaceMount)39}40if nsenterOpts.NetNS {41ns = append(ns, nsenter.NamespaceNet)42}43err := nsenter.Run(nsenterOpts.Target, args, nil, ns...)44if err != nil {45log.Fatal(err)46}47},48}4950func init() {51rootCmd.AddCommand(nsenterCmd)5253nsenterCmd.Flags().IntVar(&nsenterOpts.Target, "target", 0, "target PID")54nsenterCmd.Flags().BoolVar(&nsenterOpts.MountNS, "mount", false, "enter mount namespace")55nsenterCmd.Flags().BoolVar(&nsenterOpts.NetNS, "net", false, "enter network namespace")56}575859