105 lines
2.4 KiB
Go
105 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"net"
|
|
"flag"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"fmt"
|
|
"image/color"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var targetAddr string
|
|
var imgPath string
|
|
var goProc int
|
|
var socketCount int
|
|
|
|
var startx int
|
|
var starty int
|
|
|
|
var partTotal int
|
|
var partCount int
|
|
var partBegin int
|
|
|
|
func main() {
|
|
flag.StringVar(&targetAddr, "addr", "151.217.177.136:1234", "address of target tcp")
|
|
flag.StringVar(&imgPath, "img", "", "path to image")
|
|
flag.IntVar(&goProc, "proc", 1, "count of procs (go routines)")
|
|
flag.IntVar(&socketCount, "sockets", 1, "count of sockets to target")
|
|
|
|
flag.IntVar(&startx, "start-x", 0, "move at x")
|
|
flag.IntVar(&starty, "start-y", 0, "move at y")
|
|
|
|
flag.IntVar(&partTotal, "part-total", 1, "total count of parts")
|
|
flag.IntVar(&partCount, "part-count", 1, "showed parts")
|
|
flag.IntVar(&partBegin, "part-begin", 0, "beginning at part x")
|
|
flag.Parse()
|
|
|
|
log.Infof("starting for %s with %d proc(s) | move by (%d,%d) | %d parts of %d begin at %d", targetAddr, goProc, startx, starty, partCount, partTotal, partBegin)
|
|
|
|
var pixelmatrix [][][4]uint32
|
|
|
|
// get matrix
|
|
if imgPath != "" {
|
|
pixelmatrix = getImage(imgPath)
|
|
}else{
|
|
pixelmatrix = getColor(color.RGBA{0xcc, 0xff, 0x33, 0xff}, 1024, 1024)
|
|
}
|
|
|
|
// transform
|
|
|
|
pixelmatrix, sx, sy := getPart(pixelmatrix, partCount, partTotal, partBegin)
|
|
startx += sx
|
|
starty += sy
|
|
|
|
for s := 0; s < socketCount; s++ {
|
|
pm, sx, sy := getPart(pixelmatrix, 1, socketCount, s)
|
|
sx += startx
|
|
sy += starty
|
|
conn := createSocket(pm, sx, sy)
|
|
defer conn.Close()
|
|
}
|
|
|
|
// Wait for INT/TERM
|
|
sigs := make(chan os.Signal, 1)
|
|
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
|
sig := <-sigs
|
|
log.Println("received", sig)
|
|
|
|
}
|
|
|
|
func createSocket(pixelmatrix [][][4]uint32, xstart, ystart int) net.Conn {
|
|
// connection(s)
|
|
conn, err := net.Dial("tcp", targetAddr)
|
|
if err != nil {
|
|
log.Fatalf("not able to create connection: %s", err)
|
|
}
|
|
|
|
|
|
// start painting
|
|
for s := 0; s < goProc; s++ {
|
|
go paint(conn, pixelmatrix, xstart, ystart)
|
|
}
|
|
return conn
|
|
}
|
|
|
|
func paint(conn net.Conn, pixelmatrix [][][4]uint32, xstart, ystart int) {
|
|
var prerender [][]byte
|
|
for x, row := range pixelmatrix {
|
|
for y, pixel := range row {
|
|
if pixel[3] != 0 {
|
|
msg := fmt.Sprintf("PX %d %d %02x%02x%02x\n", xstart+x, ystart+y, pixel[0], pixel[1], pixel[2])
|
|
prerender = append(prerender, []byte(msg))
|
|
}
|
|
}
|
|
}
|
|
for {
|
|
for _, data := range prerender {
|
|
conn.Write(data)
|
|
}
|
|
}
|
|
}
|