func ManagePinned(do *definitions.Do) error { ensureRunning() if do.Rm && do.Hash != "" { return fmt.Errorf("Either remove a file by hash or all of them\n") } if do.Rm { logger.Infoln("Removing all cached files") hashes, err := rmAllPinned() if err != nil { return err } do.Result = hashes } else if do.Hash != "" { logger.Infof("Removing %v, from cache", do.Hash) hashes, err := rmPinnedByHash(do.Hash) if err != nil { return err } do.Result = hashes } else { logger.Debugf("Listing files pinned locally") hash, err := listPinned() if err != nil { return err } do.Result = hash } return nil }
func PutFiles(do *definitions.Do) error { ensureRunning() if do.Gateway != "" { _, err := url.Parse(do.Gateway) if err != nil { return fmt.Errorf("Invalid gateway URL provided %v\n", err) } logger.Debugf("Posting to %v\n", do.Gateway) } else { logger.Debugf("Posting to gateway.ipfs.io\n") } if do.AddDir { logger.Debugf("Gonna add the contents of a directory =>\t\t%s:%v\n", do.Name, do.Path) hashes, err := exportDir(do.Name, do.Gateway) if err != nil { return err } do.Result = hashes } else { logger.Debugf("Gonna Add a file =>\t\t%s:%v\n", do.Name, do.Path) hash, err := exportFile(do.Name, do.Gateway) if err != nil { return err } do.Result = hash } return nil }
func CheckoutChain(do *definitions.Do) error { if do.Name == "" { do.Result = "nil" return util.NullHead() } curHead, _ := util.GetHead() if do.Name == curHead { do.Result = "no change" return nil } return util.ChangeHead(do.Name) }
//XXX chains and services only func ListAll(do *definitions.Do, typ string) (err error) { quiet := do.Quiet var result string if do.All == true { //overrides all the functionality used for flags/tests to stdout a nice table resK, err := ListKnown(typ) if err != nil { return err } do.Result = resK //for testing but not rly needed knowns := strings.Split(resK, "\n") typs := fmt.Sprintf("The known %s on your host kind marmot:", typ) log.WithField("=>", knowns[0]).Warn(typs) knowns = append(knowns[:0], knowns[1:]...) for _, known := range knowns { log.WithField("=>", known).Warn() } result, err = PrintTableReport(typ, true, true) //when latter bool is true, former one will be ignored... if err != nil { return err } contType := fmt.Sprintf("Active %s containers:", typ) log.Warn(contType) log.Warn(result) } else { var resK, resR, resE string if do.Known { if resK, err = ListKnown(typ); err != nil { return err } do.Result = resK } if do.Running { if resR, err = ListRunningOrExisting(quiet, false, typ); err != nil { return err } do.Result = resR } if do.Existing { if resE, err = ListRunningOrExisting(quiet, true, typ); err != nil { return err } do.Result = resE } } return nil }
func RmData(do *definitions.Do) error { if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { logger.Infoln("Removing data container " + do.Name) srv := definitions.BlankServiceDefinition() srv.Operations.SrvContainerName = util.ContainersName("data", do.Name, do.Operations.ContainerNumber) err := perform.DockerRemove(srv.Service, srv.Operations, false) if err != nil { return err } } else { return fmt.Errorf("I cannot find that data container. Please check the data container name you sent me.") } if do.RmHF { logger.Println("Removing host folder " + do.Name) err := os.RemoveAll(path.Join(DataContainersPath, do.Name)) if err != nil { return err } } do.Result = "success" return nil }
func ImportService(do *definitions.Do) error { fileName := filepath.Join(ServicesPath, do.Name) if filepath.Ext(fileName) == "" { fileName = fileName + ".toml" } var err error if log.GetLevel() > 0 { err = ipfs.GetFromIPFS(do.Hash, fileName, "", os.Stdout) } else { err = ipfs.GetFromIPFS(do.Hash, fileName, "", bytes.NewBuffer([]byte{})) } if err != nil { return err } _, err = loaders.LoadServiceDefinition(do.Name, false, 0) //XXX add protections? if err != nil { return fmt.Errorf("Your service definition file looks improperly formatted and will not marshal.") } do.Result = "success" return nil }
func NewService(do *definitions.Do) error { srv := definitions.BlankServiceDefinition() srv.Name = do.Name srv.Service.Name = do.Name srv.Service.Image = do.Operations.Args[0] srv.Service.AutoData = true var err error //get maintainer info srv.Maintainer.Name, srv.Maintainer.Email, err = config.GitConfigUser() if err != nil { log.Debug(err.Error()) } log.WithFields(log.Fields{ "service": srv.Service.Name, "image": srv.Service.Image, }).Debug("Creating a new service definition file") err = WriteServiceDefinitionFile(srv, filepath.Join(ServicesPath, do.Name+".toml")) if err != nil { return err } do.Result = "success" return nil }
func ImportService(do *definitions.Do) error { fileName := filepath.Join(ServicesPath, do.Name) if filepath.Ext(fileName) == "" { fileName = fileName + ".toml" } s := strings.Split(do.Path, ":") if s[0] == "ipfs" { var err error if logger.Level > 0 { err = ipfs.GetFromIPFS(s[1], fileName, "", logger.Writer) } else { err = ipfs.GetFromIPFS(s[1], fileName, "", bytes.NewBuffer([]byte{})) } if err != nil { return err } return nil } if strings.Contains(s[0], "github") { logger.Errorln("https://twitter.com/ryaneshea/status/595957712040628224") return nil } do.Result = "success" return fmt.Errorf("I do not know how to get that file. Sorry.") }
func ImportService(do *definitions.Do) error { fileName := filepath.Join(ServicesPath, do.Name) if filepath.Ext(fileName) == "" { fileName = fileName + ".toml" } var err error if logger.Level > 0 { err = ipfs.GetFromIPFS(do.Hash, fileName, "", logger.Writer) } else { err = ipfs.GetFromIPFS(do.Hash, fileName, "", bytes.NewBuffer([]byte{})) } if err != nil { return err //return fmt.Errorf("I do not know how to get that file. Sorry. %v\n", err) } _, err = loaders.LoadServiceDefinition(do.Name, false, 0) //XXX add protections? if err != nil { return fmt.Errorf("Your service defintion file looks improperly formatted and will not marshal.") } do.Result = "success" return nil }
func NewService(do *definitions.Do) error { srv := definitions.BlankServiceDefinition() srv.Name = do.Name srv.Service.Name = do.Name srv.Service.Image = do.Args[0] srv.Service.AutoData = true //get maintainer info uName, err := gitconfig.Username() if err != nil { logger.Debugf("Could not find git user.name, setting service.Maintainer.Name = \"\"") uName = "" } email, err := gitconfig.Email() if err != nil { logger.Debugf("Could not find git user.email, setting service.Maintainer.Email = \"\"") email = "" } srv.Maintainer.Name = uName srv.Maintainer.Email = email logger.Debugf("Creating a new srv def file =>\t%s:%s\n", srv.Service.Name, srv.Service.Image) err = WriteServiceDefinitionFile(srv, path.Join(ServicesPath, do.Name+".toml")) if err != nil { return err } do.Result = "success" return nil }
// TODO: skip errors flag func RmData(do *definitions.Do) (err error) { if len(do.Operations.Args) == 0 { do.Operations.Args = []string{do.Name} } for _, name := range do.Operations.Args { do.Name = name if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { log.WithField("=>", do.Name).Info("Removing data container") srv := definitions.BlankServiceDefinition() srv.Operations.SrvContainerName = util.ContainersName("data", do.Name, do.Operations.ContainerNumber) if err = perform.DockerRemove(srv.Service, srv.Operations, false, do.Volumes); err != nil { log.Errorf("Error removing %s: %v", do.Name, err) return err } } else { err = fmt.Errorf("I cannot find that data container for %s. Please check the data container name you sent me.", do.Name) log.Error(err) return err } if do.RmHF { log.WithField("=>", do.Name).Warn("Removing host directory") if err = os.RemoveAll(filepath.Join(DataContainersPath, do.Name)); err != nil { return err } } } do.Result = "success" return err }
// TODO: finish when the PR which is blocking // eris files put --dir is integrated into // ipfs func PutPackage(do *definitions.Do) error { // do.Name = args[0] var hash string = "" do.Result = hash return nil }
func RmService(do *definitions.Do) error { for _, servName := range do.Args { service, err := loaders.LoadServiceDefinition(servName, false, do.Operations.ContainerNumber) if err != nil { return err } if IsServiceExisting(service.Service, service.Operations) { err = perform.DockerRemove(service.Service, service.Operations, do.RmD) if err != nil { return err } } if do.File { oldFile := util.GetFileByNameAndType("services", servName) if err != nil { return err } oldFile = path.Join(ServicesPath, oldFile) + ".toml" logger.Printf("Removing file =>\t\t%s\n", oldFile) if err := os.Remove(oldFile); err != nil { return err } } } do.Result = "success" return nil }
// ImportData does what it says. It imports from a host's Source to a Dest // in a data container. It returns an error. // // do.Name - name of the data container to use (required) // do.Operations.ContainerNumber - container number (optional) // do.Source - directory which should be imported (required) // do.Destination - directory to _unload_ the payload into (required) // func ImportData(do *definitions.Do) error { log.WithFields(log.Fields{ "from": do.Source, "to": do.Destination, }).Debug("Importing") if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { srv := PretendToBeAService(do.Name, do.Operations.ContainerNumber) service, exists := perform.ContainerExists(srv.Operations) if !exists { return fmt.Errorf("There is no data container for that service.") } if err := checkErisContainerRoot(do, "import"); err != nil { return err } containerName := util.DataContainersName(do.Name, do.Operations.ContainerNumber) os.Chdir(do.Source) reader, err := util.Tar(do.Source, 0) if err != nil { return err } defer reader.Close() opts := docker.UploadToContainerOptions{ InputStream: reader, Path: do.Destination, NoOverwriteDirNonDir: true, } log.WithField("=>", containerName).Info("Copying into container") log.WithField("path", do.Source).Debug() if err := util.DockerClient.UploadToContainer(service.ID, opts); err != nil { return err } doChown := definitions.NowDo() doChown.Operations.DataContainerName = containerName doChown.Operations.ContainerType = "data" doChown.Operations.ContainerNumber = do.Operations.ContainerNumber //required b/c `docker cp` (UploadToContainer) goes in as root doChown.Operations.Args = []string{"chown", "--recursive", "eris", do.Destination} _, err = perform.DockerRunData(doChown.Operations, nil) if err != nil { return fmt.Errorf("Error changing owner: %v\n", err) } } else { log.WithField("name", do.Name).Info("Data container does not exist.") ops := loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) if err := perform.DockerCreateData(ops); err != nil { return fmt.Errorf("Error creating data container %v.", err) } return ImportData(do) } do.Result = "success" return nil }
func StartChain(do *definitions.Do) error { logger.Infoln("Ensuring Key Server is Started.") //should it take a flag? keys server may be running another cNum // XXX: currently we don't use or need a key server. // plus this should be specified in a service def anyways keysService, err := loaders.LoadServiceDefinition("keys", false, 1) if err != nil { return err } err = perform.DockerRun(keysService.Service, keysService.Operations) if err != nil { return err } chain, err := loaders.LoadChainDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { logger.Infoln("Cannot start a chain I cannot find.") do.Result = "no file" return nil } if chain.Name == "" { logger.Infoln("Cannot start a chain without a name.") do.Result = "no name" return nil } chain.Service.Command = loaders.ErisChainStart if do.Run { chain.Service.Command = loaders.ErisChainStartApi } util.OverWriteOperations(chain.Operations, do.Operations) chain.Service.Environment = append(chain.Service.Environment, "CHAIN_ID="+chain.ChainID) logger.Infof("StartChainRaw to DockerRun =>\t%s\n", chain.Service.Name) logger.Debugf("\twith ChainID =>\t\t%v\n", chain.ChainID) logger.Debugf("\twith Environment =>\t%v\n", chain.Service.Environment) logger.Debugf("\twith AllPortsPublshd =>\t%v\n", chain.Operations.PublishAllPorts) if err := perform.DockerRun(chain.Service, chain.Operations); err != nil { do.Result = "error" return err } return nil }
func ListKeys(do *definitions.Do) error { if do.Host { keysPath := filepath.Join(KeysPath, "data") addrs, err := ioutil.ReadDir(keysPath) if err != nil { return err } hostAddrs := make([]string, len(addrs)) for i, addr := range addrs { hostAddrs[i] = addr.Name() } do.Result = strings.Join(hostAddrs, ",") log.WithField("=>", hostAddrs[0]).Warn("The keys on your host kind marmot:") hostAddrs = append(hostAddrs[:0], hostAddrs[1:]...) for _, addr := range hostAddrs { log.WithField("=>", addr).Warn() } } if do.Container { keysOut := new(bytes.Buffer) config.GlobalConfig.Writer = keysOut do.Name = "keys" do.Operations.ContainerNumber = 1 if err := srv.EnsureRunning(do); err != nil { return err } do.Operations.Interactive = false do.Operations.Args = []string{"ls", "/home/eris/.eris/keys/data"} if err := srv.ExecService(do); err != nil { return err } keysOutString := strings.Split(util.TrimString(string(keysOut.Bytes())), "\n") do.Result = strings.Join(keysOutString, ",") log.WithField("=>", keysOutString[0]).Warn("The keys in your container kind marmot:") keysOutString = append(keysOutString[:0], keysOutString[1:]...) for _, addr := range keysOutString { log.WithField("=>", addr).Warn() } } return nil }
func ListFiles(do *definitions.Do) error { ensureRunning() logger.Debugf("Gonna List an object =>\t\t%s:%v\n", do.Name, do.Path) hash, err := listFile(do.Name) if err != nil { return err } do.Result = hash return nil }
func CatFiles(do *definitions.Do) error { ensureRunning() logger.Debugf("Gonna Cat a file =>\t\t%s:%v\n", do.Name, do.Path) hash, err := catFile(do.Name) if err != nil { return err } do.Result = hash return nil }
func PerformDappActionService(do *definitions.Do, dapp *definitions.Contracts) error { logger.Infof("Performing DAPP Action =>\t%s:%s:%s\n", do.Service.Name, do.Service.Image, do.Service.Command) if _, err := perform.DockerRun(do.Service, do.Operations); err != nil { do.Result = "could not perform dapp action" return err } logger.Infof("Finished performing DAPP Action.\n") return nil }
func PinFiles(do *definitions.Do) error { ensureRunning() if do.CSV != "" { logger.Debugf("Gonna Pin all the files from =>\t\t%s\n", do.CSV) hashes, err := pinFiles(do.CSV) if err != nil { return err } do.Result = hashes } else { logger.Debugf("Gonna Pin a file =>\t\t%s:%v\n", do.Name, do.Path) hash, err := pinFile(do.Name) if err != nil { return err } do.Result = hash } return nil }
func CurrentChain(do *definitions.Do) error { head, _ := util.GetHead() if head == "" { head = "There is no chain checked out." } log.Warn(head) do.Result = head return nil }
func ListExisting(do *definitions.Do) error { logger.Debugln("Asking Docker Client for the Existing Containers.") if do.Quiet { do.Result = strings.Join(util.ServiceContainerNames(true), "\n") if len(do.Args) != 0 && do.Args[0] != "testing" { logger.Printf("%s\n", "\n") } } else { perform.PrintTableReport("service", true) // TODO: return this as a string. } return nil }
func UpdateService(do *definitions.Do) error { service, err := loaders.LoadServiceDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { return err } err = perform.DockerRebuild(service.Service, service.Operations, do.Pull, do.Timeout) if err != nil { return err } do.Result = "success" return nil }
func RunPackage(do *definitions.Do) error { log.Debug("Welcome! Say the marmots. Running app package") var err error pwd, err = os.Getwd() if err != nil { return fmt.Errorf("Could not get the present working directory. Are you on Mars?\nError: %v\n", err) } log.WithFields(log.Fields{ "host path": do.Path, "pwd": pwd, }).Debug() app, err := loaders.LoadContractPackage(do.Path, do.ChainName, do.Name, do.Type) if err != nil { do.Result = "could not load package" return err } if err := BootServicesAndChain(do, app); err != nil { do.Result = "could not boot chain or services" CleanUp(do, app) return err } do.Path = pwd if err := DefineAppActionService(do, app); err != nil { do.Result = "could not define app action service" CleanUp(do, app) return err } if err := PerformAppActionService(do, app); err != nil { do.Result = "could not perform app action service" CleanUp(do, app) return err } do.Result = "success" return CleanUp(do, app) }
func ImportData(do *definitions.Do) error { if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { srv := PretendToBeAService(do.Name, do.Operations.ContainerNumber) service, exists := perform.ContainerExists(srv.Operations) if !exists { return fmt.Errorf("There is no data container for that service.") } containerName := util.DataContainersName(do.Name, do.Operations.ContainerNumber) logger.Debugf("Importing FROM =>\t\t%s\n", do.Source) os.Chdir(do.Source) logger.Debugf("Importing TO =>\t\t\t%s\n", do.Destination) reader, err := util.Tar(do.Source, 0) if err != nil { return err } defer reader.Close() opts := docker.UploadToContainerOptions{ InputStream: reader, Path: do.Destination, NoOverwriteDirNonDir: true, } logger.Infof("Copying into Cont. ID =>\t%s\n", service.ID) logger.Debugf("\tPath =>\t\t\t%s\n", do.Source) if err := util.DockerClient.UploadToContainer(service.ID, opts); err != nil { return err } doChown := definitions.NowDo() doChown.Operations.DataContainerName = containerName doChown.Operations.ContainerType = "data" doChown.Operations.ContainerNumber = 1 doChown.Operations.Args = []string{"chown", "--recursive", "eris", do.Destination} _, err = perform.DockerRunData(doChown.Operations, nil) if err != nil { return fmt.Errorf("Error changing owner: %v\n", err) } } else { ops := loaders.LoadDataDefinition(do.Name, do.Operations.ContainerNumber) if err := perform.DockerCreateData(ops); err != nil { return fmt.Errorf("Error creating data container %v.", err) } return ImportData(do) } do.Result = "success" return nil }
func CatFiles(do *definitions.Do) error { ensureRunning() log.WithFields(log.Fields{ "file": do.Name, "path": do.Path, }).Debug("Dumping the contents of a file") hash, err := catFile(do.Name) if err != nil { return err } do.Result = hash return nil }
func ListAll(do *definitions.Do, typ string) (err error) { quiet := do.Quiet var result string if do.All == true { //overrides all the functionality used for flags/tests to stdout a nice table result, err = PrintTableReport(typ, true, true) //when latter bool is true, former one will be ignored... if err != nil { return err } fmt.Println(result) } else { testing := len(do.Operations.Args) != 0 && do.Operations.Args[0] == "testing" var resK, resR, resE string if do.Known { if typ != "data" { //no definition files for datas if resK, err = ListKnown(typ); err != nil { return err } } do.Result = resK } if do.Running { if resR, err = ListRunningOrExisting(quiet, testing, false, typ); err != nil { return err } do.Result = resR } if do.Existing { if resE, err = ListRunningOrExisting(quiet, testing, true, typ); err != nil { return err } do.Result = resE } } return nil }
func ExecData(do *definitions.Do) error { if util.IsDataContainer(do.Name, do.Operations.ContainerNumber) { do.Name = util.DataContainersName(do.Name, do.Operations.ContainerNumber) logger.Infoln("Running exec on container with volumes from data container " + do.Name) if err := perform.DockerRunVolumesFromContainer(do.Name, do.Interactive, do.Args); err != nil { return err } } else { return fmt.Errorf("I cannot find that data container. Please check the data container name you sent me.") } do.Result = "success" return nil }
func StartChain(do *definitions.Do) error { chain, err := loaders.LoadChainDefinition(do.Name, false, do.Operations.ContainerNumber) if err != nil { logger.Infoln("Cannot start a chain I cannot find.") do.Result = "no file" return nil } if chain.Name == "" { logger.Infoln("Cannot start a chain without a name.") do.Result = "no name" return nil } // boot the dependencies (eg. keys) if err := bootDependencies(chain, do); err != nil { return err } chain.Service.Command = loaders.ErisChainStart util.OverWriteOperations(chain.Operations, do.Operations) chain.Service.Environment = append(chain.Service.Environment, "CHAIN_ID="+chain.ChainID) chain.Service.Environment = append(chain.Service.Environment, do.Env...) if do.Run { chain.Service.Environment = append(chain.Service.Environment, "ERISDB_API=true") } chain.Service.Links = append(chain.Service.Links, do.Links...) logger.Infof("StartChainRaw to DockerRun =>\t%s\n", chain.Service.Name) logger.Debugf("\twith ChainID =>\t\t%v\n", chain.ChainID) logger.Debugf("\twith Environment =>\t%v\n", chain.Service.Environment) logger.Debugf("\twith AllPortsPublshd =>\t%v\n", chain.Operations.PublishAllPorts) if _, err := perform.DockerRun(chain.Service, chain.Operations); err != nil { do.Result = "error" return err } return nil }
func ListFiles(do *definitions.Do) error { ensureRunning() log.WithFields(log.Fields{ "file": do.Name, "path": do.Path, }).Debug("Listing an object") hash, err := listFile(do.Name) if err != nil { return err } do.Result = hash return nil }