package main import ( "bufio" "fmt" "io" "net" "os" "os/exec" "os/signal" "strings" "syscall" "log" "regexp" "bytes" "github.com/creack/pty" ) func main() { log.Println("\033[32mStarting Server\033[0m") sigs := make(chan os.Signal, 1) signal.Notify(sigs, syscall.SIGTERM) //get environmental variables var minram, maxram, args, stop, jar, regex string for _, e := range os.Environ() { pair := strings.SplitN(e, "=", 2) switch pair[0] { case "MIN_MEM": minram = "-Xms" + pair[1] case "MAX_MEM": maxram = "-Xmx" + pair[1] case "ARGS": args = pair[1] case "STOP": stop = pair[1] case "JAR": jar = pair[1] case "REGEX": regex = pair[1] } } //create command var cmdversion *exec.Cmd cmdversion = exec.Command("java", "--version") var out bytes.Buffer cmdversion.Stdout = &out cmdversion.Run() log.Println(out.String()) log.Printf("Ram: Min: %s Max: %s Stop: %s Jar: %s\n\r", minram, maxram, stop, jar) //check if there is a server jar if _, err := os.Stat("/server/"+jar); os.IsNotExist(err) { log.Println("\033[31mJar \"" + jar + "\" not found\033[0m") os.Exit(1) } var cmd *exec.Cmd if args == "" { cmd = exec.Command("java", minram, maxram, "-jar", jar) } else { cmd = exec.Command("java", minram, maxram, args, "-jar", jar) log.Printf("Args: %s \n\r", args) } //start server cmd.Dir = "/server" tty, err := pty.Start(cmd) if err != nil { panic(err) } ln, _ := net.Listen("tcp", ":8081") //cleanup defer func() { cmd.Process.Kill() cmd.Process.Wait() tty.Close() ln.Close() }() // capture sigterm go func() { sig := <-sigs if sig == syscall.SIGTERM { fmt.Println("\033[31mStopping server\033[0m") tty.WriteString(stop + "\n\r") } }() //accepts command from cmd.go and sends them to the server go func() { //accept connections from clients for { conn, err := ln.Accept() if err != nil { continue } go handleClient(conn, tty) } }() //copy to standard out. If the the is a regex pattern, do output anything that matches go func() { filter := regexp.MustCompile(regex) if(regex != "") { scanner := bufio.NewScanner(tty) for scanner.Scan() { text := scanner.Text() if(!filter.MatchString(text)) { fmt.Println(text) } } } else { //don't filter io.Copy(os.Stdout, tty) } }() //copy stdin go func() { io.Copy(tty, os.Stdin) }() cmd.Wait() //wait for server to stop tty.Write([]byte("\033[31mServer Stopped\033[0m")) os.Exit(0) } //take commands from cmd.go and send it to sdtin of the server func handleClient(conn net.Conn, tty *os.File) { defer conn.Close() cmd, _ := bufio.NewReader(conn).ReadString('\n') tty.Write([]byte(cmd)) }