diff --git a/Dockerfile b/Dockerfile index 257fcab52..22af75ff1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,4 +28,4 @@ RUN mkdir -p $IPFS_PATH && mkdir -p $QRI_PATH \ # VOLUME $QRI_PATH # Set binary as entrypoint, initalizing ipfs repo if none is mounted -CMD ["qri", "server", "--init-ipfs"] \ No newline at end of file +CMD ["qri", "server", "--init"] \ No newline at end of file diff --git a/api/server.go b/api/server.go index 5ce64c9cf..d74fc2056 100644 --- a/api/server.go +++ b/api/server.go @@ -68,7 +68,7 @@ func New(r repo.Repo, options ...func(*Config)) (s *Server, err error) { return nil, fmt.Errorf("error starting P2P service: %s", err.Error()) } if cfg.PostP2POnlineHook != nil { - cfg.PostP2POnlineHook(s.qriNode) + go cfg.PostP2POnlineHook(s.qriNode) } // p2p.PrintSwarmAddrs(qriNode) return s, nil diff --git a/cmd/init.go b/cmd/init.go index ad50f3313..40221281a 100644 --- a/cmd/init.go +++ b/cmd/init.go @@ -22,6 +22,7 @@ var ( initIPFSConfigFile string initIdentityData string initProfileData string + initDatasetsData string ) // initCmd represents the init command @@ -32,6 +33,13 @@ var initCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { var cfgData []byte + envVars := map[string]*string{ + "QRI_INIT_IDENTITY_DATA": &initIdentityData, + "QRI_INIT_PROFILE_DATA": &initProfileData, + "QRI_INIT_DATASETS_DATA": &initDatasetsData, + } + mapEnvVars(envVars) + if QRIRepoInitialized() && !initOverwrite { // use --overwrite to overwrite this repo, erasing all data and deleting your account for good ErrExit(fmt.Errorf("repo already initialized.")) @@ -51,6 +59,17 @@ var initCmd = &cobra.Command{ err := yaml.Unmarshal(cfgData, cfg) ExitIfErr(err) + if initDatasetsData != "" { + err = readAtFile(&initDatasetsData) + ExitIfErr(err) + + datasets := map[string]string{} + err = json.Unmarshal([]byte(initDatasetsData), &datasets) + ExitIfErr(err) + + cfg.DefaultDatasets = datasets + } + if err := os.MkdirAll(QriRepoPath, os.ModePerm); err != nil { ErrExit(fmt.Errorf("error creating home dir: %s\n", err.Error())) } @@ -69,7 +88,7 @@ var initCmd = &cobra.Command{ ExitIfErr(err) path := filepath.Join(os.TempDir(), "config") - data, err := json.Marshal(DefaaultIPFSConfig(id)) + data, err := json.Marshal(DefaultIPFSConfig(id)) ExitIfErr(err) err = ioutil.WriteFile(path, data, os.ModePerm) @@ -109,6 +128,7 @@ func init() { // initCmd.Flags().StringVarP(&initIPFSConfigFile, "ipfs-config", "", "", "config file for initialization") initCmd.Flags().StringVarP(&initIdentityData, "id", "", "", "json-encoded identity data, specify a filepath with '@' prefix") initCmd.Flags().StringVarP(&initProfileData, "profile", "", "", "json-encoded user profile data, specify a filepath with '@' prefix") + initCmd.Flags().StringVarP(&initDatasetsData, "datasets", "", "", "json-encoded object of default datasets") } // QRIRepoInitialized checks to see if a repository has been initialized at $QRI_PATH @@ -118,6 +138,17 @@ func QRIRepoInitialized() bool { return !os.IsNotExist(err) } +func mapEnvVars(vars map[string]*string) { + for envVar, value := range vars { + envVal := os.Getenv(envVar) + fmt.Println("%s=%s", envVar, envVal) + if envVal != "" { + fmt.Println("reading %s from env", envVar) + *value = envVal + } + } +} + func initRepoIfEmpty(repoPath, configPath string) error { if repoPath != "" { if _, err := os.Stat(filepath.Join(repoPath, "config")); os.IsNotExist(err) { @@ -148,7 +179,7 @@ func readAtFile(data *string) error { } // TODO - this is a bit of a hack for the moment, will be removed later -func DefaaultIPFSConfig(identity config.Identity) *config.Config { +func DefaultIPFSConfig(identity config.Identity) *config.Config { return &config.Config{ Identity: identity, Datastore: config.Datastore{ diff --git a/cmd/server.go b/cmd/server.go index a88647ee5..18474b7ea 100644 --- a/cmd/server.go +++ b/cmd/server.go @@ -15,10 +15,10 @@ import ( ) var ( - serverCmdPort string - serverMemOnly bool - serverOffline bool - serverInitIpfs bool + serverCmdPort string + serverMemOnly bool + serverOffline bool + serverInit bool ) // serverCmd represents the run command @@ -32,6 +32,10 @@ var serverCmd = &cobra.Command{ err error ) + if serverInit && !QRIRepoInitialized() { + initCmd.Run(&cobra.Command{}, []string{}) + } + if serverMemOnly { // TODO - refine, adding better identity generation // or options for BYO user profile @@ -95,7 +99,7 @@ func addDefaultDatasets(node *p2p.QriNode) { func init() { serverCmd.Flags().StringVarP(&serverCmdPort, "port", "p", api.DefaultPort, "port to start server on") - // serverCmd.Flags().BoolVarP(&serverInitIpfs, "init-ipfs", "", false, "initialize a new default ipfs repo if empty") + serverCmd.Flags().BoolVarP(&serverInit, "init", "", false, "initialize if necessary, reading options from enviornment variables") serverCmd.Flags().BoolVarP(&serverMemOnly, "mem-only", "", false, "run qri entirely in-memory, persisting nothing") serverCmd.Flags().BoolVarP(&serverOffline, "offline", "", false, "disable networking") RootCmd.AddCommand(serverCmd)