gopkg.in/hugelgupf/u-root.v9@v9.0.0-20180831063832-3f6f1057f09b/cmds/mm/mm.go (about)

     1  // Copyright 2016-2017 the u-root Authors. All rights reserved
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"flag"
     9  	"log"
    10  	"os"
    11  	"os/exec"
    12  
    13  	"github.com/u-root/u-root/pkg/uroot/util"
    14  )
    15  
    16  var (
    17  	dest      = flag.String("d", "/u", "destination directory")
    18  	namespace = []util.Creator{
    19  		util.Dir{Name: "proc", Mode: 0555},
    20  		util.Dir{Name: "sys", Mode: 0555},
    21  		util.Dir{Name: "buildbin", Mode: 0777},
    22  		util.Dir{Name: "ubin", Mode: 0777},
    23  		util.Dir{Name: "tmp", Mode: 0777},
    24  		util.Dir{Name: "env", Mode: 0777},
    25  		util.Dir{Name: "etc", Mode: 0777},
    26  		util.Dir{Name: "tcz", Mode: 0777},
    27  		util.Dir{Name: "dev", Mode: 0777},
    28  		util.Dir{Name: "dev/pts", Mode: 0777},
    29  		util.Dir{Name: "lib", Mode: 0777},
    30  		util.Dir{Name: "usr/lib", Mode: 0777},
    31  		util.Dir{Name: "go/pkg/linux_amd64", Mode: 0777},
    32  		util.Link{NewPath: "init", OldPath: "/init"},
    33  		util.Mount{Target: "dev/pts", FSType: "devpts", Opts: "newinstance,ptmxmode=666,gid=5,mode=620"},
    34  		util.Symlink{NewPath: "dev/ptmx", Target: "/dev/pts/ptmx"},
    35  	}
    36  	commands = []*exec.Cmd{
    37  		exec.Command("minimega", "-e", "vm", "config", "filesystem"),
    38  		exec.Command("minimega", "-e", "vm", "config", "snapshot", "false"),
    39  		exec.Command("minimega", "-e", "vm", "launch", "container", "uroot"),
    40  		exec.Command("minimega", "-e", "vm", "start", "all"),
    41  	}
    42  )
    43  
    44  func main() {
    45  	flag.Parse()
    46  	// We won't do wholesale removal. That's up to you if this fails.
    47  	if err := os.Chdir(*dest); err == nil {
    48  		log.Printf("Directory exists, skipping namespace setup")
    49  	} else if !os.IsNotExist(err) {
    50  		log.Fatalf("Couldn't chdir(%q): %v", *dest, err)
    51  	} else {
    52  		if err := os.Mkdir(*dest, 0777); err != nil {
    53  			log.Fatalf("Can't mkdir: %v", err)
    54  		}
    55  		if err := os.Chdir(*dest); err != nil {
    56  			log.Fatalf("Can't cd: %v", err)
    57  		}
    58  		for _, c := range namespace {
    59  			if err := c.Create(); err != nil {
    60  				log.Fatalf("Error creating %s: %v", c, err)
    61  			}
    62  		}
    63  	}
    64  	log.Printf("now you need to run stuff")
    65  	commands[0].Args = append(commands[0].Args, *dest)
    66  	for _, c := range commands {
    67  		o, err := c.CombinedOutput()
    68  		log.Printf("%v says %v", c, o)
    69  		if err != nil {
    70  			log.Fatalf("Fails with %v", err)
    71  		}
    72  	}
    73  }