diff options
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 166 |
1 files changed, 102 insertions, 64 deletions
diff --git a/main.go b/main.go index 97de251..49efbf1 100644 --- a/main.go +++ b/main.go @@ -1,33 +1,39 @@ package main import ( + "gopkg.in/cheggaaa/pb.v1" "bytes" + "bufio" "flag" "fmt" "image" "log" "net" "os" + _ "image/jpeg" ) var ( + + // Define command line arguments host = flag.String("host", "127.0.0.1", "Server address (v4)") port = flag.String("port", "1337", "Server port") address string imagePath = flag.String("image", "", "Relative image path") - imageOffsetX = flag.Int("xoffset", 0, "xoffset") - imageOffsetY = flag.Int("yoffset", 0, "yoffset") + xoffset = flag.Int("xoffset", 0, "xoffset") + yoffset = flag.Int("yoffset", 0, "yoffset") canvasWidth = flag.Int("width", 1920, "canvas width") canvasHeight = flag.Int("height", 1080, "canvas height") testConn = flag.Bool("t", false, "test the connection before escalating completely") - fill = flag.Bool("fill", true, "fill the complete canvas") + fill = flag.Bool("fill", false, "fill the complete canvas") color = flag.String("col", "000000", "define a color") cores = flag.Int("cores", 1, "Amount of cores to use") + loops = flag.Int("loops", 500, "Amount os loops to run") ) // parse the command line @@ -37,7 +43,7 @@ func parseFlags() { address = fmt.Sprintf("%s:%s", *host, *port) } -// test the connection to the given server if the -t flag was set +// testConnection to the given server if the -t flag was set func testConnection() { if *testConn == true { log.Printf("[ ] Testing Connection: True") @@ -50,9 +56,10 @@ func testConnection() { } } -// test connecting to the server using the given protocol ("udp" or "tcp") +// testConnectionProtocol tests the connection to the server using the given protocol ("udp" or "tcp") func testConnectionProtocol(protocol string) { - connection, netDialErr := net.Dial(protocol, address) + log.Printf("[D] address: %s", address) + connection, netDialErr := net.Dial(protocol, address) if netDialErr != nil { log.Fatal(netDialErr) } @@ -62,16 +69,15 @@ func testConnectionProtocol(protocol string) { } } +// buildSendString builds a string representing the rectangle defined in fill mode func buildSendString(start int, end int, doneChannel chan bool, stripBufferChannel chan bytes.Buffer) { - fmt.Printf("start: %d \t end: %d\n", start, end) - var stripBuffer bytes.Buffer var currentCommand string for x := start; x < end; x++ { for y := 0; y < *canvasHeight; y++ { // prepare the command that should be written - currentCommand = fmt.Sprintf("PX %d %d %s\n", x, y, *color) + currentCommand = fmt.Sprintf("PX %d %d %s\n", y + *yoffset, x + *xoffset, *color) stripBuffer.Write([]byte(currentCommand)) } } @@ -82,37 +88,44 @@ func buildSendString(start int, end int, doneChannel chan bool, stripBufferChann // openImage opens an image at the given path and returns an image.Image func openImage(imagePath string) image.Image { - log.Println("AA") - reader, openErr := os.Open(imagePath) + log.Println("[ ] Opening the image (%s) ...", imagePath) + file, openErr := os.Open(imagePath) + defer file.Close() if openErr != nil { + log.Println("[E] Error while opening the image") log.Fatal(openErr) } - log.Println("AB") - - fmt.Println(*reader) + log.Println("[ ] Done opening the image") - img, _, imageDecodeErr := image.Decode(reader) - if imageDecodeErr != nil { - log.Fatal(openErr) - } - log.Println("AC") + log.Println("[ ] Decoding the image...") + img, _, err := image.Decode(bufio.NewReader(file)) + if err != nil { + log.Println("[E] Error while decoding the image") + log.Fatal(err) + } + log.Println("[ ] Done decoding the image") return img } +// buildSendStringImage builds the string represesenting the given image for the pixelflut server func buildSendStringImage(image image.Image, start int, end int, doneChannel chan bool, stripBufferChannel chan bytes.Buffer) { var imageHeight = image.Bounds().Max.Y var stripBuffer bytes.Buffer - fmt.Printf("ImageHeight: %d", imageHeight) + log.Printf("ImageHeight: %d", imageHeight) for x := start; x < end; x++ { for y := 0; y < imageHeight; y++ { r, g, b, _ := image.At(x, y).RGBA() - fmt.Printf("%v %v %v", r, g, b) - command := fmt.Sprintf("PX %d %d %.2x%.2x%.2x", x, y, r, g, b) - stripBuffer.Write([]byte(command)) + if r > 10 || g > 10 || b > 10 { + command := fmt.Sprintf("PX %d %d 000000", x, y) + stripBuffer.Write([]byte(command)) + } else { + command := fmt.Sprintf("PX %d %d ffffff", x, y) + stripBuffer.Write([]byte(command)) + } } } @@ -121,26 +134,32 @@ func buildSendStringImage(image image.Image, start int, end int, doneChannel cha } func main() { - log.Printf("[ ] %s -> %s:%s at (%d, %d)", *imagePath, *host, *port, imageOffsetX, imageOffsetY) + log.Printf("[ ] %s -> %s:%s at (%d, %d)", *imagePath, *host, *port, xoffset, yoffset) parseFlags() testConnection() if *fill == true { - // define channels used to bundle the data generated and get information + log.Println("[M] FILL MODE") + // Define channels used to bundle the data generated and get information doneChannel := make(chan bool) stripBufferChannel := make(chan bytes.Buffer) var completeBuffer bytes.Buffer - // calculate the width of the individual stripes + // Calculate the width of the individual stripes var stripwidth int = *canvasWidth / *cores - // create a new buildStringBot generating the stripes + // Create a new buildStringBot generating the stripes + count := *cores + bar := pb.StartNew(count) for thread := 0; thread < *cores; thread++ { - log.Printf("Starting thread %d", thread) + bar.Increment() go buildSendString(thread * stripwidth, (thread + 1) * stripwidth, doneChannel, stripBufferChannel) } + bar.FinishPrint("Done Starting all threads") - // catch all threads + // Catch all threads + count = *cores + bar = pb.StartNew(count) for thread := 0; thread < *cores; thread++ { // get a "Done" message from each worker _ = <- doneChannel @@ -149,102 +168,121 @@ func main() { stripBufferChannelOutput := <- stripBufferChannel completeBuffer.Write(stripBufferChannelOutput.Bytes()) - log.Printf("Thread %d done!", thread) + bar.Increment() } + bar.FinishPrint("Done catching all threads") - // write the command to the server + // Connect to the server connection, netDialError := net.Dial("tcp", address) if netDialError != nil { log.Fatal(netDialError) } - + // Write the buffer to the connection i := 0 - for i < 500 { + count = *loops + bar = pb.StartNew(count) + for i < *loops { // actual write _, writeErr := connection.Write(completeBuffer.Bytes()) if writeErr != nil { log.Fatal(writeErr) } - fmt.Printf(".") + bar.Increment() i++ } + bar.FinishPrint("Done writing !") fmt.Printf("\n") - // close the connection + // Close the connection connectionCloseError := connection.Close() if connectionCloseError != nil { log.Fatal(connectionCloseError) } - // cleanup + // Cleanup fmt.Printf("cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) } if *imagePath != "" { - log.Println("[ ] Drawing the image!") - - log.Println("A") + log.Println("[M] IMAGE MODE") - // open the image + // Open the image + log.Println("[ ] Opening the image...") var image = openImage(*imagePath) - fmt.Println(image) - log.Println("b") + log.Println("[ ] Done opening the image") - // define channels used to bundle the data generated and get informations + // Define channels used to bundle the data generated and get informations + log.Println("[ ] Creating channels...") doneChannel := make(chan bool) stripBufferChannel := make(chan bytes.Buffer) var completeBuffer bytes.Buffer - log.Println("c") + log.Println("[ ] Done creating channels") - // calculate the width of the individual stripes + // Calculate the width of the individual stripes + log.Println("[ ] Creating stripwidth...") var stripwidth int = image.Bounds().Max.X / *cores - log.Println("d") + log.Println("[ ] Done calculating stipwith") - // create new buildSendString workers building the string that should be sent to the pixelflut server + // Create new buildSendString workers building the string that should be sent to the pixelflut server + log.Println("[ ] Creating buildworkers...") for thread := 0; thread < *cores; thread++ { log.Printf("Staring thread %d", thread) go buildSendStringImage(image, thread * stripwidth, (thread+1) * stripwidth, doneChannel, stripBufferChannel) } - log.Println("e") - // catch all the threads + // Catch all the threads + count := *cores + bar := pb.StartNew(count) for thread := 0; thread < *cores; thread++ { - // get a "Done" message from each worker + // Get a "Done" message from each worker _ = <- doneChannel - // get the buffer generated and append it to the complete buffer by writing it there + // Get the buffer generated and append it to the complete buffer by writing it there stripBufferChannelOutput := <- stripBufferChannel completeBuffer.Write(stripBufferChannelOutput.Bytes()) - log.Printf("Thread %d done!") + bar.Increment() } - log.Println("f") + bar.FinishPrint("Done catching the threads!") - // write the command to the server + + // Write the command to the server + log.Println("[ ] Connecting to server...") connection, netDialError := net.Dial("tcp", address) if netDialError != nil { log.Fatal(netDialError) } - log.Println("g") + log.Println("[ ] Done connecting to server") - // actual write - _, writeErr := connection.Write(completeBuffer.Bytes()) - if writeErr != nil { - log.Fatal(writeErr) + // Actual write + log.Println("[ ] Actual send...") + i := 0 + count = *loops + bar = pb.StartNew(count) + for i < *loops { + _, writeErr := connection.Write(completeBuffer.Bytes()) + if writeErr != nil { + log.Fatal(writeErr) + } + + bar.Increment() + i++ } - log.Println("h") + bar.FinishPrint("The End!") + log.Println("[ ] Done sending") - // close the connection + // Close the connection + log.Println("[ ] Closing the connection...") connectionCloseError := connection.Close() if connectionCloseError != nil { log.Fatal(connectionCloseError) } - log.Println("i") + log.Println("[ ] Done closing the connection") - // cleanup - fmt.Printf("cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) + // Cleanup + log.Printf("[ ] Cleanup: %d -> %d", *cores * stripwidth, *canvasWidth) } } |