diff --git a/go.mod b/go.mod index ba92831b..70dab840 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/gorilla/mux v1.7.4 // indirect github.com/imdario/mergo v0.3.11 github.com/logrusorgru/aurora v2.0.3+incompatible + github.com/mattn/go-colorable v0.1.8 github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.3.0 // indirect github.com/moby/term v0.0.0-20200611042045-63b9a826fb74 // indirect diff --git a/go.sum b/go.sum index fea5194a..5d8f0aa2 100644 --- a/go.sum +++ b/go.sum @@ -163,7 +163,11 @@ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czP github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -335,6 +339,8 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9 h1:YTzHMGlqJu67/uEo1lBv0n3wBXhXNeUbB1XfN2vmTm0= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/service/color/color.go b/service/color/color.go new file mode 100644 index 00000000..469465d6 --- /dev/null +++ b/service/color/color.go @@ -0,0 +1,13 @@ +package color + +import ( + "fmt" + + "github.com/mattn/go-colorable" +) + +var colorableOutput = colorable.NewColorableStdout() + +func Print(input interface{}) { + fmt.Fprint(colorableOutput, input) +} diff --git a/service/interface/interface.go b/service/interface/interface.go index 11106e77..4d1bdf6c 100644 --- a/service/interface/interface.go +++ b/service/interface/interface.go @@ -7,6 +7,7 @@ import ( "github.com/docker/docker/api/types" "github.com/docker/docker/client" + "github.com/fubarhouse/pygmy-go/service/color" "github.com/fubarhouse/pygmy-go/service/interface/docker" . "github.com/logrusorgru/aurora" ) @@ -63,7 +64,7 @@ func (Service *Service) Start() error { } if s && !Service.HostConfig.AutoRemove && !discrete { - fmt.Print(Green(fmt.Sprintf("Already running %s\n", name))) + color.Print(Green(fmt.Sprintf("Already running %s\n", name))) return nil } @@ -89,7 +90,7 @@ func (Service *Service) Start() error { if c, err := Service.GetRunning(); c.ID != "" { if !discrete { - fmt.Print(Green(fmt.Sprintf("Successfully started %s\n", name))) + color.Print(Green(fmt.Sprintf("Successfully started %s\n", name))) return nil } if err != nil { @@ -155,17 +156,17 @@ func (Service *Service) Clean() error { name := strings.TrimLeft(container.Names[0], "/") if e := docker.DockerKill(container.ID); e == nil { if !Service.HostConfig.AutoRemove { - fmt.Print(Green(fmt.Sprintf("Successfully killed %s\n", name))) + color.Print(Green(fmt.Sprintf("Successfully killed %s\n", name))) } } if e := docker.DockerStop(container.ID); e == nil { if !Service.HostConfig.AutoRemove { - fmt.Print(Green(fmt.Sprintf("Successfully stopped %s\n", name))) + color.Print(Green(fmt.Sprintf("Successfully stopped %s\n", name))) } } if e := docker.DockerRemove(container.ID); e != nil { if !Service.HostConfig.AutoRemove { - fmt.Print(Green(fmt.Sprintf("Successfully removed %s\n", name))) + color.Print(Green(fmt.Sprintf("Successfully removed %s\n", name))) } } } @@ -187,7 +188,7 @@ func (Service *Service) Stop() error { container, err := Service.GetRunning() if err != nil { if !discrete { - fmt.Print(Red(fmt.Sprintf("Not running %s\n", name))) + color.Print(Red(fmt.Sprintf("Not running %s\n", name))) } return nil } @@ -197,7 +198,7 @@ func (Service *Service) Stop() error { if e := docker.DockerRemove(container.ID); e == nil { if !discrete { containerName := strings.Trim(name, "/") - fmt.Print(Green(fmt.Sprintf("Successfully removed %s\n", containerName))) + color.Print(Green(fmt.Sprintf("Successfully removed %s\n", containerName))) } } } diff --git a/service/library/clean.go b/service/library/clean.go index 634568cc..fba5ea89 100644 --- a/service/library/clean.go +++ b/service/library/clean.go @@ -3,6 +3,7 @@ package library import ( "fmt" + "github.com/fubarhouse/pygmy-go/service/color" "github.com/fubarhouse/pygmy-go/service/interface/docker" . "github.com/logrusorgru/aurora" ) @@ -29,12 +30,12 @@ func Clean(c Config) { if target { err := docker.DockerKill(Container.ID) if err == nil { - fmt.Print(Green(fmt.Sprintf("Successfully killed %s\n", Container.Names[0]))) + color.Print(Green(fmt.Sprintf("Successfully killed %s\n", Container.Names[0]))) } err = docker.DockerRemove(Container.ID) if err == nil { - fmt.Print(Green(fmt.Sprintf("Successfully removed %s\n", Container.Names[0]))) + color.Print(Green(fmt.Sprintf("Successfully removed %s\n", Container.Names[0]))) } } } @@ -50,9 +51,9 @@ func Clean(c Config) { fmt.Println(e) } if s, _ := docker.DockerNetworkStatus(NetworksToClean[n]); !s { - fmt.Print(Green(fmt.Sprintf("Successfully removed network %s\n", NetworksToClean[n]))) + color.Print(Green(fmt.Sprintf("Successfully removed network %s\n", NetworksToClean[n]))) } else { - fmt.Print(Red(fmt.Sprintf("Successfully started %s\n", NetworksToClean[n]))) + color.Print(Red(fmt.Sprintf("Successfully started %s\n", NetworksToClean[n]))) } } } diff --git a/service/library/down.go b/service/library/down.go index 37ee1fe5..126411d2 100644 --- a/service/library/down.go +++ b/service/library/down.go @@ -3,6 +3,7 @@ package library import ( "fmt" + "github.com/fubarhouse/pygmy-go/service/color" "github.com/fubarhouse/pygmy-go/service/interface/docker" . "github.com/logrusorgru/aurora" ) @@ -36,9 +37,9 @@ func Down(c Config) { fmt.Println(e) } if s, _ := docker.DockerNetworkStatus(network); !s { - fmt.Print(Green(fmt.Sprintf("Successfully removed network %s\n", network))) + color.Print(Green(fmt.Sprintf("Successfully removed network %s\n", network))) } else { - fmt.Print(Red(fmt.Sprintf("Network %s was not removed\n", network))) + color.Print(Red(fmt.Sprintf("Network %s was not removed\n", network))) } } diff --git a/service/library/status.go b/service/library/status.go index 94be3043..5110b70a 100644 --- a/service/library/status.go +++ b/service/library/status.go @@ -4,6 +4,7 @@ import ( "fmt" "strings" + "github.com/fubarhouse/pygmy-go/service/color" "github.com/fubarhouse/pygmy-go/service/endpoint" "github.com/fubarhouse/pygmy-go/service/interface/docker" "github.com/fubarhouse/pygmy-go/service/resolv" @@ -20,9 +21,9 @@ func Status(c Config) { if len(checks) > 0 { for _, check := range checks { if check.State { - fmt.Println(Green(check.Message)) + color.Print(Green(check.Message + "\n")) } else { - fmt.Println(Red(check.Message)) + color.Print(Red(check.Message + "\n")) } } fmt.Println() @@ -43,9 +44,9 @@ func Status(c Config) { } if enabled && !discrete && name != "" { if s, _ := Service.Status(); s { - fmt.Print(Green(fmt.Sprintf("[*] %s: Running as container %s\n", name, name))) + color.Print(Green(fmt.Sprintf("[*] %s: Running as container %s\n", name, name))) } else { - fmt.Print(Red(fmt.Sprintf("[ ] %s is not running\n", name))) + color.Print(Red(fmt.Sprintf("[ ] %s is not running\n", name))) } } } @@ -58,7 +59,7 @@ func Status(c Config) { name, _ := Service.GetFieldString("name") discrete, _ := Service.GetFieldBool("discrete") if !discrete { - fmt.Print(Red(fmt.Sprintf("[ ] %s is not running\n", name))) + color.Print(Red(fmt.Sprintf("[ ] %s is not running\n", name))) } } } @@ -66,9 +67,9 @@ func Status(c Config) { for _, Network := range c.Networks { for _, Container := range Network.Containers { if x, _ := docker.DockerNetworkConnected(Network.Name, Container.Name); !x { - fmt.Print(Red(fmt.Sprintf("[ ] %s is not connected to network %s\n", Container.Name, Network.Name))) + color.Print(Red(fmt.Sprintf("[ ] %s is not connected to network %s\n", Container.Name, Network.Name))) } else { - fmt.Print(Green(fmt.Sprintf("[*] %s is connected to network %s\n", Container.Name, Network.Name))) + color.Print(Green(fmt.Sprintf("[*] %s is connected to network %s\n", Container.Name, Network.Name))) } } } @@ -76,17 +77,17 @@ func Status(c Config) { for _, resolver := range c.Resolvers { r := resolv.Resolv{Name: resolver.Name, Data: resolver.Data, Folder: resolver.Folder, File: resolver.File} if s := r.Status(); s { - fmt.Print(Green(fmt.Sprintf("[*] Resolv %v is properly connected\n", resolver.Name))) + color.Print(Green(fmt.Sprintf("[*] Resolv %v is properly connected\n", resolver.Name))) } else { - fmt.Print(Red(fmt.Sprintf("[ ] Resolv %v is not properly conected\n", resolver.Name))) + color.Print(Red(fmt.Sprintf("[ ] Resolv %v is not properly conected\n", resolver.Name))) } } for _, volume := range c.Volumes { if s, _ := docker.DockerVolumeExists(volume); s { - fmt.Print(Green(fmt.Sprintf("[*] Volume %s has been created\n", volume.Name))) + color.Print(Green(fmt.Sprintf("[*] Volume %s has been created\n", volume.Name))) } else { - fmt.Print(Green(fmt.Sprintf("[ ] Volume %s has not ben created\n", volume.Name))) + color.Print(Green(fmt.Sprintf("[ ] Volume %s has not ben created\n", volume.Name))) } } diff --git a/service/library/up.go b/service/library/up.go index fc6d256e..0c37d61e 100644 --- a/service/library/up.go +++ b/service/library/up.go @@ -5,6 +5,7 @@ import ( "os" "strings" + "github.com/fubarhouse/pygmy-go/service/color" "github.com/fubarhouse/pygmy-go/service/endpoint" "github.com/fubarhouse/pygmy-go/service/interface/docker" . "github.com/logrusorgru/aurora" @@ -33,12 +34,12 @@ func Up(c Config) { if s, _ := docker.DockerVolumeExists(volume); !s { _, err := docker.DockerVolumeCreate(volume) if err == nil { - fmt.Print(Green(fmt.Sprintf("Created volume %s\n", volume.Name))) + color.Print(Green(fmt.Sprintf("Created volume %s\n", volume.Name))) } else { fmt.Println(err) } } else { - fmt.Print(Green(fmt.Sprintf("Already created volume %s\n", volume.Name))) + color.Print(Green(fmt.Sprintf("Already created volume %s\n", volume.Name))) } } @@ -94,9 +95,9 @@ func Up(c Config) { netVal, _ := docker.DockerNetworkStatus(Network.Name) if !netVal { if err := NetworkCreate(Network); err == nil { - fmt.Print(Green(fmt.Sprintf("Successfully created network %s\n", Network.Name))) + color.Print(Green(fmt.Sprintf("Successfully created network %s\n", Network.Name))) } else { - fmt.Print(Red(fmt.Sprintf("Could not create network %s\n", Network.Name))) + color.Print(Red(fmt.Sprintf("Could not create network %s\n", Network.Name))) } } } @@ -110,15 +111,15 @@ func Up(c Config) { if Network, _ := service.GetFieldString("network"); Network != "" && nameErr == nil { if s, _ := docker.DockerNetworkConnected(Network, name); !s { if s := NetworkConnect(Network, name); s == nil { - fmt.Print(Green(fmt.Sprintf("Successfully connected %s to %s\n", name, Network))) + color.Print(Green(fmt.Sprintf("Successfully connected %s to %s\n", name, Network))) } else { discrete, _ := service.GetFieldBool("discrete") if !discrete { - fmt.Print(Red(fmt.Sprintf("Could not connect %s to %s\n", name, Network))) + color.Print(Red(fmt.Sprintf("Could not connect %s to %s\n", name, Network))) } } } else { - fmt.Print(Green(fmt.Sprintf("Already connected %s to %s\n", name, Network))) + color.Print(Green(fmt.Sprintf("Already connected %s to %s\n", name, Network))) } } } diff --git a/service/resolv/resolv.go b/service/resolv/resolv.go index cc1394c5..0baad3c0 100644 --- a/service/resolv/resolv.go +++ b/service/resolv/resolv.go @@ -10,6 +10,7 @@ import ( "runtime" "strings" + "github.com/fubarhouse/pygmy-go/service/color" . "github.com/logrusorgru/aurora" ) @@ -40,7 +41,7 @@ func (resolv Resolv) Configure() { return } if resolv.Status() { - fmt.Print(Green(fmt.Sprintf("Already configured resolvr %s\n", resolv.Name))) + color.Print(Green(fmt.Sprintf("Already configured resolvr %s\n", resolv.Name))) } else { fullPath := fmt.Sprintf("%v%v%v", resolv.Folder, string(os.PathSeparator), resolv.File) if _, err := os.Stat(fullPath); os.IsNotExist(err) { @@ -109,16 +110,16 @@ func (resolv Resolv) Configure() { if runtime.GOOS == "darwin" { ifConfig := exec.Command("/bin/sh", "-c", "sudo ifconfig lo0 alias 172.16.172.16") if err := ifConfig.Run(); err != nil { - fmt.Println(Sprintf(Red("error creating loopback UP alias"))) + color.Print(Sprintf(Red("error creating loopback UP alias"))) } killAll := exec.Command("/bin/sh", "-c", "sudo killall mDNSResponder") if err := killAll.Run(); err != nil { - fmt.Println(Sprintf(Red("error restarting mDNSResponder"))) + color.Print(Sprintf(Red("error restarting mDNSResponder"))) } } if resolv.Status() { - fmt.Print(Green(fmt.Sprintf("Successfully configured resolvr %s\n", resolv.Name))) + color.Print(Green(fmt.Sprintf("Successfully configured resolvr %s\n", resolv.Name))) } } } @@ -164,7 +165,7 @@ func (resolv Resolv) Clean() { fmt.Println(err) } if !resolv.statusFile() { - fmt.Println(Sprintf(Green("Successfully removed resolver file"))) + color.Print(Sprintf(Green("Successfully removed resolver file"))) } } @@ -175,10 +176,10 @@ func (resolv Resolv) Clean() { ifConfig := exec.Command("/bin/sh", "-c", "sudo ifconfig lo0 -alias 172.16.172.16") err := ifConfig.Run() if err != nil { - fmt.Println(Sprintf(Red("error removing loopback UP alias"), Red(err))) + color.Print(Sprintf(Red("error removing loopback UP alias"), Red(err))) } else { if !resolv.statusNet() { - fmt.Println(Sprintf(Green("Successfully removed loopback alias IP."))) + color.Print(Sprintf(Green("Successfully removed loopback alias IP."))) } } } @@ -186,9 +187,9 @@ func (resolv Resolv) Clean() { killAll := exec.Command("/bin/sh", "-c", "sudo killall mDNSResponder") err := killAll.Run() if err != nil { - fmt.Println(Sprintf(Red("error restarting mDNSResponder"))) + color.Print(Sprintf(Red("error restarting mDNSResponder"))) } else { - fmt.Println(Sprintf(Green("Successfully restarted mDNSResponder"))) + color.Print(Sprintf(Green("Successfully restarted mDNSResponder"))) } } }