@@ -27,7 +27,9 @@ import (
2727 "path"
2828 "path/filepath"
2929 "strings"
30+ "sync"
3031 "syscall"
32+ "text/tabwriter"
3133 "time"
3234
3335 "github.com/hyperledger/firefly-cli/internal/blockchain"
@@ -58,21 +60,20 @@ type StackManager struct {
5860 blockchainProvider blockchain.IBlockchainProvider
5961 tokenProviders []tokens.ITokensProvider
6062 IsOldFileStructure bool
63+ once sync.Once
6164}
6265
6366func ListStacks () ([]string , error ) {
64- files , err := ioutil .ReadDir (constants .StacksDir )
67+ files , err := os .ReadDir (constants .StacksDir )
6568 if err != nil {
6669 return nil , err
6770 }
6871
69- stacks := make ([]string , 0 )
70- i := 0
72+ stacks := make ([]string , 0 , len (files ))
7173 for _ , f := range files {
7274 if f .IsDir () {
7375 if exists , err := CheckExists (f .Name ()); err == nil && exists {
7476 stacks = append (stacks , f .Name ())
75- i ++
7677 }
7778 }
7879 }
@@ -250,7 +251,7 @@ func (s *StackManager) LoadStack(stackName string) error {
250251 if ! exists {
251252 return fmt .Errorf ("stack '%s' does not exist" , stackName )
252253 }
253- d , err := ioutil .ReadFile (filepath .Join (stackDir , "stack.json" ))
254+ d , err := os .ReadFile (filepath .Join (stackDir , "stack.json" ))
254255 if err != nil {
255256 return err
256257 }
@@ -1103,6 +1104,33 @@ func (s *StackManager) PrintStackInfo() error {
11031104 return nil
11041105}
11051106
1107+ // IsRunning prints to the stdout, the stack name and it status as "running" or "not_running".
1108+ func (s * StackManager ) IsRunning () error {
1109+ output , err := docker .RunDockerComposeCommandReturnsStdout (s .Stack .StackDir , "ps" )
1110+ if err != nil {
1111+ return err
1112+ }
1113+
1114+ formatHeader := "\n %s\t %s\t "
1115+ formatBody := "\n %s\t %s\t "
1116+
1117+ w := new (tabwriter.Writer )
1118+ w .Init (os .Stdout , 8 , 8 , 8 , '\t' , 0 )
1119+
1120+ s .once .Do (func () {
1121+ fmt .Fprintf (w , formatHeader , "STACK" , "STATUS" )
1122+ })
1123+
1124+ if strings .Contains (string (output ), s .Stack .Name ) { // if the output contains the stack name, it means the container is running.
1125+ fmt .Fprintf (w , formatBody , s .Stack .Name , "running" )
1126+ } else {
1127+ fmt .Fprintf (w , formatBody , s .Stack .Name , "not_running" )
1128+ }
1129+ fmt .Fprintln (w )
1130+ w .Flush ()
1131+ return nil
1132+ }
1133+
11061134func (s * StackManager ) disableFireflyCoreContainers () error {
11071135 compose := s .buildDockerCompose ()
11081136 for _ , member := range s .Stack .Members {
0 commit comments