func main() { var err error flag.Usage = usage flag.Parse() logSetup() // see containerShim() if flag.NArg() > 1 && flag.Arg(0) == CONTAINER_MAGIC { containerShim() } cliSetup() if *f_cli { if err := minicli.Validate(); err != nil { log.Fatalln(err) } doc, err := minicli.Doc() if err != nil { log.Fatal("failed to generate docs: %v", err) } fmt.Println(doc) os.Exit(0) } // rebase f_iomBase if f_base changed but iomBase did not if *f_base != BASE_PATH && *f_iomBase == IOM_PATH { *f_iomBase = filepath.Join(*f_base, "files") } if *f_version { fmt.Println("minimega", version.Revision, version.Date) fmt.Println(version.Copyright) os.Exit(0) } hostname, err = os.Hostname() if err != nil { log.Fatalln(err) } if isReserved(hostname) { log.Warn("hostname `%s` is a reserved word -- abandon all hope, ye who enter here", hostname) } // special case, catch -e and execute a command on an already running // minimega instance if *f_e || *f_attach { // try to connect to the local minimega mm, err := miniclient.Dial(*f_base) if err != nil { log.Fatalln(err) } mm.Pager = minipager.DefaultPager if *f_e { a := flag.Args() log.Debugln("got args:", a) // TODO: Need to escape? cmd := minicli.MustCompile(strings.Join(a, " ")) log.Infoln("got command:", cmd) mm.RunAndPrint(cmd, false) } else { mm.Attach() } return } // warn if we're not root user, err := user.Current() if err != nil { log.Fatalln(err) } if user.Uid != "0" { log.Warnln("not running as root") } // check for a running instance of minimega _, err = os.Stat(filepath.Join(*f_base, "minimega")) if err == nil { if !*f_force { log.Fatalln("minimega appears to already be running, override with -force") } log.Warn("minimega may already be running, proceed with caution") err = os.Remove(filepath.Join(*f_base, "minimega")) if err != nil { log.Fatalln(err) } } // set up signal handling sig := make(chan os.Signal, 1024) signal.Notify(sig, os.Interrupt, syscall.SIGTERM) go func() { first := true for s := range sig { if s == os.Interrupt && first { // do nothing continue } if *f_panic { panic("teardown") } if first { log.Info("caught signal, tearing down, ctrl-c again will force quit") go teardown() first = false } else { os.Exit(1) } } }() err = checkExternal() if err != nil { log.Warnln(err.Error()) } // attempt to set up the base path err = os.MkdirAll(*f_base, os.FileMode(0770)) if err != nil { log.Fatal("mkdir base path: %v", err) } pid := os.Getpid() writeOrDie(filepath.Join(*f_base, "minimega.pid"), strconv.Itoa(pid)) go commandSocketStart() // create a node for meshage host, err := os.Hostname() if err != nil { log.Fatalln(err) } meshageInit(host, *f_context, *f_degree, *f_msaTimeout, *f_port) // start the cc service ccStart() // start tap reaper go periodicReapTaps() fmt.Println(banner) // fan out to the number of cpus on the system if GOMAXPROCS env variable is // not set. if os.Getenv("GOMAXPROCS") == "" { cpus := runtime.NumCPU() runtime.GOMAXPROCS(cpus) } if !*f_nostdin { cliLocal() } else { <-sig if *f_panic { panic("teardown") } } teardown() }
func main() { var err error flag.Usage = usage flag.Parse() if !strings.HasSuffix(*f_base, "/") { *f_base += "/" } if *f_cli { doc, err := minicli.Doc() if err != nil { log.Fatalln("failed to generate docs: %v", err) } fmt.Println(doc) os.Exit(0) } // rebase f_iomBase if f_base changed but iomBase did not if *f_base != BASE_PATH && *f_iomBase == IOM_PATH { *f_iomBase = *f_base + "files" } if !strings.HasSuffix(*f_iomBase, "/") { *f_iomBase += "/" } if *f_version { fmt.Println("minimega", version.Revision, version.Date) fmt.Println(version.Copyright) os.Exit(0) } logSetup() hostname, err = os.Hostname() if err != nil { log.Fatalln(err) } if isReserved(hostname) { log.Warn("hostname `%s` is a reserved word -- abandon all hope, ye who enter here", hostname) } vms = make(map[int]*vmInfo) // special case, catch -e and execute a command on an already running // minimega instance if *f_e { localCommand() return } if *f_attach { cliAttach() return } // warn if we're not root user, err := user.Current() if err != nil { log.Fatalln(err) } if user.Uid != "0" { log.Warnln("not running as root") } // check for a running instance of minimega _, err = os.Stat(*f_base + "minimega") if err == nil { if !*f_force { log.Fatalln("minimega appears to already be running, override with -force") } log.Warn("minimega may already be running, proceed with caution") err = os.Remove(*f_base + "minimega") if err != nil { log.Fatalln(err) } } // set up signal handling sig := make(chan os.Signal, 1024) signal.Notify(sig, os.Interrupt, syscall.SIGTERM) go func() { first := true for { <-sig if *f_panic { panic("teardown") } if first { log.Info("caught signal, tearing down, ctrl-c again will force quit") go teardown() first = false } else { os.Exit(1) } } }() err = checkExternal() if err != nil { log.Warnln(err.Error()) } // attempt to set up the base path err = os.MkdirAll(*f_base, os.FileMode(0770)) if err != nil { log.Fatal("mkdir base path: %v", err) } pid := os.Getpid() err = ioutil.WriteFile(*f_base+"minimega.pid", []byte(fmt.Sprintf("%v", pid)), 0664) if err != nil { log.Error("write minimega pid: %v", err) teardown() } go commandSocketStart() // create a node for meshage host, err := os.Hostname() if err != nil { log.Fatalln(err) } meshageInit(host, *f_namespace, uint(*f_degree), *f_port) fmt.Println(banner) // fan out to the number of cpus on the system if GOMAXPROCS env variable is // not set. if os.Getenv("GOMAXPROCS") == "" { cpus := runtime.NumCPU() runtime.GOMAXPROCS(cpus) } if !*f_nostdin { cliLocal() } else { <-sig if *f_panic { panic("teardown") } } teardown() }