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  }