Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Println arbitrarily prints line after the prompt #39

Closed
cassanof opened this issue Aug 22, 2021 · 15 comments
Closed

Println arbitrarily prints line after the prompt #39

cassanof opened this issue Aug 22, 2021 · 15 comments

Comments

@cassanof
Copy link

Hello,
Sometimes when using Println, Printf, etc... the text gets printed after the prompt instead of in a new line.
This also happens if I use grumble.Println.
I have a whole program using grumble right now which has this issue.
Link to my program: https://github.com/elleven11/pantegana

I think that the issue rises from the fact that the println calls come from a separate goroutine.
How would I be able to fix this issue? thank you.

@skaldesh
Copy link
Member

Hi,
Can you give a reproducible example of this? Best would be with the (slightly modified) samples of this repo. Or you give me the exact commands that I need to run after I cloned your program from your repo.

@cassanof
Copy link
Author

yes, and thank you for investigating my issue.
My program pre-requirements go-binadata (go get -u github.com/go-bindata/go-bindata/...) and openssl.
So after you clone my repo you have to run make IP=127.0.0.1 DOMAIN=localhost then run the binary in ./out/server.bin after that you can just try to spam listen in the cli and you will see that sometimes the output gets printed after the prompt:
image

@skaldesh
Copy link
Member

Great, I'll try it out :)

@skaldesh
Copy link
Member

Unfortunately, I could not reproduce this behaviour:

[pantegana]$ listen
[+] Server listening on (localhost:1337)
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$
[pantegana]$
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$ listen
[-] A listener is already running.
[pantegana]$

@cassanof
Copy link
Author

Thats weird... I even tried with another machine and with using another terminal (i use st, tried to use xterm and xfce-terminal).
What could be wrong?

@skaldesh
Copy link
Member

Can you reproduce it consistently? Like does it work every time after a few trials?

@cassanof
Copy link
Author

Can you reproduce it consistently? Like does it work every time after a few trials?

yes, it happens like once every 10 stdout writes i could say.

@skaldesh
Copy link
Member

Ok. I will check the source code to see, if anything is obvious from there

@skaldesh
Copy link
Member

Btw, so you are using App.Println(), right? Could you show the relevant code from your application?

@cassanof
Copy link
Author

cassanof commented Aug 30, 2021

Yes. This is ./server/listener.go
I instantiated the clivariable as the App
Btw, ctfm.Sprintln just formats the string with color, and even if removed the issue still persists. And I am switching to fatih/color
Also, the issue is present in other parts of the code, this is just the simplest way to show it without making you start clients up, etc..

package server

import (
	"crypto/tls"
	"errors"
	"net/http"

	"github.com/i582/cfmt/cmd/cfmt"
)

//go:generate go-bindata -o cert.go ../cert/...

type Listener struct {
	Cfg    *ListenerConfig
	Server *http.Server
}

type ListenerConfig struct {
	Addr      string
	Plaintext bool
	Verbose   bool
}

var listener *Listener = nil

func (cfg *ListenerConfig) SetupListener() *Listener {
	// read cert binary data from bundled assets
	certData, err := Asset("../cert/server.crt")
	if err != nil {
		cli.Print(cfmt.Sprintf("{{[-] Error reading cert file: %s\n}}::red", err))
	}
	// read key binary data from bundled assets
	keyData, err := Asset("../cert/server.key")
	if err != nil {
		cli.Print(cfmt.Sprintf("{{[-] Error reading cert file: %s\n}}::red", err))
	}

	// create the server with the custom pair
	cert, err := tls.X509KeyPair(certData, keyData)
	tlsConfig := &tls.Config{Certificates: []tls.Certificate{cert}}
	server := http.Server{
		Addr:      cfg.Addr,
		TLSConfig: tlsConfig,
	}
	if cfg.Plaintext {
		server.TLSConfig = nil
	}

	return &Listener{
		Cfg:    cfg,
		Server: &server,
	}
}

func StartListener(cfg *ListenerConfig) {
	// check if a listener is already running
	if IsListening() {
		cli.Print(cfmt.Sprintln("{{[-] A listener is already running.}}::red"))
		return
	}

	// start the listener
	cli.Printf("[+] Listening on (%s)\n", cfg.Addr)
	listener = cfg.SetupListener()

	var err error
	if cfg.Plaintext {
		err = listener.Server.ListenAndServe()
	} else {
		err = listener.Server.ListenAndServeTLS("", "")
	}

	if err != http.ErrServerClosed {
		cli.PrintError(err)
		defer CloseListener()
	}
}

func CloseListener() error {
	var err error
	if listener != nil {
		err = listener.Server.Close()
		listener = nil
	} else {
		err = errors.New("There are no listeners running")
	}
	return err
}

func IsListening() bool {
	return listener != nil
}

@skaldesh
Copy link
Member

From your issue description I understand that even if you just use fmt.Print instead of using the grumble builtins, the issue persists?

@cassanof
Copy link
Author

cassanof commented Sep 2, 2021

From your issue description I understand that even if you just use fmt.Print instead of using the grumble builtins, the issue persists?

Yeah it does.

@skaldesh
Copy link
Member

Sorry, I lost track of this issue. Were you able to fix this?

@cassanof
Copy link
Author

Yes, it actually fixed by itself. It's still a mystery tho.

@skaldesh
Copy link
Member

Alright, thanks for reporting back!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants