| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 | package mainimport (	"io/ioutil"	"log"	"net/http"	"os"	"os/exec"	"os/signal"	"path/filepath"	"runtime"	"strings"	"syscall"	"imuslab.com/WsTTY/mod/aroz"	"imuslab.com/WsTTY/mod/wsshell")var (	handler *aroz.ArozHandler)func SetupCloseHandler() {	c := make(chan os.Signal, 2)	signal.Notify(c, os.Interrupt, syscall.SIGTERM)	go func() {		<-c		log.Println("\r- Shutting down WsTTY Service.")		os.Exit(0)	}()}func main() {	//Create a platform dependent aroz service register	if runtime.GOOS == "windows" {		//Start the aoModule pipeline (which will parse the flags as well). Pass in the module launch information		handler = aroz.HandleFlagParse(aroz.ServiceInfo{			Name:        "WsTTY",			Desc:        "arozos Websocket Terminal",			Group:       "System Tools",			IconPath:    "wstty/img/small_icon.png",			Version:     "1.1",			StartDir:    "wstty/console.html",			SupportFW:   true,			LaunchFWDir: "wstty/console.html",			InitFWSize:  []int{740, 500},		})	} else {		//Start the aoModule pipeline (which will parse the flags as well). Pass in the module launch information		handler = aroz.HandleFlagParse(aroz.ServiceInfo{			Name:        "WsTTY",			Desc:        "arozos Websocket Terminal",			Group:       "System Tools",			IconPath:    "img/icons/wstty/small_icon.png",			Version:     "1.1",			StartDir:    "wstty/",			SupportFW:   true,			LaunchFWDir: "wstty/",			InitFWSize:  []int{740, 500},		})	}	SetupCloseHandler()	//Start the gotty and rproxy it to the main system	if runtime.GOOS == "windows" {		//Switch to using wsshell module		terminal := wsshell.NewWebSocketShellTerminal()		http.HandleFunc("/tty/", terminal.HandleOpen)		//Register the standard web services urls		fs := http.FileServer(http.Dir("./web"))		http.Handle("/", fs)		//Any log println will be shown in the core system via STDOUT redirection. But not STDIN.		log.Println("WsTTY (Windows Compatible Mode) started. Listening on " + handler.Port)		err := http.ListenAndServe(handler.Port, nil)		if err != nil {			log.Fatal(err)		}	} else if runtime.GOOS == "linux" {		//Use wstty directly		absolutePath := ""		if runtime.GOARCH == "amd64" {			abs, _ := filepath.Abs("./gotty/gotty_linux_amd64")			absolutePath = abs		} else if runtime.GOARCH == "arm" {			abs, _ := filepath.Abs("./gotty/gotty_linux_arm")			absolutePath = abs		} else if runtime.GOARCH == "arm64" {			abs, _ := filepath.Abs("./gotty/ggotty_linux_arm64")			absolutePath = abs		} else {			//Unsupported platform. Default use amd64			abs, _ := filepath.Abs("./gotty/gotty_linux_amd64")			absolutePath = abs		}		//Extract port number from listening addr		tmp := strings.Split(handler.Port, ":")		tmp = tmp[len(tmp)-1:]		portOnly := strings.Join(tmp, "")		log.Println("WsTTY Started. Listening on ", portOnly)		//Start the gotty. This shoud be blocking by itself		cmd := exec.Command(absolutePath, "-w", "-p", portOnly, "-a", "localhost", "--ws-origin", `\w*`, "bash", "--init-file", "bashstart")		cmd.Stdout = os.Stdout		cmd.Stderr = os.Stderr		if err := cmd.Start(); err != nil {			//Fail to start gotty. Disable this module			ioutil.WriteFile(".disabled", []byte(""), 0755)			return		}	} else {		panic("Not supported platform: " + runtime.GOOS)	}}
 |