// Start is the entrance point of cfssl command line tools. func Start(cmds map[string]*Command) error { // cfsslFlagSet is the flag sets for cfssl. var cfsslFlagSet = flag.NewFlagSet("cfssl", flag.ExitOnError) var c Config registerFlags(&c, cfsslFlagSet) // Initial parse of command line arguments. By convention, only -h/-help is supported. if flag.Usage == nil { flag.Usage = func() { fmt.Fprintf(os.Stderr, usage) for name := range cmds { fmt.Fprintf(os.Stderr, "\t%s\n", name) } fmt.Fprintf(os.Stderr, "Top-level flags:\n") flag.PrintDefaults() } } flag.Parse() if flag.NArg() < 1 { fmt.Fprintf(os.Stderr, "No command is given.\n") flag.Usage() return errors.New("no command was given") } // Clip out the command name and args for the command cmdName = flag.Arg(0) args := flag.Args()[1:] cmd, found := cmds[cmdName] if !found { fmt.Fprintf(os.Stderr, "Command %s is not defined.\n", cmdName) flag.Usage() return errors.New("undefined command") } // The usage of each individual command is re-written to mention // flags defined and referenced only in that command. cfsslFlagSet.Usage = func() { fmt.Fprintf(os.Stderr, "\t%s", cmd.UsageText) for _, name := range cmd.Flags { if f := cfsslFlagSet.Lookup(name); f != nil { printDefaultValue(f) } } } // Parse all flags and take the rest as argument lists for the command cfsslFlagSet.Parse(args) args = cfsslFlagSet.Args() var err error c.CFG, err = config.LoadFile(c.ConfigFile) if c.ConfigFile != "" && err != nil { fmt.Fprintf(os.Stderr, "Failed to load config file: %v", err) return errors.New("failed to load config file") } if err := cmd.Main(args, c); err != nil { fmt.Fprintln(os.Stderr, err) return err } return nil }
// Parse loads a RootList from a file. func Parse(filename string) (RootList, error) { cfgMap, err := parseFile(filename) if err != nil { return nil, err } var rootList = RootList{} for label, entries := range cfgMap { var root Root spec, ok := entries["private"] if !ok { return nil, ErrMissingPrivateKey } certPath, ok := entries["certificate"] if !ok { return nil, ErrMissingCertificatePath } configPath, ok := entries["config"] if !ok { return nil, ErrMissingConfigPath } // Entries is provided for any additional // configuration data that may need to come from the // section. root.PrivateKey, err = parsePrivateKeySpec(spec, entries) if err != nil { return nil, err } in, err := ioutil.ReadFile(certPath) if err != nil { return nil, err } root.Certificate, err = helpers.ParseCertificatePEM(in) if err != nil { return nil, err } conf, err := config.LoadFile(configPath) if err != nil { return nil, err } root.Config = conf.Signing nets := entries["nets"] if nets != "" { root.ACL, err = parseACL(nets) if err != nil { return nil, err } } rootList[label] = &root } return rootList, nil }