github.com/NeowayLabs/nash@v0.2.2-0.20200127205349-a227041ffd50/cmd/nash/main.go (about) 1 // Package main has two sides: 2 // - User mode: shell 3 // - tool mode: unix socket server for handling namespace operations 4 // When started, the program choses their side based on the argv[0]. 5 // The name "nash" indicates a user shell and the name -nashd- indicates 6 // the namespace server tool. 7 package main 8 9 import ( 10 "flag" 11 "fmt" 12 "os" 13 14 "github.com/madlambda/nash" 15 ) 16 17 var ( 18 // version is set at build time 19 VersionString = "No version provided" 20 21 version bool 22 debug bool 23 file string 24 command string 25 addr string 26 noInit bool 27 interactive bool 28 install string 29 ) 30 31 func init() { 32 flag.BoolVar(&version, "version", false, "Show version") 33 flag.BoolVar(&debug, "debug", false, "enable debug") 34 flag.BoolVar(&noInit, "noinit", false, "do not load init/init.sh file") 35 flag.StringVar(&command, "c", "", "command to execute") 36 flag.StringVar(&install, "install", "", "path of the library that you want to install (can be a single file)") 37 flag.BoolVar(&interactive, "i", false, "Interactive mode (default if no args)") 38 39 if os.Args[0] == "-nashd-" || (len(os.Args) > 1 && os.Args[1] == "-daemon") { 40 flag.Bool("daemon", false, "force enable nashd mode") 41 flag.StringVar(&addr, "addr", "", "rcd unix file") 42 } 43 } 44 45 func main() { 46 var args []string 47 var shell *nash.Shell 48 var err error 49 50 flag.Parse() 51 52 if version { 53 fmt.Printf("build tag: %s\n", VersionString) 54 return 55 } 56 57 if install != "" { 58 fmt.Printf("installing library located at [%s]\n", install) 59 np, err := NashPath() 60 if err != nil { 61 fmt.Printf("error[%s] getting NASHPATH, cant install library\n", err) 62 os.Exit(1) 63 } 64 err = InstallLib(np, install) 65 if err != nil { 66 fmt.Printf("error[%s] installing library\n", err) 67 os.Exit(1) 68 } 69 fmt.Println("installed with success") 70 return 71 } 72 73 if len(flag.Args()) > 0 { 74 args = flag.Args() 75 file = args[0] 76 } 77 78 if shell, err = initShell(); err != nil { 79 goto Error 80 } 81 82 shell.SetDebug(debug) 83 84 if addr != "" { 85 startNashd(shell, addr) 86 return 87 } 88 89 if (file == "" && command == "") || interactive { 90 if err = cli(shell); err != nil { 91 goto Error 92 } 93 94 return 95 } 96 97 if file != "" { 98 if err = shell.ExecFile(file, args...); err != nil { 99 goto Error 100 } 101 } 102 103 if command != "" { 104 err = shell.ExecuteString("<argument -c>", command) 105 if err != nil { 106 goto Error 107 } 108 } 109 110 Error: 111 if err != nil { 112 fmt.Fprintf(os.Stderr, "%s\n", err.Error()) 113 os.Exit(1) 114 } 115 } 116 117 func initShell() (*nash.Shell, error) { 118 119 nashpath, err := NashPath() 120 if err != nil { 121 return nil, err 122 } 123 nashroot, err := NashRoot() 124 if err != nil { 125 return nil, err 126 } 127 128 os.Mkdir(nashpath, 0755) 129 return nash.New(nashpath, nashroot) 130 }